1package git23import (4 "context"5 "testing"67 "github.com/stretchr/testify/assert"8 "github.com/stretchr/testify/require"9)1011func TestTreeEntry(t *testing.T) {12 id := MustIDFromString(testrepoMarks[12].String())13 e := &TreeEntry{14 mode: EntrySymlink,15 typ: ObjectTree,16 id: id,17 name: "go.mod",18 }1920 assert.False(t, e.IsTree())21 assert.False(t, e.IsBlob())22 assert.False(t, e.IsExec())23 assert.True(t, e.IsSymlink())24 assert.False(t, e.IsCommit())2526 assert.Equal(t, ObjectTree, e.Type())27 assert.Equal(t, e.id, e.ID())28 assert.Equal(t, "go.mod", e.Name())29}3031func TestTreeEntry_Size(t *testing.T) {32 ctx := context.Background()33 tree, err := testrepo.LsTree(ctx, testrepoMarks[30].String())34 require.NoError(t, err)3536 es, err := tree.Entries(ctx)37 require.NoError(t, err)3839 t.Run("blob", func(t *testing.T) {40 var entry *TreeEntry41 for _, e := range es {42 if e.Name() == "README.txt" {43 entry = e44 break45 }46 }47 require.NotNil(t, entry, "entry README.txt not found")48 assert.Equal(t, int64(795), entry.Size(ctx))49 })5051 t.Run("tree returns zero", func(t *testing.T) {52 var entry *TreeEntry53 for _, e := range es {54 if e.IsTree() {55 entry = e56 break57 }58 }59 require.NotNil(t, entry, "tree entry not found")60 assert.Equal(t, int64(0), entry.Size(ctx))61 })62}6364func TestEntries_Sort(t *testing.T) {65 ctx := context.Background()66 tree, err := testrepo.LsTree(ctx, testrepoMarks[30].String())67 if err != nil {68 t.Fatal(err)69 }7071 es, err := tree.Entries(ctx)72 if err != nil {73 t.Fatal(err)74 }7576 es.Sort()7778 expEntries := []*TreeEntry{79 {80 mode: EntryTree,81 typ: ObjectTree,82 id: MustIDFromString(testrepoMarks[41].String()),83 name: "gogs",84 }, {85 mode: EntryTree,86 typ: ObjectTree,87 id: MustIDFromString(testrepoMarks[42].String()),88 name: "img",89 }, {90 mode: EntryTree,91 typ: ObjectTree,92 id: MustIDFromString(testrepoMarks[44].String()),93 name: "resources",94 }, {95 mode: EntryTree,96 typ: ObjectTree,97 id: MustIDFromString(testrepoMarks[47].String()),98 name: "src",99 }, {100 mode: EntryBlob,101 typ: ObjectBlob,102 id: MustIDFromString(testrepoMarks[34].String()),103 name: ".DS_Store",104 }, {105 mode: EntryBlob,106 typ: ObjectBlob,107 id: MustIDFromString(testrepoMarks[35].String()),108 name: ".gitattributes",109 }, {110 mode: EntryBlob,111 typ: ObjectBlob,112 id: MustIDFromString(testrepoMarks[36].String()),113 name: ".gitignore",114 }, {115 mode: EntryBlob,116 typ: ObjectBlob,117 id: MustIDFromString(testrepoMarks[37].String()),118 name: ".gitmodules",119 }, {120 mode: EntryBlob,121 typ: ObjectBlob,122 id: MustIDFromString(testrepoMarks[38].String()),123 name: ".travis.yml",124 }, {125 mode: EntryBlob,126 typ: ObjectBlob,127 id: MustIDFromString(testrepoMarks[39].String()),128 name: "README.txt",129 }, {130 mode: EntryBlob,131 typ: ObjectBlob,132 id: MustIDFromString(testrepoMarks[40].String()),133 name: "build.gradle",134 }, {135 mode: EntryBlob,136 typ: ObjectBlob,137 id: MustIDFromString(testrepoMarks[43].String()),138 name: "pom.xml",139 }, {140 mode: EntryExec,141 typ: ObjectBlob,142 id: MustIDFromString(testrepoMarks[45].String()),143 name: "run.sh",144 },145 }146 for i := range expEntries {147 assert.Equal(t, expEntries[i].Mode(), es[i].Mode(), "idx: %d", i)148 assert.Equal(t, expEntries[i].Type(), es[i].Type(), "idx: %d", i)149 assert.Equal(t, expEntries[i].ID().String(), es[i].ID().String(), "idx: %d", i)150 assert.Equal(t, expEntries[i].Name(), es[i].Name(), "idx: %d", i)151 }152}153154func TestEntries_CommitsInfo(t *testing.T) {155 ctx := context.Background()156 tree, err := testrepo.LsTree(ctx, testrepoMarks[32].String())157 if err != nil {158 t.Fatal(err)159 }160161 c, err := testrepo.CatFileCommit(ctx, tree.id.String())162 if err != nil {163 t.Fatal(err)164 }165166 t.Run("general directory", func(t *testing.T) {167 es, err := tree.Entries(ctx)168 if err != nil {169 t.Fatal(err)170 }171172 infos, err := es.CommitsInfo(ctx, c)173 if err != nil {174 t.Fatal(err)175 }176177 expInfos := []*EntryCommitInfo{178 {179 Entry: &TreeEntry{180 name: ".DS_Store",181 },182 Commit: &Commit{183 ID: MustIDFromString(testrepoMarks[28].String()),184 },185 }, {186 Entry: &TreeEntry{187 name: ".gitattributes",188 },189 Commit: &Commit{190 ID: MustIDFromString(testrepoMarks[15].String()),191 },192 }, {193 Entry: &TreeEntry{194 name: ".gitignore",195 },196 Commit: &Commit{197 ID: MustIDFromString(testrepoMarks[16].String()),198 },199 }, {200 Entry: &TreeEntry{201 name: ".gitmodules",202 },203 Commit: &Commit{204 ID: MustIDFromString(testrepoMarks[29].String()),205 },206 }, {207 Entry: &TreeEntry{208 name: ".travis.yml",209 },210 Commit: &Commit{211 ID: MustIDFromString(testrepoMarks[23].String()),212 },213 }, {214 Entry: &TreeEntry{215 name: "README.txt",216 },217 Commit: &Commit{218 ID: MustIDFromString(testrepoMarks[20].String()),219 },220 }, {221 Entry: &TreeEntry{222 name: "build.gradle",223 },224 Commit: &Commit{225 ID: MustIDFromString(testrepoMarks[17].String()),226 },227 }, {228 Entry: &TreeEntry{229 name: "gogs",230 },231 Commit: &Commit{232 ID: MustIDFromString(testrepoMarks[29].String()),233 },234 }, {235 Entry: &TreeEntry{236 name: "img",237 },238 Commit: &Commit{239 ID: MustIDFromString(testrepoMarks[28].String()),240 },241 }, {242 Entry: &TreeEntry{243 name: "pom.xml",244 },245 Commit: &Commit{246 ID: MustIDFromString(testrepoMarks[26].String()),247 },248 }, {249 Entry: &TreeEntry{250 name: "resources",251 },252 Commit: &Commit{253 ID: MustIDFromString(testrepoMarks[1].String()),254 },255 }, {256 Entry: &TreeEntry{257 name: "run.sh",258 },259 Commit: &Commit{260 ID: MustIDFromString(testrepoMarks[30].String()),261 },262 }, {263 Entry: &TreeEntry{264 name: "sameSHAs",265 },266 Commit: &Commit{267 ID: MustIDFromString(testrepoMarks[32].String()),268 },269 }, {270 Entry: &TreeEntry{271 name: "src",272 },273 Commit: &Commit{274 ID: MustIDFromString(testrepoMarks[25].String()),275 },276 },277 }278 for i := range expInfos {279 assert.Equal(t, expInfos[i].Entry.Name(), infos[i].Entry.Name(), "idx: %d", i)280 assert.Equal(t, expInfos[i].Commit.ID.String(), infos[i].Commit.ID.String(), "idx: %d", i)281 }282 })283284 t.Run("directory with submodule", func(t *testing.T) {285 subtree, err := tree.Subtree(ctx, "gogs")286 if err != nil {287 t.Fatal(err)288 }289290 es, err := subtree.Entries(ctx)291 if err != nil {292 t.Fatal(err)293 }294295 infos, err := es.CommitsInfo(ctx, c, CommitsInfoOptions{296 Path: "gogs",297 })298 if err != nil {299 t.Fatal(err)300 }301302 expInfos := []*EntryCommitInfo{303 {304 Entry: &TreeEntry{305 name: "docs-api",306 },307 Commit: &Commit{308 ID: MustIDFromString(testrepoMarks[29].String()),309 },310 },311 }312 for i := range expInfos {313 assert.Equal(t, expInfos[i].Entry.Name(), infos[i].Entry.Name(), "idx: %d", i)314 assert.Equal(t, expInfos[i].Commit.ID.String(), infos[i].Commit.ID.String(), "idx: %d", i)315 }316 })317318 t.Run("directory with files that have the same SHA", func(t *testing.T) {319 subtree, err := tree.Subtree(ctx, "sameSHAs")320 if err != nil {321 t.Fatal(err)322 }323324 es, err := subtree.Entries(ctx)325 if err != nil {326 t.Fatal(err)327 }328329 infos, err := es.CommitsInfo(ctx, c, CommitsInfoOptions{330 Path: "sameSHAs",331 })332 if err != nil {333 t.Fatal(err)334 }335336 expInfos := []*EntryCommitInfo{337 {338 Entry: &TreeEntry{339 name: "file1.txt",340 },341 Commit: &Commit{342 ID: MustIDFromString(testrepoMarks[32].String()),343 },344 }, {345 Entry: &TreeEntry{346 name: "file2.txt",347 },348 Commit: &Commit{349 ID: MustIDFromString(testrepoMarks[32].String()),350 },351 },352 }353 for i := range expInfos {354 assert.Equal(t, expInfos[i].Entry.Name(), infos[i].Entry.Name(), "idx: %d", i)355 assert.Equal(t, expInfos[i].Commit.ID.String(), infos[i].Commit.ID.String(), "idx: %d", i)356 }357 })358}