-- Тесты 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;