import copy
import importlib.util
import json
from pathlib import Path
import unittest

ROOT=Path(__file__).parent
spec=importlib.util.spec_from_file_location('api_contract',ROOT/'verify-api-contract.py')
oracle=importlib.util.module_from_spec(spec);spec.loader.exec_module(oracle)

class ApiContractTests(unittest.TestCase):
    def test_positive(self):self.assertEqual(oracle.verify()['complete_BC_body_pairs'],6)
    def test_eight_mutations(self):
        p=ROOT/'api-private-evidence/C';wire=json.loads((p/'A5.wire.json').read_text())
        lease=json.loads((p/'final.json').read_text())['lease']
        roles={r['name'].split(oracle.MARKER+'-')[1]:str(r['id']) for r in lease}
        for key,value in [('name','wrong'),('status','1'),('create_by','other'),('pname','wrong'),('type',False),('extra',0),('create_time','2001-01-01 00:00:00'),('leaf_flag',0)]:
            w=copy.deepcopy(wire);body=json.loads(w['body']);body['data'][key]=value;w['body']=json.dumps(body)
            with self.subTest(key=key):
                with self.assertRaises(AssertionError):oracle.verify_wire(w,'C','A5',roles)

if __name__=='__main__':unittest.main()
