From 4de9e8de2651d437a36ff5ccb6892508d2bcf24c Mon Sep 17 00:00:00 2001 From: Karol Konkol Date: Wed, 26 Nov 2025 10:59:08 +0100 Subject: [PATCH] Fix tests --- docker-compose-test.yaml | 4 -- fishjam/_openapi_client/api/room/add_peer.py | 4 ++ fishjam/_openapi_client/models/__init__.py | 2 + fishjam/_openapi_client/models/peer.py | 10 +-- fishjam/_openapi_client/models/stream.py | 8 +++ .../_openapi_client/models/subscriptions.py | 72 +++++++++++++++++++ fishjam/errors.py | 9 +++ tests/test_room_api.py | 8 +-- 8 files changed, 105 insertions(+), 12 deletions(-) create mode 100644 fishjam/_openapi_client/models/subscriptions.py diff --git a/docker-compose-test.yaml b/docker-compose-test.yaml index b649134..0452d2f 100644 --- a/docker-compose-test.yaml +++ b/docker-compose-test.yaml @@ -15,8 +15,6 @@ services: FJ_ADMIN_TOKEN: "12345" FJ_PORT: 5002 FJ_SECRET_KEY_BASE: "super-secret-key" - FJ_SIP_IP: "127.0.0.1" - FJ_COMPONENTS_USED: "rtsp file hls recording sip" FJ_BROADCASTING_ENABLED: "true" FJ_BROADCASTER_URL: "http://broadcaster:4000" FJ_BROADCASTER_TOKEN: "broadcaster_token" @@ -25,8 +23,6 @@ services: - "5002:5002" - "49999:49999" - "50000-50050:50000-50050/udp" - volumes: - - ./tests/fixtures:/app/fishjam_resources/file_component_sources fishjam-prep: image: curlimages/curl:8.12.1 diff --git a/fishjam/_openapi_client/api/room/add_peer.py b/fishjam/_openapi_client/api/room/add_peer.py index f4eac69..8d0cd25 100644 --- a/fishjam/_openapi_client/api/room/add_peer.py +++ b/fishjam/_openapi_client/api/room/add_peer.py @@ -52,6 +52,10 @@ def _parse_response( response_404 = Error.from_dict(response.json()) return response_404 + if response.status_code == 409: + response_409 = Error.from_dict(response.json()) + + return response_409 if response.status_code == 503: response_503 = Error.from_dict(response.json()) diff --git a/fishjam/_openapi_client/models/__init__.py b/fishjam/_openapi_client/models/__init__.py index 4261daf..3f611d3 100644 --- a/fishjam/_openapi_client/models/__init__.py +++ b/fishjam/_openapi_client/models/__init__.py @@ -36,6 +36,7 @@ from .streams_listing_response import StreamsListingResponse from .subscribe_mode import SubscribeMode from .subscribe_tracks_body import SubscribeTracksBody +from .subscriptions import Subscriptions from .track import Track from .track_metadata_type_0 import TrackMetadataType0 from .track_type import TrackType @@ -78,6 +79,7 @@ "StreamsListingResponse", "SubscribeMode", "SubscribeTracksBody", + "Subscriptions", "Track", "TrackMetadataType0", "TrackType", diff --git a/fishjam/_openapi_client/models/peer.py b/fishjam/_openapi_client/models/peer.py index 9203218..291a47e 100644 --- a/fishjam/_openapi_client/models/peer.py +++ b/fishjam/_openapi_client/models/peer.py @@ -16,6 +16,7 @@ if TYPE_CHECKING: from ..models.peer_metadata import PeerMetadata + from ..models.subscriptions import Subscriptions from ..models.track import Track @@ -31,7 +32,7 @@ class Peer: metadata (Union['PeerMetadata', None]): Custom metadata set by the peer Example: {'name': 'FishjamUser'}. status (PeerStatus): Informs about the peer status Example: disconnected. subscribe_mode (SubscribeMode): Configuration of peer's subscribing policy - subscriptions (list[str]): Describes peer's subscriptions in manual mode + subscriptions (Subscriptions): Describes peer's subscriptions in manual mode tracks (list['Track']): List of all peer's tracks type_ (PeerType): Peer type Example: webrtc. """ @@ -40,7 +41,7 @@ class Peer: metadata: Union["PeerMetadata", None] status: PeerStatus subscribe_mode: SubscribeMode - subscriptions: list[str] + subscriptions: "Subscriptions" tracks: list["Track"] type_: PeerType additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) @@ -60,7 +61,7 @@ def to_dict(self) -> dict[str, Any]: subscribe_mode = self.subscribe_mode.value - subscriptions = self.subscriptions + subscriptions = self.subscriptions.to_dict() tracks = [] for tracks_item_data in self.tracks: @@ -88,6 +89,7 @@ def to_dict(self) -> dict[str, Any]: @classmethod def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: from ..models.peer_metadata import PeerMetadata + from ..models.subscriptions import Subscriptions from ..models.track import Track d = dict(src_dict) @@ -112,7 +114,7 @@ def _parse_metadata(data: object) -> Union["PeerMetadata", None]: subscribe_mode = SubscribeMode(d.pop("subscribeMode")) - subscriptions = cast(list[str], d.pop("subscriptions")) + subscriptions = Subscriptions.from_dict(d.pop("subscriptions")) tracks = [] _tracks = d.pop("tracks") diff --git a/fishjam/_openapi_client/models/stream.py b/fishjam/_openapi_client/models/stream.py index dca2cfa..a87aa90 100644 --- a/fishjam/_openapi_client/models/stream.py +++ b/fishjam/_openapi_client/models/stream.py @@ -24,6 +24,7 @@ class Stream: """Describes stream status Attributes: + connected_viewers (int): Number of connected viewers id (str): Assigned stream id public (bool): streamers (list['Streamer']): List of all streamers @@ -31,6 +32,7 @@ class Stream: audio_only (Union[Unset, bool]): True if stream is restricted to audio only """ + connected_viewers: int id: str public: bool streamers: list["Streamer"] @@ -39,6 +41,8 @@ class Stream: additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) def to_dict(self) -> dict[str, Any]: + connected_viewers = self.connected_viewers + id = self.id public = self.public @@ -59,6 +63,7 @@ def to_dict(self) -> dict[str, Any]: field_dict.update(self.additional_properties) field_dict.update( { + "connectedViewers": connected_viewers, "id": id, "public": public, "streamers": streamers, @@ -76,6 +81,8 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: from ..models.viewer import Viewer d = dict(src_dict) + connected_viewers = d.pop("connectedViewers") + id = d.pop("id") public = d.pop("public") @@ -97,6 +104,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: audio_only = d.pop("audioOnly", UNSET) stream = cls( + connected_viewers=connected_viewers, id=id, public=public, streamers=streamers, diff --git a/fishjam/_openapi_client/models/subscriptions.py b/fishjam/_openapi_client/models/subscriptions.py new file mode 100644 index 0000000..673e2e1 --- /dev/null +++ b/fishjam/_openapi_client/models/subscriptions.py @@ -0,0 +1,72 @@ +from collections.abc import Mapping +from typing import ( + Any, + TypeVar, + cast, +) + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +T = TypeVar("T", bound="Subscriptions") + + +@_attrs_define +class Subscriptions: + """Describes peer's subscriptions in manual mode + + Attributes: + peers (list[str]): List of peer IDs this peer subscribes to + tracks (list[str]): List of track IDs this peer subscribes to + """ + + peers: list[str] + tracks: list[str] + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + def to_dict(self) -> dict[str, Any]: + peers = self.peers + + tracks = self.tracks + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update( + { + "peers": peers, + "tracks": tracks, + } + ) + + return field_dict + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + peers = cast(list[str], d.pop("peers")) + + tracks = cast(list[str], d.pop("tracks")) + + subscriptions = cls( + peers=peers, + tracks=tracks, + ) + + subscriptions.additional_properties = d + return subscriptions + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/fishjam/errors.py b/fishjam/errors.py index 0356ec7..c34dd0f 100644 --- a/fishjam/errors.py +++ b/fishjam/errors.py @@ -29,6 +29,9 @@ def from_response(response: Response[Error]): case HTTPStatus.SERVICE_UNAVAILABLE: return ServiceUnavailableError(errors) + case HTTPStatus.CONFLICT: + return ConflictError(errors) + case _: return InternalServerError(errors) @@ -61,3 +64,9 @@ class InternalServerError(HTTPError): def __init__(self, errors): """@private""" super().__init__(errors) + + +class ConflictError(HTTPError): + def __init__(self, errors): + """@private""" + super().__init__(errors) diff --git a/tests/test_room_api.py b/tests/test_room_api.py index 0da0c7c..f64fc1a 100644 --- a/tests/test_room_api.py +++ b/tests/test_room_api.py @@ -9,11 +9,11 @@ Room, RoomOptions, ) -from fishjam._openapi_client.models import SubscribeMode +from fishjam._openapi_client.models import SubscribeMode, Subscriptions from fishjam.errors import ( BadRequestError, + ConflictError, NotFoundError, - ServiceUnavailableError, UnauthorizedError, ) from fishjam.peer import ( @@ -179,7 +179,7 @@ def _assert_peer_created( tracks=[], metadata=PeerMetadata.from_dict({"peer": {}, "server": server_metadata}), subscribe_mode=SubscribeMode.AUTO, - subscriptions=[], + subscriptions=Subscriptions(peers=[], tracks=[]), ) room = room_api.get_room(room_id) @@ -213,7 +213,7 @@ def test_peer_limit_reached(self, room_api: FishjamClient): self._assert_peer_created(room_api, peer, room.id) - with pytest.raises(ServiceUnavailableError): + with pytest.raises(ConflictError): room_api.create_peer(room.id)