e2e-merged

This commit is contained in:
Untone 2024-07-04 01:33:50 +03:00
parent 0a997bdcae
commit 3e8efdcae5
7 changed files with 292 additions and 267 deletions

View File

@ -11,7 +11,7 @@
"codegen": "graphql-codegen", "codegen": "graphql-codegen",
"e2e:tests": "npx playwright test --project=webkit", "e2e:tests": "npx playwright test --project=webkit",
"e2e:install": "npx playwright install webkit && npx playwright install-deps ", "e2e:install": "npx playwright install webkit && npx playwright install-deps ",
"fix": "npm run check:code:fix && stylelint **/*.{scss,css} --fix", "fix": "npx @biomejs/biome check . --fix && stylelint **/*.{scss,css} --fix",
"format": "npx @biomejs/biome format src/. --write", "format": "npx @biomejs/biome format src/. --write",
"postinstall": "npm run codegen && npx patch-package", "postinstall": "npm run codegen && npx patch-package",
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
@ -118,9 +118,6 @@
"idb": "^8.0.0", "idb": "^8.0.0",
"mailgun.js": "^10.2.1" "mailgun.js": "^10.2.1"
}, },
"trustedDependencies": [
"@biomejs/biome"
],
"engines": { "engines": {
"node": "20.x" "node": "20.x"
} }

View File

