import { ManualInstallerAdapter } from "./manual-installer-adapter"; import * as exec from "@actions/exec"; import * as io from "@actions/io"; import * as toolCache from "@actions/tool-cache"; jest.mock("@actions/exec"); jest.mock("@actions/io"); jest.mock("@actions/tool-cache"); describe("ManualInstallerAdapter", () => { let mkdirPMock: jest.SpiedFunction; let execMock: jest.SpiedFunction; let cacheFileMock: jest.SpiedFunction; let downloadToolMock: jest.SpiedFunction; let adapter: ManualInstallerAdapter; beforeEach(() => { mkdirPMock = jest.spyOn(io, "mkdirP").mockImplementation(); execMock = jest.spyOn(exec, "exec").mockImplementation(); cacheFileMock = jest.spyOn(toolCache, "cacheFile").mockImplementation(); downloadToolMock = jest.spyOn(toolCache, "downloadTool").mockImplementation(); adapter = new ManualInstallerAdapter(); }); afterEach(() => { jest.clearAllMocks(); }); describe("install", () => { it("should install docker compose correctly", async () => { // Arrange const version = "v2.29.0"; // Uname -s execMock.mockResolvedValueOnce(0); // Uname -m execMock.mockResolvedValueOnce(0); Object.defineProperty(process.env, "HOME", { value: "/home/test", }); // Act await adapter.install(version); // Assert expect(mkdirPMock).toHaveBeenCalledWith("docker-compose"); expect(execMock).toHaveBeenNthCalledWith(1, "uname -s", [], { listeners: { stdout: expect.any(Function) }, }); expect(execMock).toHaveBeenNthCalledWith(2, "uname -m", [], { listeners: { stdout: expect.any(Function) }, }); expect(downloadToolMock).toHaveBeenCalledWith( "https://github.com/docker/compose/releases/download/v2.29.0/docker-compose--", "/home/test/.docker/cli-plugins/docker-compose" ); expect(cacheFileMock).toHaveBeenCalledWith( "/home/test/.docker/cli-plugins/docker-compose", "docker-compose", "docker-compose", version ); }); it("should handle version without 'v' prefix", async () => { // Arrange const version = "2.29.0"; // Uname -s execMock.mockResolvedValueOnce(0); // Uname -m execMock.mockResolvedValueOnce(0); Object.defineProperty(process.env, "HOME", { value: "/home/test", }); // Act await adapter.install(version); // Assert expect(mkdirPMock).toHaveBeenCalledWith("docker-compose"); expect(execMock).toHaveBeenNthCalledWith(1, "uname -s", [], { listeners: { stdout: expect.any(Function) }, }); expect(execMock).toHaveBeenNthCalledWith(2, "uname -m", [], { listeners: { stdout: expect.any(Function) }, }); expect(downloadToolMock).toHaveBeenCalledWith( "https://github.com/docker/compose/releases/download/v2.29.0/docker-compose--", "/home/test/.docker/cli-plugins/docker-compose" ); }); it("should throw an error if a command fails", async () => { // Arrange const version = "v2.29.0"; // Uname -s execMock.mockResolvedValueOnce(1); // Act await expect(adapter.install(version)).rejects.toThrow("Failed to run command: uname -s"); // Assert expect(execMock).toHaveBeenNthCalledWith(1, "uname -s", [], { listeners: { stdout: expect.any(Function) }, }); }); }); });