import pytest from conftest import golden_entries, golden_manifest from target_revenue import conversion, validation def test_conversion_status_not_converted_partway_through(): manifest = golden_manifest() status = conversion.conversion_status(manifest, golden_entries()[:4]) assert status.is_converted is False assert status.outstanding_target == 45000 def test_conversion_status_converted_after_full_sequence(): manifest = golden_manifest() status = conversion.conversion_status(manifest, golden_entries()) assert status.is_converted is True assert status.outstanding_target == 0 assert status.future_license == "MIT" def test_conversion_status_requires_no_attestation_document(): """PRD FR-7/G6: conversion status must be computable from Manifest + Ledger alone, with no attestation file consulted or required.""" manifest = golden_manifest() entries = golden_entries() status_without_attestation = conversion.conversion_status(manifest, entries) assert status_without_attestation.is_converted is True def test_generate_attestation_for_converted_phase(): manifest = golden_manifest() entries = golden_entries() attestation = conversion.generate_attestation( manifest, entries, conversion_timestamp="2027-06-01T00:00:00Z" ) validation.validate_conversion_attestation(attestation) assert attestation["final_outstanding_target"] == 0 assert attestation["final_development_credit"] == 67000 assert attestation["final_remission_credit"] == 33000 assert attestation["future_license"] == "MIT" assert attestation["phase"] == "trsl:phase:example-001" assert attestation["ledger_checkpoint"] == entries[-1]["id"] def test_generate_attestation_rejects_unconverted_phase(): manifest = golden_manifest() partial_entries = golden_entries()[:4] # Outstanding Target still 45000 with pytest.raises(ValueError, match="Outstanding Target"): conversion.generate_attestation( manifest, partial_entries, conversion_timestamp="2026-12-01T00:00:00Z" )