added unit testing
This commit is contained in:
80
internal/s3/mock.go
Normal file
80
internal/s3/mock.go
Normal file
@@ -0,0 +1,80 @@
|
||||
package s3
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"crypto/md5"
|
||||
"fmt"
|
||||
|
||||
"git.kapelle.org/niklas/s3share/internal/types"
|
||||
)
|
||||
|
||||
type mockS3 struct {
|
||||
objects map[string]mockObject
|
||||
}
|
||||
|
||||
type mockObject struct {
|
||||
content []byte
|
||||
contentType string
|
||||
}
|
||||
|
||||
type mockObjectReader struct {
|
||||
*bytes.Reader
|
||||
}
|
||||
|
||||
func (r mockObjectReader) Close() error {
|
||||
// NOOP
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewMockS3() S3 {
|
||||
return &mockS3{
|
||||
objects: map[string]mockObject{
|
||||
"test.txt": {
|
||||
content: []byte("test.txt"),
|
||||
contentType: "text/plain",
|
||||
},
|
||||
"test.png": {
|
||||
content: []byte("test.png"),
|
||||
contentType: "image/png",
|
||||
},
|
||||
"dir/test": {
|
||||
content: []byte("test"),
|
||||
contentType: "application/octet-stream",
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (m *mockS3) GetObject(ctx context.Context, key string) (ObjectReader, error) {
|
||||
mockObj, exist := m.objects[key]
|
||||
|
||||
if !exist {
|
||||
return nil, fmt.Errorf("Object not found")
|
||||
}
|
||||
|
||||
reader := bytes.NewReader(mockObj.content)
|
||||
|
||||
return mockObjectReader{reader}, nil
|
||||
}
|
||||
|
||||
func (m *mockS3) GetObjectMetadata(ctx context.Context, key string) (*types.Metadata, error) {
|
||||
mockObj, exist := m.objects[key]
|
||||
|
||||
if !exist {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return &types.Metadata{
|
||||
Size: int64(len(mockObj.content)),
|
||||
ETag: fmt.Sprintf("%x", md5.Sum(mockObj.content)),
|
||||
ContentType: mockObj.contentType,
|
||||
}, nil
|
||||
|
||||
}
|
||||
|
||||
func (m *mockS3) KeyExists(ctx context.Context, key string) (bool, error) {
|
||||
_, exist := m.objects[key]
|
||||
|
||||
return exist, nil
|
||||
}
|
||||
72
internal/s3/mock_test.go
Normal file
72
internal/s3/mock_test.go
Normal file
@@ -0,0 +1,72 @@
|
||||
package s3_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
"git.kapelle.org/niklas/s3share/internal/s3"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func setup(t *testing.T) (s3.S3, context.Context, *assert.Assertions) {
|
||||
service := s3.NewMockS3()
|
||||
ctx := context.Background()
|
||||
assert := assert.New(t)
|
||||
|
||||
return service, ctx, assert
|
||||
}
|
||||
|
||||
func TestGetObject(t *testing.T) {
|
||||
service, ctx, assert := setup(t)
|
||||
|
||||
reader, err := service.GetObject(ctx, "test.txt")
|
||||
assert.NoError(err)
|
||||
assert.NotNil(reader)
|
||||
|
||||
content, err := ioutil.ReadAll(reader)
|
||||
assert.NoError(err)
|
||||
assert.Equal("test.txt", string(content))
|
||||
}
|
||||
|
||||
func TestGetObjectNotFound(t *testing.T) {
|
||||
service, ctx, assert := setup(t)
|
||||
|
||||
reader, err := service.GetObject(ctx, "not_existing.txt")
|
||||
assert.Error(err)
|
||||
assert.Nil(reader)
|
||||
}
|
||||
|
||||
func TestGetMetadata(t *testing.T) {
|
||||
service, ctx, assert := setup(t)
|
||||
|
||||
metadata, err := service.GetObjectMetadata(ctx, "test.txt")
|
||||
assert.NoError(err)
|
||||
assert.NotNil(metadata)
|
||||
assert.Equal("text/plain", metadata.ContentType)
|
||||
assert.Equal(int64(8), metadata.Size)
|
||||
}
|
||||
|
||||
func TestGetMetadataNotFound(t *testing.T) {
|
||||
service, ctx, assert := setup(t)
|
||||
|
||||
metadata, err := service.GetObjectMetadata(ctx, "not_existing.txt")
|
||||
assert.NoError(err)
|
||||
assert.Nil(metadata)
|
||||
}
|
||||
|
||||
func TestKeyExists(t *testing.T) {
|
||||
service, ctx, assert := setup(t)
|
||||
|
||||
exists, err := service.KeyExists(ctx, "test.txt")
|
||||
assert.NoError(err)
|
||||
assert.True(exists)
|
||||
}
|
||||
|
||||
func TestKeyNotExist(t *testing.T) {
|
||||
service, ctx, assert := setup(t)
|
||||
|
||||
exists, err := service.KeyExists(ctx, "not_existing.txt")
|
||||
assert.NoError(err)
|
||||
assert.False(exists)
|
||||
}
|
||||
Reference in New Issue
Block a user