from __future__ import annotations import json import subprocess import sys import tempfile import unittest from pathlib import Path def make_raw_subset(root: Path) -> tuple[Path, Path, int, int]: data_dir = root / "OF_dataset" sim_a_file = data_dir / "sim_a" / "field.txt" sim_b_file = data_dir / "sim_b" / "nested" / "field.txt" sim_a_file.parent.mkdir(parents=True) sim_b_file.parent.mkdir(parents=True) sim_a_file.write_text("abc") sim_b_file.write_text("defgh") expected_bytes = 8 expected_files = 2 manifest_path = root / "OF_dataset_subset_manifest.json" manifest_path.write_text( json.dumps( { "source_url": "https://example.invalid/OF_dataset.zip", "source_zip_bytes": 0, "sample_seed": 123, "sample_method": "test sample", "requested_simulations": 2, "extracted_simulations": 2, "expected_extracted_bytes": expected_bytes, "actual_file_count_under_target": expected_files, "target_root": str(data_dir), "simulations": [{"name": "sim_a"}, {"name": "sim_b"}], } ) ) return data_dir, manifest_path, expected_bytes, expected_files class InspectRawCliTests(unittest.TestCase): def run_cli(self, *args: str) -> subprocess.CompletedProcess[str]: return subprocess.run( [sys.executable, "-m", "airfrans_frontier.cli", *args], text=True, capture_output=True, check=False, ) def test_inspect_raw_success_reports_manifest_match(self) -> None: with tempfile.TemporaryDirectory() as tmp: data_dir, manifest_path, _, _ = make_raw_subset(Path(tmp)) result = self.run_cli( "inspect-raw", "--data-dir", str(data_dir), "--manifest", str(manifest_path), "--sample-limit", "2", ) self.assertEqual(result.returncode, 0) self.assertIn("status: ok", result.stdout) self.assertIn("simulations: 2 / 2", result.stdout) self.assertIn("files: 2 / 2", result.stdout) self.assertIn("bytes: 8 / 8", result.stdout) self.assertIn("- sim_a", result.stdout) self.assertIn("- sim_b", result.stdout) self.assertEqual(result.stderr, "") def test_inspect_raw_missing_data_dir_is_clear_error(self) -> None: with tempfile.TemporaryDirectory() as tmp: _, manifest_path, _, _ = make_raw_subset(Path(tmp)) missing_dir = Path(tmp) / "missing" result = self.run_cli( "inspect-raw", "--data-dir", str(missing_dir), "--manifest", str(manifest_path), ) self.assertEqual(result.returncode, 1) self.assertEqual(result.stdout, "") self.assertIn("error: Raw data directory not found:", result.stderr) def test_inspect_raw_manifest_mismatch_returns_one(self) -> None: with tempfile.TemporaryDirectory() as tmp: data_dir, manifest_path, _, _ = make_raw_subset(Path(tmp)) unexpected_file = data_dir / "sim_c" / "field.txt" unexpected_file.parent.mkdir(parents=True) unexpected_file.write_text("unexpected") result = self.run_cli( "inspect-raw", "--data-dir", str(data_dir), "--manifest", str(manifest_path), ) self.assertEqual(result.returncode, 1) self.assertIn("status: mismatch", result.stdout) self.assertIn("unexpected_simulations:", result.stdout) self.assertEqual(result.stderr, "") if __name__ == "__main__": unittest.main()