Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .github/workflows/frontend-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,27 @@ jobs:

- name: Build
run: bun run build

e2e:
name: Playwright E2E
needs: checks
runs-on: ubuntu-latest
defaults:
run:
working-directory: apps/web

steps:
- name: Check out the repository
uses: actions/checkout@v4

- name: Set up Bun
uses: oven-sh/setup-bun@v2

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Install Playwright browsers
run: bunx playwright install --with-deps

- name: Run e2e tests
run: bun run e2e
4 changes: 4 additions & 0 deletions apps/web/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,7 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
.ufazien.json
# Ufazien CLI
ufazien.py

# Playwright
test-results/
playwright-report/
27 changes: 27 additions & 0 deletions apps/web/e2e/access.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { test, expect } from "@playwright/test";

test.beforeEach(async ({ page }) => {
await page.goto("/");

await page.evaluate(() => {
localStorage.setItem(
"cleat-org",
JSON.stringify({
state: {
connected: true,
connectedAccountIds: ["acct_personal"],
activeAccountId: "acct_personal",
},
version: 0,
}),
);
});

await page.reload();
});

test("access page loads", async ({ page }) => {
await page.goto("/app/access");

await expect(page.getByTestId("access-page")).toBeVisible();
});
33 changes: 33 additions & 0 deletions apps/web/e2e/artifacts.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { test, expect } from "@playwright/test";

test.beforeEach(async ({ page }) => {
await page.goto("/");

await page.evaluate(() => {
localStorage.setItem(
"cleat-org",
JSON.stringify({
state: {
connected: true,
connectedAccountIds: ["acct_personal"],
activeAccountId: "acct_personal",
},
version: 0,
}),
);
});

await page.reload();
});

test("artifacts page loads", async ({ page }) => {
await page.goto("/app/artifacts");

await expect(page.getByTestId("artifacts-page")).toBeVisible();

await expect(page.getByRole("heading", { name: "Artifacts & cost" })).toBeVisible();

await expect(page.locator("button", { hasText: "Caches" })).toBeVisible();

await expect(page.locator("button", { hasText: "Packages" })).toBeVisible();
});
27 changes: 27 additions & 0 deletions apps/web/e2e/code-scanning.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { test, expect } from "@playwright/test";

test.beforeEach(async ({ page }) => {
await page.goto("/");

await page.evaluate(() => {
localStorage.setItem(
"cleat-org",
JSON.stringify({
state: {
connected: true,
connectedAccountIds: ["acct_personal"],
activeAccountId: "acct_personal",
},
version: 0,
}),
);
});

await page.reload();
});

test("code scanning page loads", async ({ page }) => {
await page.goto("/app/security/code-scanning");

await expect(page.getByTestId("code-scanning-page")).toBeVisible();
});
33 changes: 33 additions & 0 deletions apps/web/e2e/dependencies.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { test, expect } from "@playwright/test";

test.beforeEach(async ({ page }) => {
await page.goto("/");

await page.evaluate(() => {
localStorage.setItem(
"cleat-org",
JSON.stringify({
state: {
connected: true,
connectedAccountIds: ["acct_personal"],
activeAccountId: "acct_personal",
},
version: 0,
}),
);
});

await page.reload();
});

test("dependencies page loads", async ({ page }) => {
await page.goto("/app/dependencies");

await expect(page.getByTestId("dependencies-page")).toBeVisible();

await expect(page.getByText("Total dependencies")).toBeVisible();

await expect(page.getByText("Export SBOM")).toBeVisible();

await expect(page.getByText("Download")).toBeVisible();
});
19 changes: 19 additions & 0 deletions apps/web/e2e/onboarding.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { test, expect } from "@playwright/test";

test("user can start onboarding", async ({ page }) => {
await page.goto("/connect");

await expect(
page.getByRole("button", {
name: /authorize & continue/i,
}),
).toBeVisible();

await page
.getByRole("button", {
name: /authorize & continue/i,
})
.click();

await expect(page).toHaveURL(/onboarding/);
});
33 changes: 33 additions & 0 deletions apps/web/e2e/overview.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { test, expect } from "@playwright/test";

test.beforeEach(async ({ page }) => {
await page.goto("/");

await page.evaluate(() => {
localStorage.setItem(
"cleat-org",
JSON.stringify({
state: {
connected: true,
connectedAccountIds: ["acct_personal"],
activeAccountId: "acct_personal",
},
version: 0,
}),
);
});

await page.reload();
});

