import copy
import json
import unittest
from pathlib import Path
from sql_audit import audit

class NativeAuditMutations(unittest.TestCase):
    def test_native_bind_and_scope_mutations(self):
        p=Path(__file__).parent/'private-evidence/C/pdo-native.jsonl'
        rows=[json.loads(line) for line in p.read_text().splitlines()]
        frame=next(rows[i:i+3] for i in range(0,len(rows),3) if rows[i]['sql_input'].startswith('SELECT * FROM yoshop_staff WHERE'))
        self.assertEqual(audit(frame)['HTTP_business_SELECT'],1)
        changes=[]
        bad=copy.deepcopy(frame);bad[2]['success']=False;changes.append(bad)
        bad=copy.deepcopy(frame);bad[1]['prepared']=False;changes.append(bad)
        bad=copy.deepcopy(frame);bad[2]['execute_array']=['hidden'];changes.append(bad)
        bad=copy.deepcopy(frame);bad[2]['scenario']='OTHER';changes.append(bad)
        bad=copy.deepcopy(frame);first=next(iter(bad[2]['bindValue']));bad[2]['bindValue'][first]['pdo_type']=1;changes.append(bad)
        bad=copy.deepcopy(frame);first=next(iter(bad[2]['bindValue']));bad[2]['bindValue'][first]['value']=2147001112;changes.append(bad)
        for replacement in ['UPDATE yoshop_staff SET name=1','SELECT * FROM other.yoshop_staff','SELECT * FROM yoshop_unapproved','SELECT * FROM yoshop_staff WHERE id=1','SELECT 1; DROP TABLE x']:
            bad=copy.deepcopy(frame);bad[0]['sql_input']=bad[1]['queryString']=bad[2]['queryString']=replacement;changes.append(bad)
        for bad in changes:
            with self.assertRaises((AssertionError,KeyError)):audit(bad)
        self.assertEqual(len(changes),11)

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