@@ -226,3 +226,115 @@ def testInvalidPersonId(self, client):
226
226
def testInvalidPerson (self , client ):
227
227
response = client .delete (f"/person/{ uuid .uuid4 ()} " )
228
228
assert response .status_code == 404
229
+
230
+
231
+ class TestGetOrphanedPersons :
232
+ def testGetOrphanedPersons (self , client ):
233
+ person1 = models .Person ()
234
+ patient1 = models .Patient (person = person1 , data = {})
235
+
236
+ person2 = models .Person ()
237
+ client .session .add_all ([patient1 , person2 ])
238
+ client .session .flush ()
239
+
240
+ response = client .get ("/person/orphaned" )
241
+ assert response .status_code == 200
242
+ assert response .json () == {
243
+ "data" : [str (person2 .reference_id )],
244
+ "meta" : {"next_cursor" : None , "next" : None },
245
+ }
246
+
247
+ def test_no_orphaned_persons (self , client ):
248
+ response = client .get ("/person/orphaned" )
249
+ assert response .status_code == 200
250
+ assert response .json () == {
251
+ "data" : [],
252
+ "meta" : {"next_cursor" : None , "next" : None },
253
+ }
254
+
255
+ def test_get_orphaned_persons_with_limit (self , client ):
256
+ person1 = models .Person (id = 1 )
257
+ person2 = models .Person (id = 2 )
258
+ person3 = models .Person (id = 3 )
259
+ person4 = models .Person (id = 4 )
260
+ client .session .add_all ([person1 , person2 , person3 , person4 ])
261
+ client .session .flush ()
262
+
263
+ response = client .get ("/person/orphaned?limit=2" )
264
+ assert response .status_code == 200
265
+ assert response .json () == {
266
+ "data" : [str (person1 .reference_id ), str (person2 .reference_id )],
267
+ "meta" : {
268
+ "next_cursor" : str (person2 .reference_id ),
269
+ "next" : f"http://testserver/person/orphaned?limit=2&cursor={ str (person2 .reference_id )} " ,
270
+ },
271
+ }
272
+
273
+ response = client .get (f"/person/orphaned?limit=2&cursor={ person2 .reference_id } " )
274
+ assert response .json () == {
275
+ "data" : [str (person3 .reference_id ), str (person4 .reference_id )],
276
+ "meta" : {
277
+ "next_cursor" : str (person4 .reference_id ),
278
+ "next" : f"http://testserver/person/orphaned?limit=2&cursor={ str (person4 .reference_id )} " ,
279
+ },
280
+ }
281
+
282
+ response = client .get (f"/person/orphaned?limit=5&cursor={ person2 .reference_id } " )
283
+ assert response .json () == {
284
+ "data" : [str (person3 .reference_id ), str (person4 .reference_id )],
285
+ "meta" : {"next_cursor" : None , "next" : None },
286
+ }
287
+
288
+ def test_get_orphaned_persons_with_cursor (self , client ):
289
+ person1 = models .Person (reference_id = uuid .uuid4 (), id = 1 )
290
+ patient1 = models .Patient (person = person1 )
291
+ patient2 = models .Patient (person = None )
292
+ person3 = models .Person (id = 3 )
293
+ person4 = models .Person (id = 4 )
294
+ client .session .add_all ([patient1 , patient2 , person3 , person4 ])
295
+ client .session .flush ()
296
+
297
+ # Retrieve 1 person after person 1, return no cursor
298
+ response = client .get (f"/person/orphaned?&cursor={ person3 .reference_id } " )
299
+ assert response .status_code == 200
300
+ assert response .json () == {
301
+ "data" : [str (person4 .reference_id )],
302
+ "meta" : {
303
+ "next_cursor" : None ,
304
+ "next" : None ,
305
+ },
306
+ }
307
+
308
+ # Retrieve 1 person after person 1, return cursor for person 3
309
+ response = client .get (f"/person/orphaned?limit=1&cursor={ person1 .reference_id } " )
310
+ assert response .json () == {
311
+ "data" : [str (person3 .reference_id )],
312
+ "meta" : {
313
+ "next_cursor" : str (person3 .reference_id ),
314
+ "next" : f"http://testserver/person/orphaned?limit=1&cursor={ str (person3 .reference_id )} " ,
315
+ },
316
+ }
317
+
318
+ # Retrieve 2 persons after person 2, return cursor for person 4
319
+ response = client .get (f"/person/orphaned?limit=2&cursor={ person1 .reference_id } " )
320
+ assert response .json () == {
321
+ "data" : [str (person3 .reference_id ), str (person4 .reference_id )],
322
+ "meta" : {
323
+ "next_cursor" : str (person4 .reference_id ),
324
+ "next" : f"http://testserver/person/orphaned?limit=2&cursor={ str (person4 .reference_id )} " ,
325
+ },
326
+ }
327
+
328
+ def test_invalid_cursor (self , client ):
329
+ # Return 422 if bad patient reference_id is provided as cursor
330
+ response = client .get (f"/person/orphaned?limit=1&cursor={ uuid .uuid4 ()} " )
331
+ assert response .status_code == 422
332
+ assert response .json () == {
333
+ "detail" : [
334
+ {
335
+ "loc" : ["query" , "cursor" ],
336
+ "msg" : "Cursor is an invalid Person reference_id" ,
337
+ "type" : "value_error" ,
338
+ }
339
+ ]
340
+ }
0 commit comments