From 6668565ed5ce9fb5f1c87a6b0a02de24092540b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rcio=20Barbosa?= <52362496+barbmarcio@users.noreply.github.com> Date: Thu, 25 Jul 2024 02:46:46 +0100 Subject: [PATCH] feat: adding e2e tests to the sdk This PR adds End-to-end tests to the SDK. Closes: https://topsort.atlassian.net/browse/API-922 --- .env.example | 1 + .gitignore | 4 ++ CONTRIBUTING.md | 23 ++++++++++ README.md | 2 +- bun.lockb | Bin 83432 -> 93319 bytes bunfig.toml | 1 + e2e/auctions.test.ts | 95 ++++++++++++++++++++++++++++++++++++++++++ e2e/config.ts | 3 ++ e2e/events.test.ts | 77 ++++++++++++++++++++++++++++++++++ e2e/public/index.html | 30 +++++++++++++ e2e/server.ts | 22 ++++++++++ global.d.ts | 6 +++ package.json | 5 ++- playwright.config.ts | 31 ++++++++++++++ tsconfig.json | 2 +- tsup.config.ts | 4 +- 16 files changed, 302 insertions(+), 4 deletions(-) create mode 100644 .env.example create mode 100644 e2e/auctions.test.ts create mode 100644 e2e/config.ts create mode 100644 e2e/events.test.ts create mode 100644 e2e/public/index.html create mode 100644 e2e/server.ts create mode 100644 global.d.ts create mode 100644 playwright.config.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9b47526 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +SERVER_PORT= diff --git a/.gitignore b/.gitignore index ef229ed..64b0d86 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +.env + coverage/ dist/ node_modules/ +test-results/ +test-results.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d920b47..d805965 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,6 +17,7 @@ We'd love to accept your patches and contributions to this project. Bellow, you - [Building the SDK](#building-the-sdk) - [Tests](#tests) - [Unit Tests](#unit-tests) + - [E2E Tests](#e2e-tests) - [Code Standards](#code-standards) - [Submitting contributions](#submitting-contributions) - [Commit Messages](#commit-messages) @@ -94,6 +95,24 @@ To run the unit tests, use the following command: bun run test ``` +### E2E Tests + +By default, the application is set to serve a web browser in the port `8080` for Playwright. If this port is already being used on your local machine, make sure you change the port in your `.env`.`SERVER_PORT`. +To run the end-to-end tests, make sure you have installed the browsers supported by playwright by running this command: + +```bash +npx playwright install +``` + +Please refer to [Playwright Documentation](https://playwright.dev/docs/browsers) for details. + +Then, also make sure you have the latest bundled files before running it. Use the following commands: + +```bash +bun run build +bun run test:e2e +``` + ## Code Standards We follow the coding standards set by Biome. Ensure your code follows these guidelines before submitting a pull request. You can run the formatter with the following command: @@ -125,6 +144,10 @@ We do conventional commits, so it will fail on checker with capital case after c The SDK uses following configuration files: - `tsconfig.json`: TypeScript configuration. - `tsup.config.ts`: Configuration for the TSUP bundler. +- `playwright.config.ts`: Configuration for E2E tests runner + +We also have the following variables as part of the `.env` file: +- `PLAYWRIGHT_PORT`: Port used to run the local web browser to run Playwright E2E tests. ## License This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details. diff --git a/README.md b/README.md index 175d5f4..a3c108c 100644 --- a/README.md +++ b/README.md @@ -157,7 +157,7 @@ reportEvent(config, event) 400: ```json { - "status": 204, + "status": 400, "statusText": "No Content", "body": { "errCode": "bad_request", diff --git a/bun.lockb b/bun.lockb index 72143bcb09d786ddeb7c40249b8cbf49aa6030c9..500b13a69b0e7d58eabb5f3e3b0456bbda350dc3 100755 GIT binary patch delta 21500 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 SGKardIE3k{=Vr6t>-<0A;)4JH diff --git a/bunfig.toml b/bunfig.toml index 0c9079a..61328de 100644 --- a/bunfig.toml +++ b/bunfig.toml @@ -1,2 +1,3 @@ [test] coverage = true +root = "./test" diff --git a/e2e/auctions.test.ts b/e2e/auctions.test.ts new file mode 100644 index 0000000..4c55b7d --- /dev/null +++ b/e2e/auctions.test.ts @@ -0,0 +1,95 @@ +import { expect, test } from "@playwright/test"; +import { apis, baseURL } from "../src/constants/apis.constant"; +import { playwrightConstants } from "./config"; + +test.describe("Create Auction via Topsort SDK", () => { + test("should create an auction successfully", async ({ page }) => { + const mockAPIResponse = { + results: [ + { + resultType: "listings", + winners: [], + error: false, + }, + { + resultType: "banners", + winners: [], + error: false, + }, + ], + }; + + await page.route(`${baseURL}/${apis.auctions}`, async (route) => { + await route.fulfill({ json: mockAPIResponse }); + }); + + await page.goto(playwrightConstants.host); + const result = await page.evaluate(() => { + const config = { + apiKey: "rando-api-key", + }; + + const auctionDetails = { + auctions: [ + { + type: "listings", + slots: 3, + category: { id: "cat123" }, + geoTargeting: { location: "US" }, + }, + { + type: "banners", + slots: 1, + device: "desktop", + slotId: "slot123", + category: { ids: ["cat1", "cat2"] }, + geoTargeting: { location: "UK" }, + }, + ], + }; + if (typeof window.sdk.createAuction === "undefined") { + throw new Error("Global function `createAuction` is not available."); + } + + return window.sdk.createAuction(config, auctionDetails); + }); + + expect(result).toEqual(mockAPIResponse); + }); + + test("should fail to call with missing apiKey", async ({ page }) => { + const expectedError = { status: 401, statusText: "API Key is required.", body: {} }; + await page.goto(playwrightConstants.host); + const result = await page.evaluate(() => { + const config = { + apiKey: null, + }; + + const auctionDetails = { + auctions: [ + { + type: "listings", + slots: 3, + category: { id: "cat123" }, + geoTargeting: { location: "US" }, + }, + { + type: "banners", + slots: 1, + device: "desktop", + slotId: "slot123", + category: { ids: ["cat1", "cat2"] }, + geoTargeting: { location: "UK" }, + }, + ], + }; + if (typeof window.sdk.createAuction === "undefined") { + throw new Error("Global function `createAuction` is not available."); + } + + return window.sdk.createAuction(config, auctionDetails); + }); + + expect(result).toEqual(expectedError); + }); +}); diff --git a/e2e/config.ts b/e2e/config.ts new file mode 100644 index 0000000..008e530 --- /dev/null +++ b/e2e/config.ts @@ -0,0 +1,3 @@ +export const playwrightConstants = { + host: `http://localhost:${process.env.SERVER_PORT || 8080}/index.html`, +}; diff --git a/e2e/events.test.ts b/e2e/events.test.ts new file mode 100644 index 0000000..57408e5 --- /dev/null +++ b/e2e/events.test.ts @@ -0,0 +1,77 @@ +import { expect, test } from "@playwright/test"; +import { apis, baseURL } from "../src/constants/apis.constant"; +import { playwrightConstants } from "./config"; + +test.describe("Report Events via Topsort SDK", () => { + test("should report an successfully", async ({ page }) => { + const mockAPIResponse = { + ok: true, + }; + + await page.route(`${baseURL}/${apis.events}`, async (route) => { + await route.fulfill({ json: mockAPIResponse }); + }); + + await page.goto(playwrightConstants.host); + const result = await page.evaluate(() => { + const config = { + apiKey: "rando-api-key", + }; + + const event = { + impressions: [ + { + resolvedBidId: + "ChAGaP5D2ex-UKEEBCOHwvDjEhABkF4FDAx0S5mMD2cOG0w9GhABkEnL2CB6qKIoqeItVgA_InsKd2h0dHBzOi8vd3d3LndlYmEuYmUvZnIvcHJvbW8uaHRtbD91dG1fc291cmNlPW15c2hvcGkmdXRtX21lZGl1bT1iYW5uZXJfMTI4MHg0MDAmdXRtX2NvbnRlbnQ9ZGlzcGxheSZ1dG1fY2FtcGFpZ249c29sZGVuEAU", + id: "1720706109.713344-53B92988-7A49-4679-B18E-465943B46149", + occurredAt: "2024-07-11T13:55:09Z", + opaqueUserId: "38e0a5ff-9f8a-4e80-8969-e5e3f01348e8", + placement: { + path: "/categories/sports", + }, + }, + ], + }; + + if (typeof window.sdk.reportEvent === "undefined") { + throw new Error("Global function `reportEvent` is not available."); + } + + return window.sdk.reportEvent(config, event); + }); + + expect(result).toEqual(mockAPIResponse); + }); + + test("should fail to call with missing apiKey", async ({ page }) => { + const expectedError = { status: 401, statusText: "API Key is required.", body: {} }; + await page.goto(playwrightConstants.host); + const result = await page.evaluate(() => { + const config = { + apiKey: null, + }; + + const event = { + impressions: [ + { + resolvedBidId: + "ChAGaP5D2ex-UKEEBCOHwvDjEhABkF4FDAx0S5mMD2cOG0w9GhABkEnL2CB6qKIoqeItVgA_InsKd2h0dHBzOi8vd3d3LndlYmEuYmUvZnIvcHJvbW8uaHRtbD91dG1fc291cmNlPW15c2hvcGkmdXRtX21lZGl1bT1iYW5uZXJfMTI4MHg0MDAmdXRtX2NvbnRlbnQ9ZGlzcGxheSZ1dG1fY2FtcGFpZ249c29sZGVuEAU", + id: "1720706109.713344-53B92988-7A49-4679-B18E-465943B46149", + occurredAt: "2024-07-11T13:55:09Z", + opaqueUserId: "38e0a5ff-9f8a-4e80-8969-e5e3f01348e8", + placement: { + path: "/categories/sports", + }, + }, + ], + }; + if (typeof window.sdk.reportEvent === "undefined") { + throw new Error("Global function `reportEvent` is not available."); + } + + return window.sdk.reportEvent(config, event); + }); + + expect(result).toEqual(expectedError); + }); +}); diff --git a/e2e/public/index.html b/e2e/public/index.html new file mode 100644 index 0000000..0165b8e --- /dev/null +++ b/e2e/public/index.html @@ -0,0 +1,30 @@ + + + + + + Topsort SDK Test Application + + + +

