From 15c98b0db9a6e4b6de9756a1ebd7dd8471f0ef05 Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Mon, 5 Jan 2026 16:00:02 +0100 Subject: [PATCH] refactor: move playwright config into e2e folder (#64741) --- .github/workflows/e2e-playwright.yml | 2 +- .github/workflows/e2e-third-party.yml | 2 +- .lintstagedrc.mjs | 4 ---- e2e/.gitignore | 1 + e2e/academic-honesty.spec.ts | 4 ++-- e2e/cert-username-case-navigation.spec.ts | 2 +- e2e/certification.spec.ts | 4 ++-- e2e/challenge-reset-modal.spec.ts | 4 ++-- e2e/codeally.spec.ts | 4 ++-- e2e/completed-project-preview.spec.ts | 2 +- e2e/completion-modal.spec.ts | 2 +- e2e/delete-modal.spec.ts | 6 +++--- e2e/donate-page-donor.spec.ts | 4 ++-- e2e/donation-modal.spec.ts | 16 ++++++++++------ e2e/email-settings.spec.ts | 2 +- e2e/email-sign-up-alert.spec.ts | 6 +++--- e2e/exam-survey.spec.ts | 4 ++-- e2e/failed-updates.spec.ts | 4 ++-- e2e/global-setup.ts | 6 +++--- e2e/header.spec.ts | 4 ++-- e2e/internet-presence-settings.spec.ts | 2 +- e2e/link-ms-user.spec.ts | 2 +- e2e/multifile-cert-projects.spec.ts | 2 +- e2e/package.json | 4 +++- playwright.config.ts => e2e/playwright.config.ts | 4 ++-- e2e/portfolio.spec.ts | 4 ++-- e2e/progress-reset-modal.spec.ts | 2 +- e2e/projects.spec.ts | 4 ++-- e2e/quincy-email-sign-up.spec.ts | 4 ++-- e2e/settings.spec.ts | 10 +++++----- e2e/show-cert-from-superblock.spec.ts | 4 ++-- e2e/super-block-page.spec.ts | 4 ++-- e2e/update-about-me.spec.ts | 4 ++-- e2e/user-token.spec.ts | 4 ++-- e2e/username-change.spec.ts | 4 ++-- eslint.config.mjs | 15 --------------- package.json | 5 ++--- tsconfig.json | 1 - 38 files changed, 74 insertions(+), 88 deletions(-) delete mode 100644 .lintstagedrc.mjs create mode 100644 e2e/.gitignore rename playwright.config.ts => e2e/playwright.config.ts (97%) delete mode 100644 eslint.config.mjs diff --git a/.github/workflows/e2e-playwright.yml b/.github/workflows/e2e-playwright.yml index f99b0da2408..604628e0d49 100644 --- a/.github/workflows/e2e-playwright.yml +++ b/.github/workflows/e2e-playwright.yml @@ -168,7 +168,7 @@ jobs: run: pnpm run seed:certified-user - name: Run playwright tests - run: npx playwright test --project=${{ matrix.browsers }} --grep-invert 'third-party-donation.spec.ts' + run: pnpm run playwright:run --project=${{ matrix.browsers }} --grep-invert 'third-party-donation.spec.ts' - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 if: ${{ !cancelled() }} diff --git a/.github/workflows/e2e-third-party.yml b/.github/workflows/e2e-third-party.yml index 88a54b5fea5..956b7435320 100644 --- a/.github/workflows/e2e-third-party.yml +++ b/.github/workflows/e2e-third-party.yml @@ -151,7 +151,7 @@ jobs: run: pnpm run seed:certified-user - name: Run playwright tests - run: npx playwright test third-party-donation.spec.ts --project=${{ matrix.browsers }} + run: pnpm run playwright:run third-party-donation.spec.ts --project=${{ matrix.browsers }} - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 if: ${{ !cancelled() }} diff --git a/.lintstagedrc.mjs b/.lintstagedrc.mjs deleted file mode 100644 index 2cb8879f45f..00000000000 --- a/.lintstagedrc.mjs +++ /dev/null @@ -1,4 +0,0 @@ -/* eslint-disable filenames-simple/naming-convention */ -import { createLintStagedConfig } from '@freecodecamp/eslint-config/lintstaged'; - -export default createLintStagedConfig(import.meta.dirname); diff --git a/e2e/.gitignore b/e2e/.gitignore new file mode 100644 index 00000000000..f899c6d9f95 --- /dev/null +++ b/e2e/.gitignore @@ -0,0 +1 @@ +playwright/ diff --git a/e2e/academic-honesty.spec.ts b/e2e/academic-honesty.spec.ts index e66ee6075ea..704ac673e1b 100644 --- a/e2e/academic-honesty.spec.ts +++ b/e2e/academic-honesty.spec.ts @@ -7,11 +7,11 @@ test.describe('When the user has not accepted the Academic Honesty Policy', () = test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeEach(() => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test('they should be able to accept it', async ({ page }) => { diff --git a/e2e/cert-username-case-navigation.spec.ts b/e2e/cert-username-case-navigation.spec.ts index 3d57b94664d..24629c8adf0 100644 --- a/e2e/cert-username-case-navigation.spec.ts +++ b/e2e/cert-username-case-navigation.spec.ts @@ -52,6 +52,6 @@ test.describe('Public profile certifications', () => { }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); }); diff --git a/e2e/certification.spec.ts b/e2e/certification.spec.ts index a64caa8d275..60916039a7a 100644 --- a/e2e/certification.spec.ts +++ b/e2e/certification.spec.ts @@ -12,11 +12,11 @@ import { test.describe('Claim a certification - almost certified user', () => { test.beforeEach(async () => { await deleteAllEmails(); - execSync('node ./tools/scripts/seed/seed-demo-user --unclaimed-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --unclaimed-user'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test.use({ storageState: 'playwright/.auth/certified-user.json' }); diff --git a/e2e/challenge-reset-modal.spec.ts b/e2e/challenge-reset-modal.spec.ts index 0b14057e3c6..3528fdbd207 100644 --- a/e2e/challenge-reset-modal.spec.ts +++ b/e2e/challenge-reset-modal.spec.ts @@ -228,11 +228,11 @@ test.describe('Signed in user', () => { test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeEach(() => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); }); test.afterEach(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test('User can reset on a multi-file project after reloading and saving', async ({ diff --git a/e2e/codeally.spec.ts b/e2e/codeally.spec.ts index 8dafbc443fc..74fa5f0f02a 100644 --- a/e2e/codeally.spec.ts +++ b/e2e/codeally.spec.ts @@ -5,7 +5,7 @@ test.describe('Before completing the project', () => { test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeEach(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --set-true isDonating'); + execSync('node ../tools/scripts/seed/seed-demo-user --set-true isDonating'); }); test('should not allow you to submit a URL', async ({ page }) => { @@ -24,7 +24,7 @@ test.describe('Before completing the project', () => { test.describe('After completing the project', () => { test.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test('should allow you to submit a URL', async ({ page }) => { diff --git a/e2e/completed-project-preview.spec.ts b/e2e/completed-project-preview.spec.ts index 1907dbffd95..01949344478 100644 --- a/e2e/completed-project-preview.spec.ts +++ b/e2e/completed-project-preview.spec.ts @@ -39,7 +39,7 @@ test.describe('Completed project preview', () => { test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeEach(async ({ request }) => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); await authedRequest({ request, diff --git a/e2e/completion-modal.spec.ts b/e2e/completion-modal.spec.ts index d4398949838..9f38c320bea 100644 --- a/e2e/completion-modal.spec.ts +++ b/e2e/completion-modal.spec.ts @@ -9,7 +9,7 @@ const nextChallengeURL = '/learn/data-analysis-with-python/data-analysis-with-python-projects/demographic-data-analyzer'; test.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test.beforeEach(async ({ page }) => { diff --git a/e2e/delete-modal.spec.ts b/e2e/delete-modal.spec.ts index 6eb1b15e165..7608aa6a33c 100644 --- a/e2e/delete-modal.spec.ts +++ b/e2e/delete-modal.spec.ts @@ -14,9 +14,9 @@ test.beforeEach(async ({ page }) => { test.afterAll( async () => await Promise.all([ - execP('node ./tools/scripts/seed/seed-demo-user --certified-user'), - execP('node ./tools/scripts/seed/seed-surveys'), - execP('node ./tools/scripts/seed/seed-ms-username') + execP('node ../tools/scripts/seed/seed-demo-user --certified-user'), + execP('node ../tools/scripts/seed/seed-surveys'), + execP('node ../tools/scripts/seed/seed-ms-username') ]) ); diff --git a/e2e/donate-page-donor.spec.ts b/e2e/donate-page-donor.spec.ts index eb5a0ae58d9..1cffbd55d0b 100644 --- a/e2e/donate-page-donor.spec.ts +++ b/e2e/donate-page-donor.spec.ts @@ -5,12 +5,12 @@ test.describe('Donate page', () => { test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeEach(async ({ page }) => { - execSync('node ./tools/scripts/seed/seed-demo-user --set-true isDonating'); + execSync('node ../tools/scripts/seed/seed-demo-user --set-true isDonating'); await page.goto('/donate'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test('should render the donate page correctly', async ({ page }) => { diff --git a/e2e/donation-modal.spec.ts b/e2e/donation-modal.spec.ts index 22feefc033e..094c000aba1 100644 --- a/e2e/donation-modal.spec.ts +++ b/e2e/donation-modal.spec.ts @@ -205,11 +205,11 @@ test.describe('Donation modal appearance logic - New user', () => { }); test.beforeEach(() => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test('should not appear if the user has less than 10 completed challenges in total and has just completed 3 challenges', async ({ @@ -278,7 +278,9 @@ test.describe('Donation modal appearance logic - New user', () => { test.describe('Donation modal appearance logic - Certified user claiming a new block', () => { test.use({ storageState: 'playwright/.auth/certified-user.json' }); test.beforeEach(() => - execSync('node ./tools/scripts/seed/seed-demo-user --almost-certified-user') + execSync( + 'node ../tools/scripts/seed/seed-demo-user --almost-certified-user' + ) ); test('should appear if the user has just completed a new block, and should not appear if the user re-submits the projects of the block', async ({ @@ -349,7 +351,9 @@ test.describe('Donation modal appearance logic - Certified user claiming a new b test.describe('Donation modal appearance logic - Certified user claiming a new module', () => { test.use({ storageState: 'playwright/.auth/certified-user.json' }); test.beforeEach(() => - execSync('node ./tools/scripts/seed/seed-demo-user --almost-certified-user') + execSync( + 'node ../tools/scripts/seed/seed-demo-user --almost-certified-user' + ) ); test('should appear if the user has just completed a new module', async ({ @@ -442,12 +446,12 @@ test.describe('Donation modal appearance logic - Certified user', () => { test.describe('Donation modal appearance logic - Donor user', () => { test.beforeAll(() => { execSync( - 'node ./tools/scripts/seed/seed-demo-user --certified-user --set-true isDonating' + 'node ../tools/scripts/seed/seed-demo-user --certified-user --set-true isDonating' ); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test('should not appear', async ({ diff --git a/e2e/email-settings.spec.ts b/e2e/email-settings.spec.ts index 0f12aa17246..61ccfa860e1 100644 --- a/e2e/email-settings.spec.ts +++ b/e2e/email-settings.spec.ts @@ -16,7 +16,7 @@ const originalEmail = 'foo@bar.com'; const newEmail = 'foo-update@bar.com'; test.beforeEach(async ({ page }) => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); await page.goto('/settings'); }); diff --git a/e2e/email-sign-up-alert.spec.ts b/e2e/email-sign-up-alert.spec.ts index 15a7fe61376..8491a44737d 100644 --- a/e2e/email-sign-up-alert.spec.ts +++ b/e2e/email-sign-up-alert.spec.ts @@ -29,7 +29,7 @@ test.describe('Email sign-up page when user is signed in', () => { // It's necessary to seed with a user that has not accepted the privacy // terms, otherwise the user will be redirected away from the email sign-up // page. - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); await page.goto('/learn'); }); @@ -111,7 +111,7 @@ test.describe('Email sign-up page when the user is new', () => { test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeEach(async ({ page }) => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); await page.goto('/learn'); }); @@ -134,7 +134,7 @@ test.describe('Email sign-up page when the user has made a selection', () => { test.beforeEach(async ({ page }) => { execSync( - 'node ./tools/scripts/seed/seed-demo-user --certified-user --set-false sendQuincyEmail' + 'node ../tools/scripts/seed/seed-demo-user --certified-user --set-false sendQuincyEmail' ); await page.goto('/learn'); }); diff --git a/e2e/exam-survey.spec.ts b/e2e/exam-survey.spec.ts index 7ecbf43c5e0..b77511b5adb 100644 --- a/e2e/exam-survey.spec.ts +++ b/e2e/exam-survey.spec.ts @@ -4,8 +4,8 @@ const url = '/learn/foundational-c-sharp-with-microsoft/foundational-c-sharp-with-microsoft-certification-exam/foundational-c-sharp-with-microsoft-certification-exam'; test.describe('Exam Survey', () => { test.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); - execSync('node tools/scripts/seed/seed-surveys.js delete-only'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-surveys.js delete-only'); }); test('Should show the survey alert and be able to complete the survey', async ({ diff --git a/e2e/failed-updates.spec.ts b/e2e/failed-updates.spec.ts index d9ffa82b3f2..dccf2e62b44 100644 --- a/e2e/failed-updates.spec.ts +++ b/e2e/failed-updates.spec.ts @@ -21,11 +21,11 @@ function getCompletedIds(completedChallenges: { id: string }[]): string[] { test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test.describe('failed update flushing', () => { diff --git a/e2e/global-setup.ts b/e2e/global-setup.ts index 3a71c3bb4bb..05a628503e4 100644 --- a/e2e/global-setup.ts +++ b/e2e/global-setup.ts @@ -6,7 +6,7 @@ setup.describe('certifieduser', () => { setup.use({ storageState: { cookies: [], origins: [] } }); setup.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user '); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user '); }); setup('can sign in', async ({ request }) => { @@ -25,11 +25,11 @@ setup.describe('developmentuser', () => { // We can only sign in as a single user (one with email: 'foo@bar.com'), so // changing users means changing the record with that email in the database. setup.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); }); setup.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); setup('can sign in', async ({ request }) => { diff --git a/e2e/header.spec.ts b/e2e/header.spec.ts index b079ccaac63..f467196a027 100644 --- a/e2e/header.spec.ts +++ b/e2e/header.spec.ts @@ -29,11 +29,11 @@ test.describe('Header', () => { }); test.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test('Has link for skip content', async ({ page }) => { diff --git a/e2e/internet-presence-settings.spec.ts b/e2e/internet-presence-settings.spec.ts index efdaa694b3c..e1a89954cd3 100644 --- a/e2e/internet-presence-settings.spec.ts +++ b/e2e/internet-presence-settings.spec.ts @@ -15,7 +15,7 @@ const settingsPageElement = { test.beforeEach(async ({ page }) => { // Reset input values - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); await page.goto('/certifieduser'); diff --git a/e2e/link-ms-user.spec.ts b/e2e/link-ms-user.spec.ts index 9db82e41a52..3acbe6152df 100644 --- a/e2e/link-ms-user.spec.ts +++ b/e2e/link-ms-user.spec.ts @@ -43,7 +43,7 @@ test.describe('Link MS user component (signed-out user)', () => { test.describe('Link MS user component (signed-in user)', () => { test.afterEach(() => { - execSync('node ./tools/scripts/seed/seed-ms-username'); + execSync('node ../tools/scripts/seed/seed-ms-username'); }); test("should recognize the user's MS account", async ({ page }) => { diff --git a/e2e/multifile-cert-projects.spec.ts b/e2e/multifile-cert-projects.spec.ts index 59b9707c3dc..07d635e5df3 100644 --- a/e2e/multifile-cert-projects.spec.ts +++ b/e2e/multifile-cert-projects.spec.ts @@ -3,7 +3,7 @@ import { test, expect } from '@playwright/test'; import { clearEditor, focusEditor } from './utils/editor'; test.describe('multifileCertProjects', () => { test.beforeEach(async ({ page }) => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); await page.goto( 'learn/2022/responsive-web-design/build-a-tribute-page-project/build-a-tribute-page' ); diff --git a/e2e/package.json b/e2e/package.json index cf408c8513b..c8dc4e92526 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -2,7 +2,9 @@ "name": "@freecodecamp/e2e", "version": "1.0.0", "scripts": { - "lint": "eslint --max-warnings 0" + "lint": "eslint --max-warnings 0", + "playwright:watch": "playwright test --ui-port=0", + "playwright:run": "playwright test" }, "author": "freeCodeCamp ", "license": "BSD-3-Clause", diff --git a/playwright.config.ts b/e2e/playwright.config.ts similarity index 97% rename from playwright.config.ts rename to e2e/playwright.config.ts index 9967d0ca9ae..8737aba92a6 100644 --- a/playwright.config.ts +++ b/e2e/playwright.config.ts @@ -6,13 +6,13 @@ import { defineConfig, devices } from '@playwright/test'; * Read environment variables from file. * https://github.com/motdotla/dotenv */ -const envPath = path.resolve(__dirname, '.env'); +const envPath = path.resolve(__dirname, '..', '.env'); dotenvConfig({ path: envPath }); /** * See https://playwright.dev/docs/test-configuration. */ export default defineConfig({ - testDir: 'e2e', + testDir: '.', /* Run tests in files in parallel */ fullyParallel: false, /* Fail the build on CI if you accidentally left test.only in the source code. */ diff --git a/e2e/portfolio.spec.ts b/e2e/portfolio.spec.ts index 965adc42790..c54a18234ac 100644 --- a/e2e/portfolio.spec.ts +++ b/e2e/portfolio.spec.ts @@ -5,11 +5,11 @@ import translations from '../client/i18n/locales/english/translations.json'; test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test.describe('Add Portfolio Item', () => { diff --git a/e2e/progress-reset-modal.spec.ts b/e2e/progress-reset-modal.spec.ts index 072802f58bf..39e8ed25fd8 100644 --- a/e2e/progress-reset-modal.spec.ts +++ b/e2e/progress-reset-modal.spec.ts @@ -10,7 +10,7 @@ test.beforeEach(async ({ page }) => { }); test.afterEach(async () => { - await execP('node ./tools/scripts/seed/seed-demo-user --certified-user'); + await execP('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test.describe('Progress reset modal', () => { diff --git a/e2e/projects.spec.ts b/e2e/projects.spec.ts index 735a1f8bfe3..dcdd9502bb2 100644 --- a/e2e/projects.spec.ts +++ b/e2e/projects.spec.ts @@ -74,11 +74,11 @@ const pasteContent = async (page: Page) => { test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test.describe('Projects', () => { diff --git a/e2e/quincy-email-sign-up.spec.ts b/e2e/quincy-email-sign-up.spec.ts index add0b7514e5..aad1e030b99 100644 --- a/e2e/quincy-email-sign-up.spec.ts +++ b/e2e/quincy-email-sign-up.spec.ts @@ -11,7 +11,7 @@ test.describe('Email sign-up page when user is not signed in', () => { test.use({ storageState: { cookies: [], origins: [] } }); test.beforeEach(async ({ page }) => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); await page.goto('/email-sign-up'); }); @@ -71,7 +71,7 @@ test.describe('Email sign-up page when user is not signed in', () => { test.describe('Email sign-up page when user is signed in', () => { test.beforeEach(async ({ page }) => { // It's necessary to seed with a user that has not selected an email newsletter option. - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); await page.goto('/email-sign-up'); }); diff --git a/e2e/settings.spec.ts b/e2e/settings.spec.ts index 9abcfe52502..df9bbb6d717 100644 --- a/e2e/settings.spec.ts +++ b/e2e/settings.spec.ts @@ -52,7 +52,7 @@ const legacyCertifications = [ test.describe('Settings - Certified User', () => { test.beforeEach(async ({ page }) => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); await page.goto('/settings'); }); @@ -257,13 +257,13 @@ test.describe('Settings - Certified User', () => { test.describe('Settings - Certified User without Full Stack Certification', () => { test.beforeEach(async ({ page }) => { execSync( - 'node ./tools/scripts/seed/seed-demo-user --certified-user --set-false isFullStackCert' + 'node ../tools/scripts/seed/seed-demo-user --certified-user --set-false isFullStackCert' ); await page.goto('/settings'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test('should allow claiming Full Stack cert if the user has completed all requirements', async ({ @@ -297,12 +297,12 @@ test.describe('Settings - New User', () => { test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeEach(async ({ page }) => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); await page.goto('/settings'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test('should not allow claiming Full Stack cert if the user has not completed all the required certs', async ({ diff --git a/e2e/show-cert-from-superblock.spec.ts b/e2e/show-cert-from-superblock.spec.ts index 8cc62381121..2ef82c6b6d0 100644 --- a/e2e/show-cert-from-superblock.spec.ts +++ b/e2e/show-cert-from-superblock.spec.ts @@ -5,7 +5,7 @@ test.describe('When the user HAS NOT claimed their cert', () => { test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); }); test.beforeEach(async ({ page }) => { @@ -27,7 +27,7 @@ test.describe('When the user HAS NOT claimed their cert', () => { }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); }); diff --git a/e2e/super-block-page.spec.ts b/e2e/super-block-page.spec.ts index 5b9c65ffabb..3a47f2cf361 100644 --- a/e2e/super-block-page.spec.ts +++ b/e2e/super-block-page.spec.ts @@ -5,11 +5,11 @@ test.describe('Super Block Page - Authenticated User', () => { test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeEach(() => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test.describe('Super Block in List View', () => { diff --git a/e2e/update-about-me.spec.ts b/e2e/update-about-me.spec.ts index 783a0fc0c28..959ff80d59d 100644 --- a/e2e/update-about-me.spec.ts +++ b/e2e/update-about-me.spec.ts @@ -4,7 +4,7 @@ import translations from '../client/i18n/locales/english/translations.json'; test.beforeEach(async ({ page }) => { execSync( - 'node ./tools/scripts/seed/seed-demo-user --certified-user --set-false isFullStackCert' + 'node ../tools/scripts/seed/seed-demo-user --certified-user --set-false isFullStackCert' ); await page.goto('/certifieduser'); @@ -17,7 +17,7 @@ test.beforeEach(async ({ page }) => { }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test('Should allow empty string in any field in about settings', async ({ diff --git a/e2e/user-token.spec.ts b/e2e/user-token.spec.ts index ea1387fd7f8..cb9c4e12b1e 100644 --- a/e2e/user-token.spec.ts +++ b/e2e/user-token.spec.ts @@ -7,11 +7,11 @@ import { alertToBeVisible } from './utils/alerts'; test.use({ storageState: 'playwright/.auth/development-user.json' }); test.beforeEach(() => { - execSync('node ./tools/scripts/seed/seed-demo-user'); + execSync('node ../tools/scripts/seed/seed-demo-user'); }); test.afterAll(() => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); test.describe('Initially', () => { diff --git a/e2e/username-change.spec.ts b/e2e/username-change.spec.ts index b70385eeeb1..d5a05c2e993 100644 --- a/e2e/username-change.spec.ts +++ b/e2e/username-change.spec.ts @@ -4,7 +4,7 @@ import translations from '../client/i18n/locales/english/translations.json'; test.afterAll(() => { // change the name back to the original - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); }); const settingsObject = { @@ -23,7 +23,7 @@ const settingsObject = { test.describe('Username Settings Validation', () => { test.beforeEach(async ({ page }) => { - execSync('node ./tools/scripts/seed/seed-demo-user --certified-user'); + execSync('node ../tools/scripts/seed/seed-demo-user --certified-user'); await page.goto(`/certifieduser`); if (!process.env.CI) { diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index ddac8f6a661..00000000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,15 +0,0 @@ -import { configTypeChecked } from '@freecodecamp/eslint-config/base'; -import { defineConfig, globalIgnores } from 'eslint/config'; - -export default defineConfig( - // include all in root dir, but not subdirs: - globalIgnores(['**/*', '!*.js', '!*.ts', '!*.mjs']), - { - extends: [configTypeChecked], - rules: { - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/no-unsafe-call': 'off', - '@typescript-eslint/no-unsafe-assignment': 'off' - } - } -); diff --git a/package.json b/package.json index dd1c5d516da..d4867932b4c 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,6 @@ "knip:all": "npx -y knip@5 ", "lint-root": "pnpm npm-run-all lint:*", "lint": "turbo lint && turbo lint-root", - "lint:eslint": "eslint --max-warnings 0", "lint:challenges": "cd ./curriculum && pnpm run lint-challenges", "lint:ts": "tsc && tsc -p shared && tsc -p api && tsc -p client && tsc -p curriculum && tsc -p e2e && tsc -p tools/challenge-helper-scripts", "lint:prettier": "prettier --list-different .", @@ -80,8 +79,8 @@ "test:shared": "cd ./shared && pnpm vitest run", "test:client": "cd ./client && pnpm test run", "prepare": "husky", - "playwright:run": "playwright test", - "playwright:watch": "playwright test --ui-port=0" + "playwright:run": "pnpm -F e2e run playwright:run", + "playwright:watch": "pnpm -F e2e run playwright:watch" }, "dependencies": { "dotenv": "16.4.5", diff --git a/tsconfig.json b/tsconfig.json index b3559c68661..d7672208f82 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,5 @@ { "include": [ - "*.ts", "curriculum/*.test.ts", "tools/challenge-editor/**/*", "tools/scripts/**/*.ts",