status-im/status-go

View on GitHub
images/decode_test.go

Summary

Maintainability
A
0 mins
Test Coverage
package images

import (
    "errors"
    "image"
    "net/http"
    "net/http/httptest"
    "testing"

    "github.com/stretchr/testify/require"
)

const (
    path = "../_assets/tests/"
)

func TestDecode(t *testing.T) {

    cs := []struct {
        Filepath string
        Error    bool
        Nil      bool
        Bounds   image.Rectangle
    }{
        {
            "elephant.jpg",
            false,
            false,
            image.Rectangle{
                Min: image.Point{X: 0, Y: 0},
                Max: image.Point{X: 80, Y: 80},
            },
        },
        {
            "status.png",
            false,
            false,
            image.Rectangle{
                Min: image.Point{X: 0, Y: 0},
                Max: image.Point{X: 256, Y: 256},
            },
        },
        {
            "spin.gif",
            false,
            false,
            image.Rectangle{
                Min: image.Point{X: 0, Y: 0},
                Max: image.Point{X: 256, Y: 256},
            },
        },
        {
            "rose.webp",
            false,
            false,
            image.Rectangle{
                Min: image.Point{X: 0, Y: 0},
                Max: image.Point{X: 400, Y: 301},
            },
        },
        {
            "test.aac",
            true,
            true,
            image.Rectangle{},
        },
    }

    for _, c := range cs {
        img, err := Decode(path + c.Filepath)

        if c.Error {
            require.Error(t, err)
        } else {
            require.NoError(t, err)
        }

        if c.Nil {
            require.Nil(t, img)
            continue
        } else {
            require.NotNil(t, img)
        }

        require.Exactly(t, c.Bounds, img.Bounds())
    }
}

func TestDecodeFromURL(t *testing.T) {
    s := httptest.NewServer(http.FileServer(http.Dir(path)))
    defer s.Close()

    cs := []struct {
        Filepath string
        Nil      bool
        Bounds   image.Rectangle
    }{
        {
            s.URL + "/2x1.png",
            false,
            image.Rectangle{
                Min: image.Point{X: 0, Y: 0},
                Max: image.Point{X: 2, Y: 1},
            },
        },
        {
            s.URL + "/1.jpg",
            false,
            image.Rectangle{
                Min: image.Point{X: 0, Y: 0},
                Max: image.Point{X: 1, Y: 1},
            },
        },
        {
            s.URL + "/1.gif",
            false,
            image.Rectangle{
                Min: image.Point{X: 0, Y: 0},
                Max: image.Point{X: 1, Y: 1},
            },
        },
        {
            s.URL + "/1.webp",
            false,
            image.Rectangle{
                Min: image.Point{X: 0, Y: 0},
                Max: image.Point{X: 1, Y: 1},
            },
        },
        {
            s.URL + "/1.webp",
            true,
            image.Rectangle{
                Min: image.Point{X: 0, Y: 0},
                Max: image.Point{X: 10, Y: 10},
            },
        },
    }

    for _, c := range cs {
        img, err := DecodeFromURL(c.Filepath)

        if c.Nil {
            require.Nil(t, err)
        } else {
            require.NoError(t, err)
            require.Exactly(t, c.Bounds, img.Bounds())
        }

    }
}

func TestDecodeFromURL_WithErrors(t *testing.T) {
    s := httptest.NewServer(http.FileServer(http.Dir(path)))
    defer s.Close()

    _, err := DecodeFromURL("https://doesnt-exist.com")
    require.Error(t, err)
}

func TestGetType(t *testing.T) {
    cs := []struct {
        Buf   []byte
        Value ImageType
    }{
        {testJpegBytes, JPEG},
        {testPngBytes, PNG},
        {testGifBytes, GIF},
        {testWebpBytes, WEBP},
        {testAacBytes, UNKNOWN},
    }

    for _, c := range cs {
        require.Exactly(t, c.Value, GetType(c.Buf))
    }
}

func TestGetMimeType(t *testing.T) {
    cs := []struct {
        Buf   []byte
        Value string
        Error error
    }{
        {testJpegBytes, "jpeg", nil},
        {testPngBytes, "png", nil},
        {testGifBytes, "gif", nil},
        {testWebpBytes, "webp", nil},
        {testAacBytes, "", errors.New("image format not supported")},
    }

    for _, c := range cs {
        mt, err := GetMimeType(c.Buf)
        if c.Error == nil {
            require.NoError(t, err)
        } else {
            require.EqualError(t, err, c.Error.Error())
        }

        require.Exactly(t, c.Value, mt)
    }
}