test("overview page loads", async ({ page }) => {
await page.goto("/app/overview");

await expect(page).toHaveURL(/overview/);

await expect(page.getByTestId("overview-page")).toBeVisible();

await expect(page.getByTestId("security-posture-card")).toBeVisible();

await expect(page.getByTestId("open-findings-card")).toBeVisible();
});
29 changes: 29 additions & 0 deletions apps/web/e2e/repositories.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { test, expect } from "@playwright/test";

test.beforeEach(async ({ page }) => {
await page.goto("/");

await page.evaluate(() => {
localStorage.setItem(
"cleat-org",
JSON.stringify({
state: {
connected: true,
connectedAccountIds: ["acct_personal"],
activeAccountId: "acct_personal",
},
version: 0,
}),
);
});

await page.reload();
});

test("repositories page loads", async ({ page }) => {
await page.goto("/app/repositories");

await expect(page).toHaveURL(/repositories/);

await expect(page.getByTestId("repositories-page")).toBeVisible();
});
27 changes: 27 additions & 0 deletions apps/web/e2e/repository-detail.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { test, expect } from "@playwright/test";

test.beforeEach(async ({ page }) => {
await page.goto("/");

await page.evaluate(() => {
localStorage.setItem(
"cleat-org",
JSON.stringify({
state: {
connected: true,
connectedAccountIds: ["acct_personal"],
activeAccountId: "acct_personal",
},
version: 0,
}),
);
});

await page.reload();
});

test("repository detail page loads", async ({ page }) => {
await page.goto("/app/repositories/repo-1");

await expect(page.getByTestId("repo-detail-page")).toBeVisible();
});
27 changes: 27 additions & 0 deletions apps/web/e2e/secrets.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { test, expect } from "@playwright/test";

test.beforeEach(async ({ page }) => {
await page.goto("/");

await page.evaluate(() => {
localStorage.setItem(
"cleat-org",
JSON.stringify({
state: {
connected: true,
connectedAccountIds: ["acct_personal"],
activeAccountId: "acct_personal",
},
version: 0,
}),
);
});

await page.reload();
});

test("secrets page loads", async ({ page }) => {
await page.goto("/app/security/secrets");

await expect(page.getByTestId("secrets-page")).toBeVisible();
});
27 changes: 27 additions & 0 deletions apps/web/e2e/settings.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { test, expect } from "@playwright/test";

test.beforeEach(async ({ page }) => {
await page.goto("/");

await page.evaluate(() => {
localStorage.setItem(
"cleat-org",
JSON.stringify({
state: {
connected: true,
connectedAccountIds: ["acct_personal"],
activeAccountId: "acct_personal",
},
version: 0,
}),
);
});

await page.reload();
});

test("settings page loads", async ({ page }) => {
await page.goto("/app/settings");

await expect(page.getByTestId("settings-page")).toBeVisible();
});
27 changes: 27 additions & 0 deletions apps/web/e2e/supply-chain.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { test, expect } from "@playwright/test";

test.beforeEach(async ({ page }) => {
await page.goto("/");

await page.evaluate(() => {
localStorage.setItem(
"cleat-org",
JSON.stringify({
state: {
connected: true,
connectedAccountIds: ["acct_personal"],
activeAccountId: "acct_personal",
},
version: 0,
}),
);
});

await page.reload();
});

test("supply chain page loads", async ({ page }) => {
await page.goto("/app/supply-chain");

await expect(page.getByTestId("supply-chain-page")).toBeVisible();
});
5 changes: 3 additions & 2 deletions apps/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"private": true,
"devDependencies": {
"@eslint/js": "^10.0.1",
"@playwright/test": "^1.61.0",
"@tailwindcss/vite": "^4.3.0",
"@types/bun": "latest",
"@types/react": "^19.2.15",
Expand All @@ -30,7 +31,6 @@
"date-fns": "^4.3.0",
"lucide-react": "^1.16.0",
"motion": "^12.40.0",
"playwright": "^1.60.0",
"react": "^19.2.6",
"react-dom": "^19.2.6",
"react-router-dom": "^7.15.1",
Expand All @@ -41,12 +41,13 @@
"scripts": {
"dev": "vite",
"build": "vite build",
"e2e": "playwright test",
"preview": "vite preview",
"typecheck": "tsc --noEmit",
"lint": "eslint .",
"format": "prettier --write .",
"lint:fix": "eslint . --fix",
"format:check": "prettier --check ."
},
"version": "1.7.1"
"version": "1.7.2"
}
Loading
Loading