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