@@ -72,6 +72,161 @@ public function testDeleteUser() {
7272 $ this ->assertEquals ($ response ["success " ], true );
7373 }
7474
75+ public function testQueryUsers () {
76+ $ mockedResponse = array (
77+ "users " => array (
78+ array (
79+ "userId " => "user-1 " ,
80+ "email " => "test@example.com " ,
81+ "emailVerified " => true ,
82+ "phoneNumber " => "+1234567890 " ,
83+ "phoneNumberVerified " => false ,
84+ "username " => "user1 "
85+ )
86+ ),
87+ "lastEvaluatedUserId " => "user-1 "
88+ );
89+
90+ self ::$ server ->setResponseOfPath ("/users " , new Response (json_encode ($ mockedResponse )));
91+
92+ // At least one of username, email, or phoneNumber is required by the API
93+ $ params = array ("email " => "test@example.com " );
94+ $ response = Authsignal::queryUsers ($ params );
95+
96+ $ this ->assertIsArray ($ response ["users " ]);
97+ $ this ->assertCount (1 , $ response ["users " ]);
98+ $ this ->assertEquals ($ response ["users " ][0 ]["userId " ], "user-1 " );
99+ $ this ->assertEquals ($ response ["users " ][0 ]["email " ], "test@example.com " );
100+ $ this ->assertEquals ($ response ["lastEvaluatedUserId " ], "user-1 " );
101+ }
102+
103+ public function testQueryUsersWithPagination () {
104+ $ mockedResponse = array (
105+ "users " => array (
106+ array (
107+ "userId " => "user-2 " ,
108+ "email " => "test@example.com " ,
109+ "emailVerified " => true ,
110+ "phoneNumber " => null ,
111+ "phoneNumberVerified " => false ,
112+ "username " => null
113+ )
114+ )
115+ );
116+
117+ self ::$ server ->setResponseOfPath ("/users " , new Response (json_encode ($ mockedResponse )));
118+
119+ $ params = array (
120+ "email " => "test@example.com " ,
121+ "limit " => 10 ,
122+ "lastEvaluatedUserId " => "user-1 "
123+ );
124+
125+ $ response = Authsignal::queryUsers ($ params );
126+
127+ $ this ->assertIsArray ($ response ["users " ]);
128+ $ this ->assertCount (1 , $ response ["users " ]);
129+ $ this ->assertEquals ($ response ["users " ][0 ]["email " ], "test@example.com " );
130+ }
131+
132+ public function testQueryUsersWithAllParams () {
133+ $ mockedResponse = array (
134+ "users " => array (
135+ array (
136+ "userId " => "user-3 " ,
137+ "email " => "test@example.com " ,
138+ "emailVerified " => true ,
139+ "phoneNumber " => "+1234567890 " ,
140+ "phoneNumberVerified " => true ,
141+ "username " => "testuser "
142+ )
143+ ),
144+ "lastEvaluatedUserId " => "user-3 " ,
145+ "tokenPayload " => array ("sub " => "user-3 " )
146+ );
147+
148+ self ::$ server ->setResponseOfPath ("/users " , new Response (json_encode ($ mockedResponse )));
149+
150+ $ params = array (
151+ "username " => "testuser " ,
152+ "email " => "test@example.com " ,
153+ "phoneNumber " => "+1234567890 " ,
154+ "token " => "some-token " ,
155+ "limit " => 5 ,
156+ "lastEvaluatedUserId " => "user-2 "
157+ );
158+
159+ $ response = Authsignal::queryUsers ($ params );
160+
161+ $ this ->assertIsArray ($ response ["users " ]);
162+ $ this ->assertCount (1 , $ response ["users " ]);
163+ $ this ->assertEquals ("user-3 " , $ response ["users " ][0 ]["userId " ]);
164+ $ this ->assertEquals ("testuser " , $ response ["users " ][0 ]["username " ]);
165+ $ this ->assertEquals ("+1234567890 " , $ response ["users " ][0 ]["phoneNumber " ]);
166+ $ this ->assertTrue ($ response ["users " ][0 ]["phoneNumberVerified " ]);
167+ $ this ->assertEquals ("user-3 " , $ response ["lastEvaluatedUserId " ]);
168+ $ this ->assertArrayHasKey ("tokenPayload " , $ response );
169+ }
170+
171+ public function testQueryUsersEmptyResult () {
172+ $ mockedResponse = array (
173+ "users " => array ()
174+ );
175+
176+ self ::$ server ->setResponseOfPath ("/users " , new Response (json_encode ($ mockedResponse )));
177+
178+ $ params = array ("email " => "nonexistent@example.com " );
179+ $ response = Authsignal::queryUsers ($ params );
180+
181+ $ this ->assertIsArray ($ response ["users " ]);
182+ $ this ->assertCount (0 , $ response ["users " ]);
183+ $ this ->assertArrayNotHasKey ("lastEvaluatedUserId " , $ response );
184+ }
185+
186+ public function testQueryUsersMultipleResults () {
187+ $ mockedResponse = array (
188+ "users " => array (
189+ array (
190+ "userId " => "user-1 " ,
191+ "email " => "user1@example.com " ,
192+ "emailVerified " => true ,
193+ "phoneNumber " => null ,
194+ "phoneNumberVerified " => false ,
195+ "username " => null
196+ ),
197+ array (
198+ "userId " => "user-2 " ,
199+ "email " => "user2@example.com " ,
200+ "emailVerified " => false ,
201+ "phoneNumber " => "+9876543210 " ,
202+ "phoneNumberVerified " => true ,
203+ "username " => "user2 "
204+ ),
205+ array (
206+ "userId " => "user-3 " ,
207+ "email " => "user3@example.com " ,
208+ "emailVerified " => true ,
209+ "phoneNumber " => null ,
210+ "phoneNumberVerified " => false ,
211+ "username " => "user3 "
212+ )
213+ ),
214+ "lastEvaluatedUserId " => "user-3 "
215+ );
216+
217+ self ::$ server ->setResponseOfPath ("/users " , new Response (json_encode ($ mockedResponse )));
218+
219+ $ params = array ("email " => "example.com " , "limit " => 3 );
220+ $ response = Authsignal::queryUsers ($ params );
221+
222+ $ this ->assertIsArray ($ response ["users " ]);
223+ $ this ->assertCount (3 , $ response ["users " ]);
224+ $ this ->assertEquals ("user-1 " , $ response ["users " ][0 ]["userId " ]);
225+ $ this ->assertEquals ("user-2 " , $ response ["users " ][1 ]["userId " ]);
226+ $ this ->assertEquals ("user-3 " , $ response ["users " ][2 ]["userId " ]);
227+ $ this ->assertEquals ("user-3 " , $ response ["lastEvaluatedUserId " ]);
228+ }
229+
75230 public function testGetAuthenticators () {
76231 $ mockedResponse = array (
77232 array (
0 commit comments