|
14 | 14 |
|
15 | 15 | if DJANGO_FILTER_INSTALLED: |
16 | 16 | import django_filters |
| 17 | + from django_filters import FilterSet, NumberFilter |
| 18 | + |
17 | 19 | from graphene_django.filter import (GlobalIDFilter, DjangoFilterConnectionField, |
18 | 20 | GlobalIDMultipleChoiceFilter) |
19 | 21 | from graphene_django.filter.tests.filters import ArticleFilter, PetFilter, ReporterFilter |
20 | 22 | else: |
21 | | - pytestmark.append(pytest.mark.skipif(True, reason='django_filters not installed')) |
| 23 | + pytestmark.append(pytest.mark.skipif(True, reason='django_filters not installed or not compatible')) |
22 | 24 |
|
23 | 25 | pytestmark.append(pytest.mark.django_db) |
24 | 26 |
|
@@ -365,3 +367,170 @@ class Query(ObjectType): |
365 | 367 | all_reporters = DjangoFilterConnectionField(ReporterFilterNode) |
366 | 368 |
|
367 | 369 | assert ReporterFilterNode._meta.fields['child_reporters'].node_type == ReporterFilterNode |
| 370 | + |
| 371 | + |
| 372 | +def test_should_query_filter_node_limit(): |
| 373 | + class ReporterFilter(FilterSet): |
| 374 | + limit = NumberFilter(method='filter_limit') |
| 375 | + |
| 376 | + def filter_limit(self, queryset, name, value): |
| 377 | + return queryset[:value] |
| 378 | + |
| 379 | + class Meta: |
| 380 | + model = Reporter |
| 381 | + fields = ['first_name', ] |
| 382 | + |
| 383 | + class ReporterType(DjangoObjectType): |
| 384 | + |
| 385 | + class Meta: |
| 386 | + model = Reporter |
| 387 | + interfaces = (Node, ) |
| 388 | + |
| 389 | + class ArticleType(DjangoObjectType): |
| 390 | + |
| 391 | + class Meta: |
| 392 | + model = Article |
| 393 | + interfaces = (Node, ) |
| 394 | + filter_fields = ('lang', ) |
| 395 | + |
| 396 | + class Query(ObjectType): |
| 397 | + all_reporters = DjangoFilterConnectionField( |
| 398 | + ReporterType, |
| 399 | + filterset_class=ReporterFilter |
| 400 | + ) |
| 401 | + |
| 402 | + def resolve_all_reporters(self, args, context, info): |
| 403 | + return Reporter.objects.order_by('a_choice') |
| 404 | + |
| 405 | + Reporter.objects.create( |
| 406 | + first_name='Bob', |
| 407 | + last_name='Doe', |
| 408 | + email='bobdoe@example.com', |
| 409 | + a_choice=2 |
| 410 | + ) |
| 411 | + r = Reporter.objects.create( |
| 412 | + first_name='John', |
| 413 | + last_name='Doe', |
| 414 | + email='johndoe@example.com', |
| 415 | + a_choice=1 |
| 416 | + ) |
| 417 | + |
| 418 | + Article.objects.create( |
| 419 | + headline='Article Node 1', |
| 420 | + pub_date=datetime.now(), |
| 421 | + reporter=r, |
| 422 | + editor=r, |
| 423 | + lang='es' |
| 424 | + ) |
| 425 | + Article.objects.create( |
| 426 | + headline='Article Node 2', |
| 427 | + pub_date=datetime.now(), |
| 428 | + reporter=r, |
| 429 | + editor=r, |
| 430 | + lang='en' |
| 431 | + ) |
| 432 | + |
| 433 | + schema = Schema(query=Query) |
| 434 | + query = ''' |
| 435 | + query NodeFilteringQuery { |
| 436 | + allReporters(limit: 1) { |
| 437 | + edges { |
| 438 | + node { |
| 439 | + id |
| 440 | + firstName |
| 441 | + articles(lang: "es") { |
| 442 | + edges { |
| 443 | + node { |
| 444 | + id |
| 445 | + lang |
| 446 | + } |
| 447 | + } |
| 448 | + } |
| 449 | + } |
| 450 | + } |
| 451 | + } |
| 452 | + } |
| 453 | + ''' |
| 454 | + |
| 455 | + expected = { |
| 456 | + 'allReporters': { |
| 457 | + 'edges': [{ |
| 458 | + 'node': { |
| 459 | + 'id': 'UmVwb3J0ZXJUeXBlOjI=', |
| 460 | + 'firstName': 'John', |
| 461 | + 'articles': { |
| 462 | + 'edges': [{ |
| 463 | + 'node': { |
| 464 | + 'id': 'QXJ0aWNsZVR5cGU6MQ==', |
| 465 | + 'lang': 'ES' |
| 466 | + } |
| 467 | + }] |
| 468 | + } |
| 469 | + } |
| 470 | + }] |
| 471 | + } |
| 472 | + } |
| 473 | + |
| 474 | + result = schema.execute(query) |
| 475 | + assert not result.errors |
| 476 | + assert result.data == expected |
| 477 | + |
| 478 | + |
| 479 | +def test_should_query_filter_node_double_limit_raises(): |
| 480 | + class ReporterFilter(FilterSet): |
| 481 | + limit = NumberFilter(method='filter_limit') |
| 482 | + |
| 483 | + def filter_limit(self, queryset, name, value): |
| 484 | + return queryset[:value] |
| 485 | + |
| 486 | + class Meta: |
| 487 | + model = Reporter |
| 488 | + fields = ['first_name', ] |
| 489 | + |
| 490 | + class ReporterType(DjangoObjectType): |
| 491 | + |
| 492 | + class Meta: |
| 493 | + model = Reporter |
| 494 | + interfaces = (Node, ) |
| 495 | + |
| 496 | + class Query(ObjectType): |
| 497 | + all_reporters = DjangoFilterConnectionField( |
| 498 | + ReporterType, |
| 499 | + filterset_class=ReporterFilter |
| 500 | + ) |
| 501 | + |
| 502 | + def resolve_all_reporters(self, args, context, info): |
| 503 | + return Reporter.objects.order_by('a_choice')[:2] |
| 504 | + |
| 505 | + Reporter.objects.create( |
| 506 | + first_name='Bob', |
| 507 | + last_name='Doe', |
| 508 | + email='bobdoe@example.com', |
| 509 | + a_choice=2 |
| 510 | + ) |
| 511 | + r = Reporter.objects.create( |
| 512 | + first_name='John', |
| 513 | + last_name='Doe', |
| 514 | + email='johndoe@example.com', |
| 515 | + a_choice=1 |
| 516 | + ) |
| 517 | + |
| 518 | + schema = Schema(query=Query) |
| 519 | + query = ''' |
| 520 | + query NodeFilteringQuery { |
| 521 | + allReporters(limit: 1) { |
| 522 | + edges { |
| 523 | + node { |
| 524 | + id |
| 525 | + firstName |
| 526 | + } |
| 527 | + } |
| 528 | + } |
| 529 | + } |
| 530 | + ''' |
| 531 | + |
| 532 | + result = schema.execute(query) |
| 533 | + assert len(result.errors) == 1 |
| 534 | + assert str(result.errors[0]) == ( |
| 535 | + 'Received two sliced querysets (high mark) in the connection, please slice only in one.' |
| 536 | + ) |
0 commit comments