Загрузка данных


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$;