diff --git a/.github/workflows/test-browser.yml b/.github/workflows/test-browser.yml new file mode 100644 index 0000000..cf6cba1 --- /dev/null +++ b/.github/workflows/test-browser.yml @@ -0,0 +1,33 @@ +name: Browser Tests +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] +jobs: + tests: + timeout-minutes: 10 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Node 22.x + uses: actions/setup-node@v4 + with: + node-version: 22.x + + - name: Install npm dependencies + run: npm install -y + + - name: Install Playwright Browsers + run: npx playwright install --with-deps + + - name: Run Playwright tests + run: npx playwright test + + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 \ No newline at end of file diff --git a/package.json b/package.json index bd284d7..07b2b5a 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ }, "homepage": "https://github.com/brainfoolong/js-aes-php", "devDependencies": { + "@playwright/test": "^1.46.0", "typescript": "^5.5.4" }, "engines": { diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..9de9519 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,108 @@ +import type { PlaywrightTestConfig } from '@playwright/test' +import { devices } from '@playwright/test' + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +const config: PlaywrightTestConfig = { + testDir: './tests', + /* Maximum time one test can run for. */ + timeout: 30 * 1000, + expect: { + /** + * Maximum time expect() should wait for the condition to be met. + * For example in `await expect(locator).toHaveText();` + */ + timeout: 5000 + }, + /* 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, + /* 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: { + ignoreHTTPSErrors: true, + /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ + actionTimeout: 0, + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://localhost:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + }, + }, + + { + name: 'firefox', + use: { + ...devices['Desktop Firefox'], + }, + }, + + { + name: 'webkit', + use: { + ...devices['Desktop Safari'], + }, + }, + + /* Test against mobile viewports. */ + { + name: 'Mobile Chrome', + use: { + ...devices['Pixel 5'], + }, + }, + { + name: 'Mobile Safari', + use: { + ...devices['iPhone 12'], + }, + }, + + /* Test against branded browsers. */ + { + name: 'Microsoft Edge', + use: { + channel: 'msedge', + }, + }, + { + name: 'Google Chrome', + use: { + channel: 'chrome', + }, + }, + ], + + /* Folder for test artifacts such as screenshots, videos, traces, etc. */ + // outputDir: 'test-results/', + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // port: 3000, + // }, +} + +export default config \ No newline at end of file diff --git a/tests/test-browser.spec.ts b/tests/test-browser.spec.ts new file mode 100644 index 0000000..08662f1 --- /dev/null +++ b/tests/test-browser.spec.ts @@ -0,0 +1,12 @@ +import { expect, test } from '@playwright/test' + +test('Run all tests', async ({ page }) => { + page.on('console', msg => { + if (msg.type() === 'error') + throw new Error(`Console Error: "${msg.text()}"`) + }) + await page.goto('http://127.0.0.1:6597/tests/test-browser.html') + await expect(page.locator('#console')).toContainText('TEST SUCCESSFUL', { timeout: 20000 }) + await page.goto('http://127.0.0.1:6597/tests/test-browser-module.html') + await expect(page.locator('#console')).toContainText('TEST SUCCESSFUL', { timeout: 20000 }) +}) \ No newline at end of file