mirror of
https://github.com/bendtherules/opencode-multi-model.git
synced 2026-08-18 13:42:21 +00:00
test: fix tests
This commit is contained in:
+52
-17
@@ -1,5 +1,6 @@
|
|||||||
import { expect, test, mock, beforeEach, afterEach, describe, spyOn } from "bun:test";
|
import { expect, test, mock, beforeEach, afterEach, describe, spyOn } from "bun:test";
|
||||||
import * as os from "node:os";
|
import * as os from "node:os";
|
||||||
|
import * as fs from "node:fs";
|
||||||
import { openMultiModel } from "../src/core/open";
|
import { openMultiModel } from "../src/core/open";
|
||||||
|
|
||||||
let originalBun$: typeof Bun.$ = (globalThis as any).Bun?.$;
|
let originalBun$: typeof Bun.$ = (globalThis as any).Bun?.$;
|
||||||
@@ -90,7 +91,7 @@ describe("openMultiModel error paths", () => {
|
|||||||
mockCommandResponses[`tmux has-session -t ${session}`] = { ok: false, stdout: "", stderr: "" };
|
mockCommandResponses[`tmux has-session -t ${session}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
// first model success
|
// first model success
|
||||||
const firstBranch = `opencode/${session}/gpt-5-2`;
|
const firstBranch = `opencode/${session}/gpt-5-2`;
|
||||||
const firstPath = `/home/user/.local/share/opencode/multi-model/${session}/gpt-5-2`;
|
const firstPath = `/mock/home/.local/share/opencode/multi-model/${session}/gpt-5-2`;
|
||||||
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${firstBranch}`] = { ok: false, stdout: "", stderr: "" };
|
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${firstBranch}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`git worktree add -b ${firstBranch} ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`git worktree add -b ${firstBranch} ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`tmux new-session -d -s ${session} -n gpt-5-2 -c ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`tmux new-session -d -s ${session} -n gpt-5-2 -c ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
@@ -116,23 +117,25 @@ describe("openMultiModel error paths", () => {
|
|||||||
mockCommandResponses[`tmux has-session -t ${session}`] = { ok: false, stdout: "", stderr: "" };
|
mockCommandResponses[`tmux has-session -t ${session}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
// first model success
|
// first model success
|
||||||
const firstBranch = `opencode/${session}/gpt-5-2`;
|
const firstBranch = `opencode/${session}/gpt-5-2`;
|
||||||
const firstPath = `/home/user/.local/share/opencode/multi-model/${session}/gpt-5-2`;
|
const firstPath = `/mock/home/.local/share/opencode/multi-model/${session}/gpt-5-2`;
|
||||||
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${firstBranch}`] = { ok: false, stdout: "", stderr: "" };
|
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${firstBranch}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`git worktree add -b ${firstBranch} ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`git worktree add -b ${firstBranch} ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`tmux new-session -d -s ${session} -n gpt-5-2 -c ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`tmux new-session -d -s ${session} -n gpt-5-2 -c ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`tmux send-keys -t ${session}:gpt-5-2 ${binary} --model 'openai/gpt-5.2' C-m`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`tmux send-keys -t ${session}:gpt-5-2 ${binary} --model 'openai/gpt-5.2' C-m`] = { ok: true, stdout: "", stderr: "" };
|
||||||
// second model fails worktree
|
// second model fails worktree
|
||||||
const secondBranch = `opencode/${session}/gpt-5-2-2`;
|
const secondBranch = `opencode/${session}/gpt-5-2-2`;
|
||||||
const secondPath = `/home/user/.local/share/opencode/multi-model/${session}/gpt-5-2-2`;
|
const secondPath = `/mock/home/.local/share/opencode/multi-model/${session}/gpt-5-2-2`;
|
||||||
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${secondBranch}`] = { ok: false, stdout: "", stderr: "" };
|
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${secondBranch}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`git worktree add -b ${secondBranch} ${secondPath}`] = { ok: false, stdout: "", stderr: "wt error" };
|
mockCommandResponses[`git worktree add -b ${secondBranch} ${secondPath}`] = { ok: false, stdout: "", stderr: "wt error" };
|
||||||
mockCommandResponses[`git worktree remove -f ${secondPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`git worktree remove -f ${secondPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`git branch -D ${secondBranch}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`git branch -D ${secondBranch}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
const result = await openMultiModel({ sessionName: session, models, binaryName: binary, mode: "cli" });
|
const result = await openMultiModel({ sessionName: session, models, binaryName: binary, mode: "cli" });
|
||||||
expect(result.success).toBe(true);
|
|
||||||
expect(result.instructions).toContain("Error: Created tmux session"); expect(result.instructions).toContain("Failed: anthropic/gpt-5-2");
|
|
||||||
expect(result.windows).toContain("gpt-5-2");
|
expect(result.success).toBe(true);
|
||||||
expect(result.windows).toContain("gpt-5-2-2");
|
expect(result.instructions).toContain("Error: Created tmux session"); expect(result.instructions).toContain("Failed: anthropic/gpt-5-2");
|
||||||
|
expect(result.windows).toContain("gpt-5-2");
|
||||||
|
expect(result.windows).toContain("gpt-5-2-2");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("second model window creation fails", async () => {
|
test("second model window creation fails", async () => {
|
||||||
@@ -146,24 +149,26 @@ describe("openMultiModel error paths", () => {
|
|||||||
mockCommandResponses[`tmux has-session -t ${session}`] = { ok: false, stdout: "", stderr: "" };
|
mockCommandResponses[`tmux has-session -t ${session}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
// first model success
|
// first model success
|
||||||
const firstBranch = `opencode/${session}/gpt-5-2`;
|
const firstBranch = `opencode/${session}/gpt-5-2`;
|
||||||
const firstPath = `/home/user/.local/share/opencode/multi-model/${session}/gpt-5-2`;
|
const firstPath = `/mock/home/.local/share/opencode/multi-model/${session}/gpt-5-2`;
|
||||||
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${firstBranch}`] = { ok: false, stdout: "", stderr: "" };
|
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${firstBranch}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`git worktree add -b ${firstBranch} ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`git worktree add -b ${firstBranch} ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`tmux new-session -d -s ${session} -n gpt-5-2 -c ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`tmux new-session -d -s ${session} -n gpt-5-2 -c ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`tmux send-keys -t ${session}:gpt-5-2 ${binary} --model 'openai/gpt-5.2' C-m`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`tmux send-keys -t ${session}:gpt-5-2 ${binary} --model 'openai/gpt-5.2' C-m`] = { ok: true, stdout: "", stderr: "" };
|
||||||
// second model window failure
|
// second model window failure
|
||||||
const secondBranch = `opencode/${session}/gpt-5-2-2`;
|
const secondBranch = `opencode/${session}/gpt-5-2-2`;
|
||||||
const secondPath = `/home/user/.local/share/opencode/multi-model/${session}/gpt-5-2-2`;
|
const secondPath = `/mock/home/.local/share/opencode/multi-model/${session}/gpt-5-2-2`;
|
||||||
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${secondBranch}`] = { ok: false, stdout: "", stderr: "" };
|
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${secondBranch}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`git worktree add -b ${secondBranch} ${secondPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`git worktree add -b ${secondBranch} ${secondPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`tmux new-window -d -t ${session} -n gpt-5-2-2 -c ${secondPath}`] = { ok: false, stdout: "", stderr: "win err" };
|
mockCommandResponses[`tmux new-window -d -t ${session} -n gpt-5-2-2 -c ${secondPath}`] = { ok: false, stdout: "", stderr: "win err" };
|
||||||
mockCommandResponses[`git worktree remove -f ${secondPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`git worktree remove -f ${secondPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`git branch -D ${secondBranch}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`git branch -D ${secondBranch}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
const result = await openMultiModel({ sessionName: session, models, binaryName: binary, mode: "cli" });
|
const result = await openMultiModel({ sessionName: session, models, binaryName: binary, mode: "cli" });
|
||||||
expect(result.success).toBe(true);
|
|
||||||
expect(result.instructions).toContain("Error: Created tmux session"); expect(result.instructions).toContain("Failed: anthropic/gpt-5-2");
|
|
||||||
expect(result.windows).toContain("gpt-5-2");
|
expect(result.success).toBe(true);
|
||||||
expect(result.windows).toContain("gpt-5-2-2");
|
expect(result.instructions).toContain("Error: Created tmux session"); expect(result.instructions).toContain("Failed: anthropic/gpt-5-2");
|
||||||
|
expect(result.windows).toContain("gpt-5-2");
|
||||||
|
expect(result.windows).toContain("gpt-5-2-2");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("second model launch command fails", async () => {
|
test("second model launch command fails", async () => {
|
||||||
@@ -177,14 +182,14 @@ describe("openMultiModel error paths", () => {
|
|||||||
mockCommandResponses[`tmux has-session -t ${session}`] = { ok: false, stdout: "", stderr: "" };
|
mockCommandResponses[`tmux has-session -t ${session}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
// first model success
|
// first model success
|
||||||
const firstBranch = `opencode/${session}/gpt-5-2`;
|
const firstBranch = `opencode/${session}/gpt-5-2`;
|
||||||
const firstPath = `/home/user/.local/share/opencode/multi-model/${session}/gpt-5-2`;
|
const firstPath = `/mock/home/.local/share/opencode/multi-model/${session}/gpt-5-2`;
|
||||||
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${firstBranch}`] = { ok: false, stdout: "", stderr: "" };
|
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${firstBranch}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`git worktree add -b ${firstBranch} ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`git worktree add -b ${firstBranch} ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`tmux new-session -d -s ${session} -n gpt-5-2 -c ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`tmux new-session -d -s ${session} -n gpt-5-2 -c ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`tmux send-keys -t ${session}:gpt-5-2 ${binary} --model 'openai/gpt-5.2' C-m`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`tmux send-keys -t ${session}:gpt-5-2 ${binary} --model 'openai/gpt-5.2' C-m`] = { ok: true, stdout: "", stderr: "" };
|
||||||
// second model launch fails
|
// second model launch fails
|
||||||
const secondBranch = `opencode/${session}/gpt-5-2-2`;
|
const secondBranch = `opencode/${session}/gpt-5-2-2`;
|
||||||
const secondPath = `/home/user/.local/share/opencode/multi-model/${session}/gpt-5-2-2`;
|
const secondPath = `/mock/home/.local/share/opencode/multi-model/${session}/gpt-5-2-2`;
|
||||||
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${secondBranch}`] = { ok: false, stdout: "", stderr: "" };
|
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${secondBranch}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`git worktree add -b ${secondBranch} ${secondPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`git worktree add -b ${secondBranch} ${secondPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
mockCommandResponses[`tmux new-window -d -t ${session} -n gpt-5-2-2 -c ${secondPath}`] = { ok: true, stdout: "", stderr: "" };
|
mockCommandResponses[`tmux new-window -d -t ${session} -n gpt-5-2-2 -c ${secondPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
@@ -198,4 +203,34 @@ describe("openMultiModel error paths", () => {
|
|||||||
expect(result.windows).toContain("gpt-5-2-2");
|
expect(result.windows).toContain("gpt-5-2-2");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("second model worktree path already exists", async () => {
|
||||||
|
const session = "sess-wtpath";
|
||||||
|
const binary = "opencode";
|
||||||
|
const models = ["openai/gpt-5.2", "anthropic/gpt-5-2"];
|
||||||
|
mockCommandResponses["git rev-parse --is-inside-work-tree"] = { ok: true, stdout: "true", stderr: "" };
|
||||||
|
mockCommandResponses["command -v tmux"] = { ok: true, stdout: "tmux", stderr: "" };
|
||||||
|
mockCommandResponses["command -v opencode"] = { ok: true, stdout: "opencode", stderr: "" };
|
||||||
|
mockCommandResponses["opencode models"] = { ok: true, stdout: models.join("\n"), stderr: "" };
|
||||||
|
mockCommandResponses[`tmux has-session -t ${session}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
|
// first model success
|
||||||
|
const firstBranch = `opencode/${session}/gpt-5-2`;
|
||||||
|
const firstPath = `/mock/home/.local/share/opencode/multi-model/${session}/gpt-5-2`;
|
||||||
|
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${firstBranch}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
|
mockCommandResponses[`git worktree add -b ${firstBranch} ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
|
mockCommandResponses[`tmux new-session -d -s ${session} -n gpt-5-2 -c ${firstPath}`] = { ok: true, stdout: "", stderr: "" };
|
||||||
|
mockCommandResponses[`tmux send-keys -t ${session}:gpt-5-2 ${binary} --model 'openai/gpt-5.2' C-m`] = { ok: true, stdout: "", stderr: "" };
|
||||||
|
// second model path exists
|
||||||
|
const secondBranch = `opencode/${session}/gpt-5-2-2`;
|
||||||
|
const secondPath = `/mock/home/.local/share/opencode/multi-model/${session}/gpt-5-2-2`;
|
||||||
|
mockCommandResponses[`git show-ref --verify --quiet refs/heads/${secondBranch}`] = { ok: false, stdout: "", stderr: "" };
|
||||||
|
// mock fs existsSync to return true for secondPath
|
||||||
|
spyOn(fs, "existsSync").mockImplementation((p) => p === secondPath);
|
||||||
|
const result = await openMultiModel({ sessionName: session, models, binaryName: binary, mode: "cli" });
|
||||||
|
expect(result.success).toBe(true);
|
||||||
|
expect(result.instructions).toContain("Error: Created tmux session");
|
||||||
|
expect(result.instructions).toContain("Failed: anthropic/gpt-5-2 (Worktree path already exists at");
|
||||||
|
expect(result.windows).toContain("gpt-5-2");
|
||||||
|
expect(result.windows).toContain("gpt-5-2-2");
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user