This commit is contained in:
Untone 2024-07-04 10:52:37 +03:00
commit 874654f0eb
11 changed files with 107 additions and 63 deletions

View File

@ -26,3 +26,18 @@ jobs:
- name: Test production build - name: Test production build
run: npm run build run: npm run build
- name: Install http-server
run: npm install http-server
- name: Install e2e test dependencies
run: npm run e2e:install
- name: Serve the build directory
run: npx http-server ./.output/public -p 8080 --ssl --cert ./tests/certs/cert.pem --key ./tests/certs/key.pem &
# - name: Run e2e tests
# run: npm run e2e:tests
- name: Run e2e tests
run: npm run e2e:tests:ci

View File

@ -10,6 +10,7 @@
"start": "vinxi start", "start": "vinxi start",
"codegen": "graphql-codegen", "codegen": "graphql-codegen",
"e2e:tests": "npx playwright test --project=webkit", "e2e:tests": "npx playwright test --project=webkit",
"e2e:tests:ci": "CI=true BASE_URL=https://127.0.0.1:8080 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": "npx @biomejs/biome check . --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",

View File

@ -65,7 +65,8 @@ export default defineConfig({
], ],
/* Run local dev server before starting the tests */ /* Run local dev server before starting the tests */
webServer: { /* If process env CI is set to false */
webServer: process.env.CI ? undefined :{
command: 'npm run dev', command: 'npm run dev',
url: 'https://localhost:3000', url: 'https://localhost:3000',
ignoreHTTPSErrors: true, ignoreHTTPSErrors: true,

View File

@ -44,7 +44,7 @@ async function waitForServer(url: string, timeout = 150000) {
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 = process.env.BASE_URL || 'https://localhost:3000'
await waitForServer(baseURL) await waitForServer(baseURL)
page = await browser.newPage() page = await browser.newPage()
test.setTimeout(150000) test.setTimeout(150000)

View File

@ -44,7 +44,7 @@ async function waitForServer(url: string, timeout = 150000) {
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 = process.env.BASE_URL || 'https://localhost:3000'
await waitForServer(baseURL) await waitForServer(baseURL)
page = await browser.newPage() page = await browser.newPage()
test.setTimeout(150000) test.setTimeout(150000)

View File

@ -46,7 +46,7 @@ async function waitForServer(url: string, timeout = 150000) {
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 = process.env.BASE_URL || '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()

View File

@ -1,21 +0,0 @@
import { expect, test } from '@playwright/test'
const baseHost = process.env.BASE_HOST || 'https://localhost:3000'
const pagesTitles: { [key: string]: RegExp } = {
'/': /Дискурс/,
'/feed': /Лента/,
'/edit/new': /Выберите тип публикации/,
'/guide/support': /Поддержите Дискурс/,
'/author': /Авторы/,
'/topic': /Темы и сюжеты/,
'/inbox': /Входящие/
}
Object.keys(pagesTitles).forEach((res: string) => {
test(`страница ${res}`, async ({ page }) => {
await page.goto(`${baseHost}${res}`)
const title = pagesTitles[res]
await expect(page).toHaveTitle(title)
})
})

View File

@ -1,37 +0,0 @@
import { chromium } from 'playwright'
;(async () => {
const browser = await chromium.launch()
const context = await browser.newContext()
// Define the URLs to visit
const pagesToVisit = [
'https://localhost:3000/',
'https://localhost:3000/feed',
'https://localhost:3000/edit/new',
'https://localhost:3000/guide/support',
'https://localhost:3000/author',
'https://localhost:3000/topic',
'https://localhost:3000/inbox'
]
// Loop through the pages and visit each one
for (const pageUrl of pagesToVisit) {
const page = await context.newPage()
// Log a message before visiting the page
console.log(`Visiting page: ${pageUrl}`)
await page.goto(pageUrl)
// Add your test assertions here if needed
// Log a message after visiting the page
console.log(`Finished visiting page: ${pageUrl}`)
// Close the page before moving to the next one
await page.close()
}
// Close the browser
await browser.close()
})()

31
tests/certs/cert.pem Normal file
View File

@ -0,0 +1,31 @@
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIUcRug+NV7RWtT9BJz4B1x5Clo5oAwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDA3MDQwMDQ5MTJaFw0yNTA3
MDQwMDQ5MTJaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQCzpIsc3Jzhq/Cv0n3rsk+vxOTem/1bCo5j1y0v49Q5
5ZdvT2wFo81StvYhk+Rr0xtGa2eD5pEvawUUnt8AbelkUCYwkoNkWydj2LnzyKnm
gyIPM8B/mJzv0h1mtto10bWGFcWefCTTxzz0GexGyhS3W2Uc+vhuwLB3uwRk6V8s
znH3S5CcxeXiAT5Qih28HQ8nfv8Oi0GrRHD5Un5D5d5BhydVBuhN9CmEGXg/1ecQ
qlzWdqMfwSQuLRT+/22EXPbRSJ27mmKAV50RLQ8prCrCfxBBKixSF7chAXHlVIwO
KWV+UljB/wst0wThYu/6WMXOUmUgX0s3cZ7xYQGb8TvJ7z2iWLnSp68MWwgcWuqT
JwZLmLTG2yFl0FCDFPh37cJrrED7uZZ6zXI52FvsYfEl1WmOXWq2LMThZId52bcr
IBvf/kyCkgpNK5M1D+rRH4LBvfEcCM1q2A18Ptca8vG3Z3rgsP/Q5by3G9y3w0hS
kYOtcFyT1PKd3w7lFByTdualBwGL28kLxfVdFj4WCxGPRQfejFvUKQ8Z8Xh1LAFI
mALmfFR92J89jCFXA/AgT1rj4ykGp/MkgMGcsgnfZhJMHGAL4Vcx6BF/7kME1db3
esY89iH0u8V73Y69UAbtWbEOZ3vVSPeWCJodHRjQI5i+lg3GlaokV0I0uE35Ywmz
yQIDAQABo1MwUTAdBgNVHQ4EFgQU8f9PbhBV7k+lk1R+yC6S/8zG3ZowHwYDVR0j
BBgwFoAU8f9PbhBV7k+lk1R+yC6S/8zG3ZowDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAgEAKzJQ1kHcXYCnavTe8HitbeiADUkx7xYVOEUlsvpm8gIc
RV+zilZ/Aavpty1dN7X8CSZ2+2/6GM8nVvkkCXzXzvcsfE4YoD+8CogUgumr0MId
jWjceuxrTtZT6os/kmlJbk+Dt7jts2A4CjqIsZuW7oaLeMO0O8u6f/T4PqyMpNw4
c4Z/5lYCfo19SVDdHEeawGk+NPs1+x0GSbRpatYXg3vdDUEQOlk37MX/K05HGLSI
pr/Aie1CtG8eVIhsSMgRPFxpXbBNViN5t++ViozmiHTNNRJvWKXfYZTQZnKQKarI
hKq2doVLgDAZCUSjrA9U2CaWv7Ox/6hvJN7q2gq2PZ6fN5HmGD8mO+ILlGOFLK0A
BWUYM/VSpcHoGeNla/tKnExvHPIk833ADWxyXEGVGL/ijlgyYpUJLvReoTCDwMvD
Re/PtBkNdJ3qEhS7NQt1WTf8ETaXrGnUJb6zrcPNpMHl7456qYGpuIk99L2MhMSh
reIZudo/VHzN0Gzz5yxX9XfsSV1uY05d+07VqepVI8wnkslaPgzQeyfNV4yhxrNv
bSq++Kzft1Nz9KwW/UxcZDa29QxeXyfYYZkqAgp6ZW7DSNehsE05Pd2IipJYcoXl
fKpuHgU47fWAWOTjtg5bTX4pf1ZNiMo/wwiykwDbmrCYaFuKQw/8n9TnYJti7iQ=
-----END CERTIFICATE-----

52
tests/certs/key.pem Normal file
View File

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
vwMHicF+PHK2KJ80a6pcZLNtDynD
-----END PRIVATE KEY-----

View File

@ -2,6 +2,8 @@
import https from 'node:https' import https from 'node:https'
import { type Page, expect, test } from '@playwright/test' import { type Page, expect, test } from '@playwright/test'
const baseHost = process.env.BASE_URL || 'https://localhost:3000'
/* Global starting test config */ /* Global starting test config */
let page: Page let page: Page
@ -44,7 +46,7 @@ async function waitForServer(url: string, timeout = 150000) {
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 = process.env.BASE_URL || 'https://localhost:3000'
await waitForServer(baseURL) await waitForServer(baseURL)
page = await browser.newPage() page = await browser.newPage()
test.setTimeout(150000) test.setTimeout(150000)