import pytest from jsonschema import Draft202012Validator import json from importlib.resources import files from viano_bug_analysis.package.manifest import manifest_issues, parse_manifest def test_schema_is_valid(): Draft202012Validator.check_schema(json.loads(files("viano_bug_analysis.schemas").joinpath("manifest-v1.schema.json").read_text())) @pytest.mark.parametrize("field,value", [("format_version", 2), ("format_version", True), ("package_generation", -1), ("analysis_revision", True), ("state", "UNKNOWN"), ("created_at", "2026-01-01"), ("package_id", " ")]) def test_invalid_fields(manifest, field, value): manifest[field] = value assert manifest_issues(manifest) def test_missing_state_and_routing(manifest): del manifest["state"] manifest["status"] = "NEW" assert manifest_issues(manifest) def test_independent_generation_revision_and_routing(manifest): manifest.update(package_generation=15, analysis_revision=2, state="BLOCKED") manifest["routing"].update(destination="inbox", reason="Dependency unavailable", retry_count=3, retry_not_before="2026-01-02T00:00:00Z") assert not manifest_issues(manifest) def test_time_order(manifest): manifest["updated_at"] = "2025-01-01T00:00:00Z" assert manifest_issues(manifest)[0].code == "MANIFEST_TIME" @pytest.mark.parametrize("raw", [b'{"a":1,"a":2}', b'{"a":NaN}', b'\xff']) def test_strict_json(raw): with pytest.raises((ValueError, UnicodeError)): parse_manifest(raw) @pytest.mark.parametrize("timestamp", ["2026-02-30T00:00:00Z", "2026-01-01T00:00:00", "2026-01-01T00:00:00+00:60", "2026-01-01T00:00:60Z"]) def test_invalid_timestamps(timestamp, manifest): manifest["routing"]["retry_not_before"] = timestamp assert manifest_issues(manifest) def test_lowercase_timestamp(manifest): manifest["created_at"] = "2026-01-01t00:00:00z" assert not manifest_issues(manifest)