import copy,json,unittest
from compare import ROOT,equal,projection,validate_effects,verify
from sql_audit import audit
class Tests(unittest.TestCase):
 @classmethod
 def setUpClass(cls):
  p=ROOT/'private-evidence'/'C';cls.pre=json.loads((p/'preflight.json').read_text());j=json.loads((p/'run-journal.json').read_text());cls.gid=j['new_goods_id'];cls.cases={c['scenario']:c for c in j['cases']};cls.wires={w['scenario']:w for w in map(json.loads,(p/'private-wire.jsonl').read_text().splitlines())};cls.templates=json.loads((ROOT/'request-values.json').read_text())
 def test_full_original_contract_and_sql(self):self.assertEqual(verify()['HTTP'],16);self.assertEqual(audit()['C']['counts']['API_DELETE_statements'],3)
 def test_missing_type_null_array(self):
  w=self.wires['PILOT_TG_READ_ADD'];e=projection(w,self.gid)
  for k in ('missing','money_number','id_string','null_to_array'):
   x=copy.deepcopy(e)
   if k=='missing':del x['detail']['skuList']
   if k=='money_number':x['detail']['goods_price_min']=12.34
   if k=='id_string':x['detail']['goods_id']=str(x['detail']['goods_id'])
   if k=='null_to_array':x['detail']['skuList'][0]['goods_props']=[]
   with self.assertRaises(AssertionError):equal(x,e,k)
 def test_old_scope_and_unapproved_change(self):
  s='PILOT_TG_STATE_DOWN'
  for k in ('old_goods','old_user','new_stock','foreign_sku','natural'):
   w=copy.deepcopy(self.wires[s])
   if k=='old_goods':w['original']['goods'][0]['goods_name']='changed'
   if k=='old_user':w['original']['user'][0]['balance']=99
   if k=='new_stock':next(g for g in w['original']['goods'] if int(g['goods_id'])==self.gid)['stock_total']=1
   if k=='foreign_sku':w['original']['goods_sku'][0]['goods_id']=0
   if k=='natural':w['protect_after']['printer_natural_count']=1
   with self.assertRaises(AssertionError):validate_effects(w,self.cases[s],self.pre,self.gid,self.templates)
if __name__=='__main__':unittest.main()
