Initial QSfera import
This commit is contained in:
@@ -0,0 +1,198 @@
|
||||
package thumbnail
|
||||
|
||||
import (
|
||||
"image"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/qsfera/server/services/thumbnails/pkg/errors"
|
||||
"github.com/qsfera/server/services/thumbnails/pkg/preprocessor"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/google/go-cmp/cmp/cmpopts"
|
||||
|
||||
"github.com/qsfera/server/pkg/log"
|
||||
"github.com/qsfera/server/services/thumbnails/pkg/thumbnail/storage"
|
||||
)
|
||||
|
||||
type NoOpManager struct {
|
||||
storage.Storage
|
||||
}
|
||||
|
||||
func (m NoOpManager) BuildKey(_ storage.Request) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m NoOpManager) Set(_, _ string, _ []byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func BenchmarkGet(b *testing.B) {
|
||||
|
||||
sut := NewSimpleManager(
|
||||
Resolutions{},
|
||||
NoOpManager{},
|
||||
log.NewLogger(),
|
||||
6016,
|
||||
4000,
|
||||
)
|
||||
|
||||
res, _ := ParseResolution("32x32")
|
||||
req := Request{
|
||||
Resolution: res,
|
||||
Checksum: "1872ade88f3013edeb33decd74a4f947",
|
||||
}
|
||||
cwd, _ := os.Getwd()
|
||||
p := filepath.Join(cwd, "../../testdata/test.png")
|
||||
f, _ := os.Open(p)
|
||||
defer f.Close()
|
||||
img, ext, _ := image.Decode(f)
|
||||
req.Encoder, _ = EncoderForType(ext)
|
||||
for i := 0; i < b.N; i++ {
|
||||
_, _ = sut.Generate(req, img)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPrepareRequest(t *testing.T) {
|
||||
type args struct {
|
||||
width int
|
||||
height int
|
||||
tType string
|
||||
checksum string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want Request
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "Test successful prepare the request for jpg",
|
||||
args: args{
|
||||
width: 32,
|
||||
height: 32,
|
||||
tType: "jpg",
|
||||
checksum: "1872ade88f3013edeb33decd74a4f947",
|
||||
},
|
||||
want: Request{
|
||||
Resolution: image.Rect(0, 0, 32, 32),
|
||||
Encoder: JpegEncoder{},
|
||||
Generator: SimpleGenerator{},
|
||||
Checksum: "1872ade88f3013edeb33decd74a4f947",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Test successful prepare the request for png",
|
||||
args: args{
|
||||
width: 32,
|
||||
height: 32,
|
||||
tType: "png",
|
||||
checksum: "1872ade88f3013edeb33decd74a4f947",
|
||||
},
|
||||
want: Request{
|
||||
Resolution: image.Rect(0, 0, 32, 32),
|
||||
Encoder: PngEncoder{},
|
||||
Generator: SimpleGenerator{},
|
||||
Checksum: "1872ade88f3013edeb33decd74a4f947",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Test successful prepare the request for gif",
|
||||
args: args{
|
||||
width: 32,
|
||||
height: 32,
|
||||
tType: "gif",
|
||||
checksum: "1872ade88f3013edeb33decd74a4f947",
|
||||
},
|
||||
want: Request{
|
||||
Resolution: image.Rect(0, 0, 32, 32),
|
||||
Encoder: GifEncoder{},
|
||||
Generator: GifGenerator{},
|
||||
Checksum: "1872ade88f3013edeb33decd74a4f947",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Test error when prepare the request for bmp",
|
||||
args: args{
|
||||
width: 32,
|
||||
height: 32,
|
||||
tType: "bmp",
|
||||
checksum: "1872ade88f3013edeb33decd74a4f947",
|
||||
},
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := PrepareRequest(tt.args.width, tt.args.height, tt.args.tType, tt.args.checksum, "")
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("PrepareRequest() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
// funcs are not reflactable, ignore
|
||||
if diff := cmp.Diff(tt.want, got, cmpopts.IgnoreFields(Request{}, "Generator")); diff != "" {
|
||||
t.Errorf("PrepareRequest(): %v", diff)
|
||||
}
|
||||
if reflect.TypeOf(got.Generator) != reflect.TypeOf(tt.want.Generator) {
|
||||
t.Errorf("PrepareRequest() = %v, want %v", reflect.TypeOf(got.Generator), reflect.TypeOf(tt.want.Generator))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestPreviewGenerationTooBigImage(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
fileName string
|
||||
mimeType string
|
||||
}{
|
||||
{name: "png", mimeType: "image/png", fileName: "../../testdata/test.png"},
|
||||
{name: "jpg", mimeType: "image/jpeg", fileName: "../../testdata/test.jpg"},
|
||||
{name: "ggs", mimeType: "application/vnd.geogebra.slides", fileName: "../../testdata/test.ggs"},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
sut := NewSimpleManager(
|
||||
Resolutions{},
|
||||
NoOpManager{},
|
||||
log.NewLogger(),
|
||||
1024,
|
||||
768,
|
||||
)
|
||||
|
||||
res, _ := ParseResolution("32x32")
|
||||
req := Request{
|
||||
Resolution: res,
|
||||
Checksum: "1872ade88f3013edeb33decd74a4f947",
|
||||
}
|
||||
cwd, _ := os.Getwd()
|
||||
p := filepath.Join(cwd, tt.fileName)
|
||||
f, _ := os.Open(p)
|
||||
defer f.Close()
|
||||
|
||||
preproc := preprocessor.ForType(tt.mimeType, nil)
|
||||
convert, err := preproc.Convert(f)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
ext := path.Ext(tt.fileName)
|
||||
req.Encoder, _ = EncoderForType(ext)
|
||||
req.Generator, err = GeneratorFor(ext, "fit")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
generate, err := sut.Generate(req, convert)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
assert.ErrorIs(t, err, errors.ErrImageTooLarge)
|
||||
assert.Equal(t, "", generate)
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user