@ -38,7 +38,6 @@ export default defineConfig({
/* Configure projects for major browsers */ /* Configure projects for major browsers */
projects: [ projects: [
{ {
name: 'webkit', name: 'webkit',
use: { ...devices['Desktop Safari'] } use: { ...devices['Desktop Safari'] }
@ -63,7 +62,7 @@ export default defineConfig({
// name: 'Google Chrome', // name: 'Google Chrome',
// use: { ...devices['Desktop Chrome'], channel: 'chrome' }, // use: { ...devices['Desktop Chrome'], channel: 'chrome' },
// }, // },
] ],
/* Run local dev server before starting the tests */ /* Run local dev server before starting the tests */
webServer: { webServer: {
@ -71,6 +70,6 @@ export default defineConfig({
url: 'https://localhost:3000', url: 'https://localhost:3000',
ignoreHTTPSErrors: true, ignoreHTTPSErrors: true,
reuseExistingServer: !process.env.CI, reuseExistingServer: !process.env.CI,
timeout: 5 * 60 * 1000, timeout: 5 * 60 * 1000
}, }
}) })

View File

@ -1 +0,0 @@

View File

@ -1,76 +1,81 @@
import { test, expect, type Page } from '@playwright/test'; // biome-ignore lint/correctness/noNodejsModules: <explanation>
import https from 'https'; import https from 'node:https'
import { type Page, expect, test } from '@playwright/test'
/* Global starting test config */ /* Global starting test config */
let page: Page; let page: Page
function httpsGet(url: string): Promise<void> { function httpsGet(url: string): Promise<void> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
https.get(url, { https
.get(
url,
{
rejectUnauthorized: false // Ignore SSL certificate errors rejectUnauthorized: false // Ignore SSL certificate errors
}, (res) => { },
(res) => {
if (res.statusCode === 200) { if (res.statusCode === 200) {
resolve(); resolve()
} else { } else {
reject(new Error(`Request failed with status code ${res.statusCode}`)); reject(new Error(`Request failed with status code ${res.statusCode}`))
} }
}).on('error', (error) => { }
reject(error); )
}); .on('error', (error) => {
}); reject(error)
})
})
} }
async function waitForServer(url: string, timeout: number = 150000) { async function waitForServer(url: string, timeout = 150000) {
const start = Date.now(); const start = Date.now()
while (Date.now() - start < timeout) { while (Date.now() - start < timeout) {
try { try {
await httpsGet(url); await httpsGet(url)
return true; return true
} catch (error) { } catch (error) {
// Ignore errors and try again // Ignore errors and try again
console.log (`Error fetching ${url}: ${error.message}`); console.log(`Error fetching ${url}: ${error}`)
} }
await new Promise((resolve) => setTimeout(resolve, 1000)); await new Promise((resolve) => setTimeout(resolve, 1000))
} }
throw new Error(`Server at ${url} did not start within ${timeout} ms`); throw new Error(`Server at ${url} did not start within ${timeout} ms`)
} }
test.beforeAll(async ({ browser }) => { test.beforeAll(async ({ browser }) => {
console.log('Waiting for the server to start...'); console.log('Waiting for the server to start...')
await new Promise((resolve) => setTimeout(resolve, 5000)); await new Promise((resolve) => setTimeout(resolve, 5000))
const baseURL = 'https://localhost:3000'; const baseURL = 'https://localhost:3000'
await waitForServer(baseURL); await waitForServer(baseURL)
page = await browser.newPage(); page = await browser.newPage()
test.setTimeout(150000); test.setTimeout(150000)
await page.goto(baseURL); await page.goto(baseURL)
await expect(page).toHaveTitle(/Дискурс/); await expect(page).toHaveTitle(/Дискурс/)
console.log('Localhost server started successfully!'); console.log('Localhost server started successfully!')
await page.close(); await page.close()
}); })
test.afterAll(async () => { test.afterAll(async () => {
await page.close(); await page.close()
}); })
/* TESTS section */ /* TESTS section */
test.beforeEach(async ({ page }) => { test.beforeEach(async ({ page }) => {
await page.goto(`/`); await page.goto('/')
test.setTimeout(80000); test.setTimeout(80000)
await page.getByRole('link', { name: 'Войти' }).click(); await page.getByRole('link', { name: 'Войти' }).click()
await page.getByPlaceholder('Почта').click(); await page.getByPlaceholder('Почта').click()
await page.getByPlaceholder('Почта').fill('guests@discours.io'); await page.getByPlaceholder('Почта').fill('guests@discours.io')
await page.getByPlaceholder('Пароль').click(); await page.getByPlaceholder('Пароль').click()
await page.getByPlaceholder('Пароль').fill('Gue$tP@ss'); await page.getByPlaceholder('Пароль').fill('Gue$tP@ss')
await page.getByRole('button', { name: 'Войти' }).click(); await page.getByRole('button', { name: 'Войти' }).click()
}); })
test.describe('*****Undone***** Drafts - article', () => { test.describe('*****Undone***** Drafts - article', () => {
test('Open /create', async ({ page }) => { test('Open /edit/new', async ({ page }) => {
await page.goto(`/create`); await page.goto('/edit/new')
await expect(page).toHaveTitle('Выберите тип публикации'); await expect(page).toHaveTitle('Выберите тип публикации')
}); })
}); })
/* test('Create article', async ({ page }) => { /* test('Create article', async ({ page }) => {
await page.goto(`/create`); await page.goto(`/create`);
@ -121,7 +126,6 @@ test('Check Draft', async ({ page }) => {
Check is it created Check is it created
}); */ }); */
/* test('Post topic', async ({ page }) => { /* test('Post topic', async ({ page }) => {
Open Draft Open Draft
Post Post

View File

@ -1,115 +1,128 @@
import { test, expect, type Page } from '@playwright/test'; // biome-ignore lint/correctness/noNodejsModules: <explanation>
import https from 'https'; import https from 'node:https'
import { type Page, expect, test } from '@playwright/test'
/* Global starting test config */ /* Global starting test config */
let page: Page; let page: Page
function httpsGet(url: string): Promise<void> { function httpsGet(url: string): Promise<void> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
https.get(url, { https
.get(
url,
{
rejectUnauthorized: false // Ignore SSL certificate errors rejectUnauthorized: false // Ignore SSL certificate errors
}, (res) => { },
(res) => {
if (res.statusCode === 200) { if (res.statusCode === 200) {
resolve(); resolve()
} else { } else {
reject(new Error(`Request failed with status code ${res.statusCode}`)); reject(new Error(`Request failed with status code ${res.statusCode}`))
} }
}).on('error', (error) => { }
reject(error); )
}); .on('error', (error) => {
}); reject(error)
})
})
} }
async function waitForServer(url: string, timeout: number = 150000) { async function waitForServer(url: string, timeout = 150000) {
const start = Date.now(); const start = Date.now()
while (Date.now() - start < timeout) { while (Date.now() - start < timeout) {
try { try {
await httpsGet(url); await httpsGet(url)
return true; return true
} catch (error) { } catch (error) {
// Ignore errors and try again // Ignore errors and try again
console.log (`Error fetching ${url}: ${error.message}`); console.log(`Error fetching ${url}: ${error}`)
} }
await new Promise((resolve) => setTimeout(resolve, 1000)); await new Promise((resolve) => setTimeout(resolve, 1000))
} }
throw new Error(`Server at ${url} did not start within ${timeout} ms`); throw new Error(`Server at ${url} did not start within ${timeout} ms`)
} }
test.beforeAll(async ({ browser }) => { test.beforeAll(async ({ browser }) => {
console.log('Waiting for the server to start...'); console.log('Waiting for the server to start...')
await new Promise((resolve) => setTimeout(resolve, 5000)); await new Promise((resolve) => setTimeout(resolve, 5000))
const baseURL = 'https://localhost:3000'; const baseURL = 'https://localhost:3000'
await waitForServer(baseURL); await waitForServer(baseURL)
page = await browser.newPage(); page = await browser.newPage()
test.setTimeout(150000); test.setTimeout(150000)
await page.goto(baseURL); await page.goto(baseURL)
await expect(page).toHaveTitle(/Дискурс/); await expect(page).toHaveTitle(/Дискурс/)
await page.getByRole('link', { name: 'Войти' }).click(); await page.getByRole('link', { name: 'Войти' }).click()
console.log('Localhost server started successfully!'); console.log('Localhost server started successfully!')
await page.close(); await page.close()
}); })
test.afterAll(async () => { test.afterAll(async () => {
await page.close(); await page.close()
}); })
/* TESTS section */ /* TESTS section */
/* Random Generator */ /* Random Generator */
function generateRandomString(length = 10) { function generateRandomString(length = 10) {
let result = ''; let result = ''
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
const charactersLength = characters.length; const charactersLength = characters.length
for (let i = 0; i < length; i++) { for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength)); result += characters.charAt(Math.floor(Math.random() * charactersLength))
} }
return result; return result
} }
test.beforeEach(async ({ page }) => { test.beforeEach(async ({ page }) => {
await page.goto(`/`); await page.goto('/')
/* test.setTimeout(80000); */ /* test.setTimeout(80000); */
await page.getByRole('link', { name: 'Войти' }).click(); await page.getByRole('link', { name: 'Войти' }).click()
await page.getByPlaceholder('Почта').click(); await page.getByPlaceholder('Почта').click()
await page.getByPlaceholder('Почта').fill('guests@discours.io'); await page.getByPlaceholder('Почта').fill('guests@discours.io')
await page.getByPlaceholder('Пароль').click(); await page.getByPlaceholder('Пароль').click()
await page.getByPlaceholder('Пароль').fill('Gue$tP@ss'); await page.getByPlaceholder('Пароль').fill('Gue$tP@ss')
await page.getByRole('button', { name: 'Войти' }).click(); await page.getByRole('button', { name: 'Войти' }).click()
}); })
test.describe('Topic Actions', () => { test.describe('Topic Actions', () => {
test('Follow topic', async ({ page }) => { test('Follow topic', async ({ page }) => {
await page.getByRole('link', { name: 'темы', exact: true }).click(); await page.getByRole('link', { name: 'темы', exact: true }).click()
await page.getByRole('link', { name: 'Общество Статьи о политике, экономике и обществе, об актуальных событиях, людях, мнениях. Тексты про историю и современность, про то, что происходит в России и мире' }).click(); await page
await page.getByRole('button', { name: 'Подписаться на тему' }).click(); .getByRole('link', {
await expect(page.getByRole('button', { name: 'Отписаться от темы' })).toBeVisible(); name: 'Общество Статьи о политике, экономике и обществе, об актуальных событиях, людях, мнениях. Тексты про историю и современность, про то, что происходит в России и мире'
}); })
.click()
await page.getByRole('button', { name: 'Подписаться на тему' }).click()
await expect(page.getByRole('button', { name: 'Отписаться от темы' })).toBeVisible()
})
test('Unfollow topic', async ({ page }) => { test('Unfollow topic', async ({ page }) => {
await page.getByRole('link', { name: 'темы', exact: true }).click(); await page.getByRole('link', { name: 'темы', exact: true }).click()
await page.getByRole('link', { name: 'Общество Статьи о политике, экономике и обществе, об актуальных событиях, людях, мнениях. Тексты про историю и современность, про то, что происходит в России и мире' }).click(); await page
await page.getByRole('button', { name: 'Отписаться от темы' }).click(); .getByRole('link', {
await expect(page.getByRole('button', { name: 'Подписаться на тему' })).toBeVisible(); name: 'Общество Статьи о политике, экономике и обществе, об актуальных событиях, людях, мнениях. Тексты про историю и современность, про то, что происходит в России и мире'
}); })
.click()
await page.getByRole('button', { name: 'Отписаться от темы' }).click()
await expect(page.getByRole('button', { name: 'Подписаться на тему' })).toBeVisible()
})
test('Add comment to topic', async ({ page }) => { test('Add comment to topic', async ({ page }) => {
const randomString = generateRandomString(); const randomString = generateRandomString()
const currentDate = new Date(); const currentDate = new Date()
await page.getByRole('button', { name: 'Т.Р' }).click(); await page.getByRole('button', { name: 'Т.Р' }).click()
await page.getByRole('link', { name: 'Профиль' }).click(); await page.getByRole('link', { name: 'Профиль' }).click()
await page.getByRole('link', { name: 'Тестируем функционал' }).first().click(); await page.getByRole('link', { name: 'Тестируем функционал' }).first().click()
await page.locator('.tiptap').click(); await page.locator('.tiptap').click()
await page.locator('.tiptap').fill('Проверка Комментариев: ' + randomString + ' ' + currentDate); await page.locator('.tiptap').fill(`Проверка Комментариев: ${randomString} ${currentDate}`)
await page.getByRole('button', { name: 'Отправить' }).click(); await page.getByRole('button', { name: 'Отправить' }).click()
await expect(page.getByText('Проверка Комментариев: ' + randomString + ' ' + currentDate)).toBeVisible(); await expect(page.getByText(`Проверка Комментариев: ${randomString} ${currentDate}`)).toBeVisible()
}); })
test('Edit comment to topic', async ({ page }) => { test('Edit comment to topic', async ({ page }) => {
await page.getByRole('button', { name: 'Т.Р' }).click(); await page.getByRole('button', { name: 'Т.Р' }).click()
await page.getByRole('link', { name: 'Комментарии' }).click(); await page.getByRole('link', { name: 'Комментарии' }).click()
await page.locator('[id^="comment_"]').filter({ hasText: 'Проверка Комментариев' }).first().hover(); await page.locator('[id^="comment_"]').filter({ hasText: 'Проверка Комментариев' }).first().hover()
await page.getByRole('button', { name: 'Редактировать', exact: true }).first().click(); await page.getByRole('button', { name: 'Редактировать', exact: true }).first().click()
const randomString = generateRandomString(); const randomString = generateRandomString()
const currentDate = new Date(); const currentDate = new Date()
await page.locator('.tiptap').fill('Редактируемый Комментарий: ' + randomString + ' ' + currentDate); await page.locator('.tiptap').fill(`Редактируемый Комментарий: ${randomString} ${currentDate}`)
await page.getByRole('button', { name: 'Сохранить' }).click(); await page.getByRole('button', { name: 'Сохранить' }).click()
await expect(page.getByText('Редактируемый Комментарий: ' + randomString + ' ' + currentDate)).toBeVisible(); await expect(page.getByText(`Редактируемый Комментарий: ${randomString} ${currentDate}`)).toBeVisible()
}); })
}); })

