116 lines
5.2 KiB
Plaintext
116 lines
5.2 KiB
Plaintext
-- Тесты 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;
|