github.com/panekj/cli@v0.0.0-20230304125325-467dd2f3797e/cli/manifest/store/store_test.go (about) 1 package store 2 3 import ( 4 "os" 5 "testing" 6 7 "github.com/docker/cli/cli/manifest/types" 8 "github.com/docker/distribution/reference" 9 "github.com/google/go-cmp/cmp" 10 "gotest.tools/v3/assert" 11 is "gotest.tools/v3/assert/cmp" 12 ) 13 14 type fakeRef struct { 15 name string 16 } 17 18 func (f fakeRef) String() string { 19 return f.name 20 } 21 22 func (f fakeRef) Name() string { 23 return f.name 24 } 25 26 func ref(name string) fakeRef { 27 return fakeRef{name: name} 28 } 29 30 func sref(t *testing.T, name string) *types.SerializableNamed { 31 t.Helper() 32 named, err := reference.ParseNamed("example.com/" + name) 33 assert.NilError(t, err) 34 return &types.SerializableNamed{Named: named} 35 } 36 37 func TestStoreRemove(t *testing.T) { 38 tmpDir := t.TempDir() 39 store := NewStore(tmpDir) 40 listRef := ref("list") 41 data := types.ImageManifest{Ref: sref(t, "abcdef")} 42 assert.NilError(t, store.Save(listRef, ref("manifest"), data)) 43 44 files, err := os.ReadDir(tmpDir) 45 assert.NilError(t, err) 46 assert.Assert(t, is.Len(files, 1)) 47 48 assert.Check(t, store.Remove(listRef)) 49 files, err = os.ReadDir(tmpDir) 50 assert.NilError(t, err) 51 assert.Check(t, is.Len(files, 0)) 52 } 53 54 func TestStoreSaveAndGet(t *testing.T) { 55 store := NewStore(t.TempDir()) 56 listRef := ref("list") 57 data := types.ImageManifest{Ref: sref(t, "abcdef")} 58 err := store.Save(listRef, ref("exists"), data) 59 assert.NilError(t, err) 60 61 testcases := []struct { 62 listRef reference.Reference 63 manifestRef reference.Reference 64 expected types.ImageManifest 65 expectedErr string 66 }{ 67 { 68 listRef: listRef, 69 manifestRef: ref("exists"), 70 expected: data, 71 }, 72 { 73 listRef: listRef, 74 manifestRef: ref("exist:does-not"), 75 expectedErr: "No such manifest: exist:does-not", 76 }, 77 { 78 listRef: ref("list:does-not-exist"), 79 manifestRef: ref("manifest:does-not-exist"), 80 expectedErr: "No such manifest: manifest:does-not-exist", 81 }, 82 } 83 84 for _, testcase := range testcases { 85 testcase := testcase 86 t.Run(testcase.manifestRef.String(), func(t *testing.T) { 87 actual, err := store.Get(testcase.listRef, testcase.manifestRef) 88 if testcase.expectedErr != "" { 89 assert.Error(t, err, testcase.expectedErr) 90 assert.Check(t, IsNotFound(err)) 91 return 92 } 93 assert.NilError(t, err) 94 assert.DeepEqual(t, testcase.expected, actual, cmpReferenceNamed) 95 }) 96 } 97 } 98 99 var cmpReferenceNamed = cmp.Transformer("namedref", func(r reference.Named) string { 100 return r.String() 101 }) 102 103 func TestStoreGetList(t *testing.T) { 104 store := NewStore(t.TempDir()) 105 listRef := ref("list") 106 first := types.ImageManifest{Ref: sref(t, "first")} 107 assert.NilError(t, store.Save(listRef, ref("first"), first)) 108 second := types.ImageManifest{Ref: sref(t, "second")} 109 assert.NilError(t, store.Save(listRef, ref("exists"), second)) 110 111 list, err := store.GetList(listRef) 112 assert.NilError(t, err) 113 assert.Check(t, is.Len(list, 2)) 114 } 115 116 func TestStoreGetListDoesNotExist(t *testing.T) { 117 store := NewStore(t.TempDir()) 118 listRef := ref("list") 119 _, err := store.GetList(listRef) 120 assert.Error(t, err, "No such manifest: list") 121 assert.Check(t, IsNotFound(err)) 122 }