import copy,hashlib,json,unittest
from compare import ROOT,equal,expected_data,verify
from sql_audit import audit
class Contracts(unittest.TestCase):
 @classmethod
 def setUpClass(cls):
  p=ROOT/'private-evidence'/'C';cls.f=json.loads((p/'fixture-journal.json').read_text());cls.w={x['scenario']:x for x in map(json.loads,(p/'private-wire.jsonl').read_text().splitlines())};cls.c={c['scenario']:c for path in p.glob('cases-*.json') for c in json.loads(path.read_text())};cls.s='PILOT_DS_FINAL_TERMINAL_STATISTICS';cls.expected=expected_data(cls.w[cls.s],cls.c[cls.s])
 def test_whole_body_sql_source_resources(self):self.assertEqual(verify()['HTTP'],22);self.assertEqual(audit()['C']['counts']['HTTP_DML'],0)
 def test_leaf_types_missing_key_array_order(self):
  for kind in ('money_number','quantity_number','missing','wrong_id','dates_order','empty_object'):
   d=copy.deepcopy(self.expected)
   if kind=='money_number':d['data']['goodsRanking'][0]['sales_volume']=0
   if kind=='quantity_number':d['data']['goodsRanking'][0]['total_sales_num']=1
   if kind=='missing':del d['data']['overview']['orderTotal']
   if kind=='wrong_id':d['data']['goodsRanking'][0]['goods_id']=0
   if kind=='dates_order':d['data']['tradeTrend']['date'].reverse()
   if kind=='empty_object':d['data']['userExpendRanking']={}
   with self.assertRaises(AssertionError):equal(d,self.expected,kind)
 def test_original_scope_and_natural_drift(self):
  w=self.w[self.s]
  for kind in ('user_money','old_order','new_order','natural'):
   bad=copy.deepcopy(w)
   if kind=='user_money':bad['original']['user'][0]['balance']=999
   if kind=='old_order':bad['original']['order'][0]['merchant_remark']='changed'
   if kind=='new_order':bad['original']['order'][-1]['pay_status']=10
   if kind=='natural':bad['protect_after']['natural_order_export_count']+=1
   with self.assertRaises(AssertionError):equal(bad['protect_after'],self.f['before_protect'],'natural') if kind=='natural' else equal(bad['original'],self.f['after'],'original23')
 def test_exact_server_text_large_values(self):
  d=json.loads((ROOT/'aggregate-text-diagnostic-C.json').read_text());self.assertEqual(len(d['cases']),12)
  for x in d['cases']:self.assertIs(type(x['actual']['money_text']),str);self.assertEqual(x['actual']['money_text'],x['expected']);self.assertEqual(x['actual']['count_text'],'9007199254740993')
  self.assertEqual(d['actual_own_text_aggregate'],[{'count_text':'1','money_text':'0.00'}])
 def test_immutable_original_not_main_self(self):
  for module,sha in [('store','f117d9a632fb1b93f9cc68c337bd77fabacac87e7939684b721f362d194c61fa'),('terminal','687484fd71c67adbc501618499cb55961af1adedb97050d17f05cd615dd63039')]:
   g=json.loads((ROOT/f'compiler-immutable-original-from-snapshot-{module}.json').read_text());self.assertEqual(g['service_sha256'],sha);self.assertEqual(hashlib.sha256((ROOT/'private-evidence'/'C'/f'source-original-{module}-GoodsRanking.php').read_bytes()).hexdigest(),sha);self.assertNotEqual(sha,hashlib.sha256((ROOT/f'{module}GoodsRankingTextCandidate.php').read_bytes()).hexdigest())
if __name__=='__main__':unittest.main()
