storageErrors.test.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /* @vitest-environment node */
  2. import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
  3. vi.mock("node:fs/promises", () => ({
  4. default: {
  5. access: vi.fn(),
  6. },
  7. }));
  8. import fs from "node:fs/promises";
  9. import { ApiError } from "./errors.js";
  10. import { isFsNotFoundError, mapStorageReadError } from "./storageErrors.js";
  11. describe("lib/api/storageErrors", () => {
  12. const ORIGINAL = process.env.NAS_ROOT_PATH;
  13. beforeEach(() => {
  14. vi.clearAllMocks();
  15. process.env.NAS_ROOT_PATH = "/mnt/niederlassungen";
  16. });
  17. afterEach(() => {
  18. process.env.NAS_ROOT_PATH = ORIGINAL;
  19. });
  20. it("isFsNotFoundError detects ENOENT/ENOTDIR", () => {
  21. expect(isFsNotFoundError({ code: "ENOENT" })).toBe(true);
  22. expect(isFsNotFoundError({ code: "ENOTDIR" })).toBe(true);
  23. expect(isFsNotFoundError({ code: "EACCES" })).toBe(false);
  24. expect(isFsNotFoundError(null)).toBe(false);
  25. });
  26. it("maps ENOENT to 404 when NAS root is accessible", async () => {
  27. fs.access.mockResolvedValue(undefined);
  28. const err = Object.assign(new Error("nope"), { code: "ENOENT" });
  29. const apiErr = await mapStorageReadError(err, {
  30. details: { branch: "NL01" },
  31. });
  32. expect(apiErr).toBeInstanceOf(ApiError);
  33. expect(apiErr.status).toBe(404);
  34. expect(apiErr.code).toBe("FS_NOT_FOUND");
  35. expect(apiErr.details).toEqual({ branch: "NL01" });
  36. });
  37. it("maps ENOENT to 500 when NAS root is NOT accessible", async () => {
  38. fs.access.mockRejectedValue(new Error("no access"));
  39. const err = Object.assign(new Error("nope"), { code: "ENOENT" });
  40. const apiErr = await mapStorageReadError(err, {
  41. details: { branch: "NL01" },
  42. });
  43. expect(apiErr).toBeInstanceOf(ApiError);
  44. expect(apiErr.status).toBe(500);
  45. expect(apiErr.code).toBe("FS_STORAGE_ERROR");
  46. });
  47. it("maps non-notfound filesystem errors to 500", async () => {
  48. fs.access.mockResolvedValue(undefined);
  49. const err = Object.assign(new Error("boom"), { code: "EACCES" });
  50. const apiErr = await mapStorageReadError(err, { details: { x: 1 } });
  51. expect(apiErr).toBeInstanceOf(ApiError);
  52. expect(apiErr.status).toBe(500);
  53. expect(apiErr.code).toBe("FS_STORAGE_ERROR");
  54. });
  55. });