Skip to content

Commit 7279de2

Browse files
committed
test(workspace): split merge checks from workspace suite
1 parent 531756d commit 7279de2

2 files changed

Lines changed: 126 additions & 123 deletions

File tree

internal/workspace/merge_test.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package workspace
2+
3+
import (
4+
"context"
5+
"path/filepath"
6+
"strings"
7+
"testing"
8+
)
9+
10+
func TestManagerCheckMergeUsesAlreadyFetchedRevisionsWithoutMutation(t *testing.T) {
11+
t.Parallel()
12+
ctx := context.Background()
13+
remote, baseSHA, candidateSHA := setupRemote(t)
14+
mgr := newManager(t)
15+
if err := mgr.Clone(ctx, remote, "origin"); err != nil {
16+
t.Fatal(err)
17+
}
18+
path := mgr.mirrors["origin"].path
19+
before := strings.TrimSpace(runGit(t, path, "show-ref"))
20+
beforeObjects := strings.TrimSpace(runGit(t, path, "count-objects", "-v"))
21+
result, err := mgr.CheckMerge(ctx, path, baseSHA, candidateSHA)
22+
if err != nil {
23+
t.Fatal(err)
24+
}
25+
if result.Conflicted || result.MergeBase != baseSHA {
26+
t.Fatalf("unexpected merge result: %+v", result)
27+
}
28+
after := strings.TrimSpace(runGit(t, path, "show-ref"))
29+
if before != after {
30+
t.Fatalf("merge check changed refs\nbefore: %s\nafter: %s", before, after)
31+
}
32+
afterObjects := strings.TrimSpace(runGit(t, path, "count-objects", "-v"))
33+
if beforeObjects != afterObjects {
34+
t.Fatalf("merge check changed object store\nbefore: %s\nafter: %s", beforeObjects, afterObjects)
35+
}
36+
}
37+
38+
// TestManagerCheckMergeNoFalsePositiveOnConflictMarkerInContent proves that
39+
// a file containing conflict markers in its content does not trigger a
40+
// false-positive conflict detection when the merge is actually clean.
41+
func TestManagerCheckMergeNoFalsePositiveOnConflictMarkerInContent(t *testing.T) {
42+
t.Parallel()
43+
ctx := context.Background()
44+
45+
dir := t.TempDir()
46+
remote := filepath.Join(dir, "remote.git")
47+
runGit(t, "", "init", "--bare", remote)
48+
49+
src := filepath.Join(dir, "src")
50+
runGit(t, "", "clone", remote, src)
51+
52+
writeFile(t, filepath.Join(src, "file.txt"), "hello")
53+
runGit(t, src, "add", ".")
54+
runGit(t, src, "-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "base")
55+
runGit(t, src, "push", "origin", "master")
56+
57+
marker := strings.Repeat("<", 7)
58+
runGit(t, src, "checkout", "-b", "feature")
59+
writeFile(t, filepath.Join(src, "file.txt"), marker+" HEAD\nworld\n=======\nuniverse\n"+strings.Repeat(">", 7)+" branch\n")
60+
runGit(t, src, "add", ".")
61+
runGit(t, src, "-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "feature adds conflict markers in content")
62+
runGit(t, src, "push", "origin", "feature")
63+
64+
runGit(t, src, "checkout", "master")
65+
writeFile(t, filepath.Join(src, "other.txt"), "different change")
66+
runGit(t, src, "add", ".")
67+
runGit(t, src, "-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "master adds other file")
68+
runGit(t, src, "push", "origin", "master")
69+
70+
baseSHA := strings.TrimSpace(runGit(t, src, "rev-parse", "master"))
71+
candidateSHA := strings.TrimSpace(runGit(t, src, "rev-parse", "feature"))
72+
mgr := newManager(t)
73+
if err := mgr.Clone(ctx, remote, "origin"); err != nil {
74+
t.Fatal(err)
75+
}
76+
77+
result, err := mgr.CheckMerge(ctx, mgr.mirrors["origin"].path, baseSHA, candidateSHA)
78+
if err != nil {
79+
t.Fatal(err)
80+
}
81+
if result.Conflicted {
82+
t.Fatalf("false positive: merge reported conflict but branches merge cleanly. Result: %+v", result)
83+
}
84+
}
85+
86+
func TestManagerCheckMergeDetectsAddAddConflict(t *testing.T) {
87+
t.Parallel()
88+
ctx := context.Background()
89+
90+
dir := t.TempDir()
91+
remote := filepath.Join(dir, "remote.git")
92+
runGit(t, "", "init", "--bare", remote)
93+
94+
src := filepath.Join(dir, "src")
95+
runGit(t, "", "clone", remote, src)
96+
writeFile(t, filepath.Join(src, "base.txt"), "base")
97+
runGit(t, src, "add", ".")
98+
runGit(t, src, "-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "base")
99+
runGit(t, src, "push", "origin", "master")
100+
101+
runGit(t, src, "checkout", "-b", "feature")
102+
writeFile(t, filepath.Join(src, "same.txt"), "feature")
103+
runGit(t, src, "add", ".")
104+
runGit(t, src, "-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "feature adds same path")
105+
runGit(t, src, "push", "origin", "feature")
106+
107+
runGit(t, src, "checkout", "master")
108+
writeFile(t, filepath.Join(src, "same.txt"), "master")
109+
runGit(t, src, "add", ".")
110+
runGit(t, src, "-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "master adds same path")
111+
runGit(t, src, "push", "origin", "master")
112+
113+
baseSHA := strings.TrimSpace(runGit(t, src, "rev-parse", "master"))
114+
candidateSHA := strings.TrimSpace(runGit(t, src, "rev-parse", "feature"))
115+
mgr := newManager(t)
116+
if err := mgr.Clone(ctx, remote, "origin"); err != nil {
117+
t.Fatal(err)
118+
}
119+
result, err := mgr.CheckMerge(ctx, mgr.mirrors["origin"].path, baseSHA, candidateSHA)
120+
if err != nil {
121+
t.Fatal(err)
122+
}
123+
if !result.Conflicted {
124+
t.Fatalf("add/add conflict reported clean: %+v", result)
125+
}
126+
}

internal/workspace/workspace_test.go

Lines changed: 0 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -140,34 +140,6 @@ func TestManager_CloneAndResolve(t *testing.T) {
140140
})
141141
}
142142

143-
func TestManagerCheckMergeUsesAlreadyFetchedRevisionsWithoutMutation(t *testing.T) {
144-
t.Parallel()
145-
ctx := context.Background()
146-
remote, baseSHA, candidateSHA := setupRemote(t)
147-
mgr := newManager(t)
148-
if err := mgr.Clone(ctx, remote, "origin"); err != nil {
149-
t.Fatal(err)
150-
}
151-
path := mgr.mirrors["origin"].path
152-
before := strings.TrimSpace(runGit(t, path, "show-ref"))
153-
beforeObjects := strings.TrimSpace(runGit(t, path, "count-objects", "-v"))
154-
result, err := mgr.CheckMerge(ctx, path, baseSHA, candidateSHA)
155-
if err != nil {
156-
t.Fatal(err)
157-
}
158-
if result.Conflicted || result.MergeBase != baseSHA {
159-
t.Fatalf("unexpected merge result: %+v", result)
160-
}
161-
after := strings.TrimSpace(runGit(t, path, "show-ref"))
162-
if before != after {
163-
t.Fatalf("merge check changed refs\nbefore: %s\nafter: %s", before, after)
164-
}
165-
afterObjects := strings.TrimSpace(runGit(t, path, "count-objects", "-v"))
166-
if beforeObjects != afterObjects {
167-
t.Fatalf("merge check changed object store\nbefore: %s\nafter: %s", beforeObjects, afterObjects)
168-
}
169-
}
170-
171143
func TestManager_CreateAndInspect(t *testing.T) {
172144
t.Parallel()
173145
ctx := context.Background()
@@ -804,98 +776,3 @@ func TestManager_DiffIncludesWorkingChanges(t *testing.T) {
804776
t.Fatalf("working-tree diff missing untracked file:\n%s", diff)
805777
}
806778
}
807-
808-
// TestManagerCheckMergeNoFalsePositiveOnConflictMarkerInContent proves that
809-
// a file containing conflict markers in its content does not trigger a
810-
// false-positive conflict detection when the merge is actually clean.
811-
func TestManagerCheckMergeNoFalsePositiveOnConflictMarkerInContent(t *testing.T) {
812-
t.Parallel()
813-
ctx := context.Background()
814-
815-
dir := t.TempDir()
816-
remote := filepath.Join(dir, "remote.git")
817-
runGit(t, "", "init", "--bare", remote)
818-
819-
src := filepath.Join(dir, "src")
820-
runGit(t, "", "clone", remote, src)
821-
822-
// Base commit
823-
writeFile(t, filepath.Join(src, "file.txt"), "hello")
824-
runGit(t, src, "add", ".")
825-
runGit(t, src, "-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "base")
826-
runGit(t, src, "push", "origin", "master")
827-
828-
// Branch that modifies file.txt to contain conflict markers in content.
829-
marker := strings.Repeat("<", 7)
830-
runGit(t, src, "checkout", "-b", "feature")
831-
writeFile(t, filepath.Join(src, "file.txt"), marker+" HEAD\nworld\n=======\nuniverse\n"+strings.Repeat(">", 7)+" branch\n")
832-
runGit(t, src, "add", ".")
833-
runGit(t, src, "-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "feature adds conflict markers in content")
834-
runGit(t, src, "push", "origin", "feature")
835-
836-
// Master adds a different file (no conflict with feature)
837-
runGit(t, src, "checkout", "master")
838-
writeFile(t, filepath.Join(src, "other.txt"), "different change")
839-
runGit(t, src, "add", ".")
840-
runGit(t, src, "-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "master adds other file")
841-
runGit(t, src, "push", "origin", "master")
842-
843-
baseSHA := strings.TrimSpace(runGit(t, src, "rev-parse", "master"))
844-
candidateSHA := strings.TrimSpace(runGit(t, src, "rev-parse", "feature"))
845-
846-
mgr := newManager(t)
847-
if err := mgr.Clone(ctx, remote, "origin"); err != nil {
848-
t.Fatal(err)
849-
}
850-
path := mgr.mirrors["origin"].path
851-
852-
result, err := mgr.CheckMerge(ctx, path, baseSHA, candidateSHA)
853-
if err != nil {
854-
t.Fatal(err)
855-
}
856-
if result.Conflicted {
857-
t.Fatalf("false positive: merge reported conflict but branches merge cleanly. Result: %+v", result)
858-
}
859-
}
860-
861-
func TestManagerCheckMergeDetectsAddAddConflict(t *testing.T) {
862-
t.Parallel()
863-
ctx := context.Background()
864-
865-
dir := t.TempDir()
866-
remote := filepath.Join(dir, "remote.git")
867-
runGit(t, "", "init", "--bare", remote)
868-
869-
src := filepath.Join(dir, "src")
870-
runGit(t, "", "clone", remote, src)
871-
writeFile(t, filepath.Join(src, "base.txt"), "base")
872-
runGit(t, src, "add", ".")
873-
runGit(t, src, "-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "base")
874-
runGit(t, src, "push", "origin", "master")
875-
876-
runGit(t, src, "checkout", "-b", "feature")
877-
writeFile(t, filepath.Join(src, "same.txt"), "feature")
878-
runGit(t, src, "add", ".")
879-
runGit(t, src, "-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "feature adds same path")
880-
runGit(t, src, "push", "origin", "feature")
881-
882-
runGit(t, src, "checkout", "master")
883-
writeFile(t, filepath.Join(src, "same.txt"), "master")
884-
runGit(t, src, "add", ".")
885-
runGit(t, src, "-c", "user.email=test@example.com", "-c", "user.name=Test", "commit", "-m", "master adds same path")
886-
runGit(t, src, "push", "origin", "master")
887-
888-
baseSHA := strings.TrimSpace(runGit(t, src, "rev-parse", "master"))
889-
candidateSHA := strings.TrimSpace(runGit(t, src, "rev-parse", "feature"))
890-
mgr := newManager(t)
891-
if err := mgr.Clone(ctx, remote, "origin"); err != nil {
892-
t.Fatal(err)
893-
}
894-
result, err := mgr.CheckMerge(ctx, mgr.mirrors["origin"].path, baseSHA, candidateSHA)
895-
if err != nil {
896-
t.Fatal(err)
897-
}
898-
if !result.Conflicted {
899-
t.Fatalf("add/add conflict reported clean: %+v", result)
900-
}
901-
}

0 commit comments

Comments
 (0)