53 lines
2 KiB
Python
53 lines
2 KiB
Python
|
|
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"
|
||
|
|
)
|