Initial upload with comprehensive README and tests

This commit is contained in:
2026-02-01 05:15:35 +00:00
parent fa94715cd2
commit f86c4f74e4

View File

@@ -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