"""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()