better-chatbot / src /lib /action-utils.test.ts
Bot
Initial commit for HF Spaces
05c5ed5
Raw
History Blame Contribute Delete
3.3 kB
import { describe, it, expect, vi, beforeEach } from "vitest";
import { z } from "zod";
import { USER_ROLES } from "app-types/roles";
// Mock server-only module
vi.mock("server-only", () => ({}));
// Mock the auth modules
vi.mock("auth/server", () => ({
getSession: vi.fn(),
}));
// Import after mocks
import { validatedAction, validatedActionWithUser } from "./action-utils";
const { getSession } = await import("auth/server");
describe("action-utils", () => {
beforeEach(() => {
vi.clearAllMocks();
});
describe("validatedAction", () => {
it("should validate form data and call action with valid data", async () => {
const schema = z.object({
name: z.string(),
age: z.string().transform(Number),
});
const mockAction = vi.fn().mockResolvedValue({ success: true });
const wrappedAction = validatedAction(schema, mockAction);
const formData = new FormData();
formData.set("name", "John");
formData.set("age", "25");
const result = await wrappedAction({}, formData);
expect(mockAction).toHaveBeenCalledWith(
{ name: "John", age: 25 },
formData,
);
expect(result).toEqual({ success: true });
});
it("should return error when validation fails", async () => {
const schema = z.object({
email: z.string().email(),
});
const mockAction = vi.fn();
const wrappedAction = validatedAction(schema, mockAction);
const formData = new FormData();
formData.set("email", "invalid-email");
const result = await wrappedAction({}, formData);
expect(mockAction).not.toHaveBeenCalled();
expect(result).toHaveProperty("error");
expect((result as any).error).toContain("Invalid email");
});
});
describe("validatedActionWithUser", () => {
it("should call action with user when authenticated", async () => {
const mockUser = {
id: "user-1",
name: "John Doe",
email: "john@example.com",
role: USER_ROLES.USER,
};
vi.mocked(getSession).mockResolvedValue({
user: mockUser,
session: {} as any,
} as any);
const schema = z.object({ data: z.string() });
const mockAction = vi.fn().mockResolvedValue({ success: true });
const wrappedAction = validatedActionWithUser(schema, mockAction);
const formData = new FormData();
formData.set("data", "test");
const result = await wrappedAction({}, formData);
expect(mockAction).toHaveBeenCalledWith(
{ data: "test" },
formData,
mockUser,
);
expect(result).toEqual({ success: true });
});
it("should return error when user is not authenticated", async () => {
vi.mocked(getSession).mockRejectedValue(new Error("Unauthorized"));
const schema = z.object({ data: z.string() });
const mockAction = vi.fn();
const wrappedAction = validatedActionWithUser(schema, mockAction);
const formData = new FormData();
formData.set("data", "test");
const result = await wrappedAction({}, formData);
expect(mockAction).not.toHaveBeenCalled();
expect(result).toEqual({
success: false,
message: "User is not authenticated",
});
});
});
});