11package git
22
33import (
4+ "io"
45 "os"
56 "path/filepath"
67 "testing"
78 "time"
89
910 "github.com/go-git/go-git/v5"
1011 "github.com/go-git/go-git/v5/plumbing/object"
12+ "github.com/stretchr/testify/assert"
1113 "github.com/stretchr/testify/require"
1214
1315 "github.com/launchdarkly/ld-find-code-refs/v2/internal/ld"
@@ -17,10 +19,14 @@ import (
1719)
1820
1921const (
20- repoDir = "testdata/repo"
21- flag1 = "flag1"
22- flag2 = "flag2"
23- flag3 = "flag3"
22+ REPO_DIR = "testdata/repo"
23+ )
24+
25+ var (
26+ flag1 = "flag1"
27+ flag2 = "flag2"
28+ flag3 = "flag3"
29+ flag4 = "flag4" // in bigdiff.txt
2430)
2531
2632func TestMain (m * testing.M ) {
@@ -29,9 +35,9 @@ func TestMain(m *testing.M) {
2935}
3036
3137func setupRepo (t * testing.T ) * git.Repository {
32- os .RemoveAll (repoDir )
33- require .NoError (t , os .MkdirAll (repoDir , 0700 ))
34- repo , err := git .PlainInit (repoDir , false )
38+ os .RemoveAll (REPO_DIR )
39+ require .NoError (t , os .MkdirAll (REPO_DIR , 0700 ))
40+ repo , err := git .PlainInit (REPO_DIR , false )
3541 require .NoError (t , err )
3642 return repo
3743}
@@ -41,21 +47,10 @@ func TestFindExtinctions(t *testing.T) {
4147 repo := setupRepo (t )
4248
4349 // Create commit history
44- flagFile , err := os .Create (filepath .Join (repoDir , "flag1.txt" ))
45- require .NoError (t , err )
46- _ , err = flagFile .WriteString (flag1 )
47- require .NoError (t , err )
48- require .NoError (t , flagFile .Close ())
49- flagFile , err = os .Create (filepath .Join (repoDir , "flag2.txt" ))
50- require .NoError (t , err )
51- _ , err = flagFile .WriteString (flag2 )
52- require .NoError (t , err )
53- require .NoError (t , flagFile .Close ())
54- flagFile , err = os .Create (filepath .Join (repoDir , "flag3.txt" ))
55- require .NoError (t , err )
56- _ , err = flagFile .WriteString (flag3 )
57- require .NoError (t , err )
58- require .NoError (t , flagFile .Close ())
50+ createRepoFile (t , "flag1.txt" , & flag1 )
51+ createRepoFile (t , "flag2.txt" , & flag2 )
52+ createRepoFile (t , "flag3.txt" , & flag3 )
53+ copyFile (t , "testdata/bigdiff.txt" , repoPath ("bigdiff.txt" ))
5954
6055 wt , err := repo .Worktree ()
6156 require .NoError (t , err )
@@ -65,49 +60,54 @@ func TestFindExtinctions(t *testing.T) {
6560 wt .Add ("flag1.txt" )
6661 wt .Add ("flag2.txt" )
6762 wt .Add ("flag3.txt" )
63+ wt .Add ("bigdiff.txt" )
6864 _ , err = wt .Commit ("add flags" , & git.CommitOptions {All : true , Committer : & who , Author : & who })
6965 require .NoError (t , err )
7066
7167 // Test with a removed file
72- err = os .Remove (filepath .Join (repoDir , "flag1.txt" ))
73- require .NoError (t , err )
68+ removeRepoFile (t , "flag1.txt" )
7469
75- who . When = who . When . Add ( time . Minute )
70+ who , when2 := incrementCommitTime ( who )
7671 message2 := "remove flag1"
7772 commit2 , err := wt .Commit (message2 , & git.CommitOptions {All : true , Committer : & who , Author : & who })
7873 require .NoError (t , err )
7974
8075 // Test with an updated (truncated) file
81- flagFile , err = os .Create (filepath .Join (repoDir , "flag2.txt" ))
82- require .NoError (t , err )
83- require .NoError (t , flagFile .Close ())
76+ createRepoFile (t , "flag2.txt" , nil )
8477
85- who . When = who . When . Add ( time . Minute )
78+ who , when3 := incrementCommitTime ( who )
8679 message3 := "remove flag2"
8780 commit3 , err := wt .Commit ("remove flag2" , & git.CommitOptions {All : true , Committer : & who , Author : & who })
8881 require .NoError (t , err )
8982
90- err = os .Remove (filepath .Join (repoDir , "flag3.txt" ))
91- require .NoError (t , err )
83+ removeRepoFile (t , "flag3.txt" )
9284
93- who . When = who . When . Add ( time . Minute )
85+ who , when4 := incrementCommitTime ( who )
9486 message4 := "remove flag3"
9587 commit4 , err := wt .Commit ("remove flag3" , & git.CommitOptions {All : true , Committer : & who , Author : & who })
9688 require .NoError (t , err )
9789
98- c := Client {workspace : repoDir }
90+ // Test big diff
91+ removeRepoFile (t , "bigdiff.txt" )
92+
93+ who , when5 := incrementCommitTime (who )
94+ message5 := "remove flag4 from bigdiff"
95+ commit5 , err := wt .Commit (message5 , & git.CommitOptions {All : true , Committer : & who , Author : & who })
96+ require .NoError (t , err )
97+
98+ c := Client {workspace : REPO_DIR }
9999 projKey := options.Project {
100100 Key : "default" ,
101101 }
102102 addProjKey := options.Project {
103103 Key : "otherProject" ,
104104 }
105105 projects := []options.Project {projKey , addProjKey }
106- missingFlags := [][]string {{flag1 , flag2 }, {flag3 }}
106+ missingFlags := [][]string {{flag1 , flag2 }, {flag3 , flag4 }}
107107 matcher := search.Matcher {
108108 Elements : []search.ElementMatcher {
109109 search .NewElementMatcher (projKey .Key , `` , `` , []string {flag1 , flag2 }, nil ),
110- search .NewElementMatcher (addProjKey .Key , `` , `` , []string {flag3 }, nil ),
110+ search .NewElementMatcher (addProjKey .Key , `` , `` , []string {flag3 , flag4 }, nil ),
111111 },
112112 }
113113
@@ -122,25 +122,78 @@ func TestFindExtinctions(t *testing.T) {
122122 {
123123 Revision : commit3 .String (),
124124 Message : message3 ,
125- Time : who . When . Add ( - time . Minute ). Unix () * 1000 ,
125+ Time : when3 . UnixMilli () ,
126126 ProjKey : projKey .Key ,
127127 FlagKey : flag2 ,
128128 },
129129 {
130130 Revision : commit2 .String (),
131131 Message : message2 ,
132- Time : who . When . Add ( - time . Minute * 2 ). Unix () * 1000 ,
132+ Time : when2 . UnixMilli () ,
133133 ProjKey : projKey .Key ,
134134 FlagKey : flag1 ,
135135 },
136+ {
137+ Revision : commit5 .String (),
138+ Message : message5 ,
139+ Time : when5 .UnixMilli (),
140+ ProjKey : addProjKey .Key ,
141+ FlagKey : flag4 ,
142+ },
136143 {
137144 Revision : commit4 .String (),
138145 Message : message4 ,
139- Time : who . When . Unix () * 1000 ,
146+ Time : when4 . UnixMilli () ,
140147 ProjKey : addProjKey .Key ,
141148 FlagKey : flag3 ,
142149 },
143150 }
144- require .Equal (t , expected , extinctions )
145151
152+ for i , e := range expected {
153+ assert .Equalf (t , e , extinctions [i ], "exinction at element %d does not match" , i )
154+ }
155+ }
156+
157+ // Helper functions
158+
159+ func copyFile (t * testing.T , src , dst string ) {
160+ sourceFileStat , err := os .Stat (src )
161+ require .NoError (t , err )
162+ require .Truef (t , sourceFileStat .Mode ().IsRegular (), "%s is not a regular file" , src )
163+
164+ source , err := os .Open (src )
165+ require .NoError (t , err )
166+ defer source .Close ()
167+
168+ destination , err := os .Create (dst )
169+ require .NoError (t , err )
170+
171+ defer destination .Close ()
172+ _ , err = io .Copy (destination , source )
173+ require .NoError (t , err )
174+ }
175+
176+ func createRepoFile (t * testing.T , path string , content * string ) {
177+ flagFile , err := os .Create (repoPath (path ))
178+ require .NoError (t , err )
179+ if content != nil {
180+ _ , err = flagFile .WriteString (* content )
181+ require .NoError (t , err )
182+ }
183+ require .NoError (t , flagFile .Close ())
184+ }
185+
186+ func removeRepoFile (t * testing.T , path string ) {
187+ require .NoError (t , os .Remove (filepath .Join (REPO_DIR , path )))
188+ }
189+
190+ func repoPath (path string ) string {
191+ return filepath .Join (REPO_DIR , path )
192+ }
193+
194+ func incrementCommitTime (who object.Signature ) (object.Signature , time.Time ) {
195+ t := who .When .Add (time .Minute )
196+ who .When = t
197+
198+ return who , t
146199}
0 commit comments