44from django .contrib .auth import get_user_model
55from users .models .user import UserRole
66from participant .models import Invitation
7+ from django .utils import timezone
8+ from datetime import timedelta
79
810User = get_user_model ()
911
@@ -60,6 +62,8 @@ def test_invite_participant(self, api_client, researcher_user, participant_user,
6062
6163 url = reverse ("participant-invite" , kwargs = {"pk" : participant_user .pk })
6264 payload = {"email" : "guardian@example.com" }
65+
66+ # print(f"")
6367
6468 response = api_client .post (url , payload , format = "json" )
6569
@@ -86,3 +90,52 @@ def test_check_email(self, api_client, researcher_user, email, is_taken, expecte
8690 assert response .status_code == expected_status
8791 if expected_status == status .HTTP_200_OK :
8892 assert response .data ["detail" ] == "Email is available"
93+
94+ @pytest .mark .parametrize ("invited_by_user" , [True , False ])
95+ def test_list_participants_filtered_by_logged_in_user (
96+ self , api_client , researcher_user , participant_user , invited_by_user
97+ ):
98+ """
99+ Test that the list endpoint only returns participants invited by the logged-in researcher.
100+ """
101+
102+ participant_1 = User .objects .create_user (
103+ email = "p1@example.com" , password = "password123" , role = UserRole .PARTICIPANT
104+ )
105+ participant_2 = User .objects .create_user (
106+ email = "p2@example.com" , password = "password123" , role = UserRole .PARTICIPANT
107+ )
108+
109+ expiry = timezone .now () + timedelta (days = 7 )
110+
111+ if invited_by_user :
112+ Invitation .objects .create (user = participant_1 , invited_by = researcher_user , expiry_date = expiry )
113+ Invitation .objects .create (user = participant_2 , invited_by = researcher_user , expiry_date = expiry )
114+ expected_ids = [participant_1 .id , participant_2 .id ]
115+ else :
116+ other_researcher = User .objects .create_user (
117+ email = "other@example.com" ,
118+ password = "password123" ,
119+ role = UserRole .RESEARCHER
120+ )
121+ Invitation .objects .create (user = participant_1 , invited_by = other_researcher , expiry_date = expiry )
122+ Invitation .objects .create (user = participant_2 , invited_by = other_researcher , expiry_date = expiry )
123+ expected_ids = []
124+
125+ api_client .force_authenticate (user = researcher_user )
126+ url = reverse ("participant-list" )
127+ response = api_client .get (url , format = "json" )
128+
129+ assert response .status_code == 200
130+
131+ # Handle pagination if present
132+ if isinstance (response .data , dict ) and "results" in response .data :
133+ returned_ids = [p ["id" ] for p in response .data ["results" ]]
134+ else :
135+ returned_ids = [p ["id" ] for p in response .data ]
136+
137+ print (f"\n Invited: { invited_by_user } " )
138+ print (f"Expected IDs: { expected_ids } " )
139+ print (f"Returned IDs: { returned_ids } " )
140+
141+ assert set (returned_ids ) == set (expected_ids ), f"Expected IDs { expected_ids } , but got { returned_ids } "
0 commit comments