Test Topsort.js Integration

+ + + diff --git a/e2e/server.ts b/e2e/server.ts new file mode 100644 index 0000000..d9a8a45 --- /dev/null +++ b/e2e/server.ts @@ -0,0 +1,22 @@ +import { file } from "bun"; + +const PORT = process.env.SERVER_PORT || 8080; + +Bun.serve({ + fetch(req) { + const url = new URL(req.url); + const pathname = url.pathname === "/" ? "/index.html" : url.pathname; + const filePath = `./dist${pathname}`; + + try { + if (filePath.endsWith(".ico")) { + return new Response("", { status: 204 }); + } + + return new Response(file(filePath)); + } catch (e) { + return new Response("Not Found", { status: 404 }); + } + }, + port: PORT, +}); diff --git a/global.d.ts b/global.d.ts new file mode 100644 index 0000000..f9bc02d --- /dev/null +++ b/global.d.ts @@ -0,0 +1,6 @@ +interface Window { + sdk: { + createAuction: (a, b) => unknown; + reportEvent: (a, b) => unknown; + }; +} diff --git a/package.json b/package.json index 654100a..e017911 100644 --- a/package.json +++ b/package.json @@ -32,12 +32,15 @@ ], "scripts": { "build": "tsup", + "test:e2e": "playwright test", "format": "biome check", "format:fix": "biome check --write", - "prepare": "lefthook install" + "prepare": "lefthook install", + "serve:e2e": "bun run ./e2e/server.ts" }, "devDependencies": { "@biomejs/biome": "1.8.3", + "@playwright/test": "^1.45.2", "@types/bun": "1.1.6", "lefthook": "1.7.5", "msw": "2.3.2", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..b7af23b --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,31 @@ +import { defineConfig, devices } from "@playwright/test"; + +export default defineConfig({ + testDir: "./e2e", + timeout: 30000, + retries: 0, + reporter: [["list"], ["json", { outputFile: "test-results.json" }]], + use: { + trace: "on-first-retry", + }, + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + { + name: "firefox", + use: { ...devices["Desktop Firefox"] }, + }, + { + name: "webkit", + use: { ...devices["Desktop Safari"] }, + }, + ], + webServer: { + command: "bun run serve:e2e", + reuseExistingServer: !process.env.CI, + stdout: "ignore", + stderr: "pipe", + }, +}); diff --git a/tsconfig.json b/tsconfig.json index 4eb4110..531c5f2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,6 +17,6 @@ "allowJs": true, "types": ["node"] }, - "include": ["src/*.ts", "src/**/*.ts"], + "include": ["src/*.ts", "src/**/*.ts", "e2e/server.ts"], "exclude": ["node_modules"] } diff --git a/tsup.config.ts b/tsup.config.ts index 0e3f406..49225ea 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -2,11 +2,13 @@ import { defineConfig } from "tsup"; export default defineConfig({ entry: ["src/index.ts"], - format: ["cjs", "esm"], + format: ["cjs", "esm", "iife"], dts: true, clean: true, minify: true, esbuildOptions(options) { options.keepNames = true; + options.globalName = "Topsort"; }, + onSuccess: "cp -r ./e2e/public/* dist", });