@@ -1,4 +1,4 @@
|
||||
import { mkdirSync, readFileSync, realpathSync, rmSync } from "node:fs";
|
||||
import { mkdirSync, readFileSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join } from "node:path";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
@@ -117,4 +117,28 @@ describe("package commands", () => {
|
||||
errorSpy.mockRestore();
|
||||
}
|
||||
});
|
||||
|
||||
it("suggests the configured source when update input omits the npm prefix", async () => {
|
||||
const settingsPath = join(agentDir, "settings.json");
|
||||
writeFileSync(settingsPath, JSON.stringify({ packages: ["npm:pi-formatter"] }, null, 2));
|
||||
|
||||
const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
|
||||
const logSpy = vi.spyOn(console, "log").mockImplementation(() => {});
|
||||
|
||||
try {
|
||||
await expect(main(["update", "pi-formatter"])).resolves.toBeUndefined();
|
||||
|
||||
const stderr = errorSpy.mock.calls.map(([message]) => String(message)).join("\n");
|
||||
const stdout = logSpy.mock.calls.map(([message]) => String(message)).join("\n");
|
||||
expect(stderr).toContain("Did you mean npm:pi-formatter?");
|
||||
expect(stdout).not.toContain("Updated pi-formatter");
|
||||
expect(process.exitCode).toBe(1);
|
||||
|
||||
const settings = JSON.parse(readFileSync(settingsPath, "utf-8")) as { packages?: string[] };
|
||||
expect(settings.packages).toContain("npm:pi-formatter");
|
||||
} finally {
|
||||
errorSpy.mockRestore();
|
||||
logSpy.mockRestore();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1293,6 +1293,36 @@ export default function(api) { api.registerTool({ name: "test", description: "te
|
||||
});
|
||||
|
||||
describe("offline mode and network timeouts", () => {
|
||||
it("should update project npm packages using @latest", async () => {
|
||||
settingsManager.setProjectPackages(["npm:example"]);
|
||||
|
||||
const runCommandSpy = vi.spyOn(packageManager as any, "runCommand").mockResolvedValue(undefined);
|
||||
|
||||
await packageManager.update("npm:example");
|
||||
|
||||
expect(runCommandSpy).toHaveBeenCalledWith(
|
||||
"npm",
|
||||
["install", "example@latest", "--prefix", join(tempDir, ".pi", "npm")],
|
||||
undefined,
|
||||
);
|
||||
});
|
||||
|
||||
it("should suggest npm source prefixes for update lookups", async () => {
|
||||
settingsManager.setProjectPackages(["npm:example"]);
|
||||
|
||||
await expect(packageManager.update("example")).rejects.toThrow(
|
||||
"No matching package found for example. Did you mean npm:example?",
|
||||
);
|
||||
});
|
||||
|
||||
it("should suggest git source prefixes for update lookups", async () => {
|
||||
settingsManager.setProjectPackages(["git:github.com/example/repo"]);
|
||||
|
||||
await expect(packageManager.update("github.com/example/repo")).rejects.toThrow(
|
||||
"No matching package found for github.com/example/repo. Did you mean git:github.com/example/repo?",
|
||||
);
|
||||
});
|
||||
|
||||
it("should skip installing missing package sources when offline", async () => {
|
||||
process.env.PI_OFFLINE = "1";
|
||||
settingsManager.setProjectPackages(["npm:missing-package", "git:github.com/example/missing-repo"]);
|
||||
|
||||
Reference in New Issue
Block a user