From a341a1b5288a3390fd09d7af238da42f87dca336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Pito=C5=84?= Date: Fri, 15 Oct 2021 13:03:35 +0300 Subject: [PATCH 1/2] Remove ariadne.contrib.django --- CHANGELOG.md | 4 +- ariadne/contrib/django/__init__.py | 1 - ariadne/contrib/django/apps.py | 7 - ariadne/contrib/django/scalars.py | 73 --- .../templates/ariadne/graphql_playground.html | 572 ------------------ ariadne/contrib/django/views.py | 151 ----- 6 files changed, 3 insertions(+), 805 deletions(-) delete mode 100644 ariadne/contrib/django/__init__.py delete mode 100644 ariadne/contrib/django/apps.py delete mode 100644 ariadne/contrib/django/scalars.py delete mode 100644 ariadne/contrib/django/templates/ariadne/graphql_playground.html delete mode 100644 ariadne/contrib/django/views.py diff --git a/CHANGELOG.md b/CHANGELOG.md index d3898fce9..7b405e42a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,9 @@ - Added support for multiple keys for GraphQL federations. - Made `Query` type optional in federated schemas. - Updated default resolvers to test for `Mapping` instead of `dict`. - +- Removed `ariadne.contrib.django`. (Use [ariadne_django](https://github.com/reset-button/ariadne_django) instead). + + ## 0.13.0 (2021-03-17) - Updated `graphQL-core` requirement to 3.1.3. diff --git a/ariadne/contrib/django/__init__.py b/ariadne/contrib/django/__init__.py deleted file mode 100644 index c29f99e34..000000000 --- a/ariadne/contrib/django/__init__.py +++ /dev/null @@ -1 +0,0 @@ -default_app_config = "ariadne.contrib.django.apps.AriadneConfig" diff --git a/ariadne/contrib/django/apps.py b/ariadne/contrib/django/apps.py deleted file mode 100644 index 01ad17a79..000000000 --- a/ariadne/contrib/django/apps.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.apps import AppConfig - - -class AriadneConfig(AppConfig): - name = "ariadne.contrib.django" - label = "ariadne" - verbose_name = "Ariadne" diff --git a/ariadne/contrib/django/scalars.py b/ariadne/contrib/django/scalars.py deleted file mode 100644 index 79d145556..000000000 --- a/ariadne/contrib/django/scalars.py +++ /dev/null @@ -1,73 +0,0 @@ -from datetime import date, datetime, time -from typing import Any, List, Optional, Union - -import dateutil.parser -from django.forms.utils import from_current_timezone -from django.utils import formats -from django.utils.translation import gettext_lazy as _ - -from ...scalars import ScalarType - - -date_input_formats = formats.get_format_lazy("DATE_INPUT_FORMATS") -datetime_input_formats = formats.get_format_lazy("DATETIME_INPUT_FORMATS") -time_input_formats = formats.get_format_lazy("TIME_INPUT_FORMATS") - -date_scalar = ScalarType("Date") -datetime_scalar = ScalarType("DateTime") -time_scalar = ScalarType("Time") - - -@date_scalar.serializer -def serialize_date(value: Union[date, datetime]) -> str: - if isinstance(value, datetime): - value = value.date() - return value.isoformat() - - -@date_scalar.value_parser -def parse_date_value(value: Any) -> date: - parsed_value = parse_value(value, date_input_formats) - if not parsed_value: - raise ValueError(_("Enter a valid date.")) - return parsed_value.date() - - -@datetime_scalar.serializer -def serialize_datetime(value: datetime) -> str: - return value.isoformat() - - -@datetime_scalar.value_parser -def parse_datetime_value(value: Any) -> datetime: - parsed_value = parse_value(value, datetime_input_formats) - if not parsed_value: - raise ValueError(_("Enter a valid date/time.")) - return from_current_timezone(parsed_value) - - -@time_scalar.serializer -def serialize_time(value: time) -> str: - return value.isoformat() - - -@time_scalar.value_parser -def parse_time_value(value: Any) -> time: - parsed_value = parse_value(value, time_input_formats) - if not parsed_value: - raise ValueError(_("Enter a valid time.")) - return parsed_value.time() - - -def parse_value(value: Any, formats: List[str]) -> Optional[datetime]: - for format_str in formats: - try: - return datetime.strptime(value, format_str) - except (ValueError, TypeError): - continue - - # fallback to using dateutil parser - try: - return dateutil.parser.parse(value) - except (ValueError, TypeError): - return None diff --git a/ariadne/contrib/django/templates/ariadne/graphql_playground.html b/ariadne/contrib/django/templates/ariadne/graphql_playground.html deleted file mode 100644 index c1e793119..000000000 --- a/ariadne/contrib/django/templates/ariadne/graphql_playground.html +++ /dev/null @@ -1,572 +0,0 @@ - - - - - - - - GraphQL Playground - - - - - - - - - - -
- -
Loading - GraphQL Playground -
-
- -
- - - - \ No newline at end of file diff --git a/ariadne/contrib/django/views.py b/ariadne/contrib/django/views.py deleted file mode 100644 index 411fb1c52..000000000 --- a/ariadne/contrib/django/views.py +++ /dev/null @@ -1,151 +0,0 @@ -import json -from typing import Any, Callable, Optional, Union, cast - -from django.conf import settings -from django.http import HttpRequest, HttpResponseBadRequest, JsonResponse -from django.shortcuts import render -from django.utils.decorators import method_decorator -from django.views.decorators.csrf import csrf_exempt -from django.views.generic import TemplateView -from graphql import GraphQLSchema -from graphql.execution import MiddlewareManager - -from ...constants import DATA_TYPE_JSON, DATA_TYPE_MULTIPART -from ...exceptions import HttpBadRequestError -from ...file_uploads import combine_multipart_data -from ...format_error import format_error -from ...graphql import graphql_sync -from ...types import ( - ContextValue, - ErrorFormatter, - ExtensionList, - GraphQLResult, - RootValue, - ValidationRules, -) - -Extensions = Union[ - Callable[[Any, Optional[ContextValue]], ExtensionList], ExtensionList -] - -# https://github.com/graphql/graphql-playground#properties -# For complete fields list see PlaygroundWrapperProps interface -DEFAULT_PLAYGROUND_OPTIONS = { - # Playground settings - "settings": { - "request.credentials": "same-origin", - }, - # Request HTTP headers added by default - "headers": {}, -} - - -@method_decorator(csrf_exempt, name="dispatch") -class GraphQLView(TemplateView): - http_method_names = ["get", "post", "options"] - template_name = "ariadne/graphql_playground.html" - playground_options: Optional[dict] = None - introspection: bool = True - schema: Optional[GraphQLSchema] = None - context_value: Optional[ContextValue] = None - root_value: Optional[RootValue] = None - logger = None - validation_rules: Optional[ValidationRules] = None - error_formatter: Optional[ErrorFormatter] = None - extensions: Optional[Extensions] = None - middleware: Optional[MiddlewareManager] = None - - def get( - self, request: HttpRequest, *args, **kwargs - ): # pylint: disable=unused-argument - options = DEFAULT_PLAYGROUND_OPTIONS.copy() - if self.playground_options: - options.update(self.playground_options) - - return render( - request, - self.get_template_names(), - {"playground_options": json.dumps(options)}, - ) - - def post( - self, request: HttpRequest, *args, **kwargs - ): # pylint: disable=unused-argument - if not self.schema: - raise ValueError("GraphQLView was initialized without schema.") - - try: - data = self.extract_data_from_request(request) - except HttpBadRequestError as error: - return HttpResponseBadRequest(error.message) - - success, result = self.execute_query(request, data) - status_code = 200 if success else 400 - return JsonResponse(result, status=status_code) - - def extract_data_from_request(self, request: HttpRequest): - content_type = request.content_type or "" - content_type = content_type.split(";")[0] - - if content_type == DATA_TYPE_JSON: - return self.extract_data_from_json_request(request) - if content_type == DATA_TYPE_MULTIPART: - return self.extract_data_from_multipart_request(request) - - raise HttpBadRequestError( - "Posted content must be of type {} or {}".format( - DATA_TYPE_JSON, DATA_TYPE_MULTIPART - ) - ) - - def extract_data_from_json_request(self, request: HttpRequest): - try: - return json.loads(request.body) - except (TypeError, ValueError) as ex: - raise HttpBadRequestError("Request body is not a valid JSON") from ex - - def extract_data_from_multipart_request(self, request: HttpRequest): - try: - operations = json.loads(request.POST.get("operations")) - except (TypeError, ValueError) as ex: - raise HttpBadRequestError( - "Request 'operations' multipart field is not a valid JSON" - ) from ex - try: - files_map = json.loads(request.POST.get("map")) - except (TypeError, ValueError) as ex: - raise HttpBadRequestError( - "Request 'map' multipart field is not a valid JSON" - ) from ex - - return combine_multipart_data(operations, files_map, request.FILES) - - def execute_query(self, request: HttpRequest, data: dict) -> GraphQLResult: - context_value = self.get_context_for_request(request) - extensions = self.get_extensions_for_request(request, context_value) - - return graphql_sync( - cast(GraphQLSchema, self.schema), - data, - context_value=context_value, - root_value=self.root_value, - validation_rules=self.validation_rules, - debug=settings.DEBUG, - introspection=self.introspection, - logger=self.logger, - error_formatter=self.error_formatter or format_error, - extensions=extensions, - middleware=self.middleware, - ) - - def get_context_for_request(self, request: HttpRequest) -> Optional[ContextValue]: - if callable(self.context_value): - return self.context_value(request) # pylint: disable=not-callable - return self.context_value or {"request": request} - - def get_extensions_for_request( - self, request: HttpRequest, context: Optional[ContextValue] - ) -> ExtensionList: - if callable(self.extensions): - return self.extensions(request, context) # pylint: disable=not-callable - return self.extensions From 41f8445edbfddc7baa11597a419359c5a7feca0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Pito=C5=84?= Date: Fri, 15 Oct 2021 13:07:00 +0300 Subject: [PATCH 2/2] Remove ariadne.contrib.django tests --- tests/django/__init__.py | 0 tests/django/conftest.py | 22 -- tests/django/snapshots/__init__.py | 0 .../django/snapshots/snap_test_playground.py | 12 -- .../snapshots/snap_test_query_execution.py | 22 -- tests/django/test_configuration.py | 204 ------------------ tests/django/test_playground.py | 15 -- tests/django/test_query_execution.py | 112 ---------- tests/django/test_scalars.py | 127 ----------- 9 files changed, 514 deletions(-) delete mode 100644 tests/django/__init__.py delete mode 100644 tests/django/conftest.py delete mode 100644 tests/django/snapshots/__init__.py delete mode 100644 tests/django/snapshots/snap_test_playground.py delete mode 100644 tests/django/snapshots/snap_test_query_execution.py delete mode 100644 tests/django/test_configuration.py delete mode 100644 tests/django/test_playground.py delete mode 100644 tests/django/test_query_execution.py delete mode 100644 tests/django/test_scalars.py diff --git a/tests/django/__init__.py b/tests/django/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/django/conftest.py b/tests/django/conftest.py deleted file mode 100644 index 9930c479c..000000000 --- a/tests/django/conftest.py +++ /dev/null @@ -1,22 +0,0 @@ -import pytest -from django.conf import settings -from django.test import RequestFactory - - -def pytest_configure(): - settings.configure( - USE_TZ=True, - TIME_ZONE="America/Chicago", - INSTALLED_APPS=["ariadne.contrib.django"], - TEMPLATES=[ - { - "BACKEND": "django.template.backends.django.DjangoTemplates", - "APP_DIRS": True, - } - ], - ) - - -@pytest.fixture -def request_factory(): - return RequestFactory() diff --git a/tests/django/snapshots/__init__.py b/tests/django/snapshots/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/django/snapshots/snap_test_playground.py b/tests/django/snapshots/snap_test_playground.py deleted file mode 100644 index 4de4c0f5a..000000000 --- a/tests/django/snapshots/snap_test_playground.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -# snapshottest: v1 - https://goo.gl/zC4yUc -from __future__ import unicode_literals - -from snapshottest import Snapshot - - -snapshots = Snapshot() - -snapshots['test_playground_html_is_served_on_get_request 1'] = b'\n\n\n\n\n \n \n GraphQL Playground\n \n \n \n\n\n\n\n \n\n \n
\n \n
Loading\n GraphQL Playground\n
\n
\n\n
\n \n\n\n' - -snapshots['test_playground_options_can_be_set_on_view_init 1'] = b'\n\n\n\n\n \n \n GraphQL Playground\n \n \n \n\n\n\n\n \n\n \n
\n \n
Loading\n GraphQL Playground\n
\n
\n\n
\n \n\n\n' diff --git a/tests/django/snapshots/snap_test_query_execution.py b/tests/django/snapshots/snap_test_query_execution.py deleted file mode 100644 index 71baa328f..000000000 --- a/tests/django/snapshots/snap_test_query_execution.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# snapshottest: v1 - https://goo.gl/zC4yUc -from __future__ import unicode_literals - -from snapshottest import Snapshot - - -snapshots = Snapshot() - -snapshots['test_post_request_fails_if_request_content_type_is_not_json 1'] = b'Posted content must be of type application/json or multipart/form-data' - -snapshots['test_post_request_fails_if_request_data_is_malformed_json 1'] = b'Request body is not a valid JSON' - -snapshots['test_query_in_valid_post_request_is_executed 1'] = b'{"data": {"status": true}}' - -snapshots['test_query_is_executed_for_multipart_form_request_with_file 1'] = b'{"data": {"upload": "InMemoryUploadedFile"}}' - -snapshots['test_multipart_form_request_fails_if_operations_is_not_valid_json 1'] = b"Request 'operations' multipart field is not a valid JSON" - -snapshots['test_multipart_form_request_fails_if_map_is_not_valid_json 1'] = b"Request 'map' multipart field is not a valid JSON" - -snapshots['test_post_request_fails_for_introspection_when_disabled 1'] = b'{"errors": [{"message": "Cannot query \'__schema\': introspection is disabled.", "locations": [{"line": 1, "column": 3}], "path": null}]}' diff --git a/tests/django/test_configuration.py b/tests/django/test_configuration.py deleted file mode 100644 index 064ebe022..000000000 --- a/tests/django/test_configuration.py +++ /dev/null @@ -1,204 +0,0 @@ -import json -from unittest.mock import ANY, Mock - -import pytest -from django.test import override_settings - -from ariadne.contrib.django.views import GraphQLView -from ariadne.types import ExtensionSync - - -def execute_query(request_factory, schema, query, **kwargs): - view = GraphQLView.as_view(schema=schema, **kwargs) - request = request_factory.post( - "/graphql/", data=query, content_type="application/json" - ) - response = view(request) - return json.loads(response.content) - - -def test_value_error_is_raised_when_view_was_initialized_without_schema( - request_factory, -): - with pytest.raises(ValueError): - execute_query(request_factory, None, {"query": "{ testContext }"}) - - -def test_custom_context_value_is_passed_to_resolvers(request_factory, schema): - data = execute_query( - request_factory, - schema, - {"query": "{ testContext }"}, - context_value={"test": "TEST-CONTEXT"}, - ) - assert data == {"data": {"testContext": "TEST-CONTEXT"}} - - -def test_custom_context_value_function_is_set_and_called_by_app( - request_factory, schema -): - get_context_value = Mock(return_value=True) - execute_query( - request_factory, - schema, - {"query": "{ status }"}, - context_value=get_context_value, - ) - get_context_value.assert_called_once() - - -def test_custom_context_value_function_result_is_passed_to_resolvers( - request_factory, schema -): - get_context_value = Mock(return_value={"test": "TEST-CONTEXT"}) - data = execute_query( - request_factory, - schema, - {"query": "{ testContext }"}, - context_value=get_context_value, - ) - assert data == {"data": {"testContext": "TEST-CONTEXT"}} - - -def test_custom_root_value_is_passed_to_resolvers(request_factory, schema): - data = execute_query( - request_factory, - schema, - {"query": "{ testRoot }"}, - root_value={"test": "TEST-ROOT"}, - ) - assert data == {"data": {"testRoot": "TEST-ROOT"}} - - -def test_custom_root_value_function_is_set_and_called_by_app(request_factory, schema): - get_root_value = Mock(return_value=True) - execute_query( - request_factory, schema, {"query": "{ status }"}, root_value=get_root_value - ) - get_root_value.assert_called_once() - - -def test_custom_root_value_function_is_called_with_context_value( - request_factory, schema -): - get_root_value = Mock(return_value=True) - execute_query( - request_factory, - schema, - {"query": "{ status }"}, - context_value={"test": "TEST-CONTEXT"}, - root_value=get_root_value, - ) - get_root_value.assert_called_once_with({"test": "TEST-CONTEXT"}, ANY) - - -def test_custom_validation_rule_is_called_by_query_validation( - mocker, request_factory, schema, validation_rule -): - spy_validation_rule = mocker.spy(validation_rule, "__init__") - execute_query( - request_factory, - schema, - {"query": "{ status }"}, - validation_rules=[validation_rule], - ) - spy_validation_rule.assert_called_once() - - -def test_custom_validation_rules_function_is_set_and_called_on_query_execution( - mocker, request_factory, schema, validation_rule -): - spy_validation_rule = mocker.spy(validation_rule, "__init__") - get_validation_rules = Mock(return_value=[validation_rule]) - execute_query( - request_factory, - schema, - {"query": "{ status }"}, - validation_rules=get_validation_rules, - ) - get_validation_rules.assert_called_once() - spy_validation_rule.assert_called_once() - - -def test_custom_validation_rules_function_is_called_with_context_value( - request_factory, schema, validation_rule -): - get_validation_rules = Mock(return_value=[validation_rule]) - execute_query( - request_factory, - schema, - {"query": "{ status }"}, - context_value={"test": "TEST-CONTEXT"}, - validation_rules=get_validation_rules, - ) - get_validation_rules.assert_called_once_with({"test": "TEST-CONTEXT"}, ANY, ANY) - - -def test_extensions_function_result_is_passed_to_query_executor( - request_factory, schema -): - context = {"test": "TEST-CONTEXT"} - extension = Mock(spec=ExtensionSync, format=Mock(return_value={})) - get_extensions = Mock(return_value=[Mock(return_value=extension)]) - execute_query( - request_factory, - schema, - {"query": "{ status }"}, - context_value=context, - extensions=get_extensions, - ) - get_extensions.assert_called_once() - extension.request_started.assert_called_once_with(context) - extension.request_finished.assert_called_once_with(context) - - -def test_extension_from_option_is_passed_to_query_executor(request_factory, schema): - context = {"test": "TEST-CONTEXT"} - extension = Mock(spec=ExtensionSync, format=Mock(return_value={})) - execute_query( - request_factory, - schema, - {"query": "{ status }"}, - context_value=context, - extensions=[Mock(return_value=extension)], - ) - extension.request_started.assert_called_once_with(context) - extension.request_finished.assert_called_once_with(context) - - -def execute_failing_query(request_factory, schema, **kwargs): - return execute_query(request_factory, schema, {"query": "{ error }"}, **kwargs) - - -def test_default_logger_is_used_to_log_error_if_custom_is_not_set( - request_factory, schema, mocker -): - logging_mock = mocker.patch("ariadne.logger.logging") - execute_failing_query(request_factory, schema) - logging_mock.getLogger.assert_called_once_with("ariadne") - - -def test_custom_logger_is_used_to_log_query_error(request_factory, schema, mocker): - logging_mock = mocker.patch("ariadne.logger.logging") - execute_failing_query(request_factory, schema, logger="custom") - logging_mock.getLogger.assert_called_once_with("custom") - - -def test_custom_error_formatter_is_used_to_format_error(request_factory, schema): - error_formatter = Mock(return_value=True) - execute_failing_query(request_factory, schema, error_formatter=error_formatter) - error_formatter.assert_called_once() - - -@override_settings(DEBUG=True) -def test_error_formatter_is_called_with_debug_enabled_flag(request_factory, schema): - error_formatter = Mock(return_value=True) - execute_failing_query(request_factory, schema, error_formatter=error_formatter) - error_formatter.assert_called_once_with(ANY, True) - - -@override_settings(DEBUG=False) -def test_error_formatter_is_called_with_debug_disabled_flag(request_factory, schema): - error_formatter = Mock(return_value=True) - execute_failing_query(request_factory, schema, error_formatter=error_formatter) - error_formatter.assert_called_once_with(ANY, False) diff --git a/tests/django/test_playground.py b/tests/django/test_playground.py deleted file mode 100644 index bf02b8d77..000000000 --- a/tests/django/test_playground.py +++ /dev/null @@ -1,15 +0,0 @@ -from ariadne.contrib.django.views import GraphQLView - - -def test_playground_html_is_served_on_get_request(request_factory, snapshot): - view = GraphQLView.as_view() - response = view(request_factory.get("/graphql/")) - assert response.status_code == 200 - snapshot.assert_match(response.content) - - -def test_playground_options_can_be_set_on_view_init(request_factory, snapshot): - view = GraphQLView.as_view(playground_options={"test.option": True}) - response = view(request_factory.get("/graphql/")) - assert response.status_code == 200 - snapshot.assert_match(response.content) diff --git a/tests/django/test_query_execution.py b/tests/django/test_query_execution.py deleted file mode 100644 index 9f09e96a4..000000000 --- a/tests/django/test_query_execution.py +++ /dev/null @@ -1,112 +0,0 @@ -import json - -import pytest -from django.core.files.uploadedfile import SimpleUploadedFile - -from ariadne.contrib.django.views import GraphQLView - - -@pytest.fixture -def view(schema): - return GraphQLView.as_view(schema=schema) - - -def test_post_request_fails_if_request_content_type_is_not_json( - view, request_factory, snapshot -): - request = request_factory.post("/graphql/", content_type="text/plain") - response = view(request) - assert response.status_code == 400 - snapshot.assert_match(response.content) - - -def test_post_request_fails_if_request_data_is_malformed_json( - view, request_factory, snapshot -): - request = request_factory.post( - "/graphql/", data="{malformed", content_type="application/json" - ) - response = view(request) - assert response.status_code == 400 - snapshot.assert_match(response.content) - - -def test_query_in_valid_post_request_is_executed(view, request_factory, snapshot): - request = request_factory.post( - "/graphql/", data={"query": "{ status }"}, content_type="application/json" - ) - response = view(request) - assert response.status_code == 200 - snapshot.assert_match(response.content) - - -def test_query_is_executed_for_multipart_form_request_with_file( - view, request_factory, snapshot -): - request = request_factory.post( - "/", - { - "operations": json.dumps( - { - "query": "mutation($file: Upload!) { upload(file: $file) }", - "variables": {"file": None}, - } - ), - "map": json.dumps({"0": ["variables.file"]}), - "0": SimpleUploadedFile("test.txt", b"test"), - }, - ) - response = view(request) - assert response.status_code == 200 - snapshot.assert_match(response.content) - - -def test_multipart_form_request_fails_if_operations_is_not_valid_json( - view, request_factory, snapshot -): - request = request_factory.post( - "/", - { - "operations": "not a valid json", - "map": json.dumps({"0": ["variables.file"]}), - "0": SimpleUploadedFile("test.txt", b"test"), - }, - ) - response = view(request) - assert response.status_code == 400 - snapshot.assert_match(response.content) - - -def test_multipart_form_request_fails_if_map_is_not_valid_json( - view, request_factory, snapshot -): - request = request_factory.post( - "/", - { - "operations": json.dumps( - { - "query": "mutation($file: Upload!) { upload(file: $file) }", - "variables": {"file": None}, - } - ), - "map": "not a valid json", - "0": SimpleUploadedFile("test.txt", b"test"), - }, - ) - response = view(request) - assert response.status_code == 400 - snapshot.assert_match(response.content) - - -def test_post_request_fails_for_introspection_when_disabled( - schema, request_factory, snapshot -): - view = GraphQLView.as_view(schema=schema, introspection=False) - request = request_factory.post( - "/graphql/", - data={"query": "{ __schema { types { name } } }"}, - content_type="application/json", - ) - response = view(request) - assert response.status_code == 400 - snapshot.assert_match(response.content) diff --git a/tests/django/test_scalars.py b/tests/django/test_scalars.py deleted file mode 100644 index 450c7fb80..000000000 --- a/tests/django/test_scalars.py +++ /dev/null @@ -1,127 +0,0 @@ -# pylint: disable=comparison-with-callable,protected-access -import pytest -from django.utils import timezone - -from ariadne.contrib.django.scalars import ( - date_scalar, - datetime_scalar, - parse_date_value, - parse_datetime_value, - parse_time_value, - serialize_date, - serialize_datetime, - serialize_time, - time_scalar, -) - - -@pytest.fixture -def datetime(): - return timezone.now() - - -@pytest.fixture -def date(datetime): - return datetime.date() - - -@pytest.fixture -def time(datetime): - return datetime.time() - - -def test_date_serializer_serializes_datetime(datetime, date): - assert serialize_date(datetime) == date.isoformat() - - -def test_date_serializer_serializes_date(date): - assert serialize_date(date) == date.isoformat() - - -def test_date_parser_returns_valid_date_from_datetime_iso8601_str(datetime, date): - assert parse_date_value(datetime.isoformat()) == date - - -def test_date_parser_returns_valid_date_from_date_iso8601_str(date): - assert parse_date_value(date.isoformat()) == date - - -def test_date_parser_returns_valid_date_from_other_date_str(date): - assert parse_date_value(date.strftime("%m/%d/%Y")) == date - - -def test_date_parser_raises_value_error_on_invalid_data(): - with pytest.raises(ValueError): - parse_date_value("nothing") - - -def test_datetime_serializer_serializes_datetime(datetime): - assert serialize_datetime(datetime) == datetime.isoformat() - - -def test_datetime_serializer_serializes_date(datetime, date): - assert serialize_datetime(date) == datetime.date().isoformat() - - -def test_datetime_parser_returns_valid_date_from_datetime_iso8601_str(datetime): - assert parse_datetime_value(datetime.isoformat()) == datetime - - -def test_datetime_parser_returns_valid_date_from_date_iso8601_str(date): - # time data is lost when datetime scalar receives date - assert parse_datetime_value(date.isoformat()).date() == date - - -def test_datetime_parser_returns_valid_date_from_other_date_str(date): - # time data is lost when datetime scalar receives date - assert parse_datetime_value(date.strftime("%m/%d/%Y")).date() == date - - -def test_datetime_parser_raises_value_error_on_invalid_data(): - with pytest.raises(ValueError): - parse_datetime_value("nothing") - - -def test_time_serializer_serializes_time(time): - assert serialize_time(time) == time.isoformat() - - -def test_time_parser_returns_valid_time_from_datetime_iso8601_str(datetime, time): - assert parse_time_value(datetime.isoformat()) == time - - -def test_time_parser_returns_valid_time_from_time_iso8601_str(time): - assert parse_time_value(time.isoformat()) == time - - -def test_time_parser_returns_valid_time_from_other_time_str(time): - assert parse_time_value(time.strftime("%H:%M:%S.%f")) == time - - -def test_time_parser_raises_value_error_on_invalid_data(): - with pytest.raises(ValueError): - parse_time_value("nothing") - - -def test_date_scalar_has_serializer_set(): - assert date_scalar._serialize == serialize_date - - -def test_date_scalar_has_value_parser_set(): - assert date_scalar._parse_value == parse_date_value - - -def test_datetime_scalar_has_serializer_set(): - assert datetime_scalar._serialize == serialize_datetime - - -def test_datetime_scalar_has_value_parser_set(): - assert datetime_scalar._parse_value == parse_datetime_value - - -def test_time_scalar_has_serializer_set(): - assert time_scalar._serialize == serialize_time - - -def test_time_scalar_has_value_parser_set(): - assert time_scalar._parse_value == parse_time_value