#!/usr/bin/env python3
import copy,sys,unittest
from verify import load,verify_loaded
original=(load(sys.argv[1]),load(sys.argv[2]))
class Gates(unittest.TestCase):
    def test_positive(self):self.assertEqual('pass',verify_loaded(*copy.deepcopy(original))['status'])
mutations={
    'source_sha':lambda x:x[1]['report']['source_sha256'].update({'cores/BaseModel.php':'0'*64}),
    'integer_to_string':lambda x:x[1]['responses']['S_ROLE_ALL']['body']['data']['list'][0].update(role_id='1'),
    'missing_field':lambda x:x[1]['responses']['S_ROLE_ALL']['body']['data']['list'][0].pop('role_name'),
    'empty_object':lambda x:x[1]['responses']['S_ROLE_MISSING']['body']['data'].update(list={}),
    'wrong_source_relation':lambda x:x[1]['source']['S_ROLE_ALL']['expected'][0].update(menuIds=[99999]),
    'source_fail':lambda x:x[1]['report']['cases'][0].update(source_pass=False),
    'natural_changed':lambda x:x[1]['report'].update(natural_unchanged=False),
    'external_attempt':lambda x:x[1]['report'].update(external_attempts=1),
    'dml':lambda x:x[1]['report'].update(dml=1),
    'missing_case':lambda x:x[1]['report']['cases'].pop(),
    'bad_trace':lambda x:x[1]['responses']['S_ROLE_ALL']['body'].update(trace_id='bad'),
    'events_rewritten':lambda x:x[1]['report']['events'].pop(),
    'message_changed':lambda x:x[1]['responses']['S_MENU_REPEAT']['body'].update(message='other'),
    'unexpected_helper':lambda x:x[1]['responses']['S_MENU_COLD']['body']['data']['list'][0].update(helper='unexpected'),
}
for name,change in mutations.items():
    def test(self,change=change):
        x=copy.deepcopy(original);change(x)
        with self.assertRaises((AssertionError,KeyError,TypeError)):verify_loaded(*x)
    setattr(Gates,'test_reject_'+name,test)
if __name__=='__main__':unittest.main(argv=[sys.argv[0]],verbosity=2)
