import { beforeEach, describe, expect, it, vi } from "vitest"; import type { ApplicationNested } from "@dokploy/server/utils/builders"; import { mechanizeDockerContainer } from "@dokploy/server/utils/builders"; type MockCreateServiceOptions = { StopGracePeriod?: number; [key: string]: unknown; }; const { inspectMock, getServiceMock, createServiceMock, getRemoteDockerMock } = vi.hoisted(() => { const inspect = vi.fn<[], Promise>(); const getService = vi.fn(() => ({ inspect })); const createService = vi.fn<[MockCreateServiceOptions], Promise>( async () => undefined, ); const getRemoteDocker = vi.fn(async () => ({ getService, createService, })); return { inspectMock: inspect, getServiceMock: getService, createServiceMock: createService, getRemoteDockerMock: getRemoteDocker, }; }); vi.mock("@dokploy/server/utils/servers/remote-docker", () => ({ getRemoteDocker: getRemoteDockerMock, })); const createApplication = ( overrides: Partial = {}, ): ApplicationNested => ({ appName: "test-app", buildType: "dockerfile", env: null, mounts: [], cpuLimit: null, memoryLimit: null, memoryReservation: null, cpuReservation: null, command: null, ports: [], sourceType: "docker", dockerImage: "example:latest", registry: null, environment: { project: { env: null }, env: null, }, replicas: 1, stopGracePeriodSwarm: 0n, serverId: "server-id", ...overrides, }) as unknown as ApplicationNested; describe("mechanizeDockerContainer", () => { beforeEach(() => { inspectMock.mockReset(); inspectMock.mockRejectedValue(new Error("service not found")); getServiceMock.mockClear(); createServiceMock.mockClear(); getRemoteDockerMock.mockClear(); getRemoteDockerMock.mockResolvedValue({ getService: getServiceMock, createService: createServiceMock, }); }); it("converts bigint stopGracePeriodSwarm to a number and keeps zero values", async () => { const application = createApplication({ stopGracePeriodSwarm: 0n }); await mechanizeDockerContainer(application); expect(createServiceMock).toHaveBeenCalledTimes(1); const call = createServiceMock.mock.calls[0]; if (!call) { throw new Error("createServiceMock should have been called once"); } const [settings] = call; expect(settings.StopGracePeriod).toBe(0); expect(typeof settings.StopGracePeriod).toBe("number"); }); it("omits StopGracePeriod when stopGracePeriodSwarm is null", async () => { const application = createApplication({ stopGracePeriodSwarm: null }); await mechanizeDockerContainer(application); expect(createServiceMock).toHaveBeenCalledTimes(1); const call = createServiceMock.mock.calls[0]; if (!call) { throw new Error("createServiceMock should have been called once"); } const [settings] = call; expect(settings).not.toHaveProperty("StopGracePeriod"); }); });