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  }