Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 42c25d6260 | |||
| 7db3b9d845 | |||
| 530cd62b5f | |||
| 50baaee3fc | |||
| bdf7636873 | |||
| 362cfabd74 | |||
| e85805d6e7 | |||
| 32afc6df5b | |||
| 4683a77e02 | |||
| 6801245a8b | |||
| b9951bdba3 | |||
| 0cac70ee2b | |||
| d699aaa1bd | |||
| 0bc9626e40 | |||
| 539190017b | |||
| 26946a1293 | |||
| 4e695d4cf5 | |||
|
|
f448806824 | ||
|
|
0b88a40774 | ||
|
|
48d8e24d39 |
@@ -48,9 +48,3 @@ jobs:
|
||||
- name: Build package
|
||||
run: |
|
||||
python -m build
|
||||
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: dist
|
||||
path: dist/
|
||||
|
||||
@@ -16,8 +16,6 @@ A CLI tool that generates realistic test data from JSON Schema, TypeScript types
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
pip install testdata-cli
|
||||
# or
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
|
||||
@@ -35,7 +35,6 @@ dev = [
|
||||
"pytest>=7.0",
|
||||
"pytest-cov>=4.0",
|
||||
"ruff>=0.1.0",
|
||||
"mypy>=1.0",
|
||||
]
|
||||
|
||||
[project.scripts]
|
||||
|
||||
@@ -1 +1,7 @@
|
||||
"""Formatters package for TestDataGen."""
|
||||
|
||||
from .csv_formatter import CSVFormatter
|
||||
from .json_formatter import JSONFormatter
|
||||
from .sql_formatter import SQLFormatter
|
||||
|
||||
__all__ = ["JSONFormatter", "CSVFormatter", "SQLFormatter"]
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
"""Generators package for TestDataGen."""
|
||||
|
||||
from .json_schema_generator import JSONSchemaGenerator
|
||||
|
||||
__all__ = ["JSONSchemaGenerator"]
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
"""Providers package for TestDataGen."""
|
||||
|
||||
from .testdata_provider import TestDataProvider
|
||||
|
||||
__all__ = ["TestDataProvider"]
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
"""Tests for output formatters."""
|
||||
|
||||
import json
|
||||
|
||||
import pytest
|
||||
|
||||
from testdatagen.formatters.json_formatter import JSONFormatter
|
||||
from testdatagen.formatters.csv_formatter import CSVFormatter
|
||||
from testdatagen.formatters.sql_formatter import SQLFormatter
|
||||
@@ -55,14 +53,14 @@ class TestJSONFormatter:
|
||||
result = formatter.format(records)
|
||||
|
||||
parsed = json.loads(result)
|
||||
assert parsed[0]["name"] == "John \"Jack\" Doe"
|
||||
assert parsed["name"] == "John \"Jack\" Doe"
|
||||
|
||||
|
||||
class TestCSVFormatter:
|
||||
"""Tests for CSVFormatter class."""
|
||||
|
||||
def test_format_single_record(self):
|
||||
"""Test formatting a single record."""
|
||||
def test_format_simple_records(self):
|
||||
"""Test formatting simple records."""
|
||||
records = [{"name": "John", "age": 30}]
|
||||
formatter = CSVFormatter()
|
||||
result = formatter.format(records)
|
||||
@@ -86,21 +84,31 @@ class TestCSVFormatter:
|
||||
formatter = CSVFormatter()
|
||||
result = formatter.format([])
|
||||
|
||||
assert "name" in result
|
||||
assert result == ""
|
||||
|
||||
def test_format_with_missing_keys(self):
|
||||
"""Test formatting records with different keys."""
|
||||
records = [{"name": "John", "age": 30}, {"name": "Jane"}]
|
||||
formatter = CSVFormatter()
|
||||
result = formatter.format(records)
|
||||
|
||||
lines = result.strip().split("\n")
|
||||
assert len(lines) == 3
|
||||
|
||||
|
||||
class TestSQLFormatter:
|
||||
"""Tests for SQLFormatter class."""
|
||||
|
||||
def test_format_single_record(self):
|
||||
"""Test formatting a single record."""
|
||||
def test_format_simple_record(self):
|
||||
"""Test formatting a simple record."""
|
||||
records = [{"name": "John", "age": 30}]
|
||||
formatter = SQLFormatter(table_name="users")
|
||||
result = formatter.format(records)
|
||||
|
||||
assert "INSERT" in result
|
||||
assert "users" in result
|
||||
assert "John" in result
|
||||
assert "INSERT INTO users" in result
|
||||
assert "name, age" in result
|
||||
assert "'John'" in result
|
||||
assert "30" in result
|
||||
|
||||
def test_format_multiple_records(self):
|
||||
"""Test formatting multiple records."""
|
||||
@@ -108,19 +116,59 @@ class TestSQLFormatter:
|
||||
formatter = SQLFormatter(table_name="users")
|
||||
result = formatter.format(records)
|
||||
|
||||
assert result.count("INSERT") == 2
|
||||
statements = result.strip().split("\n")
|
||||
assert len(statements) == 2
|
||||
assert "INSERT INTO users" in statements[0]
|
||||
assert "INSERT INTO users" in statements[1]
|
||||
|
||||
def test_format_empty_records(self):
|
||||
"""Test formatting empty records."""
|
||||
formatter = SQLFormatter(table_name="users")
|
||||
result = formatter.format([])
|
||||
|
||||
assert "INSERT" not in result
|
||||
assert result == ""
|
||||
|
||||
def test_custom_table_name(self):
|
||||
"""Test with custom table name."""
|
||||
records = [{"name": "John"}]
|
||||
formatter = SQLFormatter(table_name="custom_table")
|
||||
def test_validate_table_name_valid(self):
|
||||
"""Test valid table names."""
|
||||
formatter = SQLFormatter(table_name="valid_table_name")
|
||||
assert formatter.table_name == "valid_table_name"
|
||||
|
||||
def test_validate_table_name_invalid_characters(self):
|
||||
"""Test that invalid table names raise error."""
|
||||
with pytest.raises(ValueError):
|
||||
SQLFormatter(table_name="invalid-table-name")
|
||||
|
||||
def test_validate_table_name_starts_with_number(self):
|
||||
"""Test that table names starting with number raise error."""
|
||||
with pytest.raises(ValueError):
|
||||
SQLFormatter(table_name="123table")
|
||||
|
||||
def test_validate_table_name_reserved_word(self):
|
||||
"""Test that reserved words raise error."""
|
||||
with pytest.raises(ValueError):
|
||||
SQLFormatter(table_name="SELECT")
|
||||
|
||||
def test_format_string_with_quotes(self):
|
||||
"""Test formatting strings with quotes."""
|
||||
records = [{"name": "John's House"}]
|
||||
formatter = SQLFormatter(table_name="users")
|
||||
result = formatter.format(records)
|
||||
|
||||
assert "custom_table" in result
|
||||
assert "John''s House" in result
|
||||
|
||||
def test_format_null_value(self):
|
||||
"""Test formatting null values."""
|
||||
records = [{"name": None}]
|
||||
formatter = SQLFormatter(table_name="users")
|
||||
result = formatter.format(records)
|
||||
|
||||
assert "NULL" in result
|
||||
|
||||
def test_format_boolean_values(self):
|
||||
"""Test formatting boolean values."""
|
||||
records = [{"active": True, "deleted": False}]
|
||||
formatter = SQLFormatter(table_name="users")
|
||||
result = formatter.format(records)
|
||||
|
||||
assert "TRUE" in result
|
||||
assert "FALSE" in result
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
import pytest
|
||||
from faker import Faker
|
||||
|
||||
from testdatagen.providers.testdata_provider import TestDataProvider
|
||||
|
||||
|
||||
@@ -30,10 +29,23 @@ class TestTestDataProvider:
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
result = provider.json_schema_type({"type": "integer", "minimum": 10, "maximum": 20}, faker)
|
||||
result = provider.json_schema_type({
|
||||
"type": "integer",
|
||||
"minimum": 10,
|
||||
"maximum": 20
|
||||
}, faker)
|
||||
|
||||
assert isinstance(result, int)
|
||||
assert 10 <= result <= 20
|
||||
|
||||
def test_json_schema_type_number(self):
|
||||
"""Test number type generation."""
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
result = provider.json_schema_type({"type": "number"}, faker)
|
||||
assert isinstance(result, float)
|
||||
|
||||
def test_json_schema_type_string(self):
|
||||
"""Test string type generation."""
|
||||
faker = Faker()
|
||||
@@ -42,54 +54,133 @@ class TestTestDataProvider:
|
||||
result = provider.json_schema_type({"type": "string"}, faker)
|
||||
assert isinstance(result, str)
|
||||
|
||||
def test_json_schema_type_string_with_format_email(self):
|
||||
"""Test string with email format."""
|
||||
def test_json_schema_type_string_email(self):
|
||||
"""Test email format generation."""
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
result = provider.json_schema_type({"type": "string", "format": "email"}, faker)
|
||||
assert isinstance(result, str)
|
||||
result = provider.json_schema_type({
|
||||
"type": "string",
|
||||
"format": "email"
|
||||
}, faker)
|
||||
|
||||
assert "@" in result
|
||||
assert "." in result
|
||||
|
||||
def test_json_schema_type_string_with_format_uuid(self):
|
||||
"""Test string with uuid format."""
|
||||
def test_json_schema_type_string_uuid(self):
|
||||
"""Test UUID format generation."""
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
result = provider.json_schema_type({"type": "string", "format": "uuid"}, faker)
|
||||
assert isinstance(result, str)
|
||||
assert "-" in result
|
||||
result = provider.json_schema_type({
|
||||
"type": "string",
|
||||
"format": "uuid"
|
||||
}, faker)
|
||||
|
||||
def test_json_schema_type_string_with_format_date(self):
|
||||
"""Test string with date format."""
|
||||
assert len(result) == 36
|
||||
|
||||
def test_json_schema_type_string_uri(self):
|
||||
"""Test URI format generation."""
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
result = provider.json_schema_type({"type": "string", "format": "date-time"}, faker)
|
||||
assert isinstance(result, str)
|
||||
result = provider.json_schema_type({
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
}, faker)
|
||||
|
||||
def test_json_schema_type_with_enum(self):
|
||||
"""Test type with enum constraint."""
|
||||
assert "://" in result
|
||||
|
||||
def test_json_schema_type_enum(self):
|
||||
"""Test enum generation."""
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
schema = {"type": "string", "enum": ["red", "green", "blue"]}
|
||||
result = provider.json_schema_type(schema, faker)
|
||||
result = provider.json_schema_type({
|
||||
"enum": ["red", "green", "blue"]
|
||||
}, faker)
|
||||
|
||||
assert result in ["red", "green", "blue"]
|
||||
|
||||
def test_json_schema_type_with_pattern(self):
|
||||
"""Test type with pattern constraint."""
|
||||
def test_json_schema_type_null(self):
|
||||
"""Test null type generation."""
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
result = provider.json_schema_type({"type": "string", "pattern": "^[a-z]+$"}, faker)
|
||||
result = provider.json_schema_type({"type": "null"}, faker)
|
||||
assert result is None
|
||||
|
||||
def test_json_schema_type_const(self):
|
||||
"""Test const generation."""
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
result = provider.json_schema_type({"const": "fixed_value"}, faker)
|
||||
assert result == "fixed_value"
|
||||
|
||||
def test_json_schema_type_array(self):
|
||||
"""Test array generation."""
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
result = provider.json_schema_type({
|
||||
"type": "array",
|
||||
"items": {"type": "string"}
|
||||
}, faker)
|
||||
|
||||
assert isinstance(result, list)
|
||||
|
||||
def test_json_schema_type_object(self):
|
||||
"""Test object generation."""
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
result = provider.json_schema_type({
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string"}
|
||||
}
|
||||
}, faker)
|
||||
|
||||
assert isinstance(result, dict)
|
||||
assert "name" in result
|
||||
|
||||
def test_generate_from_pattern_simple(self):
|
||||
"""Test pattern-based generation."""
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
result = provider._generate_from_pattern(r"\d{3}")
|
||||
assert len(result) == 3
|
||||
assert result.isdigit()
|
||||
|
||||
def test_generate_from_pattern_alphanumeric(self):
|
||||
"""Test alphanumeric pattern generation."""
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
result = provider._generate_from_pattern(r"\w+")
|
||||
assert isinstance(result, str)
|
||||
|
||||
def test_provider_is_registered(self):
|
||||
"""Test that provider can be added to Faker."""
|
||||
def test_generate_from_pattern_complex(self):
|
||||
"""Test complex pattern generation."""
|
||||
faker = Faker()
|
||||
assert TestDataProvider not in faker.providers
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
faker.add_provider(TestDataProvider)
|
||||
assert TestDataProvider in faker.providers
|
||||
result = provider._generate_from_pattern(r"[abc]{3}")
|
||||
assert len(result) == 3
|
||||
assert all(c in "abc" for c in result)
|
||||
|
||||
def test_any_of_schema(self):
|
||||
"""Test anyOf schema handling."""
|
||||
faker = Faker()
|
||||
provider = TestDataProvider(faker)
|
||||
|
||||
result = provider.json_schema_type({
|
||||
"anyOf": [
|
||||
{"type": "string", "format": "email"},
|
||||
{"type": "string", "format": "uri"}
|
||||
]
|
||||
}, faker)
|
||||
|
||||
assert isinstance(result, str)
|
||||
|
||||
Reference in New Issue
Block a user