Files
formbricks-formbricks/apps/web/modules/environments/lib/utils.test.ts

176 lines
7.0 KiB
TypeScript

// utils.test.ts
import { getProjectPermissionByUserId } from "@/modules/ee/teams/lib/roles";
import { getTeamPermissionFlags } from "@/modules/ee/teams/utils/teams";
// Pull in the mocked implementations to configure them in tests
import { getTranslate } from "@/tolgee/server";
import { getServerSession } from "next-auth";
import { beforeEach, describe, expect, test, vi } from "vitest";
import { hasUserEnvironmentAccess } from "@formbricks/lib/environment/auth";
import { getEnvironment } from "@formbricks/lib/environment/service";
import { getMembershipByUserIdOrganizationId } from "@formbricks/lib/membership/service";
import { getAccessFlags } from "@formbricks/lib/membership/utils";
import { getOrganizationByEnvironmentId } from "@formbricks/lib/organization/service";
import { getProjectByEnvironmentId } from "@formbricks/lib/project/service";
import { getUser } from "@formbricks/lib/user/service";
import { TEnvironment } from "@formbricks/types/environment";
import { AuthorizationError } from "@formbricks/types/errors";
import { TMembership } from "@formbricks/types/memberships";
import { TOrganization } from "@formbricks/types/organizations";
import { TProject } from "@formbricks/types/project";
import { TUser } from "@formbricks/types/user";
import { environmentIdLayoutChecks, getEnvironmentAuth } from "./utils";
// Mock all external dependencies
vi.mock("@/tolgee/server", () => ({
getTranslate: vi.fn(),
}));
vi.mock("next-auth", () => ({
getServerSession: vi.fn(),
}));
vi.mock("@/modules/auth/lib/authOptions", () => ({
authOptions: {},
}));
vi.mock("@/modules/ee/teams/lib/roles", () => ({
getProjectPermissionByUserId: vi.fn(),
}));
vi.mock("@/modules/ee/teams/utils/teams", () => ({
getTeamPermissionFlags: vi.fn(),
}));
vi.mock("@formbricks/lib/environment/auth", () => ({
hasUserEnvironmentAccess: vi.fn(),
}));
vi.mock("@formbricks/lib/environment/service", () => ({
getEnvironment: vi.fn(),
}));
vi.mock("@formbricks/lib/membership/service", () => ({
getMembershipByUserIdOrganizationId: vi.fn(),
}));
vi.mock("@formbricks/lib/membership/utils", () => ({
getAccessFlags: vi.fn(),
}));
vi.mock("@formbricks/lib/organization/service", () => ({
getOrganizationByEnvironmentId: vi.fn(),
}));
vi.mock("@formbricks/lib/project/service", () => ({
getProjectByEnvironmentId: vi.fn(),
}));
vi.mock("@formbricks/lib/user/service", () => ({
getUser: vi.fn(),
}));
vi.mock("@formbricks/types/errors", () => ({
AuthorizationError: class AuthorizationError extends Error {},
}));
describe("utils.ts", () => {
beforeEach(() => {
// Provide default mocks for successful scenario
vi.mocked(getTranslate).mockResolvedValue(((key: string) => key) as any); // Mock translation function
vi.mocked(getServerSession).mockResolvedValue({ user: { id: "user123" } });
vi.mocked(getEnvironment).mockResolvedValue({ id: "env123" } as TEnvironment);
vi.mocked(getProjectByEnvironmentId).mockResolvedValue({ id: "proj123" } as TProject);
vi.mocked(getOrganizationByEnvironmentId).mockResolvedValue({ id: "org123" } as TOrganization);
vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue({
role: "member",
} as unknown as TMembership);
vi.mocked(getAccessFlags).mockReturnValue({
isMember: true,
isOwner: false,
isManager: false,
isBilling: false,
});
vi.mocked(getProjectPermissionByUserId).mockResolvedValue("read");
vi.mocked(getTeamPermissionFlags).mockReturnValue({
hasReadAccess: true,
hasReadWriteAccess: true,
hasManageAccess: true,
});
vi.mocked(hasUserEnvironmentAccess).mockResolvedValue(true);
vi.mocked(getUser).mockResolvedValue({ id: "user123" } as TUser);
});
describe("getEnvironmentAuth", () => {
test("returns environment data on success", async () => {
const result = await getEnvironmentAuth("env123");
expect(result.environment.id).toBe("env123");
expect(result.project.id).toBe("proj123");
expect(result.organization.id).toBe("org123");
expect(result.session.user.id).toBe("user123");
expect(result.isReadOnly).toBe(true); // from mocks (isMember = true & hasReadAccess = true)
});
test("throws error if project not found", async () => {
vi.mocked(getProjectByEnvironmentId).mockResolvedValueOnce(null);
await expect(getEnvironmentAuth("env123")).rejects.toThrow("common.project_not_found");
});
test("throws error if environment not found", async () => {
vi.mocked(getEnvironment).mockResolvedValueOnce(null);
await expect(getEnvironmentAuth("env123")).rejects.toThrow("common.environment_not_found");
});
test("throws error if session not found", async () => {
vi.mocked(getServerSession).mockResolvedValueOnce(null);
await expect(getEnvironmentAuth("env123")).rejects.toThrow("common.session_not_found");
});
test("throws error if organization not found", async () => {
vi.mocked(getOrganizationByEnvironmentId).mockResolvedValueOnce(null);
await expect(getEnvironmentAuth("env123")).rejects.toThrow("common.organization_not_found");
});
test("throws error if membership not found", async () => {
vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValueOnce(null);
await expect(getEnvironmentAuth("env123")).rejects.toThrow("common.membership_not_found");
});
});
describe("environmentIdLayoutChecks", () => {
test("returns t, session, user, and organization on success", async () => {
const result = await environmentIdLayoutChecks("env123");
expect(result.t).toBeInstanceOf(Function);
expect(result.session?.user.id).toBe("user123");
expect(result.user?.id).toBe("user123");
expect(result.organization?.id).toBe("org123");
});
test("returns session=null and user=null if session does not have user", async () => {
vi.mocked(getServerSession).mockResolvedValueOnce({});
const result = await environmentIdLayoutChecks("env123");
expect(result.session).toBe(null);
expect(result.user).toBe(null);
expect(result.organization).toBe(null);
});
test("returns user=null if user is not found", async () => {
vi.mocked(getServerSession).mockResolvedValueOnce({ user: { id: "user123" } });
vi.mocked(getUser).mockResolvedValueOnce(null);
const result = await environmentIdLayoutChecks("env123");
expect(result.session?.user.id).toBe("user123");
expect(result.user).toBe(null);
expect(result.organization).toBe(null);
});
test("throws AuthorizationError if user has no environment access", async () => {
vi.mocked(hasUserEnvironmentAccess).mockResolvedValueOnce(false);
await expect(environmentIdLayoutChecks("env123")).rejects.toThrow(AuthorizationError);
});
test("throws error if organization not found", async () => {
vi.mocked(getOrganizationByEnvironmentId).mockResolvedValueOnce(null);
await expect(environmentIdLayoutChecks("env123")).rejects.toThrow("common.organization_not_found");
});
});
});