View File

@ -1,111 +1,119 @@
import { test, expect, type Page } from '@playwright/test'; // biome-ignore lint/correctness/noNodejsModules: <explanation>
import https from 'https'; import https from 'node:https'
import { type Page, expect, test } from '@playwright/test'
let context: any; // biome-ignore lint/suspicious/noExplicitAny: <explanation>
let page: Page; let context: any
let page: Page
/* Global starting test config */ /* Global starting test config */
function httpsGet(url: string): Promise<void> { function httpsGet(url: string): Promise<void> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
https.get(url, { https
.get(
url,
{
rejectUnauthorized: false // Ignore SSL certificate errors rejectUnauthorized: false // Ignore SSL certificate errors
}, (res) => { },
(res) => {
if (res.statusCode === 200) { if (res.statusCode === 200) {
resolve(); resolve()
} else { } else {
reject(new Error(`Request failed with status code ${res.statusCode}`)); reject(new Error(`Request failed with status code ${res.statusCode}`))
} }
}).on('error', (error) => { }
reject(error); )
}); .on('error', (error) => {
}); reject(error)
})
})
} }
async function waitForServer(url: string, timeout: number = 150000) { async function waitForServer(url: string, timeout = 150000) {
const start = Date.now(); const start = Date.now()
while (Date.now() - start < timeout) { while (Date.now() - start < timeout) {
try { try {
await httpsGet(url); await httpsGet(url)
return true; return true
} catch (error) { } catch (error) {
// Ignore errors and try again // Ignore errors and try again
console.log (`Error fetching ${url}: ${error.message}`); console.log(`Error fetching ${url}: ${error}`)
} }
await new Promise((resolve) => setTimeout(resolve, 1000)); await new Promise((resolve) => setTimeout(resolve, 1000))
} }
throw new Error(`Server at ${url} did not start within ${timeout} ms`); throw new Error(`Server at ${url} did not start within ${timeout} ms`)
} }
test.beforeAll(async ({ browser }) => { test.beforeAll(async ({ browser }) => {
console.log('Waiting for the server to start...'); console.log('Waiting for the server to start...')
await new Promise((resolve) => setTimeout(resolve, 5000)); await new Promise((resolve) => setTimeout(resolve, 5000))
const baseURL = 'https://localhost:3000'; const baseURL = 'https://localhost:3000'
await waitForServer(baseURL); await waitForServer(baseURL)
context = await browser.newContext(); context = await browser.newContext()
page = await context.newPage(); page = await context.newPage()
test.setTimeout(150000); test.setTimeout(150000)
await page.goto(baseURL); await page.goto(baseURL)
await expect(page).toHaveTitle(/Дискурс/); await expect(page).toHaveTitle(/Дискурс/)
await page.getByRole('link', { name: 'Войти' }).click(); await page.getByRole('link', { name: 'Войти' }).click()
console.log('Localhost server started successfully!'); console.log('Localhost server started successfully!')
await page.close(); await page.close()
}); })
/* TESTS section */ /* TESTS section */
/* Random Generator */ /* Random Generator */
function generateRandomString(length = 10) { function generateRandomString(length = 10) {
let result = ''; let result = ''
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
const charactersLength = characters.length; const charactersLength = characters.length
for (let i = 0; i < length; i++) { for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength)); result += characters.charAt(Math.floor(Math.random() * charactersLength))
} }
return result; return result
} }
test.beforeEach(async ({page}) => { test.beforeEach(async ({ page }) => {
await page.goto(`/`); await page.goto('/')
/* test.setTimeout(80000); */ /* test.setTimeout(80000); */
await page.getByRole('link', { name: 'Войти' }).click(); await page.getByRole('link', { name: 'Войти' }).click()
await page.getByPlaceholder('Почта').click(); await page.getByPlaceholder('Почта').click()
await page.getByPlaceholder('Почта').fill('guests@discours.io'); await page.getByPlaceholder('Почта').fill('guests@discours.io')
await page.getByPlaceholder('Пароль').click(); await page.getByPlaceholder('Пароль').click()
await page.getByPlaceholder('Пароль').fill('Gue$tP@ss'); await page.getByPlaceholder('Пароль').fill('Gue$tP@ss')
await page.getByRole('button', { name: 'Войти' }).click(); await page.getByRole('button', { name: 'Войти' }).click()
}); })
test.describe('User Actions', () => { test.describe('User Actions', () => {
test('User sandwitch menu', async ({page}) => { test('User sandwitch menu', async ({ page }) => {
await page.getByRole('button', { name: 'Т.Р' }).click(); await page.getByRole('button', { name: 'Т.Р' }).click()
await expect(page.getByRole('link', { name: 'Профиль' })).toBeVisible(); await expect(page.getByRole('link', { name: 'Профиль' })).toBeVisible()
await page.getByRole('button', { name: 'Т.Р' }).click(); await page.getByRole('button', { name: 'Т.Р' }).click()
}); })
test('Follow user', async ({page}) => { test('Follow user', async ({ page }) => {
await page.getByRole('link', { name: 'авторы', exact: true }).click(); await page.getByRole('link', { name: 'авторы', exact: true }).click()
await page.getByRole('link', { name: 'Дискурс На сайте c 16 июня' }).click(); await page.getByRole('link', { name: 'Дискурс На сайте c 16 июня' }).click()
await page.getByRole('button', { name: 'Подписаться' }).click(); await page.getByRole('button', { name: 'Подписаться' }).click()
await expect(page.getByRole('main').getByRole('button', { name: 'Вы подписаны' })).toBeVisible(); await expect(page.getByRole('main').getByRole('button', { name: 'Вы подписаны' })).toBeVisible()
}); })
test('Unfollow user', async ({page}) => { test('Unfollow user', async ({ page }) => {
await page.getByRole('link', { name: 'авторы', exact: true }).click(); await page.getByRole('link', { name: 'авторы', exact: true }).click()
await page.getByRole('link', { name: 'Дискурс На сайте c 16 июня' }).click(); await page.getByRole('link', { name: 'Дискурс На сайте c 16 июня' }).click()
await page.getByRole('button', { name: 'Вы подписаны' }).click(); await page.getByRole('button', { name: 'Вы подписаны' }).click()
await expect(page.getByRole('main').getByRole('button', { name: 'Подписаться' })).toBeVisible(); await expect(page.getByRole('main').getByRole('button', { name: 'Подписаться' })).toBeVisible()
}); })
test('Change user data', async ({page}) => { test('Change user data', async ({ page }) => {
await page.getByRole('button', { name: 'Т.Р' }).click(); await page.getByRole('button', { name: 'Т.Р' }).click()
await page.getByRole('link', { name: 'Профиль' }).click(); await page.getByRole('link', { name: 'Профиль' }).click()
await page.getByRole('button', { name: 'Редактировать профиль' }).click(); await page.getByRole('button', { name: 'Редактировать профиль' }).click()
await page.locator('.tiptap').click(); await page.locator('.tiptap').click()
const randomString = generateRandomString(); const randomString = generateRandomString()
const currentDate = new Date(); const currentDate = new Date()
await page.locator('.tiptap').fill('test: ' + randomString + ' ' + currentDate); await page.locator('.tiptap').fill(`test: ${randomString} ${currentDate}`)
try { try {
const button = await page.getByRole('button', { name: 'Сохранить настройки' }); const button = await page.getByRole('button', { name: 'Сохранить настройки' })
await button.click(); await button.click()
} catch (error) { } catch (error) {
console.log('Button has disappeared'); console.warn('Button has disappeared', error)
} }
await expect(page.getByText('test: ' + randomString + ' ' + currentDate)).toBeVisible(); await expect(page.getByText(`test: ${randomString} ${currentDate}`)).toBeVisible()
}); })
}); })

