diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 4725a703..a3ffa147 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -26,3 +26,18 @@ jobs: - name: Test production 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 diff --git a/package.json b/package.json index e3d63a6b..7c6bbeb6 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "start": "vinxi start", "codegen": "graphql-codegen", "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 ", "fix": "npx @biomejs/biome check . --fix && stylelint **/*.{scss,css} --fix", "format": "npx @biomejs/biome format src/. --write", diff --git a/playwright.config.ts b/playwright.config.ts index 0d7f20e1..15b5acdd 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -65,7 +65,8 @@ export default defineConfig({ ], /* 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', url: 'https://localhost:3000', ignoreHTTPSErrors: true, diff --git a/tests/auth-drafts-actions.spec.ts b/tests/auth-drafts-actions.spec.ts index 07c6a82e..4c804d4a 100644 --- a/tests/auth-drafts-actions.spec.ts +++ b/tests/auth-drafts-actions.spec.ts @@ -44,7 +44,7 @@ async function waitForServer(url: string, timeout = 150000) { test.beforeAll(async ({ browser }) => { console.log('Waiting for the server to start...') await new Promise((resolve) => setTimeout(resolve, 5000)) - const baseURL = 'https://localhost:3000' + const baseURL = process.env.BASE_URL || 'https://localhost:3000' await waitForServer(baseURL) page = await browser.newPage() test.setTimeout(150000) diff --git a/tests/auth-topics-actions.spec.ts b/tests/auth-topics-actions.spec.ts index 391de1c7..f94e16cd 100644 --- a/tests/auth-topics-actions.spec.ts +++ b/tests/auth-topics-actions.spec.ts @@ -44,7 +44,7 @@ async function waitForServer(url: string, timeout = 150000) { test.beforeAll(async ({ browser }) => { console.log('Waiting for the server to start...') await new Promise((resolve) => setTimeout(resolve, 5000)) - const baseURL = 'https://localhost:3000' + const baseURL = process.env.BASE_URL || 'https://localhost:3000' await waitForServer(baseURL) page = await browser.newPage() test.setTimeout(150000) diff --git a/tests/auth-user-actions.spec.ts b/tests/auth-user-actions.spec.ts index e743c140..9323519e 100644 --- a/tests/auth-user-actions.spec.ts +++ b/tests/auth-user-actions.spec.ts @@ -46,7 +46,7 @@ async function waitForServer(url: string, timeout = 150000) { test.beforeAll(async ({ browser }) => { console.log('Waiting for the server to start...') await new Promise((resolve) => setTimeout(resolve, 5000)) - const baseURL = 'https://localhost:3000' + const baseURL = process.env.BASE_URL || 'https://localhost:3000' await waitForServer(baseURL) context = await browser.newContext() page = await context.newPage() diff --git a/tests/basic-routes.spec.ts b/tests/basic-routes.spec.ts deleted file mode 100644 index 421f715f..00000000 --- a/tests/basic-routes.spec.ts +++ /dev/null @@ -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) - }) -}) diff --git a/tests/basic-routes.test.js b/tests/basic-routes.test.js deleted file mode 100644 index 9880d3b0..00000000 --- a/tests/basic-routes.test.js +++ /dev/null @@ -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() -})() diff --git a/tests/certs/cert.pem b/tests/certs/cert.pem new file mode 100644 index 00000000..4722bcbe --- /dev/null +++ b/tests/certs/cert.pem @@ -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----- diff --git a/tests/certs/key.pem b/tests/certs/key.pem new file mode 100644 index 00000000..6ddcc6a8 --- /dev/null +++ b/tests/certs/key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +vwMHicF+PHK2KJ80a6pcZLNtDynD +-----END PRIVATE KEY----- diff --git a/tests/page-sections.spec.ts b/tests/page-sections.spec.ts index 7401996b..e90a4bb2 100644 --- a/tests/page-sections.spec.ts +++ b/tests/page-sections.spec.ts @@ -2,6 +2,8 @@ import https from 'node:https' import { type Page, expect, test } from '@playwright/test' +const baseHost = process.env.BASE_URL || 'https://localhost:3000' + /* Global starting test config */ let page: Page @@ -44,7 +46,7 @@ async function waitForServer(url: string, timeout = 150000) { test.beforeAll(async ({ browser }) => { console.log('Waiting for the server to start...') await new Promise((resolve) => setTimeout(resolve, 5000)) - const baseURL = 'https://localhost:3000' + const baseURL = process.env.BASE_URL || 'https://localhost:3000' await waitForServer(baseURL) page = await browser.newPage() test.setTimeout(150000)