Initial upload with comprehensive README and tests
This commit is contained in:
161
tests/test_type_inference.py
Normal file
161
tests/test_type_inference.py
Normal 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
|
||||
Reference in New Issue
Block a user