mirror of
https://github.com/formbricks/formbricks.git
synced 2026-02-21 00:58:29 -06:00
74 lines
2.9 KiB
TypeScript
74 lines
2.9 KiB
TypeScript
import { beforeEach, describe, expect, test, vi } from "vitest";
|
|
|
|
vi.mock("server-only", () => ({}));
|
|
|
|
const mockGetEnvironment = vi.fn();
|
|
const mockGetOrganizationIdFromProjectId = vi.fn();
|
|
const mockCheckAuthorizationUpdated = vi.fn();
|
|
|
|
vi.mock("@/lib/environment/service", () => ({
|
|
getEnvironment: (...args: any[]) => mockGetEnvironment(...args),
|
|
}));
|
|
|
|
vi.mock("@/lib/utils/helper", () => ({
|
|
getOrganizationIdFromProjectId: (...args: any[]) => mockGetOrganizationIdFromProjectId(...args),
|
|
}));
|
|
|
|
vi.mock("@/lib/utils/action-client/action-client-middleware", () => ({
|
|
checkAuthorizationUpdated: (...args: any[]) => mockCheckAuthorizationUpdated(...args),
|
|
}));
|
|
|
|
const mockUserId = "user-abc-123";
|
|
const mockEnvironmentId = "env-abc-123";
|
|
const mockProjectId = "project-abc-123";
|
|
const mockOrganizationId = "org-abc-123";
|
|
|
|
describe("checkProjectAccess", () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
test("returns organizationId and projectId on successful access check", async () => {
|
|
mockGetEnvironment.mockResolvedValue({ projectId: mockProjectId });
|
|
mockGetOrganizationIdFromProjectId.mockResolvedValue(mockOrganizationId);
|
|
mockCheckAuthorizationUpdated.mockResolvedValue(undefined);
|
|
const { checkProjectAccess } = await import("./access");
|
|
|
|
const result = await checkProjectAccess(mockUserId, mockEnvironmentId, "readWrite");
|
|
|
|
expect(result).toEqual({ organizationId: mockOrganizationId, projectId: mockProjectId });
|
|
expect(mockGetEnvironment).toHaveBeenCalledWith(mockEnvironmentId);
|
|
expect(mockGetOrganizationIdFromProjectId).toHaveBeenCalledWith(mockProjectId);
|
|
expect(mockCheckAuthorizationUpdated).toHaveBeenCalledWith({
|
|
userId: mockUserId,
|
|
organizationId: mockOrganizationId,
|
|
access: [
|
|
{ type: "organization", roles: ["owner", "manager"] },
|
|
{ type: "projectTeam", minPermission: "readWrite", projectId: mockProjectId },
|
|
],
|
|
});
|
|
});
|
|
|
|
test("throws ResourceNotFoundError when environment is not found", async () => {
|
|
mockGetEnvironment.mockResolvedValue(null);
|
|
const { checkProjectAccess } = await import("./access");
|
|
|
|
await expect(checkProjectAccess(mockUserId, mockEnvironmentId, "read")).rejects.toMatchObject({
|
|
name: "ResourceNotFoundError",
|
|
resourceType: "environment",
|
|
resourceId: mockEnvironmentId,
|
|
});
|
|
expect(mockGetOrganizationIdFromProjectId).not.toHaveBeenCalled();
|
|
expect(mockCheckAuthorizationUpdated).not.toHaveBeenCalled();
|
|
});
|
|
|
|
test("propagates authorization errors from checkAuthorizationUpdated", async () => {
|
|
mockGetEnvironment.mockResolvedValue({ projectId: mockProjectId });
|
|
mockGetOrganizationIdFromProjectId.mockResolvedValue(mockOrganizationId);
|
|
mockCheckAuthorizationUpdated.mockRejectedValue(new Error("Unauthorized"));
|
|
const { checkProjectAccess } = await import("./access");
|
|
|
|
await expect(checkProjectAccess(mockUserId, mockEnvironmentId, "manage")).rejects.toThrow("Unauthorized");
|
|
});
|
|
});
|