DO $test$
DECLARE
v_body text;
v_marker text :=
'if (smev_processes.process_type = 4) then';
v_matches integer;
BEGIN
IF EXISTS (
SELECT 1
FROM schedule.get_cron() c
WHERE c.id IN (44, 45)
AND c.active
) THEN
RAISE EXCEPTION
'Перед разовым тестом задания 44 и 45 должны быть выключены';
END IF;
IF EXISTS (
SELECT 1
FROM mtrustgate.moutlist
WHERE mftv_id BETWEEN 8000 AND 8007
) THEN
RAISE EXCEPTION
'Для тестовых файлов уже есть записи очереди. Повторный запуск остановлен';
END IF;
SELECT p.prosrc
INTO STRICT v_body
FROM pg_proc p
WHERE p.oid =
'smev.f3_send_register_to_sfr()'::regprocedure;
-- Ограничиваем выбор регламента и обновление last_processed.
SELECT count(*)
INTO v_matches
FROM regexp_matches(
v_body,
'where[[:space:]]+is_active[[:space:]]*=[[:space:]]*true',
'gi'
);
IF v_matches <> 2 THEN
RAISE EXCEPTION
'Структура функции отличается: ожидались два условия is_active';
END IF;
v_body := regexp_replace(
v_body,
'where[[:space:]]+is_active[[:space:]]*=[[:space:]]*true',
'WHERE id = 40',
'gi'
);
IF (
length(v_body)
- length(replace(v_body, v_marker, ''))
) <> length(v_marker) THEN
RAISE EXCEPTION
'Не найден единственный блок инициализации цикла';
END IF;
-- Ограничиваем результат модели шага 9 нашими восемью файлами.
v_body := replace(
v_body,
v_marker,
$scope$
IF smev_register_file.id = 40
AND smev_processes.id_process = 9 THEN
SELECT json_build_object(
'list',
coalesce(
json_agg(
x.value
ORDER BY (x.value->>'end_b')::integer
),
'[]'::json
)
)
INTO v_file_j
FROM json_array_elements(v_file_j->'list') AS x(value)
WHERE (x.value->>'end_b')::integer
BETWEEN 8000 AND 8007;
IF json_array_length(v_file_j->'list') <> 8 THEN
RAISE EXCEPTION
'Модель отбора вернула не все восемь тестовых файлов';
END IF;
END IF;
$scope$ || v_marker
);
-- Убираем уведомления только из разовой копии.
v_body := regexp_replace(
v_body,
'perform[[:space:]]+mail[.]api_new_message_group[[:space:]]*\([^;]*\);',
'NULL;',
'gi'
);
IF v_body ~* 'mail[.]api_new_message_group' THEN
RAISE EXCEPTION
'Не удалось исключить почтовые уведомления из теста';
END IF;
IF (
length(v_body)
- length(replace(v_body, 'return 0;', ''))
) <> length('return 0;') THEN
RAISE EXCEPTION
'Не найден единственный ожидаемый RETURN';
END IF;
v_body := replace(v_body, 'return 0;', 'return;');
EXECUTE format('DO %L', v_body);
END;
$test$;