feat: prepare ARR for controlled public deployment
This commit is contained in:
51
tests/test_report_channel_facts_migration.py
Normal file
51
tests/test_report_channel_facts_migration.py
Normal file
@@ -0,0 +1,51 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
PROJECT_ROOT = Path(__file__).resolve().parents[1]
|
||||
|
||||
|
||||
class ReportChannelFactsMigrationTests(unittest.TestCase):
|
||||
def test_view_is_retained_only_and_privacy_minimized(self):
|
||||
sql = (PROJECT_ROOT / "database" / "007_report_channel_facts_view.sql").read_text(
|
||||
encoding="utf-8"
|
||||
)
|
||||
lowered = sql.lower()
|
||||
self.assertIn("create view finance.v_report_channel_facts", lowered)
|
||||
self.assertIn("where records.outcome = 'retained'", lowered)
|
||||
for required in (
|
||||
"records.daily_version_id",
|
||||
"records.id as daily_record_id",
|
||||
"records.no_of_rooms",
|
||||
"records.room_category_label",
|
||||
"records.total_price",
|
||||
"records.channel_key",
|
||||
):
|
||||
self.assertIn(required, lowered)
|
||||
select_clause = lowered.split("create view", 1)[1].split("from finance.daily_records", 1)[0]
|
||||
for forbidden in (
|
||||
"full_name",
|
||||
"confirmation_no",
|
||||
"disp_room_no",
|
||||
"res_comment",
|
||||
"trace_text",
|
||||
"products",
|
||||
"source_location",
|
||||
"source_worksheet",
|
||||
"source_row_no",
|
||||
):
|
||||
self.assertNotIn(forbidden, select_clause)
|
||||
|
||||
def test_down_only_drops_the_derived_view(self):
|
||||
sql = (
|
||||
PROJECT_ROOT / "database" / "007_report_channel_facts_view.down.sql"
|
||||
).read_text(encoding="utf-8").lower()
|
||||
self.assertIn("drop view if exists finance.v_report_channel_facts", sql)
|
||||
for forbidden in ("drop table", "delete from", "truncate"):
|
||||
self.assertNotIn(forbidden, sql)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user