Skip to content

Commit

Permalink
chore: move playwright tests from main repo (#1341)
Browse files Browse the repository at this point in the history
* chore: move playwright tests from main repo

* fix: update import paths
  • Loading branch information
ojeytonwilliams authored Feb 28, 2025
1 parent 186f015 commit 0ba3297
Show file tree
Hide file tree
Showing 6 changed files with 237 additions and 1 deletion.
2 changes: 1 addition & 1 deletion .github/workflows/mobile-curriculum-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ jobs:
run: npm install -g serve

- name: Run playwright tests
run: npx playwright test --config=playwright-mobile.config.ts
run: npx playwright test --config=mobile/e2e/playwright.config.js

- uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4
if: ${{ !cancelled() }}
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,7 @@ play-store-credentials.json

generated-tests/
curriculum.json

# e2e tests

/e2e/playwright
61 changes: 61 additions & 0 deletions e2e/learn.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { expect, test } from "@playwright/test";

// These are all in the freeCodeCamp repo. That repo is installed at the root
// in CI.
import currData from "../../shared/config/curriculum.json";
import { orderedSuperBlockInfo } from "../../tools/scripts/build/build-external-curricula-data";
import { SuperBlocks } from "../../shared/config/curriculum";

// non editor superblocks should be skipped because they are not
// checked if they are compatible with the mobile app.

const nonEditorSB = [
SuperBlocks.PythonForEverybody,
SuperBlocks.DataAnalysisPy,
SuperBlocks.MachineLearningPy,
SuperBlocks.CollegeAlgebraPy,
SuperBlocks.A2English,
SuperBlocks.B1English,
];

const publicSB = orderedSuperBlockInfo
.filter((sb) => sb.public === true && !nonEditorSB.includes(sb.dashedName))
.map((sb) => sb.dashedName);

const removeCertSuperBlock = (currData) => {
const copy = currData;
delete copy["certifications"];
return copy;
};

const typedCurriculum = removeCertSuperBlock(currData);

test.describe("Test challenges in mobile", () => {
for (const superBlock of publicSB) {
for (const currBlock of Object.values(
typedCurriculum[superBlock]["blocks"]
)) {
test.describe(`SuperBlock: ${superBlock} - Block: ${currBlock["meta"]["name"]}`, () => {
for (const currChallenge of currBlock["challenges"]) {
// Skip non-editor challenges
if (![0, 1, 5, 6, 14].includes(currChallenge["challengeType"])) {
continue;
}

test(`Challenge: ${currChallenge["title"]}(${currChallenge["id"]})`, async ({
page,
}) => {
const logMsges = [];
page.on("console", (msg) => {
logMsges.push(msg.text());
});
await page.goto(
`/${superBlock}/${currChallenge["block"]}/${currChallenge["id"]}`
);
expect(logMsges).toContain("completed");
});
}
});
}
}
});
53 changes: 53 additions & 0 deletions e2e/playwright.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import path from 'path';
import { config as dotenvConfig } from 'dotenv';
import { defineConfig, devices } from '@playwright/test';

/**
* Read environment variables from file.
* https://github.com/motdotla/dotenv
*/
const envPath = path.resolve(__dirname, '.env');
dotenvConfig({ path: envPath });
/**
* See https://playwright.dev/docs/test-configuration.
*/
export default defineConfig({
testDir: '.',
testMatch: '*.spec.js',
/* Run tests in files in parallel */
fullyParallel: true,
/* 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,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: [['html', { outputFolder: 'playwright/reporter' }]],
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
timeout: 15 * 1000,
outputDir: 'playwright/test-results',

use: {
/* Base URL to use in actions like `await page.goto('/')`. */
baseURL: 'http://127.0.0.1:3000/',
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: 'on-first-retry',

/* Use custom test attribute */
testIdAttribute: 'data-playwright-test-label'
},

/* Configure projects for major browsers */
projects: [
{
name: 'Mobile Chrome',
use: { ...devices['Pixel 5'] }
}
],

/* Run your local dev server before starting the tests */
webServer: {
command: 'cd ../mobile-app && npx serve generated-tests',
url: 'http://127.0.0.1:3000',
reuseExistingServer: !process.env.CI
}
});
116 changes: 116 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
"prepare": "husky"
},
"devDependencies": {
"@playwright/test": "1.50.1",
"dotenv": "16.4.7",
"husky": "9.0.11",
"lint-staged": "15.2.7",
"npm-run-all2": "6.2.0",
Expand Down

0 comments on commit 0ba3297

Please sign in to comment.