diff --git a/.github/workflows/playwright-tests.yml b/.github/workflows/playwright-tests.yml index f889058..0f90342 100644 --- a/.github/workflows/playwright-tests.yml +++ b/.github/workflows/playwright-tests.yml @@ -37,9 +37,12 @@ env: jobs: playwright-test-runner: + strategy: + matrix: + test_case: ['@login'] timeout-minutes: 20 runs-on: - - ubuntu-latest + - ubuntu-22.04 services: postgres: image: postgres:16-alpine @@ -62,6 +65,7 @@ jobs: uses: actions/setup-node@v3 with: node-version: "18" + cache: 'yarn' - name: Initialize PostgreSQL run: | @@ -72,7 +76,17 @@ jobs: - name: Install packages run: yarn install -y + - name: Cache playwright browsers + id: cache-playwright + uses: actions/cache@v4 + with: + path: ~/.cache/ + key: ${{ runner.os }}-playwright-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-playwright- + - name: Install playwright + if: steps.cache-playwright.outputs.cache-hit != 'true' run: yarn playwright install --with-deps - name: Setup project @@ -85,7 +99,7 @@ jobs: run: yarn start & - name: Run Tests - run: yarn e2e + run: npx playwright test --grep ${{ matrix.test_case }} - uses: actions/upload-artifact@v3 if: always() diff --git a/e2e/tests/public/login.spec.ts b/e2e/tests/public/login.spec.ts index d39b34f..5faca17 100644 --- a/e2e/tests/public/login.spec.ts +++ b/e2e/tests/public/login.spec.ts @@ -1,32 +1,50 @@ -import { expect, test } from "../../index" +import { expect, test } from "../../index"; -test("Logging in without credentials displays an error", async ({ loginPage }) => { - await loginPage.submitLoginButton.click() - const toast = await loginPage.getLatestToast() - await expect(toast.locator).toBeVisible() - await expect(toast.locator).toHaveAttribute("data-type", "error") -}) +test.describe( + "Login test suite", + { + tag: "@login", + }, + async () => { + test("Logging in without credentials displays an error", async ({ + loginPage, + }) => { + await loginPage.submitLoginButton.click(); + const toast = await loginPage.getLatestToast(); + await expect(toast.locator).toBeVisible(); + await expect(toast.locator).toHaveAttribute("data-type", "error"); + }); -test("Logging in with an erroneous password displays an error", async ({ loginPage }) => { - await loginPage.usernameInput.fill(process.env['TEST_USERNAME'] || "") - await loginPage.passwordInput.fill("NOT_MY_PASSWORD_DNE_ERROR") - await loginPage.submitLoginButton.click() - const toast = await loginPage.getLatestToast() - await expect(toast.locator).toBeVisible() - await expect(toast.locator).toHaveAttribute("data-type", "error") -}) + test("Logging in with an erroneous password displays an error", async ({ + loginPage, + }) => { + await loginPage.usernameInput.fill(process.env["TEST_USERNAME"] || ""); + await loginPage.passwordInput.fill("NOT_MY_PASSWORD_DNE_ERROR"); + await loginPage.submitLoginButton.click(); + const toast = await loginPage.getLatestToast(); + await expect(toast.locator).toBeVisible(); + await expect(toast.locator).toHaveAttribute("data-type", "error"); + }); -test("Logging in without valid credentials displays an error", async ({ loginPage }) => { - await loginPage.submitLoginButton.click() - const toast = await loginPage.getLatestToast() - await expect(toast.locator).toBeVisible() - await expect(toast.locator).toHaveAttribute("data-type", "error") -}) + test("Logging in without valid credentials displays an error", async ({ + loginPage, + }) => { + await loginPage.submitLoginButton.click(); + const toast = await loginPage.getLatestToast(); + await expect(toast.locator).toBeVisible(); + await expect(toast.locator).toHaveAttribute("data-type", "error"); + }); -test("Logging in with a valid username and password works as expected", async ({ page, loginPage, dashboardPage }) => { - await loginPage.usernameInput.fill(process.env['TEST_USERNAME'] || "") - await loginPage.passwordInput.fill(process.env['TEST_PASSWORD'] || "") - await loginPage.submitLoginButton.click() - await expect(loginPage.loginForm).not.toBeVisible() - await expect(dashboardPage.container).toBeVisible() -}) \ No newline at end of file + test("Logging in with a valid username and password works as expected", async ({ + page, + loginPage, + dashboardPage, + }) => { + await loginPage.usernameInput.fill(process.env["TEST_USERNAME"] || ""); + await loginPage.passwordInput.fill(process.env["TEST_PASSWORD"] || ""); + await loginPage.submitLoginButton.click(); + await expect(loginPage.loginForm).not.toBeVisible(); + await expect(dashboardPage.container).toBeVisible(); + }); + } +);