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_body_counterexamples(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_OR_FINAL_STORE_ORDER_ALL');c=next(c for c in json.loads((d/'cases-FINAL.json').read_text()) if c['scenario']==w['scenario']);expected=expected_data(w,c,'B','FINAL');actual=json.loads(w['raw'])['data']
  mutations=[lambda a:a['list']['data'][0].pop('pay_price'),lambda a:a['list']['data'][0].__setitem__('pay_price',0),lambda a:a['list']['data'][0]['user'].__setitem__('balance',0),lambda a:a['list']['data'][0]['goods'][0].__setitem__('goods_weight','0.00'),lambda a:a['list']['data'][0].__setitem__('order_id',999999),lambda a:a['list'].__setitem__('data',{}),lambda a:a['list']['data'][0].__setitem__('address',[]),lambda a:a['list'].__setitem__('total','1'),lambda a:a['list']['data'][0]['goods'][0]['image'].pop('external_url')]
  for mutate in mutations:
   a=copy.deepcopy(actual);mutate(a)
   with self.assertRaises(AssertionError):equal(a,expected)
 def test_scope_and_natural_drift(self):
  for sql in ['UPDATE yoshop_order SET is_delete=0','DELETE FROM yoshop_user','INSERT INTO yoshop_recharge_order VALUES(1)','ALTER TABLE yoshop_order ADD x INT','GRANT ALL TO x']:self.assertFalse(no_business_write(sql))
  with self.assertRaises(AssertionError):equal({'natural_recharge_rows':898},{'natural_recharge_rows':899})
  for a,b in [([],{}),([1,2],[2,1]),(0,False),(0,'0.00'),({'store_id':2147001111},{'store_id':2147001112})]:
   with self.assertRaises(AssertionError):equal(a,b)

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