Преглед изворни кода

SVI Начало добавления тестов

SVI пре 10 месеци
родитељ
комит
c72fbb622e

+ 7 - 4
internal/store/store.go

@@ -3,7 +3,6 @@ package store
 
 import (
 	"fmt"
-	"log"
 	"os"
 	"strings"
 
@@ -45,6 +44,9 @@ func NewStore(serv types.IService) (*Store, error) {
 
 // Put -- размещает в хранилище ключ и значение
 func (sf *Store) Put(key string, val []byte) error {
+	if key == "" {
+		return fmt.Errorf("Store.Put(): key is empty")
+	}
 	err := sf.db.Put([]byte(key), val, nil)
 	if err != nil {
 		return fmt.Errorf("Store.Put(): key=%q\terr=\n\t%w", key, err)
@@ -78,15 +80,16 @@ func (sf *Store) Find(prefixKey string) ([]string, error) {
 }
 
 // Del -- удаление ключа из базы
-func (sf *Store) Del(key string) {
+func (sf *Store) Del(key string) error {
 	err := sf.db.Delete([]byte(key), nil)
 	if err != nil {
-		log.Printf("Store.Del(): key=%q\terr=\n\t%v\n", key, err)
+		return fmt.Errorf("Store.Del(): key=%q\terr=\n\t%w", key, err)
 	}
+	return nil
 }
 
 // Ожидание закрытия приложения
 func (sf *Store) close() {
 	<-sf.serv.Ctx().Done()
-	sf.db.Close()
+	_ = sf.db.Close()
 }

+ 145 - 0
internal/store/store_test.go

@@ -0,0 +1,145 @@
+package store
+
+import (
+	"os"
+	"testing"
+
+	"git.p78su.freemyip.com/svi/gostore/pkg/mock/mock_service"
+)
+
+type tester struct {
+	t     *testing.T
+	serv  *mock_service.MockService
+	store *Store
+}
+
+func TestStore(t *testing.T) {
+	fnClear := func() {
+		_ = os.RemoveAll("./store")
+	}
+	fnClear()
+	defer fnClear()
+	sf := &tester{
+		t: t,
+	}
+	sf.create()
+	sf.put()
+	sf.get()
+	sf.find()
+	sf.del()
+	sf.close()
+}
+
+// Закрытие хранилища
+func (sf *tester) close() {
+	sf.t.Log("close")
+	sf.serv.CancelApp()
+	sf.store.close()
+}
+
+// Удалет ключ из хранилища
+func (sf *tester) del() {
+	sf.t.Log("del")
+	err := sf.store.Del("k")
+	if err != nil {
+		sf.t.Fatalf("del(): err=%v", err)
+	}
+}
+
+// Ищет ключи по префиксу
+func (sf *tester) find() {
+	sf.t.Log("find")
+	lstKey, err := sf.store.Find("key")
+	if err != nil {
+		sf.t.Fatalf("find(): err=%v", err)
+	}
+	if len(lstKey) != 1 {
+		sf.t.Fatalf("find(): len(lstKey)=%v", len(lstKey))
+	}
+}
+
+// get -- проверяет получение значения из хранилища
+func (sf *tester) get() {
+	sf.t.Log("get")
+	sf.getBad1()
+	sf.getGood1()
+}
+
+func (sf *tester) getGood1() {
+	sf.t.Log("getGood1")
+	binVal, err := sf.store.Get("key")
+	if err != nil {
+		sf.t.Fatalf("getGood1(): err=%v", err)
+	}
+	if binVal == nil {
+		sf.t.Fatalf("getGood1(): binVal==nil")
+	}
+	if len(binVal) != 0 {
+		sf.t.Fatalf("getGood1(): len(binVal)=%v", len(binVal))
+	}
+}
+
+// Нет такого ключа
+func (sf *tester) getBad1() {
+	sf.t.Log("getBad1")
+	_, err := sf.store.Get("ke")
+	if err == nil {
+		sf.t.Fatalf("getBad1(): err==nil")
+	}
+}
+
+// put -- проверяет размещение ключа в хранилище
+func (sf *tester) put() {
+	sf.t.Log("put")
+	sf.putBad1()
+	sf.putGood1()
+}
+
+func (sf *tester) putGood1() {
+	sf.t.Log("putGood1")
+	err := sf.store.Put("key", nil)
+	if err != nil {
+		sf.t.Fatalf("putGood1(): err=%v", err)
+	}
+}
+
+// putBad1 -- нет ключа для хранилища
+func (sf *tester) putBad1() {
+	sf.t.Log("putBad1")
+	err := sf.store.Put("", nil)
+	if err == nil {
+		sf.t.Fatalf("putBad1(): err==nil")
+	}
+}
+
+// create -- создает хранилище
+func (sf *tester) create() {
+	sf.t.Log("create")
+	sf.createBad1()
+	sf.createGood1()
+}
+
+func (sf *tester) createGood1() {
+	sf.t.Log("createGood1")
+	sf.serv = mock_service.NewMockService()
+	var err error
+	sf.store, err = NewStore(sf.serv)
+	if err != nil {
+		sf.t.Fatalf("createGood1(): in create IStoreDisk, err=\n\t%v", err)
+	}
+	if sf.store == nil {
+		sf.t.Fatalf("createGood1(): store==nil")
+	}
+}
+
+// createBad1 -- нет объекта сервиса
+func (sf *tester) createBad1() {
+	sf.t.Log("createBad1")
+	store, err := NewStore(nil)
+	if err == nil {
+		sf.t.Fatalf("createBad1(): err==nil")
+	}
+	if store != nil {
+		sf.t.Fatalf("createBad1(): store!=nil")
+	}
+}

+ 2 - 0
pkg/mock/mock.go

@@ -0,0 +1,2 @@
+// package mock -- инфраструктура для тестирования
+package mock

+ 52 - 0
pkg/mock/mock_service/mock_service.go

@@ -0,0 +1,52 @@
+// package mock_service -- мок-сервис для тестирования
+package mock_service
+
+import (
+	"context"
+
+	"git.p78su.freemyip.com/svi/gostore/pkg/types"
+)
+
+// MockService -- мок-сервис для тестирования
+type MockService struct {
+	fnCancel  func()
+	ctx       context.Context
+	ServHttp_ types.IServHttp
+	Store_    types.IStore
+}
+
+// NewMockService -- возвращает новый мок-сервис
+func NewMockService() *MockService {
+	ctxBg := context.Background()
+	ctx, fnCancel := context.WithCancel(ctxBg)
+	sf := &MockService{
+		ctx:      ctx,
+		fnCancel: fnCancel,
+	}
+	return sf
+}
+
+// Store -- возвращает хранилище
+func (sf *MockService) Store() types.IStore {
+	return sf.Store_
+}
+
+// ServHttp -- возвращает HTTP-сервис
+func (sf *MockService) ServHttp() types.IServHttp {
+	return sf.ServHttp_
+}
+
+// Run -- запускает сервис в работу
+func (sf *MockService) Run() error {
+	return nil
+}
+
+// Ctx -- возвращает контекст приложения
+func (sf *MockService) Ctx() context.Context {
+	return sf.ctx
+}
+
+// CancelApp -- отменяет контекст приложения
+func (sf *MockService) CancelApp() {
+	sf.fnCancel()
+}

+ 1 - 1
pkg/types/istore.go

@@ -7,7 +7,7 @@ type IStore interface {
 	// Get -- получить запись
 	Get(key string) (val []byte, err error)
 	// Del -- удаляет запись по ключу
-	Del(key string)
+	Del(key string) error
 	// Find -- найти ключи по префиксу
 	Find(prefixKey string) ([]string, error)
 }

+ 9 - 0
pkg/types/types_test.go

@@ -0,0 +1,9 @@
+package types
+
+import (
+	"testing"
+)
+
+func TestTypes(t *testing.T) {
+	// TODO
+}