github.com/ali-iotechsys/cli@v20.10.0+incompatible/cli/context/store/metadata_test.go (about) 1 package store 2 3 import ( 4 "io/ioutil" 5 "os" 6 "path/filepath" 7 "testing" 8 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 testDir, err := ioutil.TempDir("", t.Name()) 25 assert.NilError(t, err) 26 defer os.RemoveAll(testDir) 27 testee := metadataStore{root: testDir, config: testCfg} 28 _, err = testee.get("noexist") 29 assert.Assert(t, IsErrContextDoesNotExist(err)) 30 } 31 32 func TestMetadataCreateGetRemove(t *testing.T) { 33 testDir, err := ioutil.TempDir("", t.Name()) 34 assert.NilError(t, err) 35 defer os.RemoveAll(testDir) 36 testee := metadataStore{root: testDir, config: testCfg} 37 expected2 := Metadata{ 38 Endpoints: map[string]interface{}{ 39 "ep1": endpoint{Foo: "baz"}, 40 "ep2": endpoint{Foo: "bee"}, 41 }, 42 Metadata: context{Bar: "foo"}, 43 Name: "test-context", 44 } 45 testMeta := testMetadata("test-context") 46 err = testee.createOrUpdate(testMeta) 47 assert.NilError(t, err) 48 // create a new instance to check it does not depend on some sort of state 49 testee = metadataStore{root: testDir, config: testCfg} 50 meta, err := testee.get(contextdirOf("test-context")) 51 assert.NilError(t, err) 52 assert.DeepEqual(t, meta, testMeta) 53 54 // update 55 56 err = testee.createOrUpdate(expected2) 57 assert.NilError(t, err) 58 meta, err = testee.get(contextdirOf("test-context")) 59 assert.NilError(t, err) 60 assert.DeepEqual(t, meta, expected2) 61 62 assert.NilError(t, testee.remove(contextdirOf("test-context"))) 63 assert.NilError(t, testee.remove(contextdirOf("test-context"))) // support duplicate remove 64 _, err = testee.get(contextdirOf("test-context")) 65 assert.Assert(t, IsErrContextDoesNotExist(err)) 66 } 67 68 func TestMetadataRespectJsonAnnotation(t *testing.T) { 69 testDir, err := ioutil.TempDir("", t.Name()) 70 assert.NilError(t, err) 71 defer os.RemoveAll(testDir) 72 testee := metadataStore{root: testDir, config: testCfg} 73 assert.NilError(t, testee.createOrUpdate(testMetadata("test"))) 74 bytes, err := ioutil.ReadFile(filepath.Join(testDir, string(contextdirOf("test")), "meta.json")) 75 assert.NilError(t, err) 76 assert.Assert(t, cmp.Contains(string(bytes), "a_very_recognizable_field_name")) 77 assert.Assert(t, cmp.Contains(string(bytes), "another_very_recognizable_field_name")) 78 } 79 80 func TestMetadataList(t *testing.T) { 81 testDir, err := ioutil.TempDir("", t.Name()) 82 assert.NilError(t, err) 83 defer os.RemoveAll(testDir) 84 testee := metadataStore{root: testDir, config: testCfg} 85 wholeData := []Metadata{ 86 testMetadata("context1"), 87 testMetadata("context2"), 88 testMetadata("context3"), 89 } 90 91 for _, s := range wholeData { 92 err = testee.createOrUpdate(s) 93 assert.NilError(t, err) 94 } 95 96 data, err := testee.list() 97 assert.NilError(t, err) 98 assert.DeepEqual(t, data, wholeData) 99 } 100 101 func TestEmptyConfig(t *testing.T) { 102 testDir, err := ioutil.TempDir("", t.Name()) 103 assert.NilError(t, err) 104 defer os.RemoveAll(testDir) 105 testee := metadataStore{root: testDir} 106 wholeData := []Metadata{ 107 testMetadata("context1"), 108 testMetadata("context2"), 109 testMetadata("context3"), 110 } 111 112 for _, s := range wholeData { 113 err = testee.createOrUpdate(s) 114 assert.NilError(t, err) 115 } 116 117 data, err := testee.list() 118 assert.NilError(t, err) 119 assert.Equal(t, len(data), len(wholeData)) 120 } 121 122 type contextWithEmbedding struct { 123 embeddedStruct 124 } 125 type embeddedStruct struct { 126 Val string 127 } 128 129 func TestWithEmbedding(t *testing.T) { 130 testDir, err := ioutil.TempDir("", t.Name()) 131 assert.NilError(t, err) 132 defer os.RemoveAll(testDir) 133 testee := metadataStore{root: testDir, config: NewConfig(func() interface{} { return &contextWithEmbedding{} })} 134 testCtxMeta := contextWithEmbedding{ 135 embeddedStruct: embeddedStruct{ 136 Val: "Hello", 137 }, 138 } 139 assert.NilError(t, testee.createOrUpdate(Metadata{Metadata: testCtxMeta, Name: "test"})) 140 res, err := testee.get(contextdirOf("test")) 141 assert.NilError(t, err) 142 assert.Equal(t, testCtxMeta, res.Metadata) 143 }