mirror of
https://github.com/formbricks/formbricks.git
synced 2025-12-30 18:30:32 -06:00
179 lines
5.3 KiB
TypeScript
179 lines
5.3 KiB
TypeScript
import { hashApiKey } from "@/modules/api/v2/management/lib/utils";
|
|
import { getApiKeyWithPermissions } from "@/modules/organization/settings/api-keys/lib/api-key";
|
|
import { hasPermission } from "@/modules/organization/settings/api-keys/lib/utils";
|
|
import { describe, expect, test, vi } from "vitest";
|
|
import { prisma } from "@formbricks/database";
|
|
import { TAPIKeyEnvironmentPermission } from "@formbricks/types/auth";
|
|
import { authenticateRequest } from "./auth";
|
|
|
|
vi.mock("@formbricks/database", () => ({
|
|
prisma: {
|
|
apiKey: {
|
|
findUnique: vi.fn(),
|
|
update: vi.fn(),
|
|
},
|
|
},
|
|
}));
|
|
|
|
vi.mock("@/modules/api/v2/management/lib/utils", () => ({
|
|
hashApiKey: vi.fn(),
|
|
}));
|
|
|
|
describe("getApiKeyWithPermissions", () => {
|
|
test("returns API key data with permissions when valid key is provided", async () => {
|
|
const mockApiKeyData = {
|
|
id: "api-key-id",
|
|
organizationId: "org-id",
|
|
hashedKey: "hashed-key",
|
|
createdAt: new Date(),
|
|
createdBy: "user-id",
|
|
lastUsedAt: null,
|
|
label: "Test API Key",
|
|
apiKeyEnvironments: [
|
|
{
|
|
environmentId: "env-1",
|
|
permission: "manage" as const,
|
|
environment: { id: "env-1" },
|
|
},
|
|
],
|
|
};
|
|
|
|
vi.mocked(hashApiKey).mockReturnValue("hashed-key");
|
|
vi.mocked(prisma.apiKey.findUnique).mockResolvedValue(mockApiKeyData);
|
|
vi.mocked(prisma.apiKey.update).mockResolvedValue(mockApiKeyData);
|
|
|
|
const result = await getApiKeyWithPermissions("test-api-key");
|
|
|
|
expect(result).toEqual(mockApiKeyData);
|
|
expect(prisma.apiKey.update).toHaveBeenCalledWith({
|
|
where: { id: "api-key-id" },
|
|
data: { lastUsedAt: expect.any(Date) },
|
|
});
|
|
});
|
|
|
|
test("returns null when API key is not found", async () => {
|
|
vi.mocked(prisma.apiKey.findUnique).mockResolvedValue(null);
|
|
|
|
const result = await getApiKeyWithPermissions("invalid-key");
|
|
|
|
expect(result).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe("hasPermission", () => {
|
|
const permissions: TAPIKeyEnvironmentPermission[] = [
|
|
{
|
|
environmentId: "env-1",
|
|
permission: "manage",
|
|
environmentType: "development",
|
|
projectId: "project-1",
|
|
projectName: "Project 1",
|
|
},
|
|
{
|
|
environmentId: "env-2",
|
|
permission: "write",
|
|
environmentType: "production",
|
|
projectId: "project-2",
|
|
projectName: "Project 2",
|
|
},
|
|
{
|
|
environmentId: "env-3",
|
|
permission: "read",
|
|
environmentType: "development",
|
|
projectId: "project-3",
|
|
projectName: "Project 3",
|
|
},
|
|
];
|
|
|
|
test("returns true for manage permission with any method", () => {
|
|
expect(hasPermission(permissions, "env-1", "GET")).toBe(true);
|
|
expect(hasPermission(permissions, "env-1", "POST")).toBe(true);
|
|
expect(hasPermission(permissions, "env-1", "DELETE")).toBe(true);
|
|
});
|
|
|
|
test("handles write permission correctly", () => {
|
|
expect(hasPermission(permissions, "env-2", "GET")).toBe(true);
|
|
expect(hasPermission(permissions, "env-2", "POST")).toBe(true);
|
|
expect(hasPermission(permissions, "env-2", "DELETE")).toBe(false);
|
|
});
|
|
|
|
test("handles read permission correctly", () => {
|
|
expect(hasPermission(permissions, "env-3", "GET")).toBe(true);
|
|
expect(hasPermission(permissions, "env-3", "POST")).toBe(false);
|
|
expect(hasPermission(permissions, "env-3", "DELETE")).toBe(false);
|
|
});
|
|
|
|
test("returns false for non-existent environment", () => {
|
|
expect(hasPermission(permissions, "env-4", "GET")).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe("authenticateRequest", () => {
|
|
test("should return authentication data for valid API key", async () => {
|
|
const request = new Request("http://localhost", {
|
|
headers: { "x-api-key": "valid-api-key" },
|
|
});
|
|
|
|
const mockApiKeyData = {
|
|
id: "api-key-id",
|
|
organizationId: "org-id",
|
|
hashedKey: "hashed-key",
|
|
createdAt: new Date(),
|
|
createdBy: "user-id",
|
|
lastUsedAt: null,
|
|
label: "Test API Key",
|
|
apiKeyEnvironments: [
|
|
{
|
|
environmentId: "env-1",
|
|
permission: "manage" as const,
|
|
environment: {
|
|
id: "env-1",
|
|
projectId: "project-1",
|
|
project: { name: "Project 1" },
|
|
type: "development",
|
|
},
|
|
},
|
|
],
|
|
};
|
|
|
|
vi.mocked(hashApiKey).mockReturnValue("hashed-key");
|
|
vi.mocked(prisma.apiKey.findUnique).mockResolvedValue(mockApiKeyData);
|
|
vi.mocked(prisma.apiKey.update).mockResolvedValue(mockApiKeyData);
|
|
|
|
const result = await authenticateRequest(request);
|
|
|
|
expect(result).toEqual({
|
|
type: "apiKey",
|
|
environmentPermissions: [
|
|
{
|
|
environmentId: "env-1",
|
|
permission: "manage",
|
|
environmentType: "development",
|
|
projectId: "project-1",
|
|
projectName: "Project 1",
|
|
},
|
|
],
|
|
hashedApiKey: "hashed-key",
|
|
apiKeyId: "api-key-id",
|
|
organizationId: "org-id",
|
|
});
|
|
});
|
|
|
|
test("returns null when no API key is provided", async () => {
|
|
const request = new Request("http://localhost");
|
|
const result = await authenticateRequest(request);
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
test("returns null when API key is invalid", async () => {
|
|
const request = new Request("http://localhost", {
|
|
headers: { "x-api-key": "invalid-api-key" },
|
|
});
|
|
|
|
vi.mocked(prisma.apiKey.findUnique).mockResolvedValue(null);
|
|
|
|
const result = await authenticateRequest(request);
|
|
expect(result).toBeNull();
|
|
});
|
|
});
|