Skip to content

Commit 6709463

Browse files
committed
test(lib): cover DNS repair templates
1 parent d48590c commit 6709463

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { describe, expect, it } from "@effect/vitest"
2+
3+
import { defaultTemplateConfig, type TemplateConfig } from "../../src/core/domain.js"
4+
import { renderDockerCompose } from "../../src/core/templates/docker-compose.js"
5+
import { renderEntrypoint } from "../../src/core/templates-entrypoint.js"
6+
import { renderEntrypointDnsRepair } from "../../src/core/templates-entrypoint/dns-repair.js"
7+
8+
const makeTemplateConfig = (overrides: Partial<TemplateConfig> = {}): TemplateConfig => ({
9+
...defaultTemplateConfig,
10+
repoUrl: "https://github.com/org/repo.git",
11+
containerName: "dg-test",
12+
serviceName: "dg-test",
13+
sshUser: "dev",
14+
targetDir: "/home/dev/org/repo",
15+
volumeName: "dg-test-home",
16+
dockerGitPath: "/workspace/.docker-git",
17+
authorizedKeysPath: "/workspace/authorized_keys",
18+
envGlobalPath: "/workspace/.orch/env/global.env",
19+
envProjectPath: "/workspace/.orch/env/project.env",
20+
codexAuthPath: "/workspace/.orch/auth/codex",
21+
codexSharedAuthPath: "/workspace/.orch/auth/codex-shared",
22+
geminiAuthPath: "/workspace/.orch/auth/gemini",
23+
...overrides
24+
})
25+
26+
describe("renderEntrypointDnsRepair", () => {
27+
it("renders the fallback nameserver repair block", () => {
28+
const dnsRepair = renderEntrypointDnsRepair()
29+
30+
expect(dnsRepair).toContain('local test_domain="github.com"')
31+
expect(dnsRepair).toContain('local fallback_dns="8.8.8.8 8.8.4.4 1.1.1.1"')
32+
expect(dnsRepair).toContain('printf "nameserver %s\\n" "$ns" >> "$resolv"')
33+
expect(dnsRepair).toContain('echo "[dns-repair] WARNING: DNS resolution still failing after repair attempt"')
34+
expect(dnsRepair).toContain("docker_git_repair_dns || true")
35+
})
36+
37+
it("injects DNS repair before the package cache setup in the full entrypoint", () => {
38+
const entrypoint = renderEntrypoint(makeTemplateConfig())
39+
const dnsRepair = renderEntrypointDnsRepair()
40+
const dnsRepairIndex = entrypoint.indexOf(dnsRepair)
41+
const packageCacheIndex = entrypoint.indexOf(
42+
"# Share package manager caches across all docker-git containers"
43+
)
44+
45+
expect(dnsRepairIndex).toBeGreaterThanOrEqual(0)
46+
expect(packageCacheIndex).toBeGreaterThan(dnsRepairIndex)
47+
})
48+
})
49+
50+
describe("renderDockerCompose", () => {
51+
it("renders fallback DNS servers for the main container even without Playwright", () => {
52+
const compose = renderDockerCompose(makeTemplateConfig())
53+
54+
expect(compose).toContain("container_name: dg-test")
55+
expect(compose).toContain(" dns:\n - 8.8.8.8\n - 8.8.4.4\n - 1.1.1.1\n networks:")
56+
expect(compose).not.toContain("dg-test-browser")
57+
expect((compose.match(/\n dns:\n/g) ?? []).length).toBe(1)
58+
})
59+
60+
it("renders fallback DNS servers for the browser sidecar when Playwright is enabled", () => {
61+
const compose = renderDockerCompose(
62+
makeTemplateConfig({
63+
enableMcpPlaywright: true
64+
}),
65+
{
66+
cpuLimit: 1.5,
67+
ramLimit: "2g"
68+
}
69+
)
70+
const browserServiceIndex = compose.indexOf("\n dg-test-browser:\n")
71+
const browserDnsIndex = compose.indexOf(
72+
' dns:\n - 8.8.8.8\n - 8.8.4.4\n - 1.1.1.1\n volumes:\n - dg-test-home-browser:/data\n',
73+
browserServiceIndex
74+
)
75+
76+
expect(compose).toContain('MCP_PLAYWRIGHT_CDP_ENDPOINT: "http://dg-test-browser:9223"')
77+
expect(browserServiceIndex).toBeGreaterThanOrEqual(0)
78+
expect(browserDnsIndex).toBeGreaterThan(browserServiceIndex)
79+
expect((compose.match(/\n dns:\n/g) ?? []).length).toBe(2)
80+
})
81+
})

