Skip to content

Commit 459ccca

Browse files
[CHA-2354] Add ParsedPredefinedFilterResponse type
Add type definition for the new `predefined_filter` field returned in QueryChannels responses when a predefined filter is used. - Added ParsedPredefinedFilterResponse TypedDict - Added unit tests for type definitions Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent cdd180c commit 459ccca

File tree

2 files changed

+85
-1
lines changed

2 files changed

+85
-1
lines changed

stream_chat/tests/test_types.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
"""Tests for type definitions."""
2+
3+
from stream_chat.types.base import (
4+
ParsedPredefinedFilterResponse,
5+
SortOrder,
6+
SortParam,
7+
)
8+
9+
10+
class TestParsedPredefinedFilterResponse:
11+
"""Tests for ParsedPredefinedFilterResponse type."""
12+
13+
def test_type_definition(self):
14+
"""Test that ParsedPredefinedFilterResponse can be used as a type hint."""
15+
response: ParsedPredefinedFilterResponse = {
16+
"name": "user_messaging",
17+
"filter": {"type": "messaging", "members": {"$in": ["user123"]}},
18+
"sort": [{"field": "last_message_at", "direction": SortOrder.DESC}],
19+
}
20+
21+
assert response["name"] == "user_messaging"
22+
assert response["filter"]["type"] == "messaging"
23+
assert response["sort"][0]["field"] == "last_message_at"
24+
assert response["sort"][0]["direction"] == SortOrder.DESC
25+
26+
def test_optional_sort(self):
27+
"""Test that sort is optional in ParsedPredefinedFilterResponse."""
28+
response: ParsedPredefinedFilterResponse = {
29+
"name": "simple_filter",
30+
"filter": {"type": "messaging"},
31+
}
32+
33+
assert response["name"] == "simple_filter"
34+
assert "sort" not in response
35+
36+
def test_empty_filter(self):
37+
"""Test that filter can be empty dict."""
38+
response: ParsedPredefinedFilterResponse = {
39+
"name": "empty_filter",
40+
"filter": {},
41+
}
42+
43+
assert response["filter"] == {}
44+
45+
46+
class TestSortParam:
47+
"""Tests for SortParam type."""
48+
49+
def test_ascending_sort(self):
50+
"""Test ascending sort parameter."""
51+
sort: SortParam = {
52+
"field": "created_at",
53+
"direction": SortOrder.ASC,
54+
}
55+
56+
assert sort["field"] == "created_at"
57+
assert sort["direction"] == 1
58+
59+
def test_descending_sort(self):
60+
"""Test descending sort parameter."""
61+
sort: SortParam = {
62+
"field": "last_message_at",
63+
"direction": SortOrder.DESC,
64+
}
65+
66+
assert sort["field"] == "last_message_at"
67+
assert sort["direction"] == -1

stream_chat/types/base.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import sys
22
from enum import IntEnum
3-
from typing import Optional
3+
from typing import Any, Dict, List, Optional
44

55
if sys.version_info >= (3, 8):
66
from typing import TypedDict
@@ -43,3 +43,20 @@ class Pager(TypedDict, total=False):
4343
limit: Optional[int]
4444
next: Optional[str]
4545
prev: Optional[str]
46+
47+
48+
class ParsedPredefinedFilterResponse(TypedDict, total=False):
49+
"""
50+
Represents the parsed/interpolated predefined filter returned in QueryChannels response.
51+
52+
This is only present when a predefined filter is used in the query.
53+
54+
Parameters:
55+
name: The name of the predefined filter that was used.
56+
filter: The interpolated filter with placeholders replaced by actual values.
57+
sort: The interpolated sort parameters (optional).
58+
"""
59+
60+
name: str
61+
filter: Dict[str, Any]
62+
sort: Optional[List[SortParam]]

0 commit comments

Comments
 (0)