View File

@ -1,71 +1,76 @@
import { test, expect, type Page } from '@playwright/test'; // biome-ignore lint/correctness/noNodejsModules: <explanation>
import https from 'https'; import https from 'node:https'
import { type Page, expect, test } from '@playwright/test'
/* Global starting test config */ /* Global starting test config */
let page: Page; let page: Page
function httpsGet(url: string): Promise<void> { function httpsGet(url: string): Promise<void> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
https.get(url, { https
.get(
url,
{
rejectUnauthorized: false // Ignore SSL certificate errors rejectUnauthorized: false // Ignore SSL certificate errors
}, (res) => { },
(res) => {
if (res.statusCode === 200) { if (res.statusCode === 200) {
resolve(); resolve()
} else { } else {
reject(new Error(`Request failed with status code ${res.statusCode}`)); reject(new Error(`Request failed with status code ${res.statusCode}`))
} }
}).on('error', (error) => { }
reject(error); )
}); .on('error', (error) => {
}); reject(error)
})
})
} }
async function waitForServer(url: string, timeout: number = 150000) { async function waitForServer(url: string, timeout = 150000) {
const start = Date.now(); const start = Date.now()
while (Date.now() - start < timeout) { while (Date.now() - start < timeout) {
try { try {
await httpsGet(url); await httpsGet(url)
return true; return true
} catch (error) { } catch (error) {
// Ignore errors and try again // Ignore errors and try again
console.log (`Error fetching ${url}: ${error.message}`); console.log(`Error fetching ${url}: ${error}`)
} }
await new Promise((resolve) => setTimeout(resolve, 1000)); await new Promise((resolve) => setTimeout(resolve, 1000))
} }
throw new Error(`Server at ${url} did not start within ${timeout} ms`); throw new Error(`Server at ${url} did not start within ${timeout} ms`)
} }
test.beforeAll(async ({ browser }) => { test.beforeAll(async ({ browser }) => {
console.log('Waiting for the server to start...'); console.log('Waiting for the server to start...')
await new Promise((resolve) => setTimeout(resolve, 5000)); await new Promise((resolve) => setTimeout(resolve, 5000))
const baseURL = 'https://localhost:3000'; const baseURL = 'https://localhost:3000'
await waitForServer(baseURL); await waitForServer(baseURL)
page = await browser.newPage(); page = await browser.newPage()
test.setTimeout(150000); test.setTimeout(150000)
await page.goto(baseURL); await page.goto(baseURL)
await expect(page).toHaveTitle(/Дискурс/); await expect(page).toHaveTitle(/Дискурс/)
console.log('Localhost server started successfully!'); console.log('Localhost server started successfully!')
}); })
test.afterAll(async () => { test.afterAll(async () => {
await page.close(); await page.close()
}); })
/* TESTS section */ /* TESTS section */
const pagesTitles = { const pagesTitles = {
'/': /Дискурс/, '/': /Дискурс/,
'/feed': /Лента/, '/feed': /Лента/,
'/about/help': /Поддержите Дискурс/, '/guide/support': /Поддержите Дискурс/,
'/authors': /Авторы/, '/author': /Авторы/,
'/topics': /Темы и сюжеты/, '/topic': /Темы и сюжеты/
'/inbox': /Входящие/,
} }
test.describe('Pages open', () => { test.describe('Pages open', () => {
Object.keys(pagesTitles).forEach((res: string) => { Object.keys(pagesTitles).forEach((res: string) => {
test(`Open Page ${res}`, async ({ page }) => { test(`Open Page ${res}`, async ({ page }) => {
await page.goto(`${res}`) await page.goto(`${res}`)
const title = pagesTitles[res] const title = pagesTitles[res as keyof typeof pagesTitles] || ''
await expect(page).toHaveTitle(title) await expect(page).toHaveTitle(title)
}) })
}) })
}); })