@@ -55,6 +55,66 @@ func TestGitRepoClone(t *testing.T) {
5555 assert .Equal (t , commit .Message , "test" )
5656}
5757
58+ func TestGitRepoCheckoutRef (t * testing.T ) {
59+ t .Run ("valid commit" , func (t * testing.T ) {
60+ repo := newGitRepo (t )
61+ oldHead , err := repo .raw .Head ()
62+ require .NoError (t , err )
63+
64+ require .NoError (t , repo .wfs .WriteFile ("new.txt" , []byte ("test" ), 0644 ))
65+ require .NoError (t , repo .StageFile ("new.txt" ))
66+ hash , err := repo .Commit ("test" )
67+ require .NoError (t , err )
68+ newHead , err := repo .raw .CommitObject (hash )
69+ require .NoError (t , err )
70+ require .NotEqual (t , oldHead .Hash (), newHead .Hash )
71+
72+ assert .NoError (t , repo .CheckoutRef (oldHead .Hash ().String ()))
73+ head , err := repo .raw .Head ()
74+ require .NoError (t , err )
75+ assert .Equal (t , head .Hash (), oldHead .Hash ())
76+ })
77+
78+ t .Run ("valid branch" , func (t * testing.T ) {
79+ repo := newGitRepo (t )
80+ require .NoError (t , repo .NewBranch ("test" ))
81+ require .NoError (t , repo .wfs .WriteFile ("new.txt" , []byte ("test" ), 0644 ))
82+ require .NoError (t , repo .StageFile ("new.txt" ))
83+ _ , err := repo .Commit ("test" )
84+ require .NoError (t , err )
85+
86+ assert .NoError (t , repo .CheckoutRef ("master" ))
87+ branch , err := repo .GetCurrentBranch ()
88+ require .NoError (t , err )
89+ assert .Equal (t , branch , "master" )
90+ })
91+
92+ t .Run ("valid tag" , func (t * testing.T ) {
93+ repo := newGitRepo (t )
94+ head , err := repo .raw .Head ()
95+ require .NoError (t , err )
96+ require .NoError (t , repo .CreateTag ("v1.0.0" , head .Hash ().String (), "test tag" ))
97+
98+ require .NoError (t , repo .wfs .WriteFile ("new.txt" , []byte ("test" ), 0644 ))
99+ require .NoError (t , repo .StageFile ("new.txt" ))
100+ _ , err = repo .Commit ("test" )
101+ require .NoError (t , err )
102+
103+ assert .NoError (t , repo .CheckoutRef ("v1.0.0" ))
104+
105+ newHead , err := repo .raw .Head ()
106+ require .NoError (t , err )
107+ assert .Equal (t , head .Hash ().String (), newHead .Hash ().String ())
108+ })
109+
110+ t .Run ("invalid ref" , func (t * testing.T ) {
111+ repo := newGitRepo (t )
112+
113+ err := repo .CheckoutRef ("invalid" )
114+ assert .Error (t , err )
115+ })
116+ }
117+
58118func TestGitRepoCommit (t * testing.T ) {
59119 t .Run ("succcess" , func (t * testing.T ) {
60120 repo := newGitRepo (t )
@@ -73,6 +133,37 @@ func TestGitRepoCommit(t *testing.T) {
73133 })
74134}
75135
136+ func TestGitRepoCreateTag (t * testing.T ) {
137+ t .Run ("create annotated tag" , func (t * testing.T ) {
138+ repo := newGitRepo (t )
139+
140+ require .NoError (t , repo .wfs .WriteFile ("new.txt" , []byte ("contesttent" ), 0644 ))
141+ require .NoError (t , repo .StageFile ("new.txt" ))
142+ commitHash , err := repo .Commit ("test" )
143+ require .NoError (t , err )
144+
145+ err = repo .CreateTag ("v1.0.0" , commitHash .String (), "message" )
146+ assert .NoError (t , err )
147+
148+ tag , err := repo .raw .Tag ("v1.0.0" )
149+ require .NoError (t , err )
150+
151+ tagObj , err := repo .raw .TagObject (tag .Hash ())
152+ require .NoError (t , err , "Should be able to get a tag object for an annotated tag" )
153+ assert .Equal (t , "message\n " , tagObj .Message )
154+
155+ commit , err := tagObj .Commit ()
156+ require .NoError (t , err )
157+ assert .Equal (t , commitHash .String (), commit .Hash .String ())
158+ })
159+
160+ t .Run ("invalid commit hash" , func (t * testing.T ) {
161+ repo := newGitRepo (t )
162+ err := repo .CreateTag ("invalid-tag" , "not-a-hash" , "" )
163+ assert .Error (t , err )
164+ })
165+ }
166+
76167func TestGitRepoFetch (t * testing.T ) {
77168 var opts * gg.FetchOptions
78169 repo := newGitRepo (t )
0 commit comments