import contextlib
import copy
import hashlib
import io
import json
from pathlib import Path
import runpy
import sys
import unittest
from unittest.mock import patch
ROOT=Path(__file__).parent;TARGET=ROOT/'private-evidence/C-http-retest/private-retest-wire.jsonl';READ=Path.read_text
def replay(replacement=None):
    def read(path,*a,**kw):return replacement if replacement is not None and path.resolve()==TARGET.resolve() else READ(path,*a,**kw)
    out=io.StringIO()
    with patch.object(Path,'read_text',read),patch.object(sys,'argv',['verify-http.py','--suffix=-retest']),contextlib.redirect_stdout(out):
        try:runpy.run_path(str(ROOT/'verify-http.py'),run_name='__main__')
        except SystemExit as exc:code=exc.code
    return code,json.loads(out.getvalue())
class OracleTests(unittest.TestCase):
    def test_positive(self):
        code,result=replay();self.assertEqual(code,0);self.assertEqual(result['assertions'],104)
    def test_nine_mutations(self):
        original=[json.loads(line) for line in READ(TARGET).splitlines()]
        for kind in range(9):
            records=copy.deepcopy(original);r=records[0];b=json.loads(r['body']);row=b['data']['rows'][0]
            if kind==0:row['id']=str(row['id'])
            elif kind==1:row['create_time']+='.000000'
            elif kind==2:row['protein']=str(row['protein'])
            elif kind==3:row['demo']=None
            elif kind==4:row['number']=float(row['number'])
            elif kind==5:row['train_status']=True
            elif kind==6:b['data']['rows']={}
            elif kind==7:r['media_leaf_calls']+=1
            elif kind==8:r['oracle_native_SELECT'][0]['row_count']=101
            r['body']=json.dumps(b,ensure_ascii=False,separators=(',',':'));r['body_sha256']=hashlib.sha256(r['body'].encode()).hexdigest()
            with self.subTest(kind=kind):
                code,result=replay('\n'.join(json.dumps(x,ensure_ascii=False) for x in records)+'\n');self.assertEqual(code,2);self.assertFalse(result['passed'])
if __name__=='__main__':unittest.main()
