"""Mutation guards over the retained evidence; no new SQL or HTTP."""
import copy
import unittest
import verify

class Mutations(unittest.TestCase):
    def test_positive_red(self):
        self.assertEqual(verify.run('red')['real_Wallet_logic_internal_failures'],3)

    def mutate(self,name,edit):
        original = verify.read
        def fake(key):
            obj=copy.deepcopy(original(key))
            if key==name: edit(obj)
            return obj
        verify.read=fake
        try:
            with self.assertRaises((AssertionError,KeyError,TypeError,ValueError)):
                verify.run('red')
        finally:
            verify.read=original

    def test_drop_dto_field(self):
        self.mutate('body-B-red-wallet-positive.json',lambda j:j['data']['data'][0].pop('business_no'))
    def test_number_string_change(self):
        self.mutate('body-B-red-account-positive.json',lambda j:j['data']['data'][1].update(biz_order_id=str(j['data']['data'][1]['biz_order_id'])))
    def test_drop_row(self):
        self.mutate('body-C-red-wallet-positive.json',lambda j:j['data']['data'].pop())
    def test_helper_leak(self):
        self.mutate('body-B-red-wallet-positive.json',lambda j:j['data']['data'][0].update(gift_biz_order_id_exact='1'))
    def test_false_natural_readback(self):
        self.mutate('readback-C.json',lambda j:j.update(all_old_rows_exact_unchanged=False))
    def test_wallet_internal_false_green(self):
        self.mutate('logic-C-red.json',lambda j:j['rows'][0].update(matches_source_contract=True))
    def test_native_bits_wrong(self):
        self.mutate('internal-C.json',lambda j:j['rows'][0].update(native_double_be_hex='3ff0000000000000'))
    def test_preparation_original_changed(self):
        self.mutate('all-before-B.json',lambda j:j[0].update(remark='mutated'))
    def test_preparation_row_changed(self):
        self.mutate('fixture-journal-C.json',lambda j:j['generated_rows'][0].update(biz_order_id='1'))
    def test_preparation_replayed(self):
        self.mutate('fixture-journal-B.json',lambda j:j.update(DML_attempts=10))

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