Spaces:
Sleeping
Sleeping
File size: 3,298 Bytes
05c5ed5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | 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",
});
});
});
});
|