IKHSAN
EN Read in EnglishID

homeio

Publik

Fork dari doctor-io/homeio

Branch
main
Commit terakhir
958d74616 Oktober 2026

disk-monitor.test.ts

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

const { inventoryMock, countersMock, snapshotMock } = vi.hoisted(() => ({
  inventoryMock: vi.fn(),
  countersMock: vi.fn(),
  snapshotMock: vi.fn(),
}));

vi.mock("@/lib/server/modules/system/disk-service", () => ({ getDiskInventory: inventoryMock }));
vi.mock("@/lib/server/modules/system/service", () => ({ getSystemMetricsSnapshot: snapshotMock }));
vi.mock("@/lib/server/modules/system/disk-activity", async (importOriginal) => ({
  ...(await importOriginal<typeof import("@/lib/server/modules/system/disk-activity")>()),
  readDiskCounters: countersMock,
}));

import { getDiskMonitor } from "@/lib/server/modules/system/disk-monitor";

const sda = {
  name: "sda",
  device: "/dev/sda",
  model: "Samsung SSD 870",
  vendor: "ATA",
  serial: "S1",
  sizeBytes: 500_000_000_000,
  mediaType: "ssd",
  transport: "sata",
  isRemovable: false,
  partitions: [
    { name: "sda1", device: "/dev/sda1", number: 1, fstype: "ext4", label: null, uuid: "u", sizeBytes: 500_000_000_000, mountpoint: "/", type: "part", ro: false },
  ],
};

describe("getDiskMonitor", () => {
  it("adds live throughput and SMART data to each disk", async () => {
    vi.useFakeTimers();
    inventoryMock.mockResolvedValue({ disks: [sda], unavailableReason: null, readOnly: false });
    snapshotMock.mockResolvedValue({
      storage: { smart: { disks: [{ device: "/dev/sda", status: "healthy", temperatureCelsius: 34, powerOnHours: 1200 }] } },
    });

    vi.setSystemTime(10_000);
    countersMock.mockResolvedValueOnce(new Map([["sda", { readBytes: 0, writeBytes: 0 }]]));
    const first = await getDiskMonitor();
    expect(first.disks[0].readBytesPerSec).toBeNull();

    vi.setSystemTime(12_000);
    countersMock.mockResolvedValueOnce(new Map([["sda", { readBytes: 4_000_000, writeBytes: 1_000_000 }]]));
    const second = await getDiskMonitor();

    expect(second.disks[0]).toMatchObject({
      device: "/dev/sda",
      readBytesPerSec: 2_000_000,
      writeBytesPerSec: 500_000,
      health: "healthy",
      temperatureCelsius: 34,
      powerOnHours: 1200,
      partitions: [{ name: "sda1", mountpoint: "/", fstype: "ext4", sizeBytes: 500_000_000_000 }],
    });
    vi.useRealTimers();
  });

  it("passes on why disks cannot be listed", async () => {
    inventoryMock.mockResolvedValue({ disks: [], unavailableReason: "Disk management needs Linux; this machine runs darwin.", readOnly: false });
    countersMock.mockResolvedValue(null);
    snapshotMock.mockRejectedValue(new Error("no metrics"));

    const result = await getDiskMonitor();

    expect(result.disks).toEqual([]);
    expect(result.unavailableReason).toContain("needs Linux");
  });

  it("leaves out the container's own mount points in Docker", async () => {
    inventoryMock.mockResolvedValue({ disks: [sda], unavailableReason: null, readOnly: true });
    countersMock.mockResolvedValue(null);
    snapshotMock.mockResolvedValue(null);

    const result = await getDiskMonitor();

    expect(result.inContainer).toBe(true);
    expect(result.disks[0].partitions[0].mountpoint).toBeNull();
  });
});
byte
3.128
baris
84
Jenis
ts
Commit terakhir
16 Oktober 2026