1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
"""Tests for GraphQL schema parser."""
from __future__ import annotations
from typing import TYPE_CHECKING, Any
import pytest
from datamodel_code_generator.model.dataclass import DataClass
from datamodel_code_generator.parser.graphql import GraphQLParser
from datamodel_code_generator.reference import Reference
from tests.conftest import create_assert_file_content
from tests.main.conftest import GRAPHQL_DATA_PATH, run_main_and_assert
from tests.main.test_main_general import DATA_PATH
if TYPE_CHECKING:
from pathlib import Path
EXPECTED_GRAPHQL_PATH: Path = DATA_PATH / "expected" / "parser" / "graphql"
assert_file_content = create_assert_file_content(EXPECTED_GRAPHQL_PATH)
def test_graphql_field_enum(output_file: Path) -> None:
"""Test parsing GraphQL field with enum default value."""
run_main_and_assert(
input_path=GRAPHQL_DATA_PATH / "field-default-enum.graphql",
output_path=output_file,
input_file_type="graphql",
assert_func=assert_file_content,
expected_file="field-default-enum.py",
extra_args=["--set-default-enum-member"],
)
def test_graphql_union_aliased_bug(output_file: Path) -> None:
"""Test parsing GraphQL union with aliased types."""
run_main_and_assert(
input_path=GRAPHQL_DATA_PATH / "union-aliased-bug.graphql",
output_path=output_file,
input_file_type="graphql",
assert_func=assert_file_content,
expected_file="union-aliased-bug.py",
)
def test_graphql_union_commented(output_file: Path) -> None:
"""Test parsing GraphQL union with comments."""
run_main_and_assert(
input_path=GRAPHQL_DATA_PATH / "union-commented.graphql",
output_path=output_file,
input_file_type="graphql",
assert_func=assert_file_content,
expected_file="union-commented.py",
)
@pytest.mark.parametrize(
("frozen_dataclasses", "keyword_only", "parser_dataclass_args", "kwargs_dataclass_args", "expected"),
[
(False, False, None, None, {}),
(True, False, None, None, {"frozen": True}),
(False, True, None, None, {"kw_only": True}),
(True, True, None, None, {"frozen": True, "kw_only": True}),
(False, False, {"slots": True}, None, {"slots": True}),
(True, True, {"slots": True}, None, {"slots": True}),
(True, True, {"slots": True}, {"order": True}, {"order": True}),
],
)
def test_create_data_model_dataclass_arguments(
frozen_dataclasses: bool,
keyword_only: bool,
parser_dataclass_args: dict | None,
kwargs_dataclass_args: dict | None,
expected: dict,
) -> None:
"""Test _create_data_model handles dataclass_arguments correctly."""
parser = GraphQLParser(
source="type Query { id: ID }",
data_model_type=DataClass,
frozen_dataclasses=frozen_dataclasses,
keyword_only=keyword_only,
)
parser.dataclass_arguments = parser_dataclass_args
reference = Reference(path="test", original_name="Test", name="Test")
kwargs: dict[str, Any] = {"reference": reference, "fields": []}
if kwargs_dataclass_args is not None:
kwargs["dataclass_arguments"] = kwargs_dataclass_args
result = parser._create_data_model(**kwargs)
assert isinstance(result, DataClass)
assert result.dataclass_arguments == expected
|