|
| 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 | +}) |
0 commit comments