import copy,json,unittest
from compare import ROOT,equal,expected_data,verify
from sql_audit import audit,no_business_write
class ContractTests(unittest.TestCase):
 def test_real_complete_evidence(self):verify();audit()
 def test_source_and_shape_mutations(self):
  d=ROOT/'private-evidence'/'B';w=next(json.loads(l) for l in (d/'private-wire.jsonl').read_text().splitlines() if json.loads(l)['scenario']=='PILOT_RD_FINAL_STORE_REFUND_DETAIL');c=next(c for c in json.loads((d/'cases-FINAL.json').read_text()) if c['scenario']==w['scenario']);actual=json.loads(w['raw'])['data'];expected=expected_data(w,c,'B','FINAL')
  changes=[lambda a:a['detail'].pop('refund_money'),lambda a:a['detail'].__setitem__('refund_money',0),lambda a:a['detail']['user'].__setitem__('balance',0),lambda a:a['detail']['orderGoods'].__setitem__('goods_weight','0.00'),lambda a:a['detail'].__setitem__('order_id',99999),lambda a:a['detail'].__setitem__('images',{}),lambda a:a['detail'].__setitem__('address',[]),lambda a:a['detail']['images'][0]['file'].pop('external_url'),lambda a:a['detail']['images'][0].__setitem__('id',99999)]
  for change in changes:
   a=copy.deepcopy(actual);change(a)
   with self.assertRaises(AssertionError):equal(a,expected)
 def test_readonly_and_natural_drift(self):
  for sql in ['UPDATE yoshop_order SET pay_status=20','DELETE FROM yoshop_user','INSERT INTO yoshop_order_delivery VALUES(1)','TRUNCATE TABLE yoshop_order_refund']:self.assertFalse(no_business_write(sql))
  for a,b in [(0,1),([],{}),(0,False),([1,2],[2,1]),({'store_id':2147001111},{'store_id':2147001112})]:
   with self.assertRaises(AssertionError):equal(a,b)
if __name__=='__main__':unittest.main()
