import copy,json,unittest
from pathlib import Path
from compare import eq,verify_wire
class GuardTests(unittest.TestCase):
 def test_full_dto_mutations_rejected(self):
  b={'status':200,'message':'success','data':{'list':{'total':2,'per_page':15,'current_page':1,'last_page':1,'data':[{'id':1,'money':'0.00','images':[]},{'id':2,'money':'0.00','images':['marked']}]}}}
  mutations=[]
  for op in range(10):
   m=copy.deepcopy(b)
   if op==0:del m['status']
   elif op==1:m['status']='200'
   elif op==2:m['message']='ok'
   elif op==3:m['data']['list']['data'][0]['money']=0
   elif op==4:m['data']['list']['data'][0]['images']={}
   elif op==5:m['data']['list']['data'].reverse()
   elif op==6:m['data']['list']['total']=1
   elif op==7:m['data']['list']['current_page']=2
   elif op==8:m['data']['list']['data'][0]['id']=3
   else:m['data']['list']['data'][0]['foreign']=True
   mutations.append(m)
  eq(b,copy.deepcopy(b))
  for m in mutations:
   with self.assertRaises(AssertionError):eq(m,b)
 def test_real_feedback_complete_oracle_and_mutations(self):
  p=Path(__file__).resolve().parent
  source=json.loads((p/'source-frozen-sha.json').read_text())['files']
  for lane in 'BC':
   schema=json.loads((p/f'structure-{lane}.json').read_text())['tables']
   for name in ['STORE_FEEDBACK_INFO','STORE_FEEDBACK_LIST_DIAGNOSTIC','TERMINAL_FOOD_ENUM','STORE_POINTS_AUTH']:
    wire=json.loads((p/'private-evidence'/lane/f'wire-PILOT_LF_{name}.json').read_text());verify_wire(wire,schema,source)
    for op in range(7):
     m=copy.deepcopy(wire);b=json.loads(m['raw'])
     if op==0:b['status']=str(b['status'])
     elif op==1:b['message']='wrong constant'
     elif op==2:b['trace_id']='invalid'
     elif op==3:del b['data']
     elif op==4:del m['source_sha256']['cores/BaseController.php']
     elif op==5:m['source_sha256']['cores/BaseController.php']='0'*64
     else:b['data']={} if isinstance(b['data'],list) else []
     m['raw']=json.dumps(b,ensure_ascii=False)
     with self.assertRaises((AssertionError,KeyError)):verify_wire(m,schema,source)
 def test_final_actual_full_dto_mutations(self):
  p=Path(__file__).resolve().parent;source=json.loads((p/'source-final-sha.json').read_text())['files']
  for lane in 'BC':
   schema=json.loads((p/f'structure-{lane}.json').read_text())['tables']
   for path in (p/'private-evidence'/f'{lane}-final').glob('wire-*.json'):
    w=json.loads(path.read_text());verify_wire(w,schema,source)
    for op in range(9):
     m=copy.deepcopy(w);b=json.loads(m['raw'])
     if op==0:b['status']='200'
     elif op==1:b['message']='incorrect'
     elif op==2:b['trace_id']='nothex'
     elif op==3:b['data']['list']['total']+=1
     elif op==4:b['data']['list']['per_page']=16
     elif op==5:b['data']['list']['data']=[{'leaked_other_tenant':2147001113}]
     elif op==6:del m['source_sha256']['cores/BaseController.php']
     elif op==7:m['before']['user'][0]['nick_name']='physical drift'
     else:
      if b['data']['list']['data']:b['data']['list']['data'][0]['user_id']=2147001113
      else:b['data']['list']['data']={}
     m['raw']=json.dumps(b,ensure_ascii=False)
     with self.assertRaises((AssertionError,KeyError)):verify_wire(m,schema,source)
if __name__=='__main__':unittest.main()
