@@ -1314,3 +1314,144 @@ def resolve_films(root, info):
13141314 }
13151315 }
13161316 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