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

class OracleMutations(unittest.TestCase):
    def test_full_dto_type_and_value_mutations(self):
        p=Path(__file__).parent
        raw=json.loads((p/'private/fixture-journal.json').read_text())
        dictionary=json.loads((p/'private/preflight-stage2-B.json').read_text())['enum_dictionary']
        original={k:[r for r in rows if int(r['store_id'])==2147001111] for k,rows in raw['after'].items()}
        cases=json.loads((p/'case-proposal.json').read_text())['cases']
        day=datetime.date(2026,10,11)
        mutations=0
        for case in cases:
            if case['context']!='store' or case['kind'] not in ['positive','unchecked-dictionary','empty','no-db']:continue
            expected=compare.expected_data(case,original,dictionary,day)
            if expected is None:continue
            body={'status':200,'message':'获取成功' if case['name']=='UNIT' else 'success','data':expected,'trace_id':'123456789abcd'}
            self.assertEqual(compare.validate_body(case,body,original,dictionary,day),[])
            bad=copy.deepcopy(body);bad['extra']=1;self.assertTrue(compare.validate_body(case,bad,original,dictionary,day));mutations+=1
            bad=copy.deepcopy(body);bad['status']='200';self.assertTrue(compare.validate_body(case,bad,original,dictionary,day));mutations+=1
            bad=copy.deepcopy(body);bad['data']={};self.assertTrue(compare.validate_body(case,bad,original,dictionary,day));mutations+=1
        for expected,actual in [({'a':'60.25'},{'a':60.25}),({'a':1},{'a':'1'}),({'a':None},{'a':[]}),({'a':[1,2]},{'a':[2,1]}),({'a':[1,2]},{'a':[1]}),({'a':{'x':1}},{'a':{}})]:
            self.assertTrue(compare.strict_diff(expected,actual));mutations+=1
        self.assertGreaterEqual(mutations,30)
        print('Full independent DTO mutation checks:',mutations)

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