Add unit tests for converters, validators, and CLI
Some checks failed
CI / test (push) Failing after 13s

This commit is contained in:
2026-02-01 19:04:08 +00:00
parent 069a281a47
commit 9e9262818b

251
tests/test_cli.py Normal file
View File

@@ -0,0 +1,251 @@
"""Tests for CLI commands."""
import pytest
import tempfile
import os
from click.testing import CliRunner
from pathlib import Path
class TestCLIConvert:
"""Tests for convert command."""
def test_convert_json_to_yaml(self):
from src.cli import cli
runner = CliRunner()
with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
f.write('{"name": "test", "value": 123}')
temp_input = f.name
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
temp_output = f.name
try:
result = runner.invoke(cli, ['convert', temp_input, '--to', 'yaml', '-o', temp_output])
assert result.exit_code == 0
assert Path(temp_output).read_text().strip() != ""
finally:
os.unlink(temp_input)
if os.path.exists(temp_output):
os.unlink(temp_output)
def test_convert_yaml_to_json(self):
from src.cli import cli
runner = CliRunner()
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
f.write('name: test\nvalue: 123')
temp_input = f.name
with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
temp_output = f.name
try:
result = runner.invoke(cli, ['convert', temp_input, '--to', 'json', '-o', temp_output])
assert result.exit_code == 0
assert Path(temp_output).read_text().strip() != ""
finally:
os.unlink(temp_input)
if os.path.exists(temp_output):
os.unlink(temp_output)
def test_convert_with_indent(self):
from src.cli import cli
runner = CliRunner()
with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
f.write('{"name": "test"}')
temp_input = f.name
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
temp_output = f.name
try:
result = runner.invoke(cli, ['convert', temp_input, '--to', 'yaml', '-o', temp_output, '--indent', '4'])
assert result.exit_code == 0
finally:
os.unlink(temp_input)
if os.path.exists(temp_output):
os.unlink(temp_output)
def test_convert_invalid_format(self):
from src.cli import cli
runner = CliRunner()
result = runner.invoke(cli, ['convert', '--to', 'invalid'])
assert result.exit_code != 0
def test_convert_stdin_to_stdout(self):
from src.cli import cli
runner = CliRunner()
result = runner.invoke(cli, ['convert', '-f', 'json', '--to', 'yaml'], input='{"test": 123}')
assert result.exit_code == 0
class TestCLIValidate:
"""Tests for validate command."""
def test_validate_valid_json(self):
from src.cli import cli
runner = CliRunner()
with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
f.write('{"name": "test"}')
temp_file = f.name
try:
result = runner.invoke(cli, ['validate', temp_file])
assert result.exit_code == 0
finally:
os.unlink(temp_file)
def test_validate_invalid_json(self):
from src.cli import cli
runner = CliRunner()
with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
f.write('{invalid json}')
temp_file = f.name
try:
result = runner.invoke(cli, ['validate', temp_file])
assert result.exit_code != 0
finally:
os.unlink(temp_file)
def test_validate_yaml_file(self):
from src.cli import cli
runner = CliRunner()
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
f.write('name: test')
temp_file = f.name
try:
result = runner.invoke(cli, ['validate', temp_file])
assert result.exit_code == 0
finally:
os.unlink(temp_file)
def test_validate_with_format_option(self):
from src.cli import cli
runner = CliRunner()
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
f.write('{"name": "test"}')
temp_file = f.name
try:
result = runner.invoke(cli, ['validate', temp_file, '--format', 'json'])
assert result.exit_code == 0
finally:
os.unlink(temp_file)
def test_validate_stdin(self):
from src.cli import cli
runner = CliRunner()
result = runner.invoke(cli, ['validate', '--stdin', '--format', 'json'], input='{"test": 1}')
assert result.exit_code == 0
class TestCLIInfo:
"""Tests for info command."""
def test_info_command(self):
from src.cli import cli
runner = CliRunner()
result = runner.invoke(cli, ['info'])
assert result.exit_code == 0
assert "Supported Formats" in result.output
class TestCLIHelp:
"""Tests for CLI help."""
def test_main_help(self):
from src.cli import cli
runner = CliRunner()
result = runner.invoke(cli, ['--help'])
assert result.exit_code == 0
assert "Data Format Converter" in result.output
def test_convert_help(self):
from src.cli import cli
runner = CliRunner()
result = runner.invoke(cli, ['convert', '--help'])
assert result.exit_code == 0
assert "Convert data from one format to another" in result.output
def test_validate_help(self):
from src.cli import cli
runner = CliRunner()
result = runner.invoke(cli, ['validate', '--help'])
assert result.exit_code == 0
assert "Validate syntax" in result.output
def test_tui_help(self):
from src.cli import cli
runner = CliRunner()
result = runner.invoke(cli, ['tui', '--help'])
assert result.exit_code == 0
assert "interactive TUI mode" in result.output
def test_watch_help(self):
from src.cli import cli
runner = CliRunner()
result = runner.invoke(cli, ['watch', '--help'])
assert result.exit_code == 0
assert "Watch files for changes" in result.output
class TestCLIEdgeCases:
"""Tests for edge cases and error handling."""
def test_convert_missing_file(self):
from src.cli import cli
runner = CliRunner()
result = runner.invoke(cli, ['convert', 'nonexistent.json', '--to', 'yaml'])
assert result.exit_code != 0
def test_convert_invalid_source_format(self):
from src.cli import cli
runner = CliRunner()
result = runner.invoke(cli, ['convert', '--from', 'invalid', '--to', 'yaml'])
assert result.exit_code != 0
def test_validate_missing_file(self):
from src.cli import cli
runner = CliRunner()
result = runner.invoke(cli, ['validate', 'nonexistent.json'])
assert result.exit_code != 0