feat(validate): добавлен валидационный DAG bookings_validate
- Зачем:
- студент реализует 9 объектов DWH без автоматической обратной связи;
- ошибки (NULL в PK, дубли BK, сломанный SCD2) обнаруживались только на слое DM
через 2–3 слоя, где отладка многократно сложнее.
- Что:
- создан DAG bookings_validate.py — три параллельных TaskGroup (validate_ods,
validate_dds, validate_dm), schedule=None (только ручной trigger);
- создано 17 SQL-скриптов в sql/validate/: ODS BK coverage vs STG-батч,
согласованность _load_id между ods.airplanes и ods.seats, дубли BK, NULL в PK,
покрытие ODS→DDS для измерений (dim_routes требует открытой версии valid_to IS NULL),
SCD2 активный тест backup→mutate→student_load→check(5 инвариантов)→restore
(trigger_rule=all_done), проверка «дыр» между SCD2-версиями,
exists-чеки для 4 DM-витрин;
- добавлен класс TestBookingsValidate (5 smoke-тестов) в tests/test_dags_smoke.py.
- Проверка:
- make test — 4 passed, 14 skipped (DAG-тесты скипаются без Airflow, норма);
- ручной trigger bookings_validate в Airflow UI на solution-ветке — все таски зелёные.
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
-- Мутация: сдвигаем departure_time у одного маршрута на 1 час.
|
||||
-- Это должно изменить hashdiff → SCD2 должен закрыть старую версию и создать новую.
|
||||
--
|
||||
-- Сохраняем route_no тестового маршрута в служебную таблицу _validate_scd2_target,
|
||||
-- чтобы check-скрипт точно знал, какой маршрут проверять (а не угадывал по побочным эффектам).
|
||||
DO $$
|
||||
DECLARE
|
||||
v_route TEXT;
|
||||
v_old_time TIME;
|
||||
BEGIN
|
||||
-- Берём первый маршрут, у которого departure_time заполнен
|
||||
SELECT route_no, departure_time
|
||||
INTO v_route, v_old_time
|
||||
FROM ods.routes
|
||||
WHERE departure_time IS NOT NULL
|
||||
ORDER BY route_no
|
||||
LIMIT 1;
|
||||
|
||||
IF v_route IS NULL THEN
|
||||
RAISE EXCEPTION 'FAILED: ods.routes пуста или нет маршрутов с departure_time. Загрузите STG→ODS перед проверкой.';
|
||||
END IF;
|
||||
|
||||
-- Запоминаем тестовый маршрут в служебную таблицу
|
||||
DROP TABLE IF EXISTS _validate_scd2_target;
|
||||
CREATE TABLE _validate_scd2_target AS
|
||||
SELECT v_route AS route_no;
|
||||
|
||||
-- Сдвигаем время на 1 час у всех записей этого маршрута
|
||||
UPDATE ods.routes
|
||||
SET departure_time = departure_time + INTERVAL '1 hour'
|
||||
WHERE route_no = v_route;
|
||||
|
||||
RAISE NOTICE 'SCD2 TEST: маршрут % — departure_time сдвинут с % на %',
|
||||
v_route, v_old_time, v_old_time + INTERVAL '1 hour';
|
||||
END $$;
|
||||
Reference in New Issue
Block a user