import { EnvironmentId, type VcsRef } from "@t3tools/contracts";import { describe, expect, it } from "vitest";import { dedupeRemoteBranchesWithLocalMatches, deriveLocalBranchNameFromRemoteRef, resolveEnvironmentOptionLabel, resolveBranchSelectionTarget, resolveCurrentWorkspaceLabel, resolveDraftEnvModeAfterBranchChange, resolveEffectiveEnvMode, resolveEnvModeLabel, resolveBranchToolbarValue, resolveLockedWorkspaceLabel, shouldIncludeBranchPickerItem,} from "./BranchToolbar.logic"; const localEnvironmentId = EnvironmentId.make("environment-local");const remoteEnvironmentId = EnvironmentId.make("environment-remote"); describe("resolveDraftEnvModeAfterBranchChange", () => { it("switches to local mode when returning from an existing worktree to the main worktree", () => { expect( resolveDraftEnvModeAfterBranchChange({ nextWorktreePath: null, currentWorktreePath: "/repo/.t3/worktrees/feature-a", effectiveEnvMode: "worktree", }), ).toBe("local"); }); it("keeps new-worktree mode when selecting a base ref before worktree creation", () => { expect( resolveDraftEnvModeAfterBranchChange({ nextWorktreePath: null, currentWorktreePath: null, effectiveEnvMode: "worktree", }), ).toBe("worktree"); }); it("uses worktree mode when selecting a ref already attached to a worktree", () => { expect( resolveDraftEnvModeAfterBranchChange({ nextWorktreePath: "/repo/.t3/worktrees/feature-a", currentWorktreePath: null, effectiveEnvMode: "local", }), ).toBe("worktree"); });}); describe("resolveBranchToolbarValue", () => { it("defaults new-worktree mode to current git ref when no explicit base ref is set", () => { expect( resolveBranchToolbarValue({ envMode: "worktree", activeWorktreePath: null, activeThreadBranch: null, currentGitBranch: "main", }), ).toBe("main"); }); it("keeps an explicitly selected worktree base ref", () => { expect( resolveBranchToolbarValue({ envMode: "worktree", activeWorktreePath: null, activeThreadBranch: "feature/base", currentGitBranch: "main", }), ).toBe("feature/base"); }); it("shows the actual checked-out ref when not selecting a new worktree base", () => { expect( resolveBranchToolbarValue({ envMode: "local", activeWorktreePath: null, activeThreadBranch: "feature/base", currentGitBranch: "main", }), ).toBe("main"); });}); describe("resolveEnvironmentOptionLabel", () => { it("prefers the primary environment's machine label", () => { expect( resolveEnvironmentOptionLabel({ isPrimary: true, environmentId: localEnvironmentId, runtimeLabel: "Julius's Mac mini", savedLabel: "Local environment", }), ).toBe("Julius's Mac mini"); }); it("falls back to 'This device' for generic primary labels", () => { expect( resolveEnvironmentOptionLabel({ isPrimary: true, environmentId: localEnvironmentId, runtimeLabel: "Local environment", savedLabel: "Local", }), ).toBe("This device"); }); it("keeps configured labels for non-primary environments", () => { expect( resolveEnvironmentOptionLabel({ isPrimary: false, environmentId: remoteEnvironmentId, runtimeLabel: null, savedLabel: "Build box", }), ).toBe("Build box"); });}); describe("resolveEffectiveEnvMode", () => { it("treats draft threads already attached to a worktree as current-checkout mode", () => { expect( resolveEffectiveEnvMode({ activeWorktreePath: "/repo/.t3/worktrees/feature-a", hasServerThread: false, draftThreadEnvMode: "worktree", }), ).toBe("local"); }); it("keeps explicit new-worktree mode for draft threads without a worktree path", () => { expect( resolveEffectiveEnvMode({ activeWorktreePath: null, hasServerThread: false, draftThreadEnvMode: "worktree", }), ).toBe("worktree"); });}); describe("resolveEnvModeLabel", () => { it("uses explicit workspace labels", () => { expect(resolveEnvModeLabel("local")).toBe("Current checkout"); expect(resolveEnvModeLabel("worktree")).toBe("New worktree"); });}); describe("resolveCurrentWorkspaceLabel", () => { it("describes the main repo checkout when no worktree path is active", () => { expect(resolveCurrentWorkspaceLabel(null)).toBe("Current checkout"); }); it("describes the active checkout as a worktree when one is attached", () => { expect(resolveCurrentWorkspaceLabel("/repo/.t3/worktrees/feature-a")).toBe("Current worktree"); });}); describe("resolveLockedWorkspaceLabel", () => { it("uses a shorter label for the main repo checkout", () => { expect(resolveLockedWorkspaceLabel(null)).toBe("Local checkout"); }); it("uses a shorter label for an attached worktree", () => { expect(resolveLockedWorkspaceLabel("/repo/.t3/worktrees/feature-a")).toBe("Worktree"); });}); describe("deriveLocalBranchNameFromRemoteRef", () => { it("strips the remote prefix from a remote ref", () => { expect(deriveLocalBranchNameFromRemoteRef("origin/feature/demo")).toBe("feature/demo"); }); it("supports remote names that contain slashes", () => { expect(deriveLocalBranchNameFromRemoteRef("my-org/upstream/feature/demo")).toBe( "upstream/feature/demo", ); }); it("returns the original name when ref is malformed", () => { expect(deriveLocalBranchNameFromRemoteRef("origin/")).toBe("origin/"); expect(deriveLocalBranchNameFromRemoteRef("/feature/demo")).toBe("/feature/demo"); });}); describe("dedupeRemoteBranchesWithLocalMatches", () => { it("hides remote refs when the matching local ref exists", () => { const input: VcsRef[] = [ { name: "feature/demo", current: false, isDefault: false, worktreePath: null, }, { name: "origin/feature/demo", isRemote: true, remoteName: "origin", current: false, isDefault: false, worktreePath: null, }, { name: "origin/feature/remote-only", isRemote: true, remoteName: "origin", current: false, isDefault: false, worktreePath: null, }, ]; expect(dedupeRemoteBranchesWithLocalMatches(input).map((ref) => ref.name)).toEqual([ "feature/demo", "origin/feature/remote-only", ]); }); it("keeps all entries when no local match exists for a remote ref", () => { const input: VcsRef[] = [ { name: "feature/local", current: false, isDefault: false, worktreePath: null, }, { name: "origin/feature/remote-only", isRemote: true, remoteName: "origin", current: false, isDefault: false, worktreePath: null, }, ]; expect(dedupeRemoteBranchesWithLocalMatches(input).map((ref) => ref.name)).toEqual([ "feature/local", "origin/feature/remote-only", ]); }); it("keeps non-origin remote refs visible even when a matching local ref exists", () => { const input: VcsRef[] = [ { name: "feature/demo", current: false, isDefault: false, worktreePath: null, }, { name: "my-org/upstream/feature/demo", isRemote: true, remoteName: "my-org/upstream", current: false, isDefault: false, worktreePath: null, }, ]; expect(dedupeRemoteBranchesWithLocalMatches(input).map((ref) => ref.name)).toEqual([ "feature/demo", "my-org/upstream/feature/demo", ]); }); it("keeps non-origin remote refs visible when git tracks with first-slash local naming", () => { const input: VcsRef[] = [ { name: "upstream/feature", current: false, isDefault: false, worktreePath: null, }, { name: "my-org/upstream/feature", isRemote: true, remoteName: "my-org/upstream", current: false, isDefault: false, worktreePath: null, }, ]; expect(dedupeRemoteBranchesWithLocalMatches(input).map((ref) => ref.name)).toEqual([ "upstream/feature", "my-org/upstream/feature", ]); });}); describe("resolveBranchSelectionTarget", () => { it("reuses an existing secondary worktree for the selected ref", () => { expect( resolveBranchSelectionTarget({ activeProjectCwd: "/repo", activeWorktreePath: "/repo/.t3/worktrees/feature-a", refName: { isDefault: false, worktreePath: "/repo/.t3/worktrees/feature-b", }, }), ).toEqual({ checkoutCwd: "/repo/.t3/worktrees/feature-b", nextWorktreePath: "/repo/.t3/worktrees/feature-b", reuseExistingWorktree: true, }); }); it("switches back to the main repo when the ref already lives there", () => { expect( resolveBranchSelectionTarget({ activeProjectCwd: "/repo", activeWorktreePath: "/repo/.t3/worktrees/feature-a", refName: { isDefault: true, worktreePath: "/repo", }, }), ).toEqual({ checkoutCwd: "/repo", nextWorktreePath: null, reuseExistingWorktree: true, }); }); it("checks out the default ref in the main repo when leaving a secondary worktree", () => { expect( resolveBranchSelectionTarget({ activeProjectCwd: "/repo", activeWorktreePath: "/repo/.t3/worktrees/feature-a", refName: { isDefault: true, worktreePath: null, }, }), ).toEqual({ checkoutCwd: "/repo", nextWorktreePath: null, reuseExistingWorktree: false, }); }); it("keeps checkout in the current worktree for non-default refs", () => { expect( resolveBranchSelectionTarget({ activeProjectCwd: "/repo", activeWorktreePath: "/repo/.t3/worktrees/feature-a", refName: { isDefault: false, worktreePath: null, }, }), ).toEqual({ checkoutCwd: "/repo/.t3/worktrees/feature-a", nextWorktreePath: "/repo/.t3/worktrees/feature-a", reuseExistingWorktree: false, }); });}); describe("shouldIncludeBranchPickerItem", () => { it("keeps the synthetic checkout PR item visible for gh pr checkout input", () => { expect( shouldIncludeBranchPickerItem({ itemValue: "__checkout_pull_request__:1359", normalizedQuery: "gh pr checkout 1359", createBranchItemValue: "__create_new_branch__:gh pr checkout 1359", checkoutPullRequestItemValue: "__checkout_pull_request__:1359", }), ).toBe(true); }); it("keeps the synthetic create-ref item visible for arbitrary ref input", () => { expect( shouldIncludeBranchPickerItem({ itemValue: "__create_new_branch__:feature/demo", normalizedQuery: "feature/demo", createBranchItemValue: "__create_new_branch__:feature/demo", checkoutPullRequestItemValue: null, }), ).toBe(true); }); it("still filters ordinary ref items by query text", () => { expect( shouldIncludeBranchPickerItem({ itemValue: "main", normalizedQuery: "gh pr checkout 1359", createBranchItemValue: "__create_new_branch__:gh pr checkout 1359", checkoutPullRequestItemValue: "__checkout_pull_request__:1359", }), ).toBe(false); });});
import { EnvironmentId, type VcsRef } from "@t3tools/contracts";
import { describe, expect, it } from "vitest";
import {
dedupeRemoteBranchesWithLocalMatches,
deriveLocalBranchNameFromRemoteRef,
resolveEnvironmentOptionLabel,
resolveBranchSelectionTarget,
resolveCurrentWorkspaceLabel,
resolveDraftEnvModeAfterBranchChange,
resolveEffectiveEnvMode,
resolveEnvModeLabel,
resolveBranchToolbarValue,
resolveLockedWorkspaceLabel,
shouldIncludeBranchPickerItem,
} from "./BranchToolbar.logic";
const localEnvironmentId = EnvironmentId.make("environment-local");
const remoteEnvironmentId = EnvironmentId.make("environment-remote");
describe("resolveDraftEnvModeAfterBranchChange", () => {
it("switches to local mode when returning from an existing worktree to the main worktree", () => {
expect(
resolveDraftEnvModeAfterBranchChange({
nextWorktreePath: null,
currentWorktreePath: "/repo/.t3/worktrees/feature-a",
effectiveEnvMode: "worktree",
}),
).toBe("local");
});
it("keeps new-worktree mode when selecting a base ref before worktree creation", () => {
expect(
resolveDraftEnvModeAfterBranchChange({
nextWorktreePath: null,
currentWorktreePath: null,
effectiveEnvMode: "worktree",
}),
).toBe("worktree");
});
it("uses worktree mode when selecting a ref already attached to a worktree", () => {
expect(
resolveDraftEnvModeAfterBranchChange({
nextWorktreePath: "/repo/.t3/worktrees/feature-a",
currentWorktreePath: null,
effectiveEnvMode: "local",
}),
).toBe("worktree");
});
});
describe("resolveBranchToolbarValue", () => {
it("defaults new-worktree mode to current git ref when no explicit base ref is set", () => {
expect(
resolveBranchToolbarValue({
envMode: "worktree",
activeWorktreePath: null,
activeThreadBranch: null,
currentGitBranch: "main",
}),
).toBe("main");
});
it("keeps an explicitly selected worktree base ref", () => {
expect(
resolveBranchToolbarValue({
envMode: "worktree",
activeWorktreePath: null,
activeThreadBranch: "feature/base",
currentGitBranch: "main",
}),
).toBe("feature/base");
});
it("shows the actual checked-out ref when not selecting a new worktree base", () => {
expect(
resolveBranchToolbarValue({
envMode: "local",
activeWorktreePath: null,
activeThreadBranch: "feature/base",
currentGitBranch: "main",
}),
).toBe("main");
});
});
describe("resolveEnvironmentOptionLabel", () => {
it("prefers the primary environment's machine label", () => {
expect(
resolveEnvironmentOptionLabel({
isPrimary: true,
environmentId: localEnvironmentId,
runtimeLabel: "Julius's Mac mini",
savedLabel: "Local environment",
}),
).toBe("Julius's Mac mini");
});
it("falls back to 'This device' for generic primary labels", () => {
expect(
resolveEnvironmentOptionLabel({
isPrimary: true,
environmentId: localEnvironmentId,
runtimeLabel: "Local environment",
savedLabel: "Local",
}),
).toBe("This device");
});
it("keeps configured labels for non-primary environments", () => {
expect(
resolveEnvironmentOptionLabel({
isPrimary: false,
environmentId: remoteEnvironmentId,
runtimeLabel: null,
savedLabel: "Build box",
}),
).toBe("Build box");
});
});
describe("resolveEffectiveEnvMode", () => {
it("treats draft threads already attached to a worktree as current-checkout mode", () => {
expect(
resolveEffectiveEnvMode({
activeWorktreePath: "/repo/.t3/worktrees/feature-a",
hasServerThread: false,
draftThreadEnvMode: "worktree",
}),
).toBe("local");
});
it("keeps explicit new-worktree mode for draft threads without a worktree path", () => {
expect(
resolveEffectiveEnvMode({
activeWorktreePath: null,
hasServerThread: false,
draftThreadEnvMode: "worktree",
}),
).toBe("worktree");
});
});
describe("resolveEnvModeLabel", () => {
it("uses explicit workspace labels", () => {
expect(resolveEnvModeLabel("local")).toBe("Current checkout");
expect(resolveEnvModeLabel("worktree")).toBe("New worktree");
});
});
describe("resolveCurrentWorkspaceLabel", () => {
it("describes the main repo checkout when no worktree path is active", () => {
expect(resolveCurrentWorkspaceLabel(null)).toBe("Current checkout");
});
it("describes the active checkout as a worktree when one is attached", () => {
expect(resolveCurrentWorkspaceLabel("/repo/.t3/worktrees/feature-a")).toBe("Current worktree");
});
});
describe("resolveLockedWorkspaceLabel", () => {
it("uses a shorter label for the main repo checkout", () => {
expect(resolveLockedWorkspaceLabel(null)).toBe("Local checkout");
});
it("uses a shorter label for an attached worktree", () => {
expect(resolveLockedWorkspaceLabel("/repo/.t3/worktrees/feature-a")).toBe("Worktree");
});
});
describe("deriveLocalBranchNameFromRemoteRef", () => {
it("strips the remote prefix from a remote ref", () => {
expect(deriveLocalBranchNameFromRemoteRef("origin/feature/demo")).toBe("feature/demo");
});
it("supports remote names that contain slashes", () => {
expect(deriveLocalBranchNameFromRemoteRef("my-org/upstream/feature/demo")).toBe(
"upstream/feature/demo",
);
});
it("returns the original name when ref is malformed", () => {
expect(deriveLocalBranchNameFromRemoteRef("origin/")).toBe("origin/");
expect(deriveLocalBranchNameFromRemoteRef("/feature/demo")).toBe("/feature/demo");
});
});
describe("dedupeRemoteBranchesWithLocalMatches", () => {
it("hides remote refs when the matching local ref exists", () => {
const input: VcsRef[] = [
{
name: "feature/demo",
current: false,
isDefault: false,
worktreePath: null,
},
{
name: "origin/feature/demo",
isRemote: true,
remoteName: "origin",
current: false,
isDefault: false,
worktreePath: null,
},
{
name: "origin/feature/remote-only",
isRemote: true,
remoteName: "origin",
current: false,
isDefault: false,
worktreePath: null,
},
];
expect(dedupeRemoteBranchesWithLocalMatches(input).map((ref) => ref.name)).toEqual([
"feature/demo",
"origin/feature/remote-only",
]);
});
it("keeps all entries when no local match exists for a remote ref", () => {
const input: VcsRef[] = [
{
name: "feature/local",
current: false,
isDefault: false,
worktreePath: null,
},
{
name: "origin/feature/remote-only",
isRemote: true,
remoteName: "origin",
current: false,
isDefault: false,
worktreePath: null,
},
];
expect(dedupeRemoteBranchesWithLocalMatches(input).map((ref) => ref.name)).toEqual([
"feature/local",
"origin/feature/remote-only",
]);
});
it("keeps non-origin remote refs visible even when a matching local ref exists", () => {
const input: VcsRef[] = [
{
name: "feature/demo",
current: false,
isDefault: false,
worktreePath: null,
},
{
name: "my-org/upstream/feature/demo",
isRemote: true,
remoteName: "my-org/upstream",
current: false,
isDefault: false,
worktreePath: null,
},
];
expect(dedupeRemoteBranchesWithLocalMatches(input).map((ref) => ref.name)).toEqual([
"feature/demo",
"my-org/upstream/feature/demo",
]);
});
it("keeps non-origin remote refs visible when git tracks with first-slash local naming", () => {
const input: VcsRef[] = [
{
name: "upstream/feature",
current: false,
isDefault: false,
worktreePath: null,
},
{
name: "my-org/upstream/feature",
isRemote: true,
remoteName: "my-org/upstream",
current: false,
isDefault: false,
worktreePath: null,
},
];
expect(dedupeRemoteBranchesWithLocalMatches(input).map((ref) => ref.name)).toEqual([
"upstream/feature",
"my-org/upstream/feature",
]);
});
});
describe("resolveBranchSelectionTarget", () => {
it("reuses an existing secondary worktree for the selected ref", () => {
expect(
resolveBranchSelectionTarget({
activeProjectCwd: "/repo",
activeWorktreePath: "/repo/.t3/worktrees/feature-a",
refName: {
isDefault: false,
worktreePath: "/repo/.t3/worktrees/feature-b",
},
}),
).toEqual({
checkoutCwd: "/repo/.t3/worktrees/feature-b",
nextWorktreePath: "/repo/.t3/worktrees/feature-b",
reuseExistingWorktree: true,
});
});
it("switches back to the main repo when the ref already lives there", () => {
expect(
resolveBranchSelectionTarget({
activeProjectCwd: "/repo",
activeWorktreePath: "/repo/.t3/worktrees/feature-a",
refName: {
isDefault: true,
worktreePath: "/repo",
},
}),
).toEqual({
checkoutCwd: "/repo",
nextWorktreePath: null,
reuseExistingWorktree: true,
});
});
it("checks out the default ref in the main repo when leaving a secondary worktree", () => {
expect(
resolveBranchSelectionTarget({
activeProjectCwd: "/repo",
activeWorktreePath: "/repo/.t3/worktrees/feature-a",
refName: {
isDefault: true,
worktreePath: null,
},
}),
).toEqual({
checkoutCwd: "/repo",
nextWorktreePath: null,
reuseExistingWorktree: false,
});
});
it("keeps checkout in the current worktree for non-default refs", () => {
expect(
resolveBranchSelectionTarget({
activeProjectCwd: "/repo",
activeWorktreePath: "/repo/.t3/worktrees/feature-a",
refName: {
isDefault: false,
worktreePath: null,
},
}),
).toEqual({
checkoutCwd: "/repo/.t3/worktrees/feature-a",
nextWorktreePath: "/repo/.t3/worktrees/feature-a",
reuseExistingWorktree: false,
});
});
});
describe("shouldIncludeBranchPickerItem", () => {
it("keeps the synthetic checkout PR item visible for gh pr checkout input", () => {
expect(
shouldIncludeBranchPickerItem({
itemValue: "__checkout_pull_request__:1359",
normalizedQuery: "gh pr checkout 1359",
createBranchItemValue: "__create_new_branch__:gh pr checkout 1359",
checkoutPullRequestItemValue: "__checkout_pull_request__:1359",
}),
).toBe(true);
});
it("keeps the synthetic create-ref item visible for arbitrary ref input", () => {
expect(
shouldIncludeBranchPickerItem({
itemValue: "__create_new_branch__:feature/demo",
normalizedQuery: "feature/demo",
createBranchItemValue: "__create_new_branch__:feature/demo",
checkoutPullRequestItemValue: null,
}),
).toBe(true);
});
it("still filters ordinary ref items by query text", () => {
expect(
shouldIncludeBranchPickerItem({
itemValue: "main",
normalizedQuery: "gh pr checkout 1359",
createBranchItemValue: "__create_new_branch__:gh pr checkout 1359",
checkoutPullRequestItemValue: "__checkout_pull_request__:1359",
}),
).toBe(false);
});
});