IKHSAN
ENID Baca dalam Bahasa Indonesia

homeio

Public

Forked from doctor-io/homeio

Branch
main
Latest commit
958d74616 October 2026

route.test.ts

Open raw
import { describe, expect, it, vi } from "vitest";

vi.mock("@/lib/server/modules/files/service", () => ({
  FileServiceError: class FileServiceError extends Error {
    code: string;
    statusCode: number;

    constructor(
      message: string,
      options?: {
        code?: string;
        statusCode?: number;
      },
    ) {
      super(message);
      this.code = options?.code ?? "internal_error";
      this.statusCode = options?.statusCode ?? 500;
    }
  },
  createDirectoryEntry: vi.fn(),
  createFileEntry: vi.fn(),
  pasteEntry: vi.fn(),
}));

import { POST } from "@/app/api/v1/files/ops/route";
import {
  createDirectoryEntry,
  createFileEntry,
  FileServiceError,
  pasteEntry,
} from "@/lib/server/modules/files/service";

describe("POST /api/v1/files/ops", () => {
  it("creates folder entries", async () => {
    vi.mocked(createDirectoryEntry).mockResolvedValueOnce({
      root: "/DATA",
      path: "Documents/New Folder",
      type: "folder",
    });

    const response = await POST(
      new Request("http://localhost/api/v1/files/ops", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          action: "create_folder",
          parentPath: "Documents",
          name: "New Folder",
        }),
      }),
    );
    const json = (await response.json()) as { data: { path: string } };

    expect(response.status).toBe(200);
    expect(json.data.path).toBe("Documents/New Folder");
  });

  it("creates file entries", async () => {
    vi.mocked(createFileEntry).mockResolvedValueOnce({
      root: "/DATA",
      path: "Documents/notes.txt",
      type: "file",
    });

    const response = await POST(
      new Request("http://localhost/api/v1/files/ops", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          action: "create_file",
          parentPath: "Documents",
          name: "notes.txt",
        }),
      }),
    );
    const json = (await response.json()) as { data: { type: string } };

    expect(response.status).toBe(200);
    expect(json.data.type).toBe("file");
  });

  it("pastes copied entries", async () => {
    vi.mocked(pasteEntry).mockResolvedValueOnce({
      root: "/DATA",
      path: "Documents/photo.jpg",
      type: "file",
    });

    const response = await POST(
      new Request("http://localhost/api/v1/files/ops", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          action: "paste",
          sourcePath: "Media/photo.jpg",
          destinationPath: "Documents",
          operation: "copy",
        }),
      }),
    );
    const json = (await response.json()) as { data: { path: string } };

    expect(response.status).toBe(200);
    expect(json.data.path).toBe("Documents/photo.jpg");
  });

  it("maps service errors", async () => {
    vi.mocked(createDirectoryEntry).mockRejectedValueOnce(
      new FileServiceError("already exists", {
        code: "destination_exists",
        statusCode: 409,
      }),
    );

    const response = await POST(
      new Request("http://localhost/api/v1/files/ops", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          action: "create_folder",
          parentPath: "Documents",
          name: "New Folder",
        }),
      }),
    );
    const json = (await response.json()) as { code: string };

    expect(response.status).toBe(409);
    expect(json.code).toBe("destination_exists");
  });
});
bytes
3,681
lines
140
Type
ts
Latest commit
16 October 2026