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