|
1 | 1 | import datetime
|
2 | 2 | import json
|
| 3 | +import os |
3 | 4 | from enum import Enum
|
4 | 5 | import inspect
|
5 | 6 | import pprint
|
|
17 | 18 | import uuid
|
18 | 19 |
|
19 | 20 | import pydantic
|
| 21 | +from pydantic.types import AwareDatetime |
20 | 22 |
|
21 | 23 | from s2python import frbc
|
22 | 24 | from s2python.common import Duration, PowerRange, NumberRange
|
@@ -64,7 +66,7 @@ def get_list_arg(field_type):
|
64 | 66 |
|
65 | 67 |
|
66 | 68 | def is_enum(field_type):
|
67 |
| - return issubclass(field_type, Enum) |
| 69 | + return inspect.isclass(field_type) and issubclass(field_type, Enum) |
68 | 70 |
|
69 | 71 |
|
70 | 72 | def snake_case(camelcased: str) -> str:
|
@@ -111,17 +113,16 @@ def generate_json_test_data_for_field(field_type: Type):
|
111 | 113 | value = bool(random.randint(0, 1))
|
112 | 114 | elif field_type is float:
|
113 | 115 | value = random.random() * 9000.0
|
114 |
| - elif field_type is datetime.datetime: |
| 116 | + elif field_type in (AwareDatetime, datetime.datetime): |
| 117 | + # Generate a timezone-aware datetime |
115 | 118 | value = datetime.datetime(
|
116 | 119 | year=random.randint(2020, 2023),
|
117 | 120 | month=random.randint(1, 12),
|
118 | 121 | day=random.randint(1, 28),
|
119 | 122 | hour=random.randint(0, 23),
|
120 | 123 | minute=random.randint(0, 59),
|
121 | 124 | second=random.randint(0, 59),
|
122 |
| - tzinfo=datetime.timezone( |
123 |
| - offset=datetime.timedelta(hours=random.randint(0, 2)) |
124 |
| - ), |
| 125 | + tzinfo=datetime.timezone(datetime.timedelta(hours=random.randint(-12, 14))), |
125 | 126 | )
|
126 | 127 | elif field_type is uuid.UUID:
|
127 | 128 | value = uuid.uuid4()
|
@@ -167,12 +168,19 @@ def dump_test_data_as_constructor_field_for(test_data, field_type: Type) -> str:
|
167 | 168 | value = str(test_data)
|
168 | 169 | elif field_type is float:
|
169 | 170 | value = str(test_data)
|
170 |
| - elif field_type is datetime.datetime: |
| 171 | + elif field_type is AwareDatetime or field_type is datetime.datetime: |
171 | 172 | test_data: datetime.datetime
|
172 | 173 | offset: datetime.timedelta = test_data.tzinfo.utcoffset(None)
|
173 |
| - value = f"datetime(year={test_data.year}, month={test_data.month}, day={test_data.day}, hour={test_data.hour}, minute={test_data.minute}, second={test_data.second}, tzinfo=offset(offset=timedelta(seconds={offset.total_seconds()})))" |
| 174 | + value = ( |
| 175 | + f"datetime(" |
| 176 | + f"year={test_data.year}, month={test_data.month}, day={test_data.day}, " |
| 177 | + f"hour={test_data.hour}, minute={test_data.minute}, second={test_data.second}, " |
| 178 | + f"tzinfo=offset(offset=timedelta(seconds={offset.total_seconds()})))" |
| 179 | + ) |
174 | 180 | elif field_type is uuid.UUID:
|
175 | 181 | value = f'uuid.UUID("{test_data}")'
|
| 182 | + elif type(field_type).__name__ == "_LiteralGenericAlias": |
| 183 | + value = field_type.__args__[0] |
176 | 184 | else:
|
177 | 185 | raise RuntimeError(
|
178 | 186 | f"Please implement dump test data for field type {field_type}"
|
@@ -217,11 +225,13 @@ def dump_test_data_as_json_field_for(test_data, field_type: Type):
|
217 | 225 | value = test_data
|
218 | 226 | elif field_type is float:
|
219 | 227 | value = test_data
|
220 |
| - elif field_type is datetime.datetime: |
| 228 | + elif field_type in (AwareDatetime, datetime.datetime): |
221 | 229 | test_data: datetime.datetime
|
222 | 230 | value = test_data.isoformat()
|
223 | 231 | elif field_type is uuid.UUID:
|
224 | 232 | value = str(test_data)
|
| 233 | + elif type(field_type).__name__ == "_LiteralGenericAlias": |
| 234 | + value = test_data |
225 | 235 | else:
|
226 | 236 | raise RuntimeError(
|
227 | 237 | f"Please implement dump test data to json for field type {field_type}"
|
@@ -294,7 +304,10 @@ def test__to_json__happy_path_full(self):
|
294 | 304 | print()
|
295 | 305 | print()
|
296 | 306 |
|
297 |
| - with open( |
298 |
| - f"tests/unit/frbc/{snake_case(class_name)}_test.py", "w+" |
299 |
| - ) as unit_test_file: |
300 |
| - unit_test_file.write(template) |
| 307 | + # Check if the file already exists |
| 308 | + if not os.path.exists(f"tests/unit/frbc/{snake_case(class_name)}_test.py"): |
| 309 | + with open( |
| 310 | + f"tests/unit/frbc/{snake_case(class_name)}_test.py", "w+" |
| 311 | + ) as unit_test_file: |
| 312 | + unit_test_file.write(template) |
| 313 | + print(f"Created tests/unit/frbc/{snake_case(class_name)}_test.py") |
0 commit comments