users-action-search-users-for-filter.test.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { beforeEach, describe, expect, test, vi } from "vitest";
  2. const getSessionMock = vi.fn();
  3. vi.mock("@/lib/auth", () => ({
  4. getSession: getSessionMock,
  5. }));
  6. vi.mock("next/cache", () => ({
  7. revalidatePath: vi.fn(),
  8. }));
  9. const getTranslationsMock = vi.fn(async () => (key: string) => key);
  10. const getLocaleMock = vi.fn(async () => "en");
  11. vi.mock("next-intl/server", () => ({
  12. getTranslations: getTranslationsMock,
  13. getLocale: getLocaleMock,
  14. }));
  15. const searchUsersForFilterRepositoryMock = vi.fn();
  16. vi.mock("@/repository/user", async (importOriginal) => {
  17. const actual = await importOriginal<typeof import("@/repository/user")>();
  18. return {
  19. ...actual,
  20. searchUsersForFilter: searchUsersForFilterRepositoryMock,
  21. };
  22. });
  23. describe("searchUsersForFilter (action)", () => {
  24. beforeEach(() => {
  25. getSessionMock.mockReset();
  26. searchUsersForFilterRepositoryMock.mockReset();
  27. });
  28. test("returns UNAUTHORIZED when session is missing", async () => {
  29. getSessionMock.mockResolvedValue(null);
  30. const { searchUsersForFilter } = await import("@/actions/users");
  31. const result = await searchUsersForFilter();
  32. expect(result.ok).toBe(false);
  33. if (!result.ok) {
  34. expect(result.errorCode).toBe("UNAUTHORIZED");
  35. }
  36. });
  37. test("returns PERMISSION_DENIED for non-admin user", async () => {
  38. getSessionMock.mockResolvedValue({ user: { id: 123, role: "user" } });
  39. const { searchUsersForFilter } = await import("@/actions/users");
  40. const result = await searchUsersForFilter();
  41. expect(result.ok).toBe(false);
  42. if (!result.ok) {
  43. expect(result.errorCode).toBe("PERMISSION_DENIED");
  44. }
  45. });
  46. test("returns users for admin", async () => {
  47. getSessionMock.mockResolvedValue({ user: { id: 1, role: "admin" } });
  48. searchUsersForFilterRepositoryMock.mockResolvedValue([{ id: 1, name: "Alice" }]);
  49. const { searchUsersForFilter } = await import("@/actions/users");
  50. const result = await searchUsersForFilter("ali");
  51. expect(searchUsersForFilterRepositoryMock).toHaveBeenCalledWith("ali");
  52. expect(result).toEqual({ ok: true, data: [{ id: 1, name: "Alice" }] });
  53. });
  54. });