|
3 | 3 | """Tests for `graphql.backend.core` module."""
|
4 | 4 |
|
5 | 5 | import pytest
|
| 6 | + |
| 7 | +from graphql import GraphQLError |
6 | 8 | from graphql.execution.executors.sync import SyncExecutor
|
| 9 | +from graphql.validation.rules.base import ValidationRule |
7 | 10 |
|
8 | 11 | from ..base import GraphQLBackend, GraphQLDocument
|
9 | 12 | from ..core import GraphQLCoreBackend
|
10 | 13 | from .schema import schema
|
11 | 14 |
|
12 | 15 | if False:
|
13 |
| - from typing import Any |
| 16 | + from pytest_mock import MockFixture |
| 17 | + from typing import Any, List, Optional, Type |
| 18 | + from graphql.language.ast import Document |
14 | 19 |
|
15 | 20 |
|
16 | 21 | def test_core_backend():
|
@@ -52,3 +57,42 @@ def test_backend_can_execute_custom_executor():
|
52 | 57 | assert not result.errors
|
53 | 58 | assert result.data == {"hello": "World"}
|
54 | 59 | assert executor.executed
|
| 60 | + |
| 61 | + |
| 62 | +class AlwaysFailValidator(ValidationRule): |
| 63 | + # noinspection PyPep8Naming |
| 64 | + def enter_Document(self, node, key, parent, path, ancestors): |
| 65 | + # type: (Document, Optional[Any], Optional[Any], List, List) -> None |
| 66 | + self.context.report_error(GraphQLError("Test validator failure", [node])) |
| 67 | + |
| 68 | + |
| 69 | +class CustomValidatorBackend(GraphQLCoreBackend): |
| 70 | + def get_validation_rules(self): |
| 71 | + # type: () -> List[Type[ValidationRule]] |
| 72 | + return [AlwaysFailValidator] |
| 73 | + |
| 74 | + |
| 75 | +def test_backend_custom_validators_result(): |
| 76 | + # type: () -> None |
| 77 | + backend = CustomValidatorBackend() |
| 78 | + assert isinstance(backend, CustomValidatorBackend) |
| 79 | + document = backend.document_from_string(schema, "{ hello }") |
| 80 | + assert isinstance(document, GraphQLDocument) |
| 81 | + result = document.execute() |
| 82 | + assert result.errors |
| 83 | + assert len(result.errors) == 1 |
| 84 | + assert result.errors[0].message == "Test validator failure" |
| 85 | + |
| 86 | + |
| 87 | +def test_backend_custom_validators_in_validation_args(mocker): |
| 88 | + # type: (MockFixture) -> None |
| 89 | + mocked_validate = mocker.patch("graphql.backend.core.validate") |
| 90 | + backend = CustomValidatorBackend() |
| 91 | + assert isinstance(backend, CustomValidatorBackend) |
| 92 | + document = backend.document_from_string(schema, "{ hello }") |
| 93 | + assert isinstance(document, GraphQLDocument) |
| 94 | + mocked_validate.assert_not_called() |
| 95 | + result = document.execute() |
| 96 | + mocked_validate.assert_called_once() |
| 97 | + (args, kwargs) = mocked_validate.call_args |
| 98 | + assert [AlwaysFailValidator] in args |
0 commit comments