mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
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:
+27
-4
@@ -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);
|
||||
},
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user