[autofix.ci] apply automated fixes

This commit is contained in:
autofix-ci[bot]
2026-03-15 22:43:40 +00:00
committed by GitHub
parent 8127dc4536
commit 5410a56638
8 changed files with 321 additions and 275 deletions
@@ -1,6 +1,9 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
const mockMemberData = (role: string, overrides: Record<string, boolean> = {}) => ({
const mockMemberData = (
role: string,
overrides: Record<string, boolean> = {},
) => ({
id: "member-1",
role,
userId: "user-1",
@@ -22,7 +25,8 @@ const mockMemberData = (role: string, overrides: Record<string, boolean> = {}) =
user: { id: "user-1", email: "[email protected]" },
});
let memberToReturn: ReturnType<typeof mockMemberData> = mockMemberData("member");
let memberToReturn: ReturnType<typeof mockMemberData> =
mockMemberData("member");
vi.mock("@dokploy/server/db", () => ({
db: {
@@ -57,23 +61,33 @@ beforeEach(() => {
describe("static roles bypass enterprise resources", () => {
it("owner bypasses deployment.read", async () => {
memberToReturn = mockMemberData("owner");
await expect(checkPermission(ctx, { deployment: ["read"] })).resolves.toBeUndefined();
await expect(
checkPermission(ctx, { deployment: ["read"] }),
).resolves.toBeUndefined();
});
it("admin bypasses backup.create", async () => {
memberToReturn = mockMemberData("admin");
await expect(checkPermission(ctx, { backup: ["create"] })).resolves.toBeUndefined();
await expect(
checkPermission(ctx, { backup: ["create"] }),
).resolves.toBeUndefined();
});
it("member bypasses schedule.delete", async () => {
memberToReturn = mockMemberData("member");
await expect(checkPermission(ctx, { schedule: ["delete"] })).resolves.toBeUndefined();
await expect(
checkPermission(ctx, { schedule: ["delete"] }),
).resolves.toBeUndefined();
});
it("member bypasses multiple enterprise permissions at once", async () => {
memberToReturn = mockMemberData("member");
await expect(
checkPermission(ctx, { deployment: ["read"], backup: ["create"], domain: ["delete"] }),
checkPermission(ctx, {
deployment: ["read"],
backup: ["create"],
domain: ["delete"],
}),
).resolves.toBeUndefined();
});
});
@@ -81,34 +95,46 @@ describe("static roles bypass enterprise resources", () => {
describe("static roles validate free-tier resources", () => {
it("owner passes project.create", async () => {
memberToReturn = mockMemberData("owner");
await expect(checkPermission(ctx, { project: ["create"] })).resolves.toBeUndefined();
await expect(
checkPermission(ctx, { project: ["create"] }),
).resolves.toBeUndefined();
});
it("member fails project.create (no legacy override)", async () => {
memberToReturn = mockMemberData("member");
await expect(checkPermission(ctx, { project: ["create"] })).rejects.toThrow();
await expect(
checkPermission(ctx, { project: ["create"] }),
).rejects.toThrow();
});
it("member passes service.read", async () => {
memberToReturn = mockMemberData("member");
await expect(checkPermission(ctx, { service: ["read"] })).resolves.toBeUndefined();
await expect(
checkPermission(ctx, { service: ["read"] }),
).resolves.toBeUndefined();
});
it("member fails service.create", async () => {
memberToReturn = mockMemberData("member");
await expect(checkPermission(ctx, { service: ["create"] })).rejects.toThrow();
await expect(
checkPermission(ctx, { service: ["create"] }),
).rejects.toThrow();
});
});
describe("legacy boolean overrides for member", () => {
it("member passes project.create with canCreateProjects=true", async () => {
memberToReturn = mockMemberData("member", { canCreateProjects: true });
await expect(checkPermission(ctx, { project: ["create"] })).resolves.toBeUndefined();
await expect(
checkPermission(ctx, { project: ["create"] }),
).resolves.toBeUndefined();
});
it("member passes docker.read with canAccessToDocker=true", async () => {
memberToReturn = mockMemberData("member", { canAccessToDocker: true });
await expect(checkPermission(ctx, { docker: ["read"] })).resolves.toBeUndefined();
await expect(
checkPermission(ctx, { docker: ["read"] }),
).resolves.toBeUndefined();
});
it("member fails docker.read with canAccessToDocker=false", async () => {
@@ -1,5 +1,8 @@
import { describe, it, expect } from "vitest";
import { enterpriseOnlyResources, statements } from "@dokploy/server/lib/access-control";
import {
enterpriseOnlyResources,
statements,
} from "@dokploy/server/lib/access-control";
const FREE_TIER_RESOURCES = [
"organization",
@@ -1,6 +1,9 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
const mockMemberData = (role: string, overrides: Record<string, boolean> = {}) => ({
const mockMemberData = (
role: string,
overrides: Record<string, boolean> = {},
) => ({
id: "member-1",
role,
userId: "user-1",
@@ -22,7 +25,8 @@ const mockMemberData = (role: string, overrides: Record<string, boolean> = {}) =
user: { id: "user-1", email: "[email protected]" },
});
let memberToReturn: ReturnType<typeof mockMemberData> = mockMemberData("member");
let memberToReturn: ReturnType<typeof mockMemberData> =
mockMemberData("member");
vi.mock("@dokploy/server/db", () => ({
db: {
@@ -43,8 +47,12 @@ vi.mock("@dokploy/server/services/proprietary/license-key", () => ({
hasValidLicense: vi.fn(() => Promise.resolve(false)),
}));
const { resolvePermissions } = await import("@dokploy/server/services/permission");
const { enterpriseOnlyResources, statements } = await import("@dokploy/server/lib/access-control");
const { resolvePermissions } = await import(
"@dokploy/server/services/permission"
);
const { enterpriseOnlyResources, statements } = await import(
"@dokploy/server/lib/access-control"
);
const ctx = {
user: { id: "user-1" },
@@ -26,7 +26,8 @@ const mockMemberData = (
user: { id: "user-1", email: "[email protected]" },
});
let memberToReturn: ReturnType<typeof mockMemberData> = mockMemberData("member");
let memberToReturn: ReturnType<typeof mockMemberData> =
mockMemberData("member");
vi.mock("@dokploy/server/db", () => ({
db: {
@@ -64,35 +65,45 @@ describe("checkServicePermissionAndAccess", () => {
it("owner bypasses accessedServices check", async () => {
memberToReturn = mockMemberData("owner", []);
await expect(
checkServicePermissionAndAccess(ctx, "service-123", { deployment: ["read"] }),
checkServicePermissionAndAccess(ctx, "service-123", {
deployment: ["read"],
}),
).resolves.toBeUndefined();
});
it("admin bypasses accessedServices check", async () => {
memberToReturn = mockMemberData("admin", []);
await expect(
checkServicePermissionAndAccess(ctx, "service-123", { backup: ["create"] }),
checkServicePermissionAndAccess(ctx, "service-123", {
backup: ["create"],
}),
).resolves.toBeUndefined();
});
it("member with access to service passes", async () => {
memberToReturn = mockMemberData("member", ["service-123"]);
await expect(
checkServicePermissionAndAccess(ctx, "service-123", { deployment: ["read"] }),
checkServicePermissionAndAccess(ctx, "service-123", {
deployment: ["read"],
}),
).resolves.toBeUndefined();
});
it("member WITHOUT access to service fails", async () => {
memberToReturn = mockMemberData("member", ["other-service"]);
await expect(
checkServicePermissionAndAccess(ctx, "service-123", { deployment: ["read"] }),
checkServicePermissionAndAccess(ctx, "service-123", {
deployment: ["read"],
}),
).rejects.toThrow("You don't have access to this service");
});
it("member with empty accessedServices fails", async () => {
memberToReturn = mockMemberData("member", []);
await expect(
checkServicePermissionAndAccess(ctx, "service-123", { domain: ["delete"] }),
checkServicePermissionAndAccess(ctx, "service-123", {
domain: ["delete"],
}),
).rejects.toThrow("You don't have access to this service");
});
});
@@ -100,7 +111,9 @@ describe("checkServicePermissionAndAccess", () => {
describe("checkServiceAccess", () => {
it("member with service access passes read check", async () => {
memberToReturn = mockMemberData("member", ["app-1"]);
await expect(checkServiceAccess(ctx, "app-1", "read")).resolves.toBeUndefined();
await expect(
checkServiceAccess(ctx, "app-1", "read"),
).resolves.toBeUndefined();
});
it("member without service access fails read check", async () => {
@@ -112,6 +125,8 @@ describe("checkServiceAccess", () => {
it("owner bypasses all access checks", async () => {
memberToReturn = mockMemberData("owner", [], []);
await expect(checkServiceAccess(ctx, "project-1", "create")).resolves.toBeUndefined();
await expect(
checkServiceAccess(ctx, "project-1", "create"),
).resolves.toBeUndefined();
});
});