#!/usr/bin/env python3
import copy,pathlib,sys,unittest
from compare import load,compare_loaded
args=sys.argv[1:];original=(load(pathlib.Path(args[0]),pathlib.Path(args[1])),load(pathlib.Path(args[2]),pathlib.Path(args[3])))
class Gates(unittest.TestCase):
    def test_private_overlay_results_match_with_explicit_owned_time_semantics(self):
        r=compare_loaded(*copy.deepcopy(original),allow_time=True);self.assertEqual(24,r['red_type_differences']);self.assertEqual(10,r['green_pass'])
    def test_without_opt_in_time_values_still_fail_literal_equality(self):
        with self.assertRaises(AssertionError):compare_loaded(*copy.deepcopy(original),allow_time=False)
mutations={
    'red_money_value':lambda x:x[1]['red']['responses']['S_DETAIL']['body']['data']['detail'].update(reduce_price=99.99),
    'red_other_value':lambda x:x[1]['red']['responses']['S_DETAIL']['body']['data']['detail'].update(describe='wrong'),
    'money_number':lambda x:x[1]['green']['responses']['S_DETAIL']['body']['data']['detail'].update(reduce_price=23.45),
    'missing_field':lambda x:x[1]['green']['responses']['S_LIST']['body']['data']['list']['data'][0].pop('write_off_limit_amount'),
    'empty_object':lambda x:x[1]['green']['responses']['S_EMPTY']['body']['data']['list'].update(data={}),
    'wrong_id':lambda x:x[1]['green']['responses']['S_DETAIL']['body']['data']['detail'].update(coupon_id=99999),
    'id_string':lambda x:x[1]['green']['responses']['S_DETAIL']['body']['data']['detail'].update(coupon_id=str(x[1]['ids']['store'])),
    'date_getter_difference':lambda x:x[1]['green']['responses']['S_DETAIL']['body']['data']['detail'].update(start_time='2030/01/01'),
    'unknown_time_type':lambda x:x[1]['green']['responses']['S_DETAIL']['body']['data']['detail'].update(create_time=7),
    'wrong_time_value_even_mapping':lambda x:x[1]['green']['responses']['S_DETAIL']['body']['data']['detail'].update(create_time='1999-01-01 00:00:00'),
    'natural_changed':lambda x:x[1]['green']['report'].update(natural_unchanged=False),
    'external_attempt':lambda x:x[1]['green']['report'].update(external_attempts=1),
    'retained_not_softdelete':lambda x:x[1]['green']['report']['retained_owned'][0].update(is_delete=0),
    'missing_case':lambda x:x[1]['green']['report']['cases'].pop(),
    'source_fail':lambda x:x[1]['green']['report']['cases'][0].update(source_pass=False),
    'old_serializer':lambda x:x[1]['green']['report']['source_sha256'].update({'app/store/model/Coupon.php':'49fd20285d9c80a21f520a7a0c7651387a616cbcd50a0ae8e44473409cc75a8b'}),
    'trace_invalid':lambda x:x[1]['green']['responses']['S_DELETE']['body'].update(trace_id='bad'),
    'message_changed':lambda x:x[1]['green']['responses']['S_DELETE']['body'].update(message='other'),
    'fake_source_time_window':lambda x:x[1]['red']['responses']['S_ADD'].update(request_time_window=[0,1]),
}
for name,change in mutations.items():
    def test(self,change=change):
        x=copy.deepcopy(original);change(x)
        with self.assertRaises((AssertionError,KeyError,TypeError,ValueError)):compare_loaded(*x,allow_time=True)
    setattr(Gates,'test_reject_'+name,test)
if __name__=='__main__':unittest.main(argv=[sys.argv[0]],verbosity=2)
