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  }