import copy
import json
import unittest
import sql_audit

class ScopeTests(unittest.TestCase):
    @classmethod
    def setUpClass(cls): cls.original = json.loads((sql_audit.ROOT / 'final-audit-B.json').read_text())['exact_original_rows']
    def test_quoted_comma(self): self.assertEqual(sql_audit.split_sql("'东门,广场', 7, 'x''y'"), ["'东门,广场'", '7', "'x''y'"])
    def test_literal_escaped(self): self.assertEqual(sql_audit.literal("'x''y'"), "x'y")
    def test_unbalanced_quotes(self):
        with self.assertRaises(AssertionError): sql_audit.split_sql("'not closed,7")
    def test_actual_private_SQL(self):
        rows = [json.loads(x) for x in (sql_audit.ROOT / 'private-evidence/B/private-sql.jsonl').read_text().splitlines()]
        self.assertEqual(sum(sql_audit.audit(r['sql'], self.original)['own_scope'] for r in rows if r['sql'].startswith(('INSERT', 'UPDATE'))), 26)
    def reject(self, sql):
        with self.assertRaises((AssertionError, KeyError, ValueError)): sql_audit.audit(sql, self.original)
    def test_global_insert(self): self.reject("INSERT INTO yoshop_sign_action SET store_id=0, create_by=2147001571, title='CDXSG10C91E'")
    def test_creator_mismatch(self): self.reject("INSERT INTO yoshop_sign_action SET store_id=2147001571, create_by=7, title='CDXSG10C91E'")
    def test_nonmarker_title(self): self.reject("INSERT INTO yoshop_sign_action SET store_id=2147001571, create_by=2147001571, title='自然活动'")
    def test_unknown_parent(self): self.reject("INSERT INTO yoshop_sign_address SET action_id=99999, create_by=2147001571, address='CDXSG10C91E'")
    def test_other_table(self): self.reject("INSERT INTO yoshop_sign_user SET action_id=89")
    def test_wide_update(self): self.reject("UPDATE yoshop_sign_action SET is_delete=1 WHERE store_id=2147001571")
    def test_unknown_id(self): self.reject("UPDATE yoshop_sign_action SET is_delete=1 WHERE id=99999 AND store_id=2147001571")
    def test_wrong_tenant(self): self.reject("UPDATE yoshop_sign_action SET is_delete=1 WHERE id=89 AND store_id=2147001572")
    def test_hard_delete(self): self.reject("DELETE FROM yoshop_sign_action WHERE id=89 AND store_id=2147001571")
    def test_schema_write(self): self.reject("ALTER TABLE yoshop_sign_action ADD COLUMN arbitrary INT")

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