datalens-ui/tests/utils/playwright/datalens/datalens-test-setup.ts
2026-06-24 21:10:34 +05:00

117 lines
3.4 KiB
TypeScript

import fs from 'fs';
import path from 'path';
import {FullConfig, Page, chromium} from '@playwright/test';
import type {AuthRobotSettings, AuthenticateType, AuthenticateCustomArgs} from '../types';
import {AUTH_TYPE, DEFAULT_SCREENSHOT_PATH, AUTH_RETRY} from '../constants';
import {isTrueArg} from '../../../../src/shared';
import {authenticate} from './utils';
const ARTIFACTS_PATH = path.resolve(__dirname, '../../../artifacts');
type DatalensTestSetupArgs = {
config: FullConfig;
authSettings: AuthRobotSettings;
authType?: AuthenticateType;
authDisabled?: boolean;
afterAuth?: (args: {page: Page}) => Promise<void>;
customAuth?: (args: AuthenticateCustomArgs) => Promise<void>;
};
export async function datalensTestSetup({
config,
authSettings,
authType,
authDisabled,
afterAuth,
customAuth,
}: DatalensTestSetupArgs) {
if (fs.existsSync(ARTIFACTS_PATH) && process.env.CI !== 'true') {
await fs.rmSync(ARTIFACTS_PATH, {recursive: true});
}
const headful = isTrueArg(process.env.E2E_HEADFUL);
const browser = await chromium.launch({
args: ['--no-sandbox', '--disable-setuid-sandbox', '--ignore-certificate-errors'],
headless: !headful,
});
const context = await browser.newContext({
recordVideo: {
dir: DEFAULT_SCREENSHOT_PATH,
},
ignoreHTTPSErrors: true,
});
const page = await context.newPage();
const project = (config.projects || [])[0];
if (!project) {
throw new Error('Config for @playwright is not provided');
}
const baseUrl = project.use.baseURL;
const storageState =
typeof project.use.storageState === 'string' ? project.use.storageState : undefined;
if (!baseUrl) {
throw new Error('The URL for testing is not specified');
}
const pingRetries = 60;
const pingRetryDelay = 500;
let pingError: unknown;
for (let i = 0; i <= pingRetries; i += 1) {
try {
const response = await page.request.get(`${baseUrl}/ping`, {
timeout: 1 * 1000,
maxRedirects: 0,
});
if (response.ok()) {
pingError = null;
break;
}
} catch (error) {
pingError = error;
}
await new Promise((r) => setTimeout(r, pingRetryDelay));
}
if (pingError) {
throw pingError;
}
// eslint-disable-next-line no-console
console.log(`Ping ready: ok`);
const isAuthDisabled =
Boolean(authDisabled) ||
isTrueArg(process.env.NO_AUTH) ||
isTrueArg(process.env.E2E_NO_AUTH) ||
!isTrueArg(process.env.AUTH_ENABLED || 'true');
try {
if (isAuthDisabled) {
await afterAuth?.({page});
} else {
const authTypeFromEnv = process.env.E2E_AUTH_TYPE as AuthenticateType | undefined;
await authenticate({
page,
baseUrl,
authUrl: authSettings.url,
authType: authType || authTypeFromEnv || AUTH_TYPE.DATALENS,
login: authSettings.login,
password: authSettings.password,
afterAuth,
customAuth,
retryCount: AUTH_RETRY,
storageState,
});
}
} finally {
await page.close();
await context.close();
await browser.close();
}
}