MT.Checks/DB/chk/tests/test_chk_check_insert.psql

116 lines
5.2 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Тесты chk.chk_check_insert — по func_specs/chk_check_insert.md (db-tst-6: № = строке таблицы).
-- Запуск: psql -d <тестовая база> -f test_chk_check_insert.psql (одна транзакция, откат в конце).
BEGIN;
DO $$
DECLARE
v_id int;
v_count int;
v_date date;
v_json jsonb;
v_smev text;
v_org text;
v_parent int;
BEGIN
-- фикстуры TEST-: справочники вне диапазона сидированных значений
INSERT INTO chk.chk_type (id, name) VALUES (990001, 'TEST-тип')
ON CONFLICT (id) DO NOTHING;
INSERT INTO chk.chk_status (id, name) VALUES (990001, 'TEST-статус')
ON CONFLICT (id) DO NOTHING;
-- родительская проверка фикстуры
v_parent := chk.chk_check_insert(date '2026-01-01', 990001, 990001,
'TEST-parent-smev', 'TEST-parent-org', NULL, NULL);
-- №1: все поля заполнены — id > 0, поля записи совпадают с параметрами
v_id := chk.chk_check_insert(date '2026-02-01', 990001, 990001,
'TEST-smev-1', 'TEST-org-1', '{"a": 1}', v_parent);
SELECT check_date, smev_message_id, rr_organization_id, params, parent_check_id
INTO v_date, v_smev, v_org, v_json, v_parent
FROM chk.chk_check_get(v_id);
IF v_id > 0
AND v_date = date '2026-02-01'
AND v_smev = 'TEST-smev-1'
AND v_org = 'TEST-org-1'
AND v_json = '{"a": 1}'::jsonb
AND v_parent IS NOT NULL THEN
RAISE NOTICE 'PASS chk.chk_check_insert #1';
ELSE
RAISE EXCEPTION 'FAIL chk.chk_check_insert #1: поля записи не совпали';
END IF;
-- №2: только обязательные параметры — необязательные поля NULL
v_id := chk.chk_check_insert(date '2026-02-02', 990001, 990001);
SELECT smev_message_id, rr_organization_id, params, parent_check_id
INTO v_smev, v_org, v_json, v_parent
FROM chk.chk_check_get(v_id);
IF v_id > 0 AND v_smev IS NULL AND v_org IS NULL AND v_json IS NULL AND v_parent IS NULL THEN
RAISE NOTICE 'PASS chk.chk_check_insert #2';
ELSE
RAISE EXCEPTION 'FAIL chk.chk_check_insert #2: необязательные поля не NULL';
END IF;
-- №3: валидный JSON в p_params — сохранён как есть
v_id := chk.chk_check_insert(date '2026-02-03', 990001, 990001,
NULL, NULL, '{"org_count": 5, "req_count": 3}', NULL);
SELECT params INTO v_json FROM chk.chk_check_get(v_id);
IF v_json = '{"org_count": 5, "req_count": 3}'::jsonb THEN
RAISE NOTICE 'PASS chk.chk_check_insert #3';
ELSE
RAISE EXCEPTION 'FAIL chk.chk_check_insert #3: JSON не совпал';
END IF;
-- №4: NULL p_check_date — исключение
BEGIN
PERFORM chk.chk_check_insert(NULL, 990001, 990001);
RAISE EXCEPTION 'FAIL chk.chk_check_insert #4: исключения не было';
EXCEPTION
WHEN raise_exception THEN
RAISE NOTICE 'PASS chk.chk_check_insert #4: %', SQLERRM;
END;
-- №5: NULL p_chk_type_id — исключение
BEGIN
PERFORM chk.chk_check_insert(date '2026-02-04', NULL, 990001);
RAISE EXCEPTION 'FAIL chk.chk_check_insert #5: исключения не было';
EXCEPTION
WHEN raise_exception THEN
RAISE NOTICE 'PASS chk.chk_check_insert #5: %', SQLERRM;
END;
-- №6: NULL p_chk_status_id — исключение
BEGIN
PERFORM chk.chk_check_insert(date '2026-02-04', 990001, NULL);
RAISE EXCEPTION 'FAIL chk.chk_check_insert #6: исключения не было';
EXCEPTION
WHEN raise_exception THEN
RAISE NOTICE 'PASS chk.chk_check_insert #6: %', SQLERRM;
END;
-- №7: несуществующий тип — исключение FOREIGN KEY
BEGIN
PERFORM chk.chk_check_insert(date '2026-02-04', 999999, 990001);
RAISE EXCEPTION 'FAIL chk.chk_check_insert #7: исключения не было';
EXCEPTION
WHEN foreign_key_violation THEN
RAISE NOTICE 'PASS chk.chk_check_insert #7';
END;
-- №8: некорректный JSON — исключение приведения
BEGIN
PERFORM chk.chk_check_insert(date '2026-02-04', 990001, 990001,
NULL, NULL, 'не-json', NULL);
RAISE EXCEPTION 'FAIL chk.chk_check_insert #8: исключения не было';
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'PASS chk.chk_check_insert #8: %', SQLERRM;
END;
-- удаление фикстур (родитель каскадом не удаляет — дочерние удаляем явно)
PERFORM chk.chk_check_delete(v_parent);
DELETE FROM chk.chk_check WHERE rr_organization_id LIKE 'TEST-%';
DELETE FROM chk.chk_type WHERE id = 990001;
DELETE FROM chk.chk_status WHERE id = 990001;
RAISE NOTICE 'ИТОГ chk.chk_check_insert: все проверки выполнены';
END;
$$;
ROLLBACK;