Как я могу установить переменные окружения во время выполнения в SvelteKit?

Вопрос или проблема

Я пытаюсь запустить тесты playwright для моего приложения SvelteKit, где я создаю новую базу данных для каждого запуска набора тестов. Я устанавливаю переменные окружения в файле настройки тестов вот так:

import { exec as baseExec } from 'child_process';
import util from 'util';
import { test as setup } from '@playwright/test';
import { uid } from 'uid';

const exec = util.promisify(baseExec);

setup('создать новую базу данных', async ({}) => {
  // Vite заменяет точечную нотацию
  // https://github.com/vitejs/vite/issues/3176
  // eslint-disable-next-line @typescript-eslint/dot-notation
  process.env['DATABASE_URL'] = `file:e2e/${uid()}.db`;
  await exec('npm run db:push -- --force');
});

Я могу читать process.env в файле завершения, но сами тесты по-прежнему используют URL базы данных, установленный в моем .env файле. Моя база данных настроена так:

import { createClient } from '@libsql/client';
import { drizzle } from 'drizzle-orm/libsql';
import { env } from '$env/dynamic/private';

if (env.DATABASE_URL == null) {
  throw new Error('DATABASE_URL не установлена');
}

const client = createClient({ url: env.DATABASE_URL });

export const db = drizzle({ client, casing: 'snake_case' });

Как заставить тесты использовать базу данных, созданную в файле настройки?

Ответ или решение

Как установить переменные окружения в режиме выполнения в SvelteKit

Ваша задача заключается в том, чтобы динамически устанавливать переменные окружения при запуске тестов Playwright для вашего приложения SvelteKit, особенно касаемо переменной DATABASE_URL, которая должна указывать на базу данных, созданную в процессе настройки.

Проблема

Вы установили переменные окружения в файле настройки тестов, однако ваши тесты продолжают использовать значение переменной DATABASE_URL, заданное в .env файле проекта. Это связано с особенностями того, как SvelteKit управляет переменными окружения на этапе сборки и выполнения.

Решение

Для того чтобы обеспечить доступ вашему коду к измененным переменным окружения во время выполнения тестов, вам потребуется специальный подход, так как SvelteKit использует динамические импорты из проекта env, которые считываются на этапе сборки, а не во время выполнения.

Вот несколько шагов, которые вы можете предпринять для решения этой проблемы:

  1. Создание отдельного файла конфигурации:
    Создайте файл, который будет заниматься динамическим разрешением переменной DATABASE_URL в зависимости от того, установлена ли она в окружении. Это может выглядеть так:

    // src/lib/databaseConfig.js
    export function getDatabaseUrl() {
     if (process.env.DATABASE_URL) {
       return process.env.DATABASE_URL;
     } else {
       throw new Error('DATABASE_URL is not set');
     }
    }
  2. Использование пользовательского механизма импорта:
    Вместо использования импорта из $env/dynamic/private, вы можете импортировать свой файл конфигурации и использовать его в своих тестах. Например, измените ваш код для инициализации базы данных таким образом:

    import { createClient } from '@libsql/client';
    import { drizzle } from 'drizzle-orm/libsql';
    import { getDatabaseUrl } from '$lib/databaseConfig';
    
    const client = createClient({ url: getDatabaseUrl() });
    export const db = drizzle({ client, casing: 'snake_case' });
  3. Перезапуск вашего приложения при изменении окружения:
    Возможно, потребуется настроить ваше приложение SvelteKit так, чтобы оно автоматически перезапускалось, если окружение меняется. Вы можете использовать такие инструменты, как nodemon, который позволит перезапустить приложение при изменениях в коде или конфигурации.

  4. Проверка значений во время выполнения:
    Убедитесь, что process.env.DATABASE_URL действительно изменяется перед запуском тестов. Для этого добавьте логи:

    console.log('Current DATABASE_URL:', process.env.DATABASE_URL);

    Это поможет вам диагностировать, происходит ли изменение переменной окружения должным образом перед выполнением тестов.

Заключение

Следуя приведенным рекомендациям, вы сможете успешно интегрировать динамически устанавливаемые переменные окружения в ваше приложение SvelteKit во время выполнения тестов. Это не только оптимизирует процесс тестирования, но и делает его более гибким и удобным для работы. Так вы сможете избежать использования затвердевых значений из .env и использовать базы данных, созданные на лету в ходе работы, что значительно улучшит качество тестирования вашего приложения.

Оцените материал
Добавить комментарий

Капча загружается...