#!/usr/bin/env python3
import copy,json,pathlib,sys,unittest
from VerifyOffline import load,verify_loaded
original=load(pathlib.Path(sys.argv[1]))

class Gates(unittest.TestCase):
    def test_actual_reports_pass_but_not_database_or_global_acceptance(self):
        result=verify_loaded(*copy.deepcopy(original));self.assertFalse(result['actual_select_executed']);self.assertFalse(result['p0_closed']);self.assertEqual(0,result['http_increment'])

mutations={
    'network_not_denied':lambda r:r[0]['ai_api'].update(os_network_denied=False),
    'database_query':lambda r:r[0]['ai_api'].update(db_queries=1),
    'cache_claim':lambda r:r[0]['ai_api'].update(cache_enabled=True),
    'p0_claim':lambda r:r[0]['ai_api'].update(p0_closed=True),
    'missing_case':lambda r:r[0]['store']['compiled'].pop('one'),
    'bind_type_drift':lambda r:r[0]['ai_api']['compiled']['one']['projected']['bind']['owned_min'].__setitem__(1,2),
    'altered_predicate':lambda r:r[0]['ai_api']['compiled']['one']['projected'].update(sql='SELECT 1'),
    'forged_hash':lambda r:r[0]['ai_api']['compiled']['one'].update(plan_sql_sha256='0'*64),
    'unsupported_passed':lambda r:r[0]['store']['unsupported']['group'].update(status='pass'),
    'id_string_drift':lambda r:r[0]['ai_api']['thin_model_wire'].__setitem__(0,r[0]['ai_api']['thin_model_wire'][0].replace('9007199254740993','"9007199254740993"')),
    'missing_real_model':lambda r:r[0]['ai_api'].update(actual_gift_model_wire=[]),
    'real_star_enabled':lambda r:r[0]['ai_api']['gift_candidate_not_executed']['schema'].update(star_allowed=True),
    'schema_difference_hidden':lambda r:r[2]['report'].update(columns=r[2]['report']['columns'][:16]),
    'metadata_read_business_rows':lambda r:r[1].update(business_row_reads=1),
    'physical_source_forged':lambda r:r[0]['ai_api']['source_identity']['app\\api\\model\\user\\GiftLog'].update(sha256='0'*64),
}
for name,mutation in mutations.items():
    def test(self,mutation=mutation):
        r=copy.deepcopy(original);mutation(r)
        with self.assertRaises((AssertionError,KeyError,TypeError,ValueError)):verify_loaded(*r)
    setattr(Gates,'test_reject_'+name,test)
if __name__=='__main__':unittest.main(argv=[sys.argv[0]],verbosity=2)
