github.com/panekj/cli@v0.0.0-20230304125325-467dd2f3797e/cli/context/store/metadata_test.go (about) 1 package store 2 3 import ( 4 "os" 5 "path/filepath" 6 "testing" 7 8 "github.com/docker/docker/errdefs" 9 "gotest.tools/v3/assert" 10 "gotest.tools/v3/assert/cmp" 11 ) 12 13 func testMetadata(name string) Metadata { 14 return Metadata{ 15 Endpoints: map[string]interface{}{ 16 "ep1": endpoint{Foo: "bar"}, 17 }, 18 Metadata: context{Bar: "baz"}, 19 Name: name, 20 } 21 } 22 23 func TestMetadataGetNotExisting(t *testing.T) { 24 testee := metadataStore{root: t.TempDir(), config: testCfg} 25 _, err := testee.get("noexist") 26 assert.ErrorType(t, err, errdefs.IsNotFound) 27 } 28 29 func TestMetadataCreateGetRemove(t *testing.T) { 30 testDir := t.TempDir() 31 testee := metadataStore{root: testDir, config: testCfg} 32 expected2 := Metadata{ 33 Endpoints: map[string]interface{}{ 34 "ep1": endpoint{Foo: "baz"}, 35 "ep2": endpoint{Foo: "bee"}, 36 }, 37 Metadata: context{Bar: "foo"}, 38 Name: "test-context", 39 } 40 testMeta := testMetadata("test-context") 41 err := testee.createOrUpdate(testMeta) 42 assert.NilError(t, err) 43 // create a new instance to check it does not depend on some sort of state 44 testee = metadataStore{root: testDir, config: testCfg} 45 meta, err := testee.get("test-context") 46 assert.NilError(t, err) 47 assert.DeepEqual(t, meta, testMeta) 48 49 // update 50 51 err = testee.createOrUpdate(expected2) 52 assert.NilError(t, err) 53 meta, err = testee.get("test-context") 54 assert.NilError(t, err) 55 assert.DeepEqual(t, meta, expected2) 56 57 assert.NilError(t, testee.remove("test-context")) 58 assert.NilError(t, testee.remove("test-context")) // support duplicate remove 59 _, err = testee.get("test-context") 60 assert.ErrorType(t, err, errdefs.IsNotFound) 61 } 62 63 func TestMetadataRespectJsonAnnotation(t *testing.T) { 64 testDir := t.TempDir() 65 testee := metadataStore{root: testDir, config: testCfg} 66 assert.NilError(t, testee.createOrUpdate(testMetadata("test"))) 67 bytes, err := os.ReadFile(filepath.Join(testDir, string(contextdirOf("test")), "meta.json")) 68 assert.NilError(t, err) 69 assert.Assert(t, cmp.Contains(string(bytes), "a_very_recognizable_field_name")) 70 assert.Assert(t, cmp.Contains(string(bytes), "another_very_recognizable_field_name")) 71 } 72 73 func TestMetadataList(t *testing.T) { 74 testee := metadataStore{root: t.TempDir(), config: testCfg} 75 wholeData := []Metadata{ 76 testMetadata("context1"), 77 testMetadata("context2"), 78 testMetadata("context3"), 79 } 80 81 for _, s := range wholeData { 82 assert.NilError(t, testee.createOrUpdate(s)) 83 } 84 85 data, err := testee.list() 86 assert.NilError(t, err) 87 assert.DeepEqual(t, data, wholeData) 88 } 89 90 func TestEmptyConfig(t *testing.T) { 91 testee := metadataStore{root: t.TempDir()} 92 wholeData := []Metadata{ 93 testMetadata("context1"), 94 testMetadata("context2"), 95 testMetadata("context3"), 96 } 97 98 for _, s := range wholeData { 99 assert.NilError(t, testee.createOrUpdate(s)) 100 } 101 102 data, err := testee.list() 103 assert.NilError(t, err) 104 assert.Equal(t, len(data), len(wholeData)) 105 } 106 107 type contextWithEmbedding struct { 108 embeddedStruct 109 } 110 type embeddedStruct struct { 111 Val string 112 } 113 114 func TestWithEmbedding(t *testing.T) { 115 testee := metadataStore{ 116 root: t.TempDir(), 117 config: NewConfig(func() interface{} { return &contextWithEmbedding{} }), 118 } 119 testCtxMeta := contextWithEmbedding{ 120 embeddedStruct: embeddedStruct{ 121 Val: "Hello", 122 }, 123 } 124 assert.NilError(t, testee.createOrUpdate(Metadata{Metadata: testCtxMeta, Name: "test"})) 125 res, err := testee.get("test") 126 assert.NilError(t, err) 127 assert.Equal(t, testCtxMeta, res.Metadata) 128 }