feat: pipeline templates, analytics opt-out, 83 conversion presets, positioning + e2e modernization

Lands five integrated branches: pipeline templates (#355), analytics opt-out (#354), 83 conversion presets bringing the catalog to 240 tools (#356), self-hosted positioning (#353), and e2e modernization (#351).

Integration fixes: aligned stale web analytics tests with the opt-out/allow-list model, closed 3 CodeQL incomplete-sanitization alerts in the i18n generator, resolved settings/index/docs/format-matrix conflicts, and corrected tool counts to 240.
This commit is contained in:
SnapOtter
2026-06-28 18:57:53 +08:00
committed by GitHub
parent 88af8d46fb
commit 63a03d26f2
421 changed files with 17308 additions and 2540 deletions
+27 -4
View File
@@ -98,14 +98,22 @@ base.describe("RBAC - Admin sees all tabs", () => {
await page.goto("/");
await openSettings(page);
// Admin has every permission, so all 12 nav items are visible.
await expect(page.getByRole("button", { name: /general/i })).toBeVisible();
await expect(page.getByRole("button", { name: /system settings/i })).toBeVisible();
await expect(page.getByRole("button", { name: /security/i })).toBeVisible();
await expect(page.getByRole("button", { name: /people/i })).toBeVisible();
await expect(page.getByRole("button", { name: /teams/i })).toBeVisible();
await expect(page.getByRole("button", { name: /^roles$/i })).toBeVisible();
await expect(page.getByRole("button", { name: /audit log/i })).toBeVisible();
await expect(page.getByRole("button", { name: /^usage$/i })).toBeVisible();
await expect(page.getByRole("button", { name: /api keys/i })).toBeVisible();
await expect(page.getByRole("button", { name: /ai features/i })).toBeVisible();
await expect(page.getByRole("button", { name: /tools/i })).toBeVisible();
await expect(page.getByRole("button", { name: /about/i })).toBeVisible();
// Exactly 12 nav buttons in the settings sidebar.
expect(await page.locator(".w-48 button").count()).toBe(12);
});
});
@@ -128,7 +136,7 @@ base.describe("RBAC - User sees restricted tabs", () => {
await openSettings(page);
// Should see these tabs
// Should see these 5 tabs (no permission gate, or authRequired only)
await expect(page.getByRole("button", { name: /general/i })).toBeVisible();
await expect(page.getByRole("button", { name: /security/i })).toBeVisible();
await expect(page.getByRole("button", { name: /api keys/i })).toBeVisible();
@@ -139,9 +147,15 @@ base.describe("RBAC - User sees restricted tabs", () => {
await expect(page.getByRole("button", { name: /system settings/i })).not.toBeVisible();
await expect(page.getByRole("button", { name: /people/i })).not.toBeVisible();
await expect(page.getByRole("button", { name: /teams/i })).not.toBeVisible();
// Should NOT see editor-only tabs (requires settings:write)
await expect(page.getByRole("button", { name: /^roles$/i })).not.toBeVisible();
await expect(page.getByRole("button", { name: /audit log/i })).not.toBeVisible();
// Usage now requires audit:read, so it is admin-only.
await expect(page.getByRole("button", { name: /^usage$/i })).not.toBeVisible();
// AI Features requires settings:write.
await expect(page.getByRole("button", { name: /ai features/i })).not.toBeVisible();
// Exactly 5 nav buttons for the user role.
expect(await page.locator(".w-48 button").count()).toBe(5);
});
base.test("user role gets 403 on admin API endpoints", async ({ page }) => {
@@ -228,7 +242,8 @@ base.describe("RBAC - Editor sees collaborative tabs", () => {
await login(page, "editortest", "EditorTest1");
await openSettings(page);
// Should see these
// Should see these 5 tabs (editor lacks settings:write, users:manage,
// teams:manage, and audit:read).
await expect(page.getByRole("button", { name: /general/i })).toBeVisible();
await expect(page.getByRole("button", { name: /security/i })).toBeVisible();
await expect(page.getByRole("button", { name: /api keys/i })).toBeVisible();
@@ -239,6 +254,14 @@ base.describe("RBAC - Editor sees collaborative tabs", () => {
await expect(page.getByRole("button", { name: /system settings/i })).not.toBeVisible();
await expect(page.getByRole("button", { name: /people/i })).not.toBeVisible();
await expect(page.getByRole("button", { name: /teams/i })).not.toBeVisible();
await expect(page.getByRole("button", { name: /^roles$/i })).not.toBeVisible();
await expect(page.getByRole("button", { name: /audit log/i })).not.toBeVisible();
// Usage requires audit:read, AI Features requires settings:write.
await expect(page.getByRole("button", { name: /^usage$/i })).not.toBeVisible();
await expect(page.getByRole("button", { name: /ai features/i })).not.toBeVisible();
// Exactly 5 nav buttons for the editor role.
expect(await page.locator(".w-48 button").count()).toBe(5);
},
);