github.com/weaviate/weaviate@v1.24.6/modules/text2vec-contextionary/extensions/usecase_test.go (about)

     1  //                           _       _
     2  // __      _____  __ ___   ___  __ _| |_ ___
     3  // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
     4  //  \ V  V /  __/ (_| |\ V /| | (_| | ||  __/
     5  //   \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
     6  //
     7  //  Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
     8  //
     9  //  CONTACT: hello@weaviate.io
    10  //
    11  
    12  package extensions
    13  
    14  import (
    15  	"bytes"
    16  	"fmt"
    17  	"sort"
    18  	"testing"
    19  
    20  	"github.com/stretchr/testify/assert"
    21  	"github.com/stretchr/testify/require"
    22  	"github.com/weaviate/weaviate/entities/moduletools"
    23  )
    24  
    25  func Test_UseCase(t *testing.T) {
    26  	storage := newFakeStorage()
    27  	uc := NewUseCase(storage)
    28  
    29  	t.Run("storing and loading something", func(t *testing.T) {
    30  		err := uc.Store("concept1", []byte("value1"))
    31  		require.Nil(t, err)
    32  
    33  		err = uc.Store("concept2", []byte("value2"))
    34  		require.Nil(t, err)
    35  
    36  		val, err := uc.Load("concept1")
    37  		require.Nil(t, err)
    38  		assert.Equal(t, []byte("value1"), val)
    39  
    40  		val, err = uc.Load("concept2")
    41  		require.Nil(t, err)
    42  		assert.Equal(t, []byte("value2"), val)
    43  
    44  		vals, err := uc.LoadAll()
    45  		require.Nil(t, err)
    46  		assert.Equal(t, []byte("value1\nvalue2\n"), vals)
    47  	})
    48  
    49  	t.Run("when storing fails", func(t *testing.T) {
    50  		storage.putError = fmt.Errorf("oops")
    51  		err := uc.Store("concept1", []byte("value1"))
    52  		assert.Equal(t, "store concept \"concept1\": oops", err.Error())
    53  	})
    54  
    55  	t.Run("when loading fails", func(t *testing.T) {
    56  		storage.getError = fmt.Errorf("oops")
    57  		_, err := uc.Load("concept1")
    58  		assert.Equal(t, "load concept \"concept1\": oops", err.Error())
    59  	})
    60  }
    61  
    62  func newFakeStorage() *fakeStorage {
    63  	return &fakeStorage{
    64  		store: map[string][]byte{},
    65  	}
    66  }
    67  
    68  type fakeStorage struct {
    69  	store    map[string][]byte
    70  	getError error
    71  	putError error
    72  }
    73  
    74  func (f *fakeStorage) Get(k []byte) ([]byte, error) {
    75  	return f.store[string(k)], f.getError
    76  }
    77  
    78  func (f *fakeStorage) Put(k, v []byte) error {
    79  	f.store[string(k)] = v
    80  	return f.putError
    81  }
    82  
    83  func (f *fakeStorage) Scan(scan moduletools.ScanFn) error {
    84  	var keys [][]byte
    85  	for key := range f.store {
    86  		keys = append(keys, []byte(key))
    87  	}
    88  
    89  	sort.Slice(keys, func(a, b int) bool {
    90  		return bytes.Compare(keys[a], keys[b]) == -1
    91  	})
    92  
    93  	for _, key := range keys {
    94  		scan(key, f.store[string(key)])
    95  	}
    96  
    97  	return nil
    98  }