github.com/panekj/cli@v0.0.0-20230304125325-467dd2f3797e/cli/manifest/store/store_test.go (about)

     1  package store
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  
     7  	"github.com/docker/cli/cli/manifest/types"
     8  	"github.com/docker/distribution/reference"
     9  	"github.com/google/go-cmp/cmp"
    10  	"gotest.tools/v3/assert"
    11  	is "gotest.tools/v3/assert/cmp"
    12  )
    13  
    14  type fakeRef struct {
    15  	name string
    16  }
    17  
    18  func (f fakeRef) String() string {
    19  	return f.name
    20  }
    21  
    22  func (f fakeRef) Name() string {
    23  	return f.name
    24  }
    25  
    26  func ref(name string) fakeRef {
    27  	return fakeRef{name: name}
    28  }
    29  
    30  func sref(t *testing.T, name string) *types.SerializableNamed {
    31  	t.Helper()
    32  	named, err := reference.ParseNamed("example.com/" + name)
    33  	assert.NilError(t, err)
    34  	return &types.SerializableNamed{Named: named}
    35  }
    36  
    37  func TestStoreRemove(t *testing.T) {
    38  	tmpDir := t.TempDir()
    39  	store := NewStore(tmpDir)
    40  	listRef := ref("list")
    41  	data := types.ImageManifest{Ref: sref(t, "abcdef")}
    42  	assert.NilError(t, store.Save(listRef, ref("manifest"), data))
    43  
    44  	files, err := os.ReadDir(tmpDir)
    45  	assert.NilError(t, err)
    46  	assert.Assert(t, is.Len(files, 1))
    47  
    48  	assert.Check(t, store.Remove(listRef))
    49  	files, err = os.ReadDir(tmpDir)
    50  	assert.NilError(t, err)
    51  	assert.Check(t, is.Len(files, 0))
    52  }
    53  
    54  func TestStoreSaveAndGet(t *testing.T) {
    55  	store := NewStore(t.TempDir())
    56  	listRef := ref("list")
    57  	data := types.ImageManifest{Ref: sref(t, "abcdef")}
    58  	err := store.Save(listRef, ref("exists"), data)
    59  	assert.NilError(t, err)
    60  
    61  	testcases := []struct {
    62  		listRef     reference.Reference
    63  		manifestRef reference.Reference
    64  		expected    types.ImageManifest
    65  		expectedErr string
    66  	}{
    67  		{
    68  			listRef:     listRef,
    69  			manifestRef: ref("exists"),
    70  			expected:    data,
    71  		},
    72  		{
    73  			listRef:     listRef,
    74  			manifestRef: ref("exist:does-not"),
    75  			expectedErr: "No such manifest: exist:does-not",
    76  		},
    77  		{
    78  			listRef:     ref("list:does-not-exist"),
    79  			manifestRef: ref("manifest:does-not-exist"),
    80  			expectedErr: "No such manifest: manifest:does-not-exist",
    81  		},
    82  	}
    83  
    84  	for _, testcase := range testcases {
    85  		testcase := testcase
    86  		t.Run(testcase.manifestRef.String(), func(t *testing.T) {
    87  			actual, err := store.Get(testcase.listRef, testcase.manifestRef)
    88  			if testcase.expectedErr != "" {
    89  				assert.Error(t, err, testcase.expectedErr)
    90  				assert.Check(t, IsNotFound(err))
    91  				return
    92  			}
    93  			assert.NilError(t, err)
    94  			assert.DeepEqual(t, testcase.expected, actual, cmpReferenceNamed)
    95  		})
    96  	}
    97  }
    98  
    99  var cmpReferenceNamed = cmp.Transformer("namedref", func(r reference.Named) string {
   100  	return r.String()
   101  })
   102  
   103  func TestStoreGetList(t *testing.T) {
   104  	store := NewStore(t.TempDir())
   105  	listRef := ref("list")
   106  	first := types.ImageManifest{Ref: sref(t, "first")}
   107  	assert.NilError(t, store.Save(listRef, ref("first"), first))
   108  	second := types.ImageManifest{Ref: sref(t, "second")}
   109  	assert.NilError(t, store.Save(listRef, ref("exists"), second))
   110  
   111  	list, err := store.GetList(listRef)
   112  	assert.NilError(t, err)
   113  	assert.Check(t, is.Len(list, 2))
   114  }
   115  
   116  func TestStoreGetListDoesNotExist(t *testing.T) {
   117  	store := NewStore(t.TempDir())
   118  	listRef := ref("list")
   119  	_, err := store.GetList(listRef)
   120  	assert.Error(t, err, "No such manifest: list")
   121  	assert.Check(t, IsNotFound(err))
   122  }