FN-6691: speed shared-branch lifecycle slow tests
Optimizes shared branch group lifecycle coverage by bypassing repeated mock merger sessions where full merge behavior is not under test. - Add a deterministic fast integration helper that merges staged member branches into the shared group branch and records merge metadata. - Keep routing and self-healing cases on the full aiMergeTask path while using the faster seam for promotion and gating assertions. - Preserve FN-5820 shared branch completion and auto-merge-off expectations with less slow-test overhead. Files changed: .../shared-branch-group-lifecycle.slow.test.ts | 54 ++++++++++++++++++---- 1 file changed, 46 insertions(+), 8 deletions(-) Fusion-Task-Id: FN-6691 Fusion-Task-Lineage: 5f01318c-20b0-4f11-ad3c-c2e1b8cd0f3e
This commit is contained in:
@@ -74,6 +74,46 @@ git checkout main
|
||||
return { taskId: input.taskId, branch, worktreePath, fileName: input.fileName };
|
||||
}
|
||||
|
||||
async function fastIntegrateSharedMember(
|
||||
store: TaskStore,
|
||||
rootDir: string,
|
||||
member: StagedMember,
|
||||
group: { id: string; branchName: string },
|
||||
): Promise<string> {
|
||||
/*
|
||||
FNXC:EngineTests 2026-06-19-02:55:
|
||||
FN-6691 keeps full aiMergeTask coverage in the routing-focused and self-healing cases, but promotion/gating cases only need member branches already accumulated on the shared branch with merge metadata.
|
||||
Use one deterministic git shell seam here so FN-5820 completion, promotion, and auto-merge-off assertions stay intact without paying the mock merger session cost in every case.
|
||||
*/
|
||||
const message = `test: integrate ${member.taskId} into ${group.branchName}`;
|
||||
const script = `set -e
|
||||
member_branch=$1
|
||||
group_branch=$2
|
||||
message=$3
|
||||
if ! git show-ref --verify --quiet "refs/heads/$group_branch"; then
|
||||
git branch "$group_branch" main
|
||||
fi
|
||||
git checkout "$group_branch"
|
||||
git merge --no-ff "$member_branch" -m "$message"
|
||||
git rev-parse HEAD
|
||||
git checkout main
|
||||
`;
|
||||
const output = git(rootDir, `sh -c ${shellQuote(script)} sh ${[member.branch, group.branchName, message].map(shellQuote).join(" ")}`);
|
||||
const commitSha = output.split("\n").map((line) => line.trim()).filter(Boolean).at(-1) ?? "";
|
||||
await store.updateTask(member.taskId, {
|
||||
column: "done",
|
||||
status: null,
|
||||
error: null,
|
||||
mergeDetails: {
|
||||
commitSha,
|
||||
mergeConfirmed: true,
|
||||
mergeTargetSource: "branch-group-integration",
|
||||
mergeTargetBranch: group.branchName,
|
||||
},
|
||||
} as any);
|
||||
return commitSha;
|
||||
}
|
||||
|
||||
describe("FN-5820 reliability interactions: shared branch group lifecycle", () => {
|
||||
it.skipIf(!hasGit)("CASE 1: shared members resolve distinct working branches/worktrees without branch conflict", async () => {
|
||||
const fixture = await makeReliabilityFixture({ taskId: "FN-5820-RI-A", settings: sharedBranchLifecycleSettings() });
|
||||
@@ -213,8 +253,7 @@ describe("FN-5820 reliability interactions: shared branch group lifecycle", () =
|
||||
await store.setTaskBranchGroup(task.id, group.id);
|
||||
await store.setTaskBranchGroup(second.id, group.id);
|
||||
|
||||
const firstMerge = await aiMergeTask(store, rootDir, task.id);
|
||||
expect(firstMerge.merged).toBe(true);
|
||||
await fastIntegrateSharedMember(store, rootDir, { taskId: task.id, branch: `fusion/${task.id.toLowerCase()}`, worktreePath: "", fileName: "fn5820Case3A" }, group);
|
||||
const firstMergedTask = await store.getTask(task.id);
|
||||
expect(firstMergedTask?.mergeDetails?.mergeTargetSource).toBe("branch-group-integration");
|
||||
expect(firstMergedTask?.mergeDetails?.mergeTargetBranch).toBe(group.branchName);
|
||||
@@ -229,8 +268,7 @@ describe("FN-5820 reliability interactions: shared branch group lifecycle", () =
|
||||
expect(incomplete.reason).toBe("incomplete");
|
||||
expect(() => git(rootDir, "git show main:packages/engine/src/fn5820Case3A.ts")).toThrow();
|
||||
|
||||
const secondMerge = await aiMergeTask(store, rootDir, second.id);
|
||||
expect(secondMerge.merged).toBe(true);
|
||||
await fastIntegrateSharedMember(store, rootDir, { taskId: second.id, branch: `fusion/${second.id.toLowerCase()}`, worktreePath: "", fileName: "fn5820Case3B" }, group);
|
||||
const secondMergedTask = await store.getTask(second.id);
|
||||
expect(secondMergedTask?.mergeDetails?.mergeTargetSource).toBe("branch-group-integration");
|
||||
expect(secondMergedTask?.mergeDetails?.mergeTargetBranch).toBe(group.branchName);
|
||||
@@ -307,13 +345,13 @@ describe("FN-5820 reliability interactions: shared branch group lifecycle", () =
|
||||
autoMerge: true,
|
||||
});
|
||||
|
||||
await stageSharedMember(store, rootDir, { taskId: task.id, groupId: group.id, source: "planning", fileName: "fn5820Case4A" });
|
||||
await stageSharedMember(store, rootDir, { taskId: second.id, groupId: group.id, source: "planning", fileName: "fn5820Case4B" });
|
||||
const firstMember = await stageSharedMember(store, rootDir, { taskId: task.id, groupId: group.id, source: "planning", fileName: "fn5820Case4A" });
|
||||
const secondMember = await stageSharedMember(store, rootDir, { taskId: second.id, groupId: group.id, source: "planning", fileName: "fn5820Case4B" });
|
||||
await store.setTaskBranchGroup(task.id, group.id);
|
||||
await store.setTaskBranchGroup(second.id, group.id);
|
||||
|
||||
expect((await aiMergeTask(store, rootDir, task.id)).merged).toBe(true);
|
||||
expect((await aiMergeTask(store, rootDir, second.id)).merged).toBe(true);
|
||||
await fastIntegrateSharedMember(store, rootDir, firstMember, group);
|
||||
await fastIntegrateSharedMember(store, rootDir, secondMember, group);
|
||||
const firstMergedTask = await store.getTask(task.id);
|
||||
const secondMergedTask = await store.getTask(second.id);
|
||||
expect(firstMergedTask?.mergeDetails?.mergeTargetSource).toBe("branch-group-integration");
|
||||
|
||||
Reference in New Issue
Block a user