from pathlib import Path
ROOT=Path(__file__).resolve().parents[1]
def read(x): return (ROOT/x).read_text()
def test_v021_router_ui_version():
 m=read('app/main.py'); assert 'v021_router' in m and "from app.api.v021 import router as v021_router" in m and '/tenant-isolation' in m
 assert (ROOT/'app/static/tenant-isolation.html').exists()
def test_v021_models_migration_and_physical_columns():
 s=read('app/models/entities.py')+read('migrations/021_full_tenant_isolation.sql')
 for t in ['tenant_resource_scopes_v021','tenant_isolation_violations_v021','tenant_migration_batches_v021','tenant_isolation_policies_v021']: assert t in s
 for t in ['data_sources','datasets','dashboards','reports','semantic_models_v015','federated_query_jobs_v017','object_storage_artifacts_v019']: assert f'ALTER TABLE {t} ADD COLUMN IF NOT EXISTS tenant_id' in s
def test_v021_enforcement_and_migration_controls():
 s=read('app/api/v021.py')+read('app/services/tenant_isolation.py')
 for token in ['assert_resource_access','cross_tenant_access','unscoped_resource','block_unscoped_resources','dry_run','LEGACY_RESOURCE_MAP','X-Tenant-ID','record_violation']: assert token in s
def test_v021_docs():
 for f in ['USER_GUIDE_V021.md','ADMIN_GUIDE_V021.md','HOMOLOGATION_V021.md']: assert (ROOT/f).exists()
