@herdctl/core 5.5.0 → 5.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/__tests__/merge.test.js +1 -1
- package/dist/config/__tests__/merge.test.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +10 -2
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +6 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/distribution/__tests__/agent-discovery.test.d.ts +7 -0
- package/dist/distribution/__tests__/agent-discovery.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/agent-discovery.test.js +443 -0
- package/dist/distribution/__tests__/agent-discovery.test.js.map +1 -0
- package/dist/distribution/__tests__/agent-info.test.d.ts +7 -0
- package/dist/distribution/__tests__/agent-info.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/agent-info.test.js +568 -0
- package/dist/distribution/__tests__/agent-info.test.js.map +1 -0
- package/dist/distribution/__tests__/agent-remover.test.d.ts +7 -0
- package/dist/distribution/__tests__/agent-remover.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/agent-remover.test.js +498 -0
- package/dist/distribution/__tests__/agent-remover.test.js.map +1 -0
- package/dist/distribution/__tests__/agent-repo-metadata.test.d.ts +5 -0
- package/dist/distribution/__tests__/agent-repo-metadata.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/agent-repo-metadata.test.js +500 -0
- package/dist/distribution/__tests__/agent-repo-metadata.test.js.map +1 -0
- package/dist/distribution/__tests__/env-scanner.test.d.ts +5 -0
- package/dist/distribution/__tests__/env-scanner.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/env-scanner.test.js +576 -0
- package/dist/distribution/__tests__/env-scanner.test.js.map +1 -0
- package/dist/distribution/__tests__/file-installer.test.d.ts +7 -0
- package/dist/distribution/__tests__/file-installer.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/file-installer.test.js +714 -0
- package/dist/distribution/__tests__/file-installer.test.js.map +1 -0
- package/dist/distribution/__tests__/fleet-config-updater.test.d.ts +7 -0
- package/dist/distribution/__tests__/fleet-config-updater.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/fleet-config-updater.test.js +531 -0
- package/dist/distribution/__tests__/fleet-config-updater.test.js.map +1 -0
- package/dist/distribution/__tests__/installation-metadata.test.d.ts +2 -0
- package/dist/distribution/__tests__/installation-metadata.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/installation-metadata.test.js +292 -0
- package/dist/distribution/__tests__/installation-metadata.test.js.map +1 -0
- package/dist/distribution/__tests__/integration.test.d.ts +10 -0
- package/dist/distribution/__tests__/integration.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/integration.test.js +522 -0
- package/dist/distribution/__tests__/integration.test.js.map +1 -0
- package/dist/distribution/__tests__/repository-fetcher.test.d.ts +5 -0
- package/dist/distribution/__tests__/repository-fetcher.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/repository-fetcher.test.js +386 -0
- package/dist/distribution/__tests__/repository-fetcher.test.js.map +1 -0
- package/dist/distribution/__tests__/repository-validator.test.d.ts +7 -0
- package/dist/distribution/__tests__/repository-validator.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/repository-validator.test.js +447 -0
- package/dist/distribution/__tests__/repository-validator.test.js.map +1 -0
- package/dist/distribution/__tests__/source-specifier.test.d.ts +5 -0
- package/dist/distribution/__tests__/source-specifier.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/source-specifier.test.js +533 -0
- package/dist/distribution/__tests__/source-specifier.test.js.map +1 -0
- package/dist/distribution/agent-discovery.d.ts +81 -0
- package/dist/distribution/agent-discovery.d.ts.map +1 -0
- package/dist/distribution/agent-discovery.js +264 -0
- package/dist/distribution/agent-discovery.js.map +1 -0
- package/dist/distribution/agent-info.d.ts +86 -0
- package/dist/distribution/agent-info.d.ts.map +1 -0
- package/dist/distribution/agent-info.js +225 -0
- package/dist/distribution/agent-info.js.map +1 -0
- package/dist/distribution/agent-remover.d.ts +83 -0
- package/dist/distribution/agent-remover.d.ts.map +1 -0
- package/dist/distribution/agent-remover.js +222 -0
- package/dist/distribution/agent-remover.js.map +1 -0
- package/dist/distribution/agent-repo-metadata.d.ts +181 -0
- package/dist/distribution/agent-repo-metadata.d.ts.map +1 -0
- package/dist/distribution/agent-repo-metadata.js +143 -0
- package/dist/distribution/agent-repo-metadata.js.map +1 -0
- package/dist/distribution/env-scanner.d.ts +78 -0
- package/dist/distribution/env-scanner.d.ts.map +1 -0
- package/dist/distribution/env-scanner.js +144 -0
- package/dist/distribution/env-scanner.js.map +1 -0
- package/dist/distribution/file-installer.d.ts +80 -0
- package/dist/distribution/file-installer.d.ts.map +1 -0
- package/dist/distribution/file-installer.js +268 -0
- package/dist/distribution/file-installer.js.map +1 -0
- package/dist/distribution/fleet-config-updater.d.ts +96 -0
- package/dist/distribution/fleet-config-updater.d.ts.map +1 -0
- package/dist/distribution/fleet-config-updater.js +266 -0
- package/dist/distribution/fleet-config-updater.js.map +1 -0
- package/dist/distribution/index.d.ts +23 -0
- package/dist/distribution/index.d.ts.map +1 -0
- package/dist/distribution/index.js +42 -0
- package/dist/distribution/index.js.map +1 -0
- package/dist/distribution/installation-metadata.d.ts +191 -0
- package/dist/distribution/installation-metadata.d.ts.map +1 -0
- package/dist/distribution/installation-metadata.js +100 -0
- package/dist/distribution/installation-metadata.js.map +1 -0
- package/dist/distribution/repository-fetcher.d.ts +104 -0
- package/dist/distribution/repository-fetcher.d.ts.map +1 -0
- package/dist/distribution/repository-fetcher.js +246 -0
- package/dist/distribution/repository-fetcher.js.map +1 -0
- package/dist/distribution/repository-validator.d.ts +86 -0
- package/dist/distribution/repository-validator.d.ts.map +1 -0
- package/dist/distribution/repository-validator.js +296 -0
- package/dist/distribution/repository-validator.js.map +1 -0
- package/dist/distribution/source-specifier.d.ts +106 -0
- package/dist/distribution/source-specifier.d.ts.map +1 -0
- package/dist/distribution/source-specifier.js +247 -0
- package/dist/distribution/source-specifier.js.map +1 -0
- package/dist/fleet-manager/errors.d.ts +15 -0
- package/dist/fleet-manager/errors.d.ts.map +1 -1
- package/dist/fleet-manager/errors.js +16 -0
- package/dist/fleet-manager/errors.js.map +1 -1
- package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.js +31 -9
- package/dist/fleet-manager/fleet-manager.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/runner/message-processor.d.ts.map +1 -1
- package/dist/runner/message-processor.js +7 -2
- package/dist/runner/message-processor.js.map +1 -1
- package/dist/runner/runtime/container-manager.js +1 -1
- package/dist/runner/runtime/container-manager.js.map +1 -1
- package/dist/scheduler/errors.d.ts +15 -0
- package/dist/scheduler/errors.d.ts.map +1 -1
- package/dist/scheduler/schedule-runner.d.ts.map +1 -1
- package/dist/scheduler/schedule-runner.js +6 -5
- package/dist/scheduler/schedule-runner.js.map +1 -1
- package/dist/state/__tests__/jsonl-parser.test.d.ts +5 -0
- package/dist/state/__tests__/jsonl-parser.test.d.ts.map +1 -0
- package/dist/state/__tests__/jsonl-parser.test.js +307 -0
- package/dist/state/__tests__/jsonl-parser.test.js.map +1 -0
- package/dist/state/__tests__/session-attribution.test.d.ts +2 -0
- package/dist/state/__tests__/session-attribution.test.d.ts.map +1 -0
- package/dist/state/__tests__/session-attribution.test.js +567 -0
- package/dist/state/__tests__/session-attribution.test.js.map +1 -0
- package/dist/state/__tests__/session-discovery.test.d.ts +2 -0
- package/dist/state/__tests__/session-discovery.test.d.ts.map +1 -0
- package/dist/state/__tests__/session-discovery.test.js +941 -0
- package/dist/state/__tests__/session-discovery.test.js.map +1 -0
- package/dist/state/__tests__/session-metadata.test.d.ts +2 -0
- package/dist/state/__tests__/session-metadata.test.d.ts.map +1 -0
- package/dist/state/__tests__/session-metadata.test.js +422 -0
- package/dist/state/__tests__/session-metadata.test.js.map +1 -0
- package/dist/state/__tests__/tool-parsing.test.d.ts +5 -0
- package/dist/state/__tests__/tool-parsing.test.d.ts.map +1 -0
- package/dist/state/__tests__/tool-parsing.test.js +315 -0
- package/dist/state/__tests__/tool-parsing.test.js.map +1 -0
- package/dist/state/index.d.ts +5 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +10 -0
- package/dist/state/index.js.map +1 -1
- package/dist/state/jsonl-parser.d.ts +115 -0
- package/dist/state/jsonl-parser.d.ts.map +1 -0
- package/dist/state/jsonl-parser.js +437 -0
- package/dist/state/jsonl-parser.js.map +1 -0
- package/dist/state/session-attribution.d.ts +35 -0
- package/dist/state/session-attribution.d.ts.map +1 -0
- package/dist/state/session-attribution.js +179 -0
- package/dist/state/session-attribution.js.map +1 -0
- package/dist/state/session-discovery.d.ts +188 -0
- package/dist/state/session-discovery.d.ts.map +1 -0
- package/dist/state/session-discovery.js +513 -0
- package/dist/state/session-discovery.js.map +1 -0
- package/dist/state/session-metadata.d.ts +186 -0
- package/dist/state/session-metadata.d.ts.map +1 -0
- package/dist/state/session-metadata.js +297 -0
- package/dist/state/session-metadata.js.map +1 -0
- package/dist/state/tool-parsing.d.ts +88 -0
- package/dist/state/tool-parsing.d.ts.map +1 -0
- package/dist/state/tool-parsing.js +199 -0
- package/dist/state/tool-parsing.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for repository fetcher
|
|
3
|
+
*/
|
|
4
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
// =============================================================================
|
|
6
|
+
// Mocks - Must be defined BEFORE imports that use them
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// We need to use vi.hoisted to create the mock function before vi.mock runs
|
|
9
|
+
const { mockExecFileAsync } = vi.hoisted(() => ({
|
|
10
|
+
mockExecFileAsync: vi.fn(),
|
|
11
|
+
}));
|
|
12
|
+
// Mock node:util to control promisify behavior
|
|
13
|
+
vi.mock("node:util", async (importOriginal) => {
|
|
14
|
+
const actual = await importOriginal();
|
|
15
|
+
return {
|
|
16
|
+
...actual,
|
|
17
|
+
promisify: () => mockExecFileAsync,
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
// Mock child_process
|
|
21
|
+
vi.mock("node:child_process", () => ({
|
|
22
|
+
execFile: vi.fn(),
|
|
23
|
+
}));
|
|
24
|
+
// Mock fs/promises
|
|
25
|
+
vi.mock("node:fs/promises", () => ({
|
|
26
|
+
mkdtemp: vi.fn(),
|
|
27
|
+
rm: vi.fn(),
|
|
28
|
+
stat: vi.fn(),
|
|
29
|
+
cp: vi.fn(),
|
|
30
|
+
}));
|
|
31
|
+
// Mock os
|
|
32
|
+
vi.mock("node:os", () => ({
|
|
33
|
+
tmpdir: vi.fn(() => "/tmp"),
|
|
34
|
+
}));
|
|
35
|
+
// =============================================================================
|
|
36
|
+
// Import after mocks are set up
|
|
37
|
+
// =============================================================================
|
|
38
|
+
// Import mocked modules for assertions
|
|
39
|
+
import { cp, mkdtemp, rm, stat } from "node:fs/promises";
|
|
40
|
+
import { fetchRepository, GitHubCloneAuthError, GitHubRepoNotFoundError, LocalPathError, NetworkError, RepositoryFetchError, } from "../repository-fetcher.js";
|
|
41
|
+
// =============================================================================
|
|
42
|
+
// Helper Functions
|
|
43
|
+
// =============================================================================
|
|
44
|
+
function mockExecFileSuccess(stdout = "", stderr = "") {
|
|
45
|
+
mockExecFileAsync.mockResolvedValue({ stdout, stderr });
|
|
46
|
+
}
|
|
47
|
+
function mockExecFileError(error) {
|
|
48
|
+
mockExecFileAsync.mockRejectedValue(error);
|
|
49
|
+
}
|
|
50
|
+
// =============================================================================
|
|
51
|
+
// Test Setup
|
|
52
|
+
// =============================================================================
|
|
53
|
+
describe("fetchRepository", () => {
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
vi.clearAllMocks();
|
|
56
|
+
// Default mock implementations
|
|
57
|
+
mkdtemp.mockResolvedValue("/tmp/herdctl-github-abc123");
|
|
58
|
+
rm.mockResolvedValue(undefined);
|
|
59
|
+
stat.mockResolvedValue({ isDirectory: () => true });
|
|
60
|
+
cp.mockResolvedValue(undefined);
|
|
61
|
+
});
|
|
62
|
+
// ===========================================================================
|
|
63
|
+
// GitHub Source Tests
|
|
64
|
+
// ===========================================================================
|
|
65
|
+
describe("GitHub source", () => {
|
|
66
|
+
const source = {
|
|
67
|
+
type: "github",
|
|
68
|
+
owner: "herdctl",
|
|
69
|
+
repo: "example-agent",
|
|
70
|
+
};
|
|
71
|
+
describe("successful clone", () => {
|
|
72
|
+
it("clones a GitHub repository to a temp directory", async () => {
|
|
73
|
+
mockExecFileSuccess();
|
|
74
|
+
const result = await fetchRepository(source);
|
|
75
|
+
expect(result.path).toBe("/tmp/herdctl-github-abc123");
|
|
76
|
+
expect(typeof result.cleanup).toBe("function");
|
|
77
|
+
expect(mockExecFileAsync).toHaveBeenCalledWith("git", [
|
|
78
|
+
"clone",
|
|
79
|
+
"--depth",
|
|
80
|
+
"1",
|
|
81
|
+
"https://github.com/herdctl/example-agent.git",
|
|
82
|
+
"/tmp/herdctl-github-abc123",
|
|
83
|
+
], expect.objectContaining({
|
|
84
|
+
env: expect.objectContaining({
|
|
85
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
86
|
+
}),
|
|
87
|
+
}));
|
|
88
|
+
});
|
|
89
|
+
it("clones with ref when specified", async () => {
|
|
90
|
+
mockExecFileSuccess();
|
|
91
|
+
const sourceWithRef = {
|
|
92
|
+
...source,
|
|
93
|
+
ref: "v1.0.0",
|
|
94
|
+
};
|
|
95
|
+
await fetchRepository(sourceWithRef);
|
|
96
|
+
expect(mockExecFileAsync).toHaveBeenCalledWith("git", [
|
|
97
|
+
"clone",
|
|
98
|
+
"--depth",
|
|
99
|
+
"1",
|
|
100
|
+
"--branch",
|
|
101
|
+
"v1.0.0",
|
|
102
|
+
"https://github.com/herdctl/example-agent.git",
|
|
103
|
+
"/tmp/herdctl-github-abc123",
|
|
104
|
+
], expect.any(Object));
|
|
105
|
+
});
|
|
106
|
+
it("clones with branch name as ref", async () => {
|
|
107
|
+
mockExecFileSuccess();
|
|
108
|
+
const sourceWithBranch = {
|
|
109
|
+
...source,
|
|
110
|
+
ref: "main",
|
|
111
|
+
};
|
|
112
|
+
await fetchRepository(sourceWithBranch);
|
|
113
|
+
expect(mockExecFileAsync).toHaveBeenCalledWith("git", [
|
|
114
|
+
"clone",
|
|
115
|
+
"--depth",
|
|
116
|
+
"1",
|
|
117
|
+
"--branch",
|
|
118
|
+
"main",
|
|
119
|
+
"https://github.com/herdctl/example-agent.git",
|
|
120
|
+
"/tmp/herdctl-github-abc123",
|
|
121
|
+
], expect.any(Object));
|
|
122
|
+
});
|
|
123
|
+
it("sets GIT_TERMINAL_PROMPT=0 to prevent interactive prompts", async () => {
|
|
124
|
+
mockExecFileSuccess();
|
|
125
|
+
await fetchRepository(source);
|
|
126
|
+
expect(mockExecFileAsync).toHaveBeenCalledWith("git", expect.any(Array), expect.objectContaining({
|
|
127
|
+
env: expect.objectContaining({
|
|
128
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
129
|
+
}),
|
|
130
|
+
}));
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe("cleanup function", () => {
|
|
134
|
+
it("removes the temp directory when cleanup is called", async () => {
|
|
135
|
+
mockExecFileSuccess();
|
|
136
|
+
const result = await fetchRepository(source);
|
|
137
|
+
await result.cleanup();
|
|
138
|
+
expect(rm).toHaveBeenCalledWith("/tmp/herdctl-github-abc123", {
|
|
139
|
+
recursive: true,
|
|
140
|
+
force: true,
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe("error handling", () => {
|
|
145
|
+
it("throws GitHubCloneAuthError on authentication failure (exit code 128)", async () => {
|
|
146
|
+
const error = new Error("fatal: could not read Username");
|
|
147
|
+
error.code = 128;
|
|
148
|
+
error.stderr =
|
|
149
|
+
"fatal: could not read Username for 'https://github.com': terminal prompts disabled";
|
|
150
|
+
mockExecFileError(error);
|
|
151
|
+
await expect(fetchRepository(source)).rejects.toThrow(GitHubCloneAuthError);
|
|
152
|
+
await expect(fetchRepository(source)).rejects.toThrow(/Authentication failed/);
|
|
153
|
+
await expect(fetchRepository(source)).rejects.toThrow(/credentials/);
|
|
154
|
+
});
|
|
155
|
+
it("throws GitHubCloneAuthError when stderr contains authentication", async () => {
|
|
156
|
+
const error = new Error("authentication failed");
|
|
157
|
+
error.stderr = "authentication required";
|
|
158
|
+
mockExecFileError(error);
|
|
159
|
+
await expect(fetchRepository(source)).rejects.toThrow(GitHubCloneAuthError);
|
|
160
|
+
});
|
|
161
|
+
it("throws GitHubRepoNotFoundError when repo doesn't exist", async () => {
|
|
162
|
+
const error = new Error("fatal: repository not found");
|
|
163
|
+
error.stderr = "fatal: repository 'https://github.com/nonexistent/repo.git/' not found";
|
|
164
|
+
mockExecFileError(error);
|
|
165
|
+
await expect(fetchRepository(source)).rejects.toThrow(GitHubRepoNotFoundError);
|
|
166
|
+
await expect(fetchRepository(source)).rejects.toThrow(/Repository not found/);
|
|
167
|
+
await expect(fetchRepository(source)).rejects.toThrow(/herdctl\/example-agent/);
|
|
168
|
+
});
|
|
169
|
+
it("throws GitHubRepoNotFoundError when stderr contains does not exist", async () => {
|
|
170
|
+
const error = new Error("remote does not exist");
|
|
171
|
+
error.stderr = "error: remote does not exist";
|
|
172
|
+
mockExecFileError(error);
|
|
173
|
+
await expect(fetchRepository(source)).rejects.toThrow(GitHubRepoNotFoundError);
|
|
174
|
+
});
|
|
175
|
+
it("throws GitHubRepoNotFoundError (not auth error) when exit code 128 with repo not found message", async () => {
|
|
176
|
+
// Git exit code 128 is used for multiple failure modes.
|
|
177
|
+
// When the stderr contains "not found", it should be classified as repo not found,
|
|
178
|
+
// not as an auth error, even though exit code 128 is often associated with auth failures.
|
|
179
|
+
const error = new Error("fatal: repository not found");
|
|
180
|
+
error.code = 128;
|
|
181
|
+
error.stderr = "fatal: repository 'https://github.com/nonexistent/repo.git/' not found";
|
|
182
|
+
mockExecFileError(error);
|
|
183
|
+
await expect(fetchRepository(source)).rejects.toThrow(GitHubRepoNotFoundError);
|
|
184
|
+
// Verify it's NOT throwing GitHubCloneAuthError
|
|
185
|
+
await expect(fetchRepository(source)).rejects.not.toThrow(GitHubCloneAuthError);
|
|
186
|
+
});
|
|
187
|
+
it("throws NetworkError on network failure", async () => {
|
|
188
|
+
const error = new Error("network error");
|
|
189
|
+
error.stderr = "fatal: could not resolve host: github.com";
|
|
190
|
+
mockExecFileError(error);
|
|
191
|
+
await expect(fetchRepository(source)).rejects.toThrow(NetworkError);
|
|
192
|
+
await expect(fetchRepository(source)).rejects.toThrow(/Network error/);
|
|
193
|
+
await expect(fetchRepository(source)).rejects.toThrow(/internet connection/);
|
|
194
|
+
});
|
|
195
|
+
it("throws NetworkError when stderr contains connection issues", async () => {
|
|
196
|
+
const error = new Error("connection failed");
|
|
197
|
+
error.stderr = "fatal: unable to access: connection refused";
|
|
198
|
+
mockExecFileError(error);
|
|
199
|
+
await expect(fetchRepository(source)).rejects.toThrow(NetworkError);
|
|
200
|
+
});
|
|
201
|
+
it("throws RepositoryFetchError for generic git errors", async () => {
|
|
202
|
+
const error = new Error("some other git error");
|
|
203
|
+
error.stderr = "fatal: something went wrong";
|
|
204
|
+
mockExecFileError(error);
|
|
205
|
+
await expect(fetchRepository(source)).rejects.toThrow(RepositoryFetchError);
|
|
206
|
+
await expect(fetchRepository(source)).rejects.toThrow(/Failed to clone/);
|
|
207
|
+
});
|
|
208
|
+
it("cleans up temp directory on failure", async () => {
|
|
209
|
+
const error = new Error("clone failed");
|
|
210
|
+
error.stderr = "generic error";
|
|
211
|
+
mockExecFileError(error);
|
|
212
|
+
await expect(fetchRepository(source)).rejects.toThrow();
|
|
213
|
+
// Should have attempted to clean up
|
|
214
|
+
expect(rm).toHaveBeenCalledWith("/tmp/herdctl-github-abc123", {
|
|
215
|
+
recursive: true,
|
|
216
|
+
force: true,
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
// ===========================================================================
|
|
222
|
+
// Local Source Tests
|
|
223
|
+
// ===========================================================================
|
|
224
|
+
describe("Local source", () => {
|
|
225
|
+
const source = {
|
|
226
|
+
type: "local",
|
|
227
|
+
path: "/home/user/my-agent",
|
|
228
|
+
};
|
|
229
|
+
describe("successful copy", () => {
|
|
230
|
+
it("copies a local directory to a temp directory", async () => {
|
|
231
|
+
mkdtemp.mockResolvedValue("/tmp/herdctl-local-xyz789");
|
|
232
|
+
stat.mockResolvedValue({ isDirectory: () => true });
|
|
233
|
+
cp.mockResolvedValue(undefined);
|
|
234
|
+
const result = await fetchRepository(source);
|
|
235
|
+
expect(result.path).toBe("/tmp/herdctl-local-xyz789");
|
|
236
|
+
expect(typeof result.cleanup).toBe("function");
|
|
237
|
+
expect(stat).toHaveBeenCalledWith("/home/user/my-agent");
|
|
238
|
+
expect(cp).toHaveBeenCalledWith("/home/user/my-agent", "/tmp/herdctl-local-xyz789", {
|
|
239
|
+
recursive: true,
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
it("validates the path exists before copying", async () => {
|
|
243
|
+
stat.mockResolvedValue({ isDirectory: () => true });
|
|
244
|
+
await fetchRepository(source);
|
|
245
|
+
expect(stat).toHaveBeenCalledWith("/home/user/my-agent");
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
describe("cleanup function", () => {
|
|
249
|
+
it("removes the temp directory when cleanup is called", async () => {
|
|
250
|
+
mkdtemp.mockResolvedValue("/tmp/herdctl-local-cleanup");
|
|
251
|
+
stat.mockResolvedValue({ isDirectory: () => true });
|
|
252
|
+
const result = await fetchRepository(source);
|
|
253
|
+
await result.cleanup();
|
|
254
|
+
expect(rm).toHaveBeenCalledWith("/tmp/herdctl-local-cleanup", {
|
|
255
|
+
recursive: true,
|
|
256
|
+
force: true,
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
describe("error handling", () => {
|
|
261
|
+
it("throws LocalPathError when path does not exist", async () => {
|
|
262
|
+
const error = new Error("ENOENT");
|
|
263
|
+
error.code = "ENOENT";
|
|
264
|
+
stat.mockRejectedValue(error);
|
|
265
|
+
await expect(fetchRepository(source)).rejects.toThrow(LocalPathError);
|
|
266
|
+
await expect(fetchRepository(source)).rejects.toThrow(/does not exist/);
|
|
267
|
+
});
|
|
268
|
+
it("throws LocalPathError when path is a file, not a directory", async () => {
|
|
269
|
+
stat.mockResolvedValue({ isDirectory: () => false });
|
|
270
|
+
await expect(fetchRepository(source)).rejects.toThrow(LocalPathError);
|
|
271
|
+
await expect(fetchRepository(source)).rejects.toThrow(/not a directory/);
|
|
272
|
+
});
|
|
273
|
+
it("throws LocalPathError when stat fails for other reasons", async () => {
|
|
274
|
+
const error = new Error("Permission denied");
|
|
275
|
+
error.code = "EACCES";
|
|
276
|
+
stat.mockRejectedValue(error);
|
|
277
|
+
await expect(fetchRepository(source)).rejects.toThrow(LocalPathError);
|
|
278
|
+
await expect(fetchRepository(source)).rejects.toThrow(/Cannot access path/);
|
|
279
|
+
});
|
|
280
|
+
it("throws LocalPathError when copy fails", async () => {
|
|
281
|
+
stat.mockResolvedValue({ isDirectory: () => true });
|
|
282
|
+
cp.mockRejectedValue(new Error("Copy failed: disk full"));
|
|
283
|
+
await expect(fetchRepository(source)).rejects.toThrow(LocalPathError);
|
|
284
|
+
await expect(fetchRepository(source)).rejects.toThrow(/Failed to copy directory/);
|
|
285
|
+
});
|
|
286
|
+
it("cleans up temp directory on copy failure", async () => {
|
|
287
|
+
mkdtemp.mockResolvedValue("/tmp/herdctl-local-fail");
|
|
288
|
+
stat.mockResolvedValue({ isDirectory: () => true });
|
|
289
|
+
cp.mockRejectedValue(new Error("Copy failed"));
|
|
290
|
+
await expect(fetchRepository(source)).rejects.toThrow();
|
|
291
|
+
expect(rm).toHaveBeenCalledWith("/tmp/herdctl-local-fail", {
|
|
292
|
+
recursive: true,
|
|
293
|
+
force: true,
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
it("includes source path in error message", async () => {
|
|
297
|
+
const error = new Error("ENOENT");
|
|
298
|
+
error.code = "ENOENT";
|
|
299
|
+
stat.mockRejectedValue(error);
|
|
300
|
+
await expect(fetchRepository(source)).rejects.toThrow(/\/home\/user\/my-agent/);
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
// ===========================================================================
|
|
305
|
+
// RepositoryFetchResult Type Tests
|
|
306
|
+
// ===========================================================================
|
|
307
|
+
describe("RepositoryFetchResult", () => {
|
|
308
|
+
it("returns correct shape for GitHub source", async () => {
|
|
309
|
+
mockExecFileSuccess();
|
|
310
|
+
const result = await fetchRepository({
|
|
311
|
+
type: "github",
|
|
312
|
+
owner: "test",
|
|
313
|
+
repo: "repo",
|
|
314
|
+
});
|
|
315
|
+
expect(result).toHaveProperty("path");
|
|
316
|
+
expect(result).toHaveProperty("cleanup");
|
|
317
|
+
expect(typeof result.path).toBe("string");
|
|
318
|
+
expect(typeof result.cleanup).toBe("function");
|
|
319
|
+
});
|
|
320
|
+
it("returns correct shape for local source", async () => {
|
|
321
|
+
stat.mockResolvedValue({ isDirectory: () => true });
|
|
322
|
+
const result = await fetchRepository({
|
|
323
|
+
type: "local",
|
|
324
|
+
path: "/some/path",
|
|
325
|
+
});
|
|
326
|
+
expect(result).toHaveProperty("path");
|
|
327
|
+
expect(result).toHaveProperty("cleanup");
|
|
328
|
+
expect(typeof result.path).toBe("string");
|
|
329
|
+
expect(typeof result.cleanup).toBe("function");
|
|
330
|
+
});
|
|
331
|
+
it("cleanup is idempotent (can be called multiple times)", async () => {
|
|
332
|
+
mockExecFileSuccess();
|
|
333
|
+
rm.mockResolvedValue(undefined);
|
|
334
|
+
const result = await fetchRepository({
|
|
335
|
+
type: "github",
|
|
336
|
+
owner: "test",
|
|
337
|
+
repo: "repo",
|
|
338
|
+
});
|
|
339
|
+
// Should not throw even when called multiple times
|
|
340
|
+
await result.cleanup();
|
|
341
|
+
await result.cleanup();
|
|
342
|
+
await result.cleanup();
|
|
343
|
+
expect(rm).toHaveBeenCalledTimes(3);
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
// ===========================================================================
|
|
347
|
+
// Error Class Tests
|
|
348
|
+
// ===========================================================================
|
|
349
|
+
describe("Error classes", () => {
|
|
350
|
+
it("RepositoryFetchError has correct properties", () => {
|
|
351
|
+
const source = { type: "github", owner: "a", repo: "b" };
|
|
352
|
+
const cause = new Error("root cause");
|
|
353
|
+
const error = new RepositoryFetchError("Test error", source, cause);
|
|
354
|
+
expect(error.name).toBe("RepositoryFetchError");
|
|
355
|
+
expect(error.message).toBe("Test error");
|
|
356
|
+
expect(error.source).toBe(source);
|
|
357
|
+
expect(error.cause).toBe(cause);
|
|
358
|
+
});
|
|
359
|
+
it("GitHubCloneAuthError extends RepositoryFetchError", () => {
|
|
360
|
+
const source = { type: "github", owner: "test", repo: "repo" };
|
|
361
|
+
const error = new GitHubCloneAuthError(source);
|
|
362
|
+
expect(error).toBeInstanceOf(RepositoryFetchError);
|
|
363
|
+
expect(error.name).toBe("GitHubCloneAuthError");
|
|
364
|
+
expect(error.source).toBe(source);
|
|
365
|
+
});
|
|
366
|
+
it("GitHubRepoNotFoundError extends RepositoryFetchError", () => {
|
|
367
|
+
const source = { type: "github", owner: "test", repo: "missing" };
|
|
368
|
+
const error = new GitHubRepoNotFoundError(source);
|
|
369
|
+
expect(error).toBeInstanceOf(RepositoryFetchError);
|
|
370
|
+
expect(error.name).toBe("GitHubRepoNotFoundError");
|
|
371
|
+
});
|
|
372
|
+
it("NetworkError extends RepositoryFetchError", () => {
|
|
373
|
+
const source = { type: "github", owner: "test", repo: "repo" };
|
|
374
|
+
const error = new NetworkError(source);
|
|
375
|
+
expect(error).toBeInstanceOf(RepositoryFetchError);
|
|
376
|
+
expect(error.name).toBe("NetworkError");
|
|
377
|
+
});
|
|
378
|
+
it("LocalPathError extends RepositoryFetchError", () => {
|
|
379
|
+
const source = { type: "local", path: "/test" };
|
|
380
|
+
const error = new LocalPathError(source, "reason");
|
|
381
|
+
expect(error).toBeInstanceOf(RepositoryFetchError);
|
|
382
|
+
expect(error.name).toBe("LocalPathError");
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
});
|
|
386
|
+
//# sourceMappingURL=repository-fetcher.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-fetcher.test.js","sourceRoot":"","sources":["../../../src/distribution/__tests__/repository-fetcher.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-validator.test.d.ts","sourceRoot":"","sources":["../../../src/distribution/__tests__/repository-validator.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|