@@ -1314,3 +1314,144 @@ def resolve_films(root, info):
1314
1314
}
1315
1315
}
1316
1316
assert result .data == expected , str (result .data )
1317
+
1318
+
1319
+ def test_connection_should_enable_offset_filtering ():
1320
+ Reporter .objects .create (first_name = "John" , last_name = "Doe" )
1321
+ Reporter .objects .create (first_name = "Some" , last_name = "Guy" )
1322
+
1323
+ class ReporterType (DjangoObjectType ):
1324
+ class Meta :
1325
+ model = Reporter
1326
+ interfaces = (Node ,)
1327
+
1328
+ class Query (graphene .ObjectType ):
1329
+ all_reporters = DjangoConnectionField (ReporterType )
1330
+
1331
+ schema = graphene .Schema (query = Query )
1332
+ query = """
1333
+ query {
1334
+ allReporters(first: 1, offset: 1) {
1335
+ edges {
1336
+ node {
1337
+ firstName
1338
+ lastName
1339
+ }
1340
+ }
1341
+ }
1342
+ }
1343
+ """
1344
+
1345
+ result = schema .execute (query )
1346
+ assert not result .errors
1347
+ expected = {
1348
+ "allReporters" : {"edges" : [{"node" : {"firstName" : "Some" , "lastName" : "Guy" }},]}
1349
+ }
1350
+ assert result .data == expected
1351
+
1352
+
1353
+ def test_connection_should_enable_offset_filtering_higher_than_max_limit (
1354
+ graphene_settings ,
1355
+ ):
1356
+ graphene_settings .RELAY_CONNECTION_MAX_LIMIT = 2
1357
+ Reporter .objects .create (first_name = "John" , last_name = "Doe" )
1358
+ Reporter .objects .create (first_name = "Some" , last_name = "Guy" )
1359
+ Reporter .objects .create (first_name = "Jane" , last_name = "Roe" )
1360
+ Reporter .objects .create (first_name = "Some" , last_name = "Lady" )
1361
+
1362
+ class ReporterType (DjangoObjectType ):
1363
+ class Meta :
1364
+ model = Reporter
1365
+ interfaces = (Node ,)
1366
+
1367
+ class Query (graphene .ObjectType ):
1368
+ all_reporters = DjangoConnectionField (ReporterType )
1369
+
1370
+ schema = graphene .Schema (query = Query )
1371
+ query = """
1372
+ query {
1373
+ allReporters(first: 1, offset: 3) {
1374
+ edges {
1375
+ node {
1376
+ firstName
1377
+ lastName
1378
+ }
1379
+ }
1380
+ }
1381
+ }
1382
+ """
1383
+
1384
+ result = schema .execute (query )
1385
+ assert not result .errors
1386
+ expected = {
1387
+ "allReporters" : {
1388
+ "edges" : [{"node" : {"firstName" : "Some" , "lastName" : "Lady" }},]
1389
+ }
1390
+ }
1391
+ assert result .data == expected
1392
+
1393
+
1394
+ def test_connection_should_forbid_offset_filtering_with_before ():
1395
+ class ReporterType (DjangoObjectType ):
1396
+ class Meta :
1397
+ model = Reporter
1398
+ interfaces = (Node ,)
1399
+
1400
+ class Query (graphene .ObjectType ):
1401
+ all_reporters = DjangoConnectionField (ReporterType )
1402
+
1403
+ schema = graphene .Schema (query = Query )
1404
+ query = """
1405
+ query ReporterPromiseConnectionQuery ($before: String) {
1406
+ allReporters(first: 1, before: $before, offset: 1) {
1407
+ edges {
1408
+ node {
1409
+ firstName
1410
+ lastName
1411
+ }
1412
+ }
1413
+ }
1414
+ }
1415
+ """
1416
+ before = base64 .b64encode (b"arrayconnection:2" ).decode ()
1417
+ result = schema .execute (query , variable_values = dict (before = before ))
1418
+ expected_error = "You can't provide a `before` value at the same time as an `offset` value to properly paginate the `allReporters` connection."
1419
+ assert len (result .errors ) == 1
1420
+ assert result .errors [0 ].message == expected_error
1421
+
1422
+
1423
+ def test_connection_should_allow_offset_filtering_with_after ():
1424
+ Reporter .objects .create (first_name = "John" , last_name = "Doe" )
1425
+ Reporter .objects .create (first_name = "Some" , last_name = "Guy" )
1426
+ Reporter .objects .create (first_name = "Jane" , last_name = "Roe" )
1427
+ Reporter .objects .create (first_name = "Some" , last_name = "Lady" )
1428
+
1429
+ class ReporterType (DjangoObjectType ):
1430
+ class Meta :
1431
+ model = Reporter
1432
+ interfaces = (Node ,)
1433
+
1434
+ class Query (graphene .ObjectType ):
1435
+ all_reporters = DjangoConnectionField (ReporterType )
1436
+
1437
+ schema = graphene .Schema (query = Query )
1438
+ query = """
1439
+ query ReporterPromiseConnectionQuery ($after: String) {
1440
+ allReporters(first: 1, after: $after, offset: 1) {
1441
+ edges {
1442
+ node {
1443
+ firstName
1444
+ lastName
1445
+ }
1446
+ }
1447
+ }
1448
+ }
1449
+ """
1450
+
1451
+ after = base64 .b64encode (b"arrayconnection:0" ).decode ()
1452
+ result = schema .execute (query , variable_values = dict (after = after ))
1453
+ assert not result .errors
1454
+ expected = {
1455
+ "allReporters" : {"edges" : [{"node" : {"firstName" : "Jane" , "lastName" : "Roe" }},]}
1456
+ }
1457
+ assert result .data == expected
0 commit comments