github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/graveler/committed/unmarshal_iterator_test.go (about)

     1  package committed_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/go-test/deep"
     7  	"github.com/golang/mock/gomock"
     8  	"github.com/treeverse/lakefs/pkg/graveler"
     9  	"github.com/treeverse/lakefs/pkg/graveler/committed"
    10  	"github.com/treeverse/lakefs/pkg/graveler/committed/mock"
    11  )
    12  
    13  func TestUnmarshalIterator(t *testing.T) {
    14  	tests := []struct {
    15  		Name   string
    16  		Keys   []graveler.Key
    17  		Values []*graveler.Value
    18  	}{
    19  		{
    20  			Name:   "empty",
    21  			Keys:   make([]graveler.Key, 0),
    22  			Values: make([]*graveler.Value, 0),
    23  		},
    24  		{
    25  			Name:   "one",
    26  			Keys:   []graveler.Key{graveler.Key("k1")},
    27  			Values: []*graveler.Value{{Identity: []byte(""), Data: []byte("")}},
    28  		},
    29  		{
    30  			Name: "two",
    31  			Keys: []graveler.Key{
    32  				graveler.Key("k1"),
    33  				graveler.Key("k2"),
    34  			},
    35  			Values: []*graveler.Value{
    36  				{Identity: []byte("id1"), Data: []byte("data1")},
    37  				{Identity: []byte("id2"), Data: []byte("data2")},
    38  			},
    39  		},
    40  	}
    41  
    42  	for _, tt := range tests {
    43  		t.Run(tt.Name, func(t *testing.T) {
    44  			ctrl := gomock.NewController(t)
    45  			defer ctrl.Finish()
    46  
    47  			// we expect the iterator to call our iterator n+1 times and check an error on the last call
    48  			mockIt := mock.NewMockValueIterator(ctrl)
    49  			mockIt.EXPECT().Next().Times(len(tt.Keys)).
    50  				Return(true)
    51  			for i := range tt.Keys {
    52  				mockIt.EXPECT().Value().Times(1).
    53  					Return(&committed.Record{
    54  						Key:   committed.Key(tt.Keys[i]),
    55  						Value: committed.MustMarshalValue(tt.Values[i]),
    56  					})
    57  			}
    58  			mockIt.EXPECT().Next().Times(1).Return(false)
    59  			mockIt.EXPECT().Err().Times(1).Return(nil)
    60  
    61  			// use the iterator and collect the values
    62  			keys := make([]graveler.Key, 0)
    63  			values := make([]*graveler.Value, 0)
    64  			it := committed.NewUnmarshalIterator(mockIt)
    65  			for it.Next() {
    66  				v := it.Value()
    67  				if v == nil {
    68  					t.Fatal("Iterator return value is nil after next")
    69  				}
    70  				keys = append(keys, v.Key)
    71  				values = append(values, v.Value)
    72  			}
    73  			if err := it.Err(); err != nil {
    74  				t.Fatal("Iteration ended with error", err)
    75  			}
    76  			// verify keys and values
    77  			if diff := deep.Equal(keys, tt.Keys); diff != nil {
    78  				t.Fatal("Difference found in keys", diff)
    79  			}
    80  			if diff := deep.Equal(values, tt.Values); diff != nil {
    81  				t.Fatal("Difference found in values", diff)
    82  			}
    83  		})
    84  	}
    85  }