-- Тесты chk.chk_check_select — по func_specs/chk_check_select.md (db-tst-6: № = строке таблицы). -- Запуск: psql -d <тестовая база> -f test_chk_check_select.psql (одна транзакция, откат в конце). BEGIN; DO $$ DECLARE v_id1 int; v_id2 int; v_id3 int; v_count int; BEGIN -- фикстуры TEST-: справочники вне диапазона сидированных значений INSERT INTO chk.chk_type (id, name) VALUES (990001, 'TEST-тип 1') ON CONFLICT (id) DO NOTHING; INSERT INTO chk.chk_type (id, name) VALUES (990002, 'TEST-тип 2') ON CONFLICT (id) DO NOTHING; INSERT INTO chk.chk_status (id, name) VALUES (990001, 'TEST-статус 1') ON CONFLICT (id) DO NOTHING; INSERT INTO chk.chk_status (id, name) VALUES (990002, 'TEST-статус 2') ON CONFLICT (id) DO NOTHING; -- три проверки: 1 и 2 — одна дата/тип/статус, 3 — все значения другие v_id1 := chk.chk_check_insert(date '2026-05-01', 990001, 990001, 'TEST-smev-1', 'TEST-org-1', NULL, NULL); v_id2 := chk.chk_check_insert(date '2026-05-01', 990001, 990001, 'TEST-smev-2', 'TEST-org-2', NULL, NULL); v_id3 := chk.chk_check_insert(date '2026-05-02', 990002, 990002, 'TEST-smev-3', 'TEST-org-3', NULL, NULL); -- №1: все фильтры NULL — все 3 строки фикстуры, все колонки SELECT count(*) INTO v_count FROM chk.chk_check_select(NULL, NULL, NULL, NULL) WHERE id IN (v_id1, v_id2, v_id3); IF v_count = 3 THEN RAISE NOTICE 'PASS chk.chk_check_select #1'; ELSE RAISE EXCEPTION 'FAIL chk.chk_check_select #1: найдено % из 3', v_count; END IF; -- №2: фильтр по дате — только строки с 2026-05-01 SELECT count(*) INTO v_count FROM chk.chk_check_select(date '2026-05-01', NULL, NULL, NULL) WHERE id IN (v_id1, v_id2, v_id3); IF v_count = 2 THEN RAISE NOTICE 'PASS chk.chk_check_select #2'; ELSE RAISE EXCEPTION 'FAIL chk.chk_check_select #2: найдено %, ожидалось 2', v_count; END IF; -- №3: фильтр по типу SELECT count(*) INTO v_count FROM chk.chk_check_select(NULL, 990001, NULL, NULL) WHERE id IN (v_id1, v_id2, v_id3); IF v_count = 2 THEN RAISE NOTICE 'PASS chk.chk_check_select #3'; ELSE RAISE EXCEPTION 'FAIL chk.chk_check_select #3: найдено %, ожидалось 2', v_count; END IF; -- №4: фильтр по статусу SELECT count(*) INTO v_count FROM chk.chk_check_select(NULL, NULL, 990002, NULL) WHERE id IN (v_id1, v_id2, v_id3); IF v_count = 1 THEN RAISE NOTICE 'PASS chk.chk_check_select #4'; ELSE RAISE EXCEPTION 'FAIL chk.chk_check_select #4: найдено %, ожидалось 1', v_count; END IF; -- №5: фильтр по организации РР SELECT count(*) INTO v_count FROM chk.chk_check_select(NULL, NULL, NULL, 'TEST-org-2') WHERE id IN (v_id1, v_id2, v_id3); IF v_count = 1 THEN RAISE NOTICE 'PASS chk.chk_check_select #5'; ELSE RAISE EXCEPTION 'FAIL chk.chk_check_select #5: найдено %, ожидалось 1', v_count; END IF; -- №6: комбинированный фильтр (дата + статус) — только строка 3 SELECT count(*) INTO v_count FROM chk.chk_check_select(date '2026-05-02', NULL, 990002, NULL) WHERE id IN (v_id1, v_id2, v_id3); IF v_count = 1 THEN RAISE NOTICE 'PASS chk.chk_check_select #6'; ELSE RAISE EXCEPTION 'FAIL chk.chk_check_select #6: найдено %, ожидалось 1', v_count; END IF; -- №7: фильтр без совпадений — пустая таблица SELECT count(*) INTO v_count FROM chk.chk_check_select(date '2026-05-02', NULL, 990001, NULL); IF v_count = 0 THEN RAISE NOTICE 'PASS chk.chk_check_select #7'; ELSE RAISE EXCEPTION 'FAIL chk.chk_check_select #7: найдено %, ожидалось 0', v_count; END IF; -- удаление фикстур PERFORM chk.chk_check_delete(v_id1); PERFORM chk.chk_check_delete(v_id2); PERFORM chk.chk_check_delete(v_id3); DELETE FROM chk.chk_type WHERE id IN (990001, 990002); DELETE FROM chk.chk_status WHERE id IN (990001, 990002); RAISE NOTICE 'ИТОГ chk.chk_check_select: все проверки выполнены'; END; $$; ROLLBACK;