packages/lib/tests/usecases/prepare-files.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ const readEnableMcpPlaywrightFlag = (value: unknown): boolean | undefined => {
125125
return typeof flag === "boolean" ? flag : undefined
126126
}
127127

128+
const countOccurrences = (source: string, fragment: string): number =>
129+
source.split(fragment).length - 1
130+
128131
describe("prepareProjectFiles", () => {
129132
it.effect("force-env refresh rewrites managed templates", () =>
130133
withTempDir((root) =>
@@ -147,6 +150,7 @@ describe("prepareProjectFiles", () => {
147150
const entrypointPath = path.join(outDir, "entrypoint.sh")
148151
const entrypoint = yield* _(fs.readFileString(entrypointPath))
149152
const composeBefore = yield* _(fs.readFileString(path.join(outDir, "docker-compose.yml")))
153+
const dnsBlock = " dns:\n - 8.8.8.8\n - 8.8.4.4\n - 1.1.1.1"
150154
const entrypointSyntaxExitCode = yield* _(
151155
runCommandExitCode({
152156
cwd: outDir,
@@ -171,6 +175,11 @@ describe("prepareProjectFiles", () => {
171175
expect(entrypoint).toContain('. /etc/profile 2>/dev/null || true;')
172176
expect(entrypoint).toContain("codex exec")
173177
expect(entrypoint).not.toContain("codex --approval-mode full-auto")
178+
expect(entrypoint).toContain("docker_git_repair_dns() {")
179+
expect(entrypoint).toContain('local test_domain="github.com"')
180+
expect(entrypoint).toContain('local fallback_dns="8.8.8.8 8.8.4.4 1.1.1.1"')
181+
expect(entrypoint).toContain('printf "nameserver %s\\n" "$ns" >> "$resolv"')
182+
expect(entrypoint).toContain("docker_git_repair_dns || true")
174183
expect(entrypoint).toContain('"plugin": ["oh-my-opencode"]')
175184
expect(entrypoint).toContain("branch '$REPO_REF' missing; retrying without --branch")
176185
expect(entrypoint).not.toContain("git ls-remote --symref")
@@ -185,6 +194,7 @@ describe("prepareProjectFiles", () => {
185194
expect(composeBefore).not.toContain("dg-test-browser")
186195
expect(composeBefore).toContain("docker-git-shared")
187196
expect(composeBefore).toContain("external: true")
197+
expect(countOccurrences(composeBefore, dnsBlock)).toBe(1)
188198

189199
yield* _(
190200
prepareProjectFiles(outDir, root, globalConfig, withMcp, {
@@ -208,6 +218,7 @@ describe("prepareProjectFiles", () => {
208218
expect(composeAfter).toContain("container_name: dg-test-browser\n restart: unless-stopped")
209219
expect(composeAfter).toContain("docker-git-shared")
210220
expect(composeAfter).toContain("external: true")
221+
expect(countOccurrences(composeAfter, dnsBlock)).toBe(2)
211222
expect(readEnableMcpPlaywrightFlag(configAfter)).toBe(true)
212223
expect(configAfterText).toContain('"cpuLimit": "30%"')
213224
expect(configAfterText).toContain('"ramLimit": "30%"')

0 commit comments

Comments
 (0)