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  }