Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions stream_chat/tests/test_types.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
"""Tests for type definitions."""

from stream_chat.types.base import (
ParsedPredefinedFilterResponse,
SortOrder,
SortParam,
)


class TestParsedPredefinedFilterResponse:
"""Tests for ParsedPredefinedFilterResponse type."""

def test_type_definition(self):
"""Test that ParsedPredefinedFilterResponse can be used as a type hint."""
response: ParsedPredefinedFilterResponse = {
"name": "user_messaging",
"filter": {"type": "messaging", "members": {"$in": ["user123"]}},
"sort": [{"field": "last_message_at", "direction": SortOrder.DESC}],
}

assert response["name"] == "user_messaging"
assert response["filter"]["type"] == "messaging"
assert response["sort"][0]["field"] == "last_message_at"
assert response["sort"][0]["direction"] == SortOrder.DESC

def test_optional_sort(self):
"""Test that sort is optional in ParsedPredefinedFilterResponse."""
response: ParsedPredefinedFilterResponse = {
"name": "simple_filter",
"filter": {"type": "messaging"},
}

assert response["name"] == "simple_filter"
assert "sort" not in response

def test_empty_filter(self):
"""Test that filter can be empty dict."""
response: ParsedPredefinedFilterResponse = {
"name": "empty_filter",
"filter": {},
}

assert response["filter"] == {}


class TestSortParam:
"""Tests for SortParam type."""

def test_ascending_sort(self):
"""Test ascending sort parameter."""
sort: SortParam = {
"field": "created_at",
"direction": SortOrder.ASC,
}

assert sort["field"] == "created_at"
assert sort["direction"] == 1

def test_descending_sort(self):
"""Test descending sort parameter."""
sort: SortParam = {
"field": "last_message_at",
"direction": SortOrder.DESC,
}

assert sort["field"] == "last_message_at"
assert sort["direction"] == -1
19 changes: 18 additions & 1 deletion stream_chat/types/base.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import sys
from enum import IntEnum
from typing import Optional
from typing import Any, Dict, List, Optional

if sys.version_info >= (3, 8):
from typing import TypedDict
Expand Down Expand Up @@ -43,3 +43,20 @@ class Pager(TypedDict, total=False):
limit: Optional[int]
next: Optional[str]
prev: Optional[str]


class ParsedPredefinedFilterResponse(TypedDict, total=False):
"""
Represents the parsed/interpolated predefined filter returned in QueryChannels response.

This is only present when a predefined filter is used in the query.

Parameters:
name: The name of the predefined filter that was used.
filter: The interpolated filter with placeholders replaced by actual values.
sort: The interpolated sort parameters (optional).
"""

name: str
filter: Dict[str, Any]
sort: Optional[List[SortParam]]
Loading