import pytest from rest_framework.test import APIClient from apps.clients.models import Client from apps.projects.models import Project from apps.users.models import User from apps.workspaces.models import Workspace, WorkspaceMembership @pytest.fixture() def api_client(): return APIClient() @pytest.fixture() def owner(db): return User.objects.create_user(mobile="09121110001", password="secret123", first_name="Owner") @pytest.fixture() def workspace(owner): return Workspace.objects.create(name="Projects", owner=owner) @pytest.fixture() def member(db, workspace): user = User.objects.create_user(mobile="09121110002", password="secret123", first_name="Member") WorkspaceMembership.objects.create( workspace=workspace, user=user, role=WorkspaceMembership.Role.MEMBER, is_active=True, ) return user @pytest.fixture() def clients(workspace): first = Client.objects.create(workspace=workspace, name="Acme") second = Client.objects.create(workspace=workspace, name="Globex") third = Client.objects.create(workspace=workspace, name="Initech") return first, second, third @pytest.fixture() def projects(workspace, clients): first, second, third = clients return [ Project.objects.create(workspace=workspace, client=first, name="Alpha"), Project.objects.create(workspace=workspace, client=second, name="Beta"), Project.objects.create(workspace=workspace, client=third, name="Gamma"), ] def test_project_list_supports_multi_client_filter(api_client, member, workspace, clients, projects): api_client.force_authenticate(user=member) first, second, _ = clients response = api_client.get( "/api/projects/", [ ("workspace", str(workspace.id)), ("clients", str(first.id)), ("clients", str(second.id)), ], ) assert response.status_code == 200 items = ( response.data if isinstance(response.data, list) else response.data.get("results") or response.data.get("items", []) ) result_ids = {str(item["client"]["id"]) for item in items} assert result_ids == {str(first.id), str(second.id)}