diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml new file mode 100644 index 00000000..6a9d2e05 --- /dev/null +++ b/.github/workflows/playwright.yml @@ -0,0 +1,37 @@ +name: Playwright Tests +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] +jobs: + test: + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + - name: Install dependencies + run: npm ci + env: + CI: true + PUBLIC_GRAPHQL_URL: ${{ secrets.PUBLIC_GRAPHQL_URL }} + ALGOLIA_SEARCH_API_KEY: ${{ secrets.ALGOLIA_SEARCH_API_KEY }} + ALGOLIA_APPLICATION_ID: ${{ secrets.ALGOLIA_APPLICATION_ID }} + - name: Install Playwright Browsers + run: npx playwright install --with-deps + - name: Run Playwright tests + run: npx playwright test + env: + CI: true + PUBLIC_GRAPHQL_URL: ${{ secrets.PUBLIC_GRAPHQL_URL }} + ALGOLIA_SEARCH_API_KEY: ${{ secrets.ALGOLIA_SEARCH_API_KEY }} + ALGOLIA_APPLICATION_ID: ${{ secrets.ALGOLIA_APPLICATION_ID }} + - uses: actions/upload-artifact@v3 + if: always() + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 diff --git a/.gitignore b/.gitignore index 438cb086..8f500e54 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ node_modules .output .env dist +/test-results/ +/playwright-report/ +/playwright/.cache/ diff --git a/package-lock.json b/package-lock.json index 78d90ba0..11dff649 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "devDependencies": { "@nuxtjs/apollo": "^5.0.0-alpha.6", "@pinia-plugin-persistedstate/nuxt": "^1.1.1", + "@playwright/test": "^1.35.1", "autoprefixer": "^10.4.14", "nuxt": "^3.6.2", "nuxt-icon": "^0.4.2", @@ -2021,6 +2022,25 @@ "node": "^14.18.0 || >=16.10.0" } }, + "node_modules/@playwright/test": { + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.35.1.tgz", + "integrity": "sha512-b5YoFe6J9exsMYg0pQAobNDR85T1nLumUYgUTtKm4d21iX2L7WqKq9dW8NGJ+2vX0etZd+Y7UeuqsxDXm9+5ZA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "playwright-core": "1.35.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, "node_modules/@rollup/plugin-alias": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.0.0.tgz", @@ -6934,6 +6954,18 @@ "pathe": "^1.1.0" } }, + "node_modules/playwright-core": { + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.35.1.tgz", + "integrity": "sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/postcss": { "version": "8.4.25", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz", diff --git a/package.json b/package.json index 4f0dc328..1ced19cf 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "devDependencies": { "@nuxtjs/apollo": "^5.0.0-alpha.6", "@pinia-plugin-persistedstate/nuxt": "^1.1.1", + "@playwright/test": "^1.35.1", "autoprefixer": "^10.4.14", "nuxt": "^3.6.2", "nuxt-icon": "^0.4.2", @@ -23,7 +24,6 @@ "overrides": { "vue": "^3.3.4", "tslib": "2.5.1" - }, "dependencies": { "@formkit/nuxt": "^1.0.0-beta.9-f64c966", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 00000000..7bf8a819 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,84 @@ +import { defineConfig, devices } from "@playwright/test"; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: "./tests", + /* 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: { + /* 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", + }, + + /* 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: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // url: 'http://127.0.0.1:3000', + // reuseExistingServer: !process.env.CI, + // }, + + /* Run your local dev server before starting the tests */ + webServer: { + reuseExistingServer: true, + command: "npm run dev", + port: 3000, + }, +}); diff --git a/tests/index.spec.ts b/tests/index.spec.ts new file mode 100644 index 00000000..e2573551 --- /dev/null +++ b/tests/index.spec.ts @@ -0,0 +1,9 @@ +import { test, expect } from "@playwright/test"; + +test("Has Index title", async ({ page }) => { + //await page.goto('https://playwright.dev/'); + await page.goto("/"); + + // Expect a title "to contain" a substring. + await expect(page).toHaveTitle(/Index - Nuxt 3 Woocommerce/); +});