import copy,json,unittest
from pathlib import Path
from compare import compare

class ContractMutationTests(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        p=Path(__file__).parent
        cls.b=json.loads((p/'green-evidence-B.json').read_text());cls.c=json.loads((p/'green-evidence-C.json').read_text())
    def test_real_green(self):compare(self.b,self.c)
    def test_mutations_fail_closed(self):
        def money(c):c['cases'][0]['body']['data']['detail']['recommend_energy']=2345.67
        def ratio(c):c['cases'][0]['body']['data']['detail']['nutrition_target']['fat_ratio']=25
        def field(c):c['cases'][0]['body']['data']['detail']['nutrition_target'].pop('store_id')
        def array_object(c):c['cases'][4]['body']['data']['detail']['nutrition_target']={}
        def empty(c):c['cases'][7]['body']['data']['list']['data']=[]
        def owner(c):c['cases'][7]['body']['data']['list']['data'][0]['user_id']=1
        def lexical(c):c['events'][0]['fingerprint_lexical_warning']=True
        def scope(c):c['write_audit'][0]['owned_scope_verified']=False
        def job(c):c['jobs'][0]['full_independent_values']['recommend_power']='2345.68'
        def history(c):c['jobs'][0]['old_prefix_unchanged']=False
        def sha(c):c['source_boundary']['nutrition_model_sha']='unknown'
        def proof(c):c['independent_final_original_verification']['plan_list_all_columns_verified']=False
        def retained(c):c['retention']['counts']['nurtrition']=2
        def order(c):c['cases'][0],c['cases'][1]=c['cases'][1],c['cases'][0]
        def actual_source(c):
            for e in c['events']:
                if 'app/store/model/nutrition/Nutrition.php' in e.get('source_hashes',{}):e['source_hashes']['app/store/model/nutrition/Nutrition.php']='candidate';break
        for mutate in (money,ratio,field,array_object,empty,owner,lexical,scope,job,history,sha,proof,retained,order,actual_source):
            c=copy.deepcopy(self.c);mutate(c)
            with self.subTest(mutation=mutate.__name__),self.assertRaises(AssertionError):compare(self.b,c)

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