From 8a21add9bc05896f10eb06edf84c5206b3716a1a Mon Sep 17 00:00:00 2001 From: benmartin-coforma Date: Mon, 25 Nov 2024 15:45:03 -0700 Subject: [PATCH] Initial Playwright setup --- .env.tpl | 11 +- .github/workflows/deploy.yml | 256 ++++++++++----------------- .gitignore | 6 +- services/ui-src/src/index.tsx | 1 + tests/package.json | 15 ++ tests/playwright.config.ts | 59 ++++++ tests/playwright/utils/auth.setup.ts | 39 ++++ tests/playwright/utils/consts.ts | 4 + tests/playwright/utils/hello.spec.ts | 31 ++++ tests/yarn.lock | 41 +++++ tsconfig.json | 8 +- 11 files changed, 297 insertions(+), 174 deletions(-) create mode 100644 tests/package.json create mode 100644 tests/playwright.config.ts create mode 100644 tests/playwright/utils/auth.setup.ts create mode 100644 tests/playwright/utils/consts.ts create mode 100644 tests/playwright/utils/hello.spec.ts create mode 100644 tests/yarn.lock diff --git a/.env.tpl b/.env.tpl index dea9818a..f54a820b 100755 --- a/.env.tpl +++ b/.env.tpl @@ -20,11 +20,12 @@ VPC_SUBNET_B=local-nonsense VPC_SUBNET_C=local-nonsense BROKER_STRINGS=local-nonsense -# needed for e2e tests -CYPRESS_ADMIN_USER_EMAIL=op://mdct_devs/hcbs_secrets/CYPRESS_ADMIN_USER_EMAIL -CYPRESS_ADMIN_USER_PASSWORD=op://mdct_devs/hcbs_secrets/CYPRESS_ADMIN_USER_PASSWORD # pragma: allowlist secret -CYPRESS_STATE_USER_EMAIL=op://mdct_devs/hcbs_secrets/CYPRESS_STATE_USER_EMAIL -CYPRESS_STATE_USER_PASSWORD=op://mdct_devs/hcbs_secrets/CYPRESS_STATE_USER_PASSWORD # pragma: allowlist secret +# These settings are needed for playwright end-to-end tests +TEST_ADMIN_USER_EMAIL=op://mdct_devs/hcbs_secrets/CYPRESS_ADMIN_USER_EMAIL +TEST_ADMIN_USER_PASSWORD=op://mdct_devs/hcbs_secrets/CYPRESS_ADMIN_USER_PASSWORD # pragma: allowlist secret +TEST_STATE_USER_EMAIL=op://mdct_devs/hcbs_secrets/CYPRESS_STATE_USER_EMAIL +TEST_STATE_USER_PASSWORD=op://mdct_devs/hcbs_secrets/CYPRESS_STATE_USER_PASSWORD # pragma: allowlist secret +TEST_STATE=DC # db:seed SEED_ADMIN_USER_EMAIL=op://mdct_devs/hcbs_secrets/SEED_ADMIN_USER_EMAIL diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 65684c7d..7502d399 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -203,166 +203,100 @@ jobs: ipset_name: ${{ steps.fetch-ip-set-info.outputs.IPSET_NAME }} ipset_id: ${{ steps.fetch-ip-set-info.outputs.IPSET_ID }} - # e2e-test: - # name: E2E Integration Tests - # needs: - # - deploy - # - register-runner - # if: ${{ always() && !cancelled() && needs.deploy.result == 'success' && github.ref_name != 'production' }} - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v4 - # - name: Run Cypress Tests - # uses: cypress-io/github-action@v6 - # with: - # working-directory: tests - # spec: | - # cypress/e2e/wp/*.cy.js - # cypress/e2e/sar/*.cy.js - # cypress/e2e/*.cy.js - # browser: chrome - # config: baseUrl=${{ needs.deploy.outputs.application_endpoint }} - # wait-on: ${{ needs.deploy.outputs.application_endpoint }} - # env: true - # env: - # CYPRESS_STATE_USER_EMAIL: ${{ secrets.CYPRESS_STATE_USER_EMAIL }} - # CYPRESS_STATE_USER_PASSWORD: ${{ secrets.CYPRESS_STATE_USER_PASSWORD }} - # CYPRESS_ADMIN_USER_EMAIL: ${{ secrets.CYPRESS_ADMIN_USER_EMAIL }} - # CYPRESS_ADMIN_USER_PASSWORD: ${{ secrets.CYPRESS_ADMIN_USER_PASSWORD }} - # - name: Upload screenshots - # uses: actions/upload-artifact@v4 - # if: failure() - # with: - # name: cypress-test-results - # path: | - # ${{github.workspace}}/tests/screenshots/ - # ${{github.workspace}}/tests/videos/ - # retention-days: 14 - - # a11y-tests: - # name: E2E A11y Tests - # needs: - # - deploy - # - register-runner - # if: ${{ always() && !cancelled() && needs.deploy.result == 'success' && github.ref_name != 'production' }} - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v4 - # - name: Check Project A11y - # uses: cypress-io/github-action@v6 - # with: - # working-directory: tests - # spec: cypress/e2e/accessibility/*.cy.js - # browser: chrome - # config: baseUrl=${{ needs.deploy.outputs.application_endpoint }} - # wait-on: ${{ needs.deploy.outputs.application_endpoint }} - # env: true - # env: - # CYPRESS_STATE_USER_EMAIL: ${{ secrets.CYPRESS_STATE_USER_EMAIL }} - # CYPRESS_STATE_USER_PASSWORD: ${{ secrets.CYPRESS_STATE_USER_PASSWORD }} - # CYPRESS_ADMIN_USER_EMAIL: ${{ secrets.CYPRESS_ADMIN_USER_EMAIL }} - # CYPRESS_ADMIN_USER_PASSWORD: ${{ secrets.CYPRESS_ADMIN_USER_PASSWORD }} - # - name: Upload screenshots - # uses: actions/upload-artifact@v4 - # if: failure() - # with: - # name: a11y-test-results - # path: | - # ${{github.workspace}}/tests/screenshots/ - # ${{github.workspace}}/tests/videos/ - # retention-days: 14 - - # test: - # name: Playwright Tests - # needs: - # - deploy - # - register-runner - # if: ${{ always() && !cancelled() && needs.deploy.result == 'success' && github.ref_name != 'production' }} - # timeout-minutes: 60 - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v4 - # - name: Configure AWS credentials for GitHub Actions - # uses: aws-actions/configure-aws-credentials@v4 - # with: - # role-to-assume: ${{ secrets[env.BRANCH_SPECIFIC_VARNAME_AWS_OIDC_ROLE_TO_ASSUME] || secrets.AWS_OIDC_ROLE_TO_ASSUME }} - # aws-region: ${{ secrets[env.BRANCH_SPECIFIC_VARNAME_AWS_DEFAULT_REGION] || secrets.AWS_DEFAULT_REGION }} - # - uses: actions/setup-node@v4 - # with: - # node-version-file: ".nvmrc" - # - name: yarn install - # run: yarn install - # - name: Install Playwright Browsers - # run: yarn playwright install --with-deps - # - name: Run Playwright tests - # run: yarn playwright test - # continue-on-error: true - # env: - # BASE_URL: ${{ needs.deploy.outputs.application_endpoint }} - # CYPRESS_STATE_USER_EMAIL: ${{ secrets.CYPRESS_STATE_USER_EMAIL }} - # CYPRESS_STATE_USER_PASSWORD: ${{ secrets.CYPRESS_STATE_USER_PASSWORD }} - # CYPRESS_ADMIN_USER_EMAIL: ${{ secrets.CYPRESS_ADMIN_USER_EMAIL }} - # CYPRESS_ADMIN_USER_PASSWORD: ${{ secrets.CYPRESS_ADMIN_USER_PASSWORD }} - # SEED_ADMIN_USER_EMAIL: ${{ secrets.SEED_ADMIN_USER_EMAIL }} - # SEED_ADMIN_USER_PASSWORD: ${{ secrets.SEED_ADMIN_USER_PASSWORD }} - # SEED_STATE_USER_EMAIL: ${{ secrets.SEED_STATE_USER_EMAIL }} - # SEED_STATE_USER_PASSWORD: ${{ secrets.SEED_STATE_USER_PASSWORD }} - # - uses: actions/upload-artifact@v4 - # if: ${{ !cancelled() }} - # with: - # name: playwright-html-report # upload artifact as this name - # # path: playwright-report/index.html # path on runner - # path: playwright-report # path on runner - # retention-days: 30 + test: + name: Playwright Tests + needs: + - deploy + - register-runner + - e2e-test + - a11y-tests + if: ${{ always() && !cancelled() && needs.deploy.result == 'success' && github.ref_name != 'production' }} + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Configure AWS credentials for GitHub Actions + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ secrets[env.BRANCH_SPECIFIC_VARNAME_AWS_OIDC_ROLE_TO_ASSUME] || secrets.AWS_OIDC_ROLE_TO_ASSUME }} + aws-region: ${{ secrets[env.BRANCH_SPECIFIC_VARNAME_AWS_DEFAULT_REGION] || secrets.AWS_DEFAULT_REGION }} + - uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + - name: yarn install + run: yarn install + - name: yarn install tests + run: yarn install + working-directory: tests + - name: Install Playwright Browsers + run: yarn playwright install --with-deps + working-directory: tests + - name: Run Playwright tests + run: yarn playwright test + working-directory: tests + continue-on-error: true + env: + BASE_URL: ${{ needs.deploy.outputs.application_endpoint }} + TEST_STATE_USER_EMAIL: ${{ secrets.CYPRESS_STATE_USER_EMAIL }} + TEST_STATE_USER_PASSWORD: ${{ secrets.CYPRESS_STATE_USER_PASSWORD }} + TEST_ADMIN_USER_EMAIL: ${{ secrets.CYPRESS_ADMIN_USER_EMAIL }} + TEST_ADMIN_USER_PASSWORD: ${{ secrets.CYPRESS_ADMIN_USER_PASSWORD }} + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-html-report # upload artifact as this name + # path: playwright-report/index.html # path on runner + path: tests/playwright-report # path on runner + retention-days: 30 - # upload-reports: - # name: Upload Reports - # needs: - # - test - # if: always() - # runs-on: ubuntu-latest - # outputs: - # timestamp: ${{ steps.timestampid.outputs.timestamp }} - # steps: - # # create a unique folder name to put playwright reports in - # - name: Set a Timestamp - # id: timestampid - # run: echo "timestamp=$(date --utc +%Y%m%d_%H%M%SZ)" >> "$GITHUB_OUTPUT" - # - uses: actions/checkout@v4 - # - uses: actions/setup-node@v4 - # with: - # node-version-file: ".nvmrc" - # - name: Install dependencies - # run: yarn install - # # downloads artifact created from the test job - # - name: Download reports from GitHub Actions Artifacts - # uses: actions/download-artifact@v4 - # with: - # name: playwright-html-report # download from previous job - # path: downloaded-html-report # save as this when downloaded - # - name: Push files to github pages - # uses: peaceiris/actions-gh-pages@v4 - # with: - # github_token: ${{ secrets.GITHUB_TOKEN }} - # publish_dir: ./downloaded-html-report # publish downloaded dir to github pages - # destination_dir: ${{ steps.timestampid.outputs.timestamp }} - # # need to extract just org name for reassembling the github pages URL - # - name: Extract Organization Name - # id: extract-org - # run: | - # echo "ORG_NAME=$(echo $GITHUB_REPOSITORY | cut -d'/' -f1)" >> $GITHUB_ENV - # echo "org name: ${ORG_NAME}" - # # need to extract just the repo name for reassembling the github pages URL - # - name: Extract Repository Name - # id: extract-repo - # run: | - # echo "REPO_NAME=$(echo $GITHUB_REPOSITORY | cut -d'/' -f2)" >> $GITHUB_ENV - # echo "repo name: ${REPO_NAME}" - # # assembles org name, repo name, and unique timestamp to link to github pages url that was published - # - name: Write URL in Summary - # run: | - # echo "## Playwright Test Results" >> $GITHUB_STEP_SUMMARY - # echo "https://${ORG_NAME}.github.io/${REPO_NAME}/${{ steps.timestampid.outputs.timestamp }}/" >> $GITHUB_STEP_SUMMARY + upload-reports: + name: Upload Reports + needs: + - test + if: ${{ always() && github.ref_name != 'production' }} + runs-on: ubuntu-latest + outputs: + timestamp: ${{ steps.timestampid.outputs.timestamp }} + steps: + # create a unique folder name to put playwright reports in + - name: Set a Timestamp + id: timestampid + run: echo "timestamp=$(date --utc +%Y%m%d_%H%M%SZ)" >> "$GITHUB_OUTPUT" + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + - name: Install dependencies + run: yarn install + # downloads artifact created from the test job + - name: Download reports from GitHub Actions Artifacts + uses: actions/download-artifact@v4 + with: + name: playwright-html-report # download from previous job + path: downloaded-html-report # save as this when downloaded + - name: Push files to github pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./downloaded-html-report # publish downloaded dir to github pages + destination_dir: ${{ steps.timestampid.outputs.timestamp }} + # need to extract just org name for reassembling the github pages URL + - name: Extract Organization Name + id: extract-org + run: | + echo "ORG_NAME=$(echo $GITHUB_REPOSITORY | cut -d'/' -f1)" >> $GITHUB_ENV + echo "org name: ${ORG_NAME}" + # need to extract just the repo name for reassembling the github pages URL + - name: Extract Repository Name + id: extract-repo + run: | + echo "REPO_NAME=$(echo $GITHUB_REPOSITORY | cut -d'/' -f2)" >> $GITHUB_ENV + echo "repo name: ${REPO_NAME}" + # assembles org name, repo name, and unique timestamp to link to github pages url that was published + - name: Write URL in Summary + run: | + echo "## Playwright Test Results" >> $GITHUB_STEP_SUMMARY + echo "https://${ORG_NAME}.github.io/${REPO_NAME}/${{ steps.timestampid.outputs.timestamp }}/" >> $GITHUB_STEP_SUMMARY cleanup: name: Delist GHA Runner CIDR Blocks @@ -370,9 +304,7 @@ jobs: runs-on: ubuntu-latest needs: - register-runner - # - a11y-tests - # - e2e-test - # - test + - test env: SLS_DEPRECATION_DISABLE: "*" # Turn off deprecation warnings in the pipeline steps: diff --git a/.gitignore b/.gitignore index d77fe833..d265e89d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,8 @@ tests_output package-lock.json .vscode/ *._S3rver_cors.xml -.serverless \ No newline at end of file +.serverless +tests/test-results/ +tests/playwright-report/ +tests/playwright/.cache/ +tests/playwright/.auth diff --git a/services/ui-src/src/index.tsx b/services/ui-src/src/index.tsx index e5b83d68..9ce2ed60 100644 --- a/services/ui-src/src/index.tsx +++ b/services/ui-src/src/index.tsx @@ -61,6 +61,7 @@ const ldClientId = config.REACT_APP_LD_SDK_CLIENT; eventsUrl: "https://events.launchdarkly.us", }, deferInitialization: false, + timeout: 2, // seconds }); ReactDOM.render( diff --git a/tests/package.json b/tests/package.json new file mode 100644 index 00000000..6dd00b70 --- /dev/null +++ b/tests/package.json @@ -0,0 +1,15 @@ +{ + "name": "tests", + "version": "1.0.0", + "description": "End-to-end tests for the HCBS application", + "license": "ISC", + "scripts": { + "test": "playwright test", + "test-ui": "playwright test --ui" + }, + "dependencies": { + "@axe-core/playwright": "^4.10.1", + "@playwright/test": "^1.49.0", + "playwright": "^1.49.0" + } +} diff --git a/tests/playwright.config.ts b/tests/playwright.config.ts new file mode 100644 index 00000000..8b169b1a --- /dev/null +++ b/tests/playwright.config.ts @@ -0,0 +1,59 @@ +import { defineConfig, devices } from "@playwright/test"; +import dotenv from "dotenv"; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +dotenv.config({ path: "../.env" }); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: "playwright", + testMatch: ["**/*.spec.js", "**/*.spec.ts"], + /* Run tests in files in parallel */ + fullyParallel: false, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: "html", + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: process.env.BASE_URL || "http://localhost:3000", + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: "on-first-retry", + + /* Video recording configuration */ + video: "retain-on-failure", + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: "setup", + use: { ...devices["Desktop Chrome"] }, + testMatch: /.*\.setup\.ts/, + }, + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + dependencies: ["setup"], + }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: process.env.CI ? "" : "cd ../ && ./run local", + url: process.env.BASE_URL || "http://localhost:3000", + reuseExistingServer: !!process.env.CI, + stdout: "pipe", + }, +}); diff --git a/tests/playwright/utils/auth.setup.ts b/tests/playwright/utils/auth.setup.ts new file mode 100644 index 00000000..c75bf319 --- /dev/null +++ b/tests/playwright/utils/auth.setup.ts @@ -0,0 +1,39 @@ +import { test, expect } from "@playwright/test"; + +import { adminPassword, adminUser, statePassword, stateUser } from "./consts"; + +const adminFile = "playwright/.auth/admin.json"; + +test("authenticate as admin", async ({ page }) => { + await page.goto("/"); + const emailInput = page.getByRole("textbox", { name: "email" }); + const passwordInput = page.getByRole("textbox", { name: "password" }); + const loginButton = page.getByRole("button", { name: "Log In with Cognito" }); + await emailInput.fill(adminUser); + await passwordInput.fill(adminPassword); + await loginButton.click(); + const landingPageHeading = page.getByRole("heading", { + name: "View State/Territory Reports", + }); + await expect(landingPageHeading).toBeVisible(); + await page.waitForTimeout(1000); + await page.context().storageState({ path: adminFile }); +}); + +const userFile = "playwright/.auth/stateUser.json"; + +test("authenticate as user", async ({ page }) => { + await page.goto("/"); + const emailInput = page.getByRole("textbox", { name: "email" }); + const passwordInput = page.getByRole("textbox", { name: "password" }); + const loginButton = page.getByRole("button", { name: "Log In with Cognito" }); + await emailInput.fill(stateUser); + await passwordInput.fill(statePassword); + await loginButton.click(); + const landingPageHeading = page.getByRole("heading", { + name: "Home and Community Based Services (HCBS) Portal", + }); + await expect(landingPageHeading).toBeVisible(); + await page.waitForTimeout(1000); + await page.context().storageState({ path: userFile }); +}); diff --git a/tests/playwright/utils/consts.ts b/tests/playwright/utils/consts.ts new file mode 100644 index 00000000..0d0e11df --- /dev/null +++ b/tests/playwright/utils/consts.ts @@ -0,0 +1,4 @@ +export const adminUser = process.env.TEST_ADMIN_USER_EMAIL!; +export const adminPassword = process.env.TEST_ADMIN_USER_PASSWORD!; // pragma: allowlist secret +export const stateUser = process.env.TEST_STATE_USER_EMAIL!; +export const statePassword = process.env.TEST_STATE_USER_PASSWORD!; // pragma: allowlist secret diff --git a/tests/playwright/utils/hello.spec.ts b/tests/playwright/utils/hello.spec.ts new file mode 100644 index 00000000..a49c7f94 --- /dev/null +++ b/tests/playwright/utils/hello.spec.ts @@ -0,0 +1,31 @@ +import { test, expect } from "@playwright/test"; + +test.describe("Basic tests", () => { + test("Admins should see the admin view", async ({ browser }) => { + const adminContext = await browser.newContext({ + storageState: "playwright/.auth/admin.json", + }); + const page = await adminContext.newPage(); + await page.goto("/"); + + const stateSelection = page.getByLabel("Select state or territory:"); + await expect(stateSelection).toBeVisible(); + + await adminContext.close(); + }); + + test("State users should see the state view", async ({ browser }) => { + const stateContext = await browser.newContext({ + storageState: "playwright/.auth/stateUser.json", + }); + const page = await stateContext.newPage(); + await page.goto("/"); + + const landingPageHeading = page.getByRole("heading", { + name: "Home and Community Based Services (HCBS) Portal", + }); + await expect(landingPageHeading).toBeVisible(); + + await stateContext.close(); + }); +}); diff --git a/tests/yarn.lock b/tests/yarn.lock new file mode 100644 index 00000000..ce7fcab2 --- /dev/null +++ b/tests/yarn.lock @@ -0,0 +1,41 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@axe-core/playwright@^4.10.1": + version "4.10.1" + resolved "https://registry.yarnpkg.com/@axe-core/playwright/-/playwright-4.10.1.tgz#c811ba8bfa244833cce422c4131e0043828c42cc" + integrity sha512-EV5t39VV68kuAfMKqb/RL+YjYKhfuGim9rgIaQ6Vntb2HgaCaau0h98Y3WEUqW1+PbdzxDtDNjFAipbtZuBmEA== + dependencies: + axe-core "~4.10.2" + +"@playwright/test@^1.49.0": + version "1.49.0" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.49.0.tgz#74227385b58317ee076b86b56d0e1e1b25cff01e" + integrity sha512-DMulbwQURa8rNIQrf94+jPJQ4FmOVdpE5ZppRNvWVjvhC+6sOeo28r8MgIpQRYouXRtt/FCCXU7zn20jnHR4Qw== + dependencies: + playwright "1.49.0" + +axe-core@~4.10.2: + version "4.10.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.2.tgz#85228e3e1d8b8532a27659b332e39b7fa0e022df" + integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w== + +fsevents@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +playwright-core@1.49.0: + version "1.49.0" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.49.0.tgz#8e69ffed3f41855b854982f3632f2922c890afcb" + integrity sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA== + +playwright@1.49.0, playwright@^1.49.0: + version "1.49.0" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.49.0.tgz#df6b9e05423377a99658202844a294a8afb95d0a" + integrity sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A== + dependencies: + playwright-core "1.49.0" + optionalDependencies: + fsevents "2.3.2" diff --git a/tsconfig.json b/tsconfig.json index a98edf53..16dcc0f1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -33,11 +33,7 @@ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ }, "exclude": [ - "./services/ui-src/*", - "./services/app-api/*", - "./services/database/*", - "./tests/e2e/**/**.ts", - "./tests/e2e/**/**.js", - "playwright.config.ts" + "./services/*", + "./tests/*" ] } \ No newline at end of file