diff --git a/tests/test_type_inference.py b/tests/test_type_inference.py new file mode 100644 index 0000000..9026284 --- /dev/null +++ b/tests/test_type_inference.py @@ -0,0 +1,161 @@ +"""Tests for JSON type inference.""" +import pytest +from json_to_openapi.analyzer import JsonAnalyzer, TypeInfo + + +class TestJsonAnalyzer: + """Test cases for JsonAnalyzer.""" + + def test_analyze_string(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze("hello") + assert result.type_name == "string" + + def test_analyze_integer(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze(42) + assert result.type_name == "integer" + + def test_analyze_float(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze(3.14) + assert result.type_name == "number" + + def test_analyze_boolean_true(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze(True) + assert result.type_name == "boolean" + + def test_analyze_boolean_false(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze(False) + assert result.type_name == "boolean" + + def test_analyze_null(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze(None) + assert result.type_name == "null" + + def test_analyze_empty_array(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze([]) + assert result.type_name == "array" + + def test_analyze_empty_object(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze({}) + assert result.type_name == "object" + + def test_analyze_string_format_date(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze("2024-01-15") + assert result.type_name == "string" + assert result.format == "date" + + def test_analyze_string_format_datetime(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze("2024-01-15T10:30:00Z") + assert result.type_name == "string" + assert result.format == "date-time" + + def test_analyze_string_format_email(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze("user@example.com") + assert result.type_name == "string" + assert result.format == "email" + + def test_analyze_string_format_uuid(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze("550e8400-e29b-41d4-a716-446655440000") + assert result.type_name == "string" + assert result.format == "uuid" + + def test_analyze_object_with_properties(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze({"name": "John", "age": 30}) + assert result.type_name == "object" + assert result.properties is not None + assert "name" in result.properties + assert "age" in result.properties + assert result.properties["name"].type_name == "string" + assert result.properties["age"].type_name == "integer" + + def test_analyze_nested_object(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze({"user": {"address": {"city": "Boston"}}}) + assert result.type_name == "object" + assert result.properties["user"].type_name == "object" + assert result.properties["user"].properties["address"].type_name == "object" + assert result.properties["user"].properties["address"].properties["city"].type_name == "string" + + def test_analyze_array_of_strings(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze(["a", "b", "c"]) + assert result.type_name == "array" + assert result.items is not None + assert result.items.type_name == "string" + + def test_analyze_array_of_integers(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze([1, 2, 3]) + assert result.type_name == "array" + assert result.items is not None + assert result.items.type_name == "integer" + + def test_analyze_array_of_objects(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze([{"id": 1}, {"id": 2}]) + assert result.type_name == "array" + assert result.items is not None + assert result.items.type_name == "object" + assert result.items.properties is not None + assert "id" in result.items.properties + + def test_analyze_mixed_array(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze(["text", 123, True]) + assert result.type_name == "array" + + def test_analyze_large_integer(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze(9999999999999) + assert result.type_name == "integer" + assert result.format == "int64" + + def test_analyze_uri_format(self): + analyzer = JsonAnalyzer() + result = analyzer.analyze("https://example.com/api") + assert result.type_name == "string" + assert result.format == "uri" + + def test_max_depth_prevents_infinite_recursion(self): + analyzer = JsonAnalyzer(max_depth=3) + data = {"level1": {"level2": {"level3": {"level4": {"value": 1}}}}} + result = analyzer.analyze(data) + assert result.type_name == "object" + + +class TestTypeInfo: + """Test cases for TypeInfo dataclass.""" + + def test_type_info_creation(self): + type_info = TypeInfo(type_name="string") + assert type_info.type_name == "string" + assert type_info.format is None + assert type_info.properties is None + assert type_info.items is None + assert type_info.enum_values is None + assert type_info.nullable is False + + def test_type_info_with_all_fields(self): + type_info = TypeInfo( + type_name="object", + format=None, + properties={"key": TypeInfo(type_name="string")}, + items=None, + enum_values=["a", "b"], + nullable=True + ) + assert type_info.type_name == "object" + assert type_info.nullable is True + assert len(type_info.enum_values) == 2