#!/usr/bin/env python3
import copy,pathlib,sys,unittest
from compare import compare_loaded,load
original=(load(pathlib.Path(sys.argv[1])),load(pathlib.Path(sys.argv[2])))
class Gates(unittest.TestCase):
    def test_real_evidence_passes_with_limited_page_scope(self):
        r=compare_loaded(*copy.deepcopy(original));self.assertEqual(16,r['pair_pass']);self.assertEqual(10,r['strict_full_response_pairs']);self.assertIsNone(r['pairs'][-1]['strict_equal'])
mutations={
    'amount_number_not_string':lambda x:x[1]['responses']['CP_DEFAULT']['owned_row'].update(write_off_limit_amount=0.0),
    'missing_new_field':lambda x:x[1]['responses']['MY_DEFAULT']['body']['data']['list']['data'][0].pop('employee_id'),
    'empty_object_array':lambda x:x[1]['responses']['MY_BEFORE']['body']['data']['list'].update(data={}),
    'trace_invalid':lambda x:x[1]['responses']['RECEIVE']['body'].update(trace_id=7),
    'message_difference':lambda x:x[1]['responses']['REPEAT']['body'].update(message='other'),
    'wrong_owned_id':lambda x:x[1]['responses']['MY_DEFAULT']['body']['data']['list']['data'][0].update(coupon_id=999999),
    'id_string_type':lambda x:x[1]['responses']['MY_DEFAULT']['body']['data']['list']['data'][0].update(user_coupon_id=str(x[1]['fixture_map']['claim_id'])),
    'clob_truncated':lambda x:x[1]['responses']['CP_JSON_32768']['owned_row'].update(unavailable_dates='[]'),
    'clob_array_type':lambda x:x[1]['responses']['CP_JSON_QUOTES']['owned_row'].update(unavailable_dates=[]),
    'natural_changed':lambda x:x[1]['report'].update(natural_unchanged=False),
    'cleanup_nonzero':lambda x:x[1]['report']['independent_remaining'].update(user_coupon=1),
    'external_attempt':lambda x:x[1]['report'].update(external_attempts=1),
    'actor_changed':lambda x:x[1]['report'].update(actors_unchanged=False),
    'missing_case':lambda x:x[1]['report']['cases'].pop(),
    'source_fail':lambda x:x[1]['report']['cases'][0].update(source_pass=False),
    'wrong_serializer':lambda x:x[1]['report']['source_sha256'].update({'app/api/model/Coupon.php':'0'*64}),
    'repeat_writes':lambda x:x[1]['report']['events'].append({'kind':'query_observed','scenario':'PILOT_CPN_REPEAT','operation':'insert','callsites':['fake:1'],'fingerprint_lexical_warning':False,'fingerprint':'0'*64}),
}
for name,change in mutations.items():
    def test(self,change=change):
        data=copy.deepcopy(original);change(data)
        with self.assertRaises((AssertionError,KeyError,TypeError,ValueError)):compare_loaded(*data)
    setattr(Gates,'test_reject_'+name,test)
if __name__=='__main__':unittest.main(argv=[sys.argv[0]],verbosity=2)
