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