prj-canon-federation/tools/test_validate_ownership.py
tegwick 745d74abd9 Record ownership ledger and completed CommerceCanon rename
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a070b5-4994-7271-bd8b-7c3dbcedec4b
2026-09-05 20:22:12 +02:00

54 lines
1.8 KiB
Python

"""Exercise migration-loss and ownership-conflict failure modes."""
import copy
import json
from pathlib import Path
import unittest
from validate_ownership import validate
class OwnershipValidationTests(unittest.TestCase):
def setUp(self):
root = Path(__file__).resolve().parents[1] / 'ledger'
self.ledger = json.loads((root / 'concept-ownership.json').read_text())
self.inventory = json.loads((root / 'source-inventory.json').read_text())
def errors(self):
return validate(self.ledger, self.inventory)['errors']
def test_complete_inventory(self):
self.assertEqual(self.errors(), [])
def test_lost_source_entry(self):
self.ledger['entries'].pop()
self.assertTrue(self.errors())
def test_duplicate_mapping(self):
self.ledger['entries'].append(copy.deepcopy(self.ledger['entries'][0]))
self.assertTrue(self.errors())
def test_conflicting_owner_across_entries(self):
target = self.ledger['entries'][1]['targets'][0]
target['concept'] = 'Actor'
target['owner']['model'] = 'itc-ident'
result = validate(self.ledger, self.inventory)
self.assertEqual(result['multiply_owned_concepts'], 1)
self.assertTrue(result['errors'])
def test_missing_owner(self):
self.ledger['entries'][0]['targets'][0].pop('owner')
self.assertTrue(self.errors())
def test_lost_half_of_split(self):
entry = next(e for e in self.ledger['entries'] if e['disposition'] == 'split')
entry['targets'].pop()
self.assertTrue(self.errors())
def test_convenience_term_promotion(self):
self.ledger['entries'][-1]['targets'][0]['kind'] = 'concept'
self.assertTrue(self.errors())
if __name__ == '__main__':
unittest.main()