Skip to content

Commit

Permalink
Add test for type styles and string literals
Browse files Browse the repository at this point in the history
  • Loading branch information
bogdandm committed May 4, 2020
1 parent 5b2c34e commit 252e691
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 7 deletions.
2 changes: 1 addition & 1 deletion json_to_models/dynamic_typing/complex.py
Expand Up @@ -279,7 +279,7 @@ def to_typing_code(self, types_style: Dict[Union['BaseType', Type['BaseType']],
if options.get(self.TypeStyle.use_literals):
limit = options.get(self.TypeStyle.max_literals)
if limit is None or len(self.literals) < limit:
parts = ', '.join(f'"{s}"' for s in self.literals)
parts = ', '.join(f'"{s}"' for s in sorted(self.literals))
return [(Literal.__module__, 'Literal')], f"Literal[{parts}]"

return [], 'str'
Expand Down
67 changes: 63 additions & 4 deletions test/test_code_generation/test_models_code_generator.py
@@ -1,9 +1,8 @@
from typing import Dict, List
from typing import Dict, List, Type, Union

import pytest

from json_to_models.dynamic_typing import (AbsoluteModelRef, DDict, DList, DOptional, IntString, ModelMeta, ModelPtr,
Unknown, compile_imports)
from json_to_models.dynamic_typing import (AbsoluteModelRef, BaseType, DDict, DList, DOptional, IntString, ModelMeta, ModelPtr, StringLiteral, Unknown, compile_imports)
from json_to_models.models.base import GenericModelCodeGenerator, generate_code
from json_to_models.models.structure import sort_fields
from json_to_models.models.utils import indent
Expand Down Expand Up @@ -288,7 +287,67 @@ class Тест:


@pytest.mark.parametrize("value,kwargs,expected", test_unicode_data)
def test_generated(value: ModelMeta, kwargs: dict, expected: str):
def test_unicode(value: ModelMeta, kwargs: dict, expected: str):
generated = generate_code(([{"model": value, "nested": []}], {}),
GenericModelCodeGenerator, class_generator_kwargs=kwargs)
assert generated.rstrip() == expected, generated


# Data format:
# (
# model metadata,
# style override,
# expected
# )
test_override_style_data = [
pytest.param(
model_factory("M", {
"bar": StringLiteral({'bar', 'foo'})
}),
{},
trim("""
from typing_extensions import Literal
class M:
bar: Literal["bar", "foo"]
"""),
id='default_behaviour'
),
pytest.param(
model_factory("M", {
"bar": StringLiteral({'bar', 'foo'})
}),
{StringLiteral: {
StringLiteral.TypeStyle.use_literals: False
}},
trim("""
class M:
bar: str
"""),
id='disable_literal'
),
pytest.param(
model_factory("M", {
"bar": IntString
}),
{IntString: {
IntString.TypeStyle.use_actual_type: True
}},
trim("""
class M:
bar: int
"""),
id='string_serializable_use_actual_type'
),
]


@pytest.mark.parametrize("value,types_style,expected", test_override_style_data)
def test_override_style(value: ModelMeta, types_style: Dict[Union['BaseType', Type['BaseType']], dict], expected: str):
generated = generate_code(
([{"model": value, "nested": []}], {}),
GenericModelCodeGenerator,
class_generator_kwargs=dict(types_style=types_style)
)
assert generated.rstrip() == expected, generated
19 changes: 17 additions & 2 deletions test/test_dynamic_typing/test_dynamic_typing.py
Expand Up @@ -2,7 +2,7 @@

import pytest

from json_to_models.dynamic_typing import DUnion, get_hash_string
from json_to_models.dynamic_typing import DUnion, StringLiteral, get_hash_string

# *args | MetaData
test_dunion = [
Expand All @@ -20,7 +20,22 @@
[str, DUnion(int, DUnion(float, complex))],
DUnion(int, float, complex, str),
id="complex_merge"
)
),
pytest.param(
[str, StringLiteral({'a'})],
DUnion(str),
id="str_literal_to_string"
),
pytest.param(
[StringLiteral({'b'}), StringLiteral({'a'})],
DUnion(StringLiteral({'a', 'b'})),
id="str_literal_merge"
),
pytest.param(
[StringLiteral({str(i)}) for i in range(100)],
DUnion(str),
id="str_literal_too_much"
),
]


Expand Down

0 comments on commit 252e691

Please sign in to comment.