Feat: add more tests
This commit is contained in:
25
docs/docs.go
25
docs/docs.go
@@ -86,7 +86,10 @@ const docTemplate = `{
|
|||||||
],
|
],
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "OK"
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/api.postImageOutput"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"401": {
|
"401": {
|
||||||
"description": "Unauthorized"
|
"description": "Unauthorized"
|
||||||
@@ -264,6 +267,9 @@ const docTemplate = `{
|
|||||||
"type": "integer"
|
"type": "integer"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"extension": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"id": {
|
"id": {
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
@@ -275,6 +281,23 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"api.postImageOutput": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"extension": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"id": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"uploadedAt": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"uploadedUserId": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"api.putImageAliasesInput": {
|
"api.putImageAliasesInput": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
|||||||
@@ -78,7 +78,10 @@
|
|||||||
],
|
],
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "OK"
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/api.postImageOutput"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"401": {
|
"401": {
|
||||||
"description": "Unauthorized"
|
"description": "Unauthorized"
|
||||||
@@ -256,6 +259,9 @@
|
|||||||
"type": "integer"
|
"type": "integer"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"extension": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"id": {
|
"id": {
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
@@ -267,6 +273,23 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"api.postImageOutput": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"extension": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"id": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"uploadedAt": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"uploadedUserId": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"api.putImageAliasesInput": {
|
"api.putImageAliasesInput": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ definitions:
|
|||||||
items:
|
items:
|
||||||
type: integer
|
type: integer
|
||||||
type: array
|
type: array
|
||||||
|
extension:
|
||||||
|
type: string
|
||||||
id:
|
id:
|
||||||
type: integer
|
type: integer
|
||||||
uploadedAt:
|
uploadedAt:
|
||||||
@@ -20,6 +22,17 @@ definitions:
|
|||||||
uploadedUserId:
|
uploadedUserId:
|
||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
|
api.postImageOutput:
|
||||||
|
properties:
|
||||||
|
extension:
|
||||||
|
type: string
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
uploadedAt:
|
||||||
|
type: string
|
||||||
|
uploadedUserId:
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
api.putImageAliasesInput:
|
api.putImageAliasesInput:
|
||||||
properties:
|
properties:
|
||||||
aliases:
|
aliases:
|
||||||
@@ -97,6 +110,8 @@ paths:
|
|||||||
responses:
|
responses:
|
||||||
"200":
|
"200":
|
||||||
description: OK
|
description: OK
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/api.postImageOutput'
|
||||||
"401":
|
"401":
|
||||||
description: Unauthorized
|
description: Unauthorized
|
||||||
/api/image/{id}:
|
/api/image/{id}:
|
||||||
|
|||||||
@@ -1,16 +1,21 @@
|
|||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"slices"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gitea.konchin.com/go2025/backend/middlewares"
|
"gitea.konchin.com/go2025/backend/middlewares"
|
||||||
|
"gitea.konchin.com/go2025/backend/tracing"
|
||||||
"github.com/uptrace/bunrouter"
|
"github.com/uptrace/bunrouter"
|
||||||
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
type getImagesOutputImage struct {
|
type getImagesOutputImage struct {
|
||||||
Id int64 `json:"id"`
|
Id int64 `json:"id"`
|
||||||
|
Extension string `json:"extension"`
|
||||||
Uploader string `json:"uploadedUserId"`
|
Uploader string `json:"uploadedUserId"`
|
||||||
UploadTS int64 `json:"uploadedAt"`
|
UploadTS int64 `json:"uploadedAt"`
|
||||||
AliasesIds []int64 `json:"aliasesIds"`
|
AliasesIds []int64 `json:"aliasesIds"`
|
||||||
@@ -29,11 +34,18 @@ func (self *Handlers) GetImages(
|
|||||||
) error {
|
) error {
|
||||||
ctx := req.Context()
|
ctx := req.Context()
|
||||||
|
|
||||||
|
rmf := func(s string) bool { return len(s) == 0 }
|
||||||
rawReqImages := strings.Split(req.URL.Query().Get("images"), ",")
|
rawReqImages := strings.Split(req.URL.Query().Get("images"), ",")
|
||||||
|
rawReqImages = slices.DeleteFunc(rawReqImages, rmf)
|
||||||
rawReqAliases := strings.Split(req.URL.Query().Get("aliases"), ",")
|
rawReqAliases := strings.Split(req.URL.Query().Get("aliases"), ",")
|
||||||
|
rawReqAliases = slices.DeleteFunc(rawReqAliases, rmf)
|
||||||
|
|
||||||
if (len(rawReqImages) == 0 && len(rawReqAliases) == 0) ||
|
if (len(rawReqImages) == 0 && len(rawReqAliases) == 0) ||
|
||||||
(len(rawReqImages) > 0 && len(rawReqAliases) > 0) {
|
(len(rawReqImages) > 0 && len(rawReqAliases) > 0) {
|
||||||
|
tracing.Logger.Ctx(ctx).
|
||||||
|
Debug("rawReq",
|
||||||
|
zap.String("rawReqImages", fmt.Sprintf("%+v", rawReqImages)),
|
||||||
|
zap.String("rawReqAlias", fmt.Sprintf("%+v", rawReqAliases)))
|
||||||
return middlewares.HTTPError{
|
return middlewares.HTTPError{
|
||||||
StatusCode: http.StatusBadRequest,
|
StatusCode: http.StatusBadRequest,
|
||||||
Message: "images and aliases should exist exactly one",
|
Message: "images and aliases should exist exactly one",
|
||||||
@@ -79,6 +91,7 @@ func (self *Handlers) GetImages(
|
|||||||
}
|
}
|
||||||
output = append(output, getImagesOutputImage{
|
output = append(output, getImagesOutputImage{
|
||||||
Id: img.Id,
|
Id: img.Id,
|
||||||
|
Extension: img.Extension,
|
||||||
Uploader: img.Uploader,
|
Uploader: img.Uploader,
|
||||||
UploadTS: img.UploadTS.Unix(),
|
UploadTS: img.UploadTS.Unix(),
|
||||||
AliasesIds: aliases,
|
AliasesIds: aliases,
|
||||||
|
|||||||
@@ -8,17 +8,23 @@ import (
|
|||||||
"gitea.konchin.com/go2025/backend/middlewares"
|
"gitea.konchin.com/go2025/backend/middlewares"
|
||||||
"gitea.konchin.com/go2025/backend/models"
|
"gitea.konchin.com/go2025/backend/models"
|
||||||
"gitea.konchin.com/go2025/backend/types"
|
"gitea.konchin.com/go2025/backend/types"
|
||||||
"gitea.konchin.com/go2025/backend/utils"
|
|
||||||
"github.com/uptrace/bunrouter"
|
"github.com/uptrace/bunrouter"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type postImageOutput struct {
|
||||||
|
Id int64 `json:"id"`
|
||||||
|
Extension string `json:"extension"`
|
||||||
|
Uploader string `json:"uploadedUserId"`
|
||||||
|
UploadTS time.Time `json:"uploadedAt"`
|
||||||
|
}
|
||||||
|
|
||||||
// PostImage
|
// PostImage
|
||||||
//
|
//
|
||||||
// @param userinfo header string true "userinfo from /auth/gen-login-url"
|
// @param userinfo header string true "userinfo from /auth/gen-login-url"
|
||||||
// @accept image/png
|
// @accept image/png
|
||||||
// @accept image/jpeg
|
// @accept image/jpeg
|
||||||
// @accept image/gif
|
// @accept image/gif
|
||||||
// @success 200
|
// @success 200 {object} postImageOutput
|
||||||
// @failure 401
|
// @failure 401
|
||||||
// @router /api/image [post]
|
// @router /api/image [post]
|
||||||
func (self *Handlers) PostImage(
|
func (self *Handlers) PostImage(
|
||||||
@@ -65,5 +71,10 @@ func (self *Handlers) PostImage(
|
|||||||
OriginError: err,
|
OriginError: err,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return utils.Success(w)
|
return bunrouter.JSON(w, postImageOutput{
|
||||||
|
Id: image.Id,
|
||||||
|
Extension: image.Extension,
|
||||||
|
Uploader: image.Uploader,
|
||||||
|
UploadTS: image.UploadTS,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ func (self *BunDatabase) GetImages(
|
|||||||
if len(imageIds) > 0 {
|
if len(imageIds) > 0 {
|
||||||
err := self.db.NewSelect().
|
err := self.db.NewSelect().
|
||||||
Model(&ret).
|
Model(&ret).
|
||||||
Where("image_id IN (?)", bun.In(imageIds)).
|
Where("id IN (?)", bun.In(imageIds)).
|
||||||
Relation("Aliases").
|
Relation("Aliases").
|
||||||
Scan(ctx)
|
Scan(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -178,7 +178,7 @@ func (self *BunDatabase) UpdateAliases(
|
|||||||
}
|
}
|
||||||
_, err := self.db.NewInsert().
|
_, err := self.db.NewInsert().
|
||||||
Model(&aliases).
|
Model(&aliases).
|
||||||
On("CONFLICT (id) DO NOTHING").
|
On("CONFLICT (name) DO NOTHING").
|
||||||
Exec(ctx)
|
Exec(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -193,7 +193,7 @@ func (self *BunDatabase) UpdateAliases(
|
|||||||
}
|
}
|
||||||
_, err = self.db.NewInsert().
|
_, err = self.db.NewInsert().
|
||||||
Model(&rels).
|
Model(&rels).
|
||||||
On("CONFLICT (alias_id, image_id) DO NOTHING").
|
On(`CONFLICT ("alias_id", "image_id") DO NOTHING`).
|
||||||
Exec(ctx)
|
Exec(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ type Alias struct {
|
|||||||
bun.BaseModel `bun:"table:alias"`
|
bun.BaseModel `bun:"table:alias"`
|
||||||
|
|
||||||
Id int64 `bun:"id,pk,autoincrement"`
|
Id int64 `bun:"id,pk,autoincrement"`
|
||||||
Name string `bun:"name,notnull"`
|
Name string `bun:"name,unique"`
|
||||||
|
|
||||||
Images []Image `bun:"m2m:alias_image,join:Alias=Image"`
|
Images []Image `bun:"m2m:alias_image,join:Alias=Image"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package main
|
package tests
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_02_GetImages(t *testing.T) {
|
|
||||||
resp, err := client.R().
|
|
||||||
Get("http://localhost:8080/api/aliases")
|
|
||||||
if err != nil || resp.StatusCode() != http.StatusOK {
|
|
||||||
t.Logf("%+v", resp)
|
|
||||||
t.Fatal("failed to fetch aliases")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
37
tests/02_postImage_test.go
Normal file
37
tests/02_postImage_test.go
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
package tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type postImagePayload struct {
|
||||||
|
Id int64 `json:"id"`
|
||||||
|
Extension string `json:"extension"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var rawImage []byte
|
||||||
|
var image postImagePayload
|
||||||
|
|
||||||
|
func Test_02_PostImage(t *testing.T) {
|
||||||
|
f, err := os.Open("resources/huh.png")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("failed to open test png")
|
||||||
|
}
|
||||||
|
rawImage, err = io.ReadAll(f)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("failed to read from file")
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := client.R().
|
||||||
|
SetBody(rawImage).
|
||||||
|
SetResult(&image).
|
||||||
|
Post("http://localhost:8080/api/image")
|
||||||
|
|
||||||
|
if err != nil || resp.StatusCode() != http.StatusOK {
|
||||||
|
t.Logf("%+v", resp)
|
||||||
|
t.Fatal("failed to post image")
|
||||||
|
}
|
||||||
|
}
|
||||||
25
tests/03_putImageAliases_test.go
Normal file
25
tests/03_putImageAliases_test.go
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type putImageAliasPayload struct {
|
||||||
|
Aliases []string `json:"aliases"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_03_PutImageAliases(t *testing.T) {
|
||||||
|
payload := putImageAliasPayload{
|
||||||
|
Aliases: []string{"huh"},
|
||||||
|
}
|
||||||
|
resp, err := client.R().
|
||||||
|
SetBody(payload).
|
||||||
|
Put(fmt.Sprintf("http://localhost:8080/api/image/%d/aliases",
|
||||||
|
image.Id))
|
||||||
|
if err != nil || resp.StatusCode() != http.StatusOK {
|
||||||
|
t.Logf("%+v", resp)
|
||||||
|
t.Fatal("failed to put image alias")
|
||||||
|
}
|
||||||
|
}
|
||||||
26
tests/04_getAliases_test.go
Normal file
26
tests/04_getAliases_test.go
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type aliasPayload struct {
|
||||||
|
Id int64 `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var aliases []aliasPayload
|
||||||
|
|
||||||
|
func Test_04_GetAliases(t *testing.T) {
|
||||||
|
resp, err := client.R().
|
||||||
|
SetResult(&aliases).
|
||||||
|
Get("http://localhost:8080/api/aliases")
|
||||||
|
if err != nil || resp.StatusCode() != http.StatusOK {
|
||||||
|
t.Logf("%+v", resp)
|
||||||
|
t.Fatal("failed to get aliases")
|
||||||
|
}
|
||||||
|
if len(aliases) == 0 {
|
||||||
|
t.Fatal("no aliases")
|
||||||
|
}
|
||||||
|
}
|
||||||
28
tests/05_getImages_test.go
Normal file
28
tests/05_getImages_test.go
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_05_GetImages(t *testing.T) {
|
||||||
|
t.Run("check with alias id", func(t *testing.T) {
|
||||||
|
resp, err := client.R().
|
||||||
|
SetQueryParam("aliases", strconv.FormatInt(aliases[0].Id, 10)).
|
||||||
|
Get("http://localhost:8080/api/images")
|
||||||
|
if err != nil || resp.StatusCode() != http.StatusOK {
|
||||||
|
t.Logf("%+v", resp)
|
||||||
|
t.Fatal("failed to get images by alias id")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
t.Run("check with image id", func(t *testing.T) {
|
||||||
|
resp, err := client.R().
|
||||||
|
SetQueryParam("images", strconv.FormatInt(image.Id, 10)).
|
||||||
|
Get("http://localhost:8080/api/images")
|
||||||
|
if err != nil || resp.StatusCode() != http.StatusOK {
|
||||||
|
t.Logf("%+v", resp)
|
||||||
|
t.Fatal("failed to get images by image id")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
21
tests/06_getImage_test.go
Normal file
21
tests/06_getImage_test.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_06_GetImage(t *testing.T) {
|
||||||
|
resp, err := client.R().
|
||||||
|
Get(fmt.Sprintf("http://localhost:8080/img/%d.%s",
|
||||||
|
image.Id, image.Extension))
|
||||||
|
if err != nil || resp.StatusCode() != http.StatusOK {
|
||||||
|
t.Fatal("failed to get image")
|
||||||
|
}
|
||||||
|
|
||||||
|
if bytes.Compare(rawImage, resp.Body()) != 0 {
|
||||||
|
t.Fatal("image differ")
|
||||||
|
}
|
||||||
|
}
|
||||||
29
tests/07_deleteAlias_test.go
Normal file
29
tests/07_deleteAlias_test.go
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_07_DeleteAlias(t *testing.T) {
|
||||||
|
resp, err := client.R().
|
||||||
|
Delete(fmt.Sprintf("http://localhost:8080/api/alias/%d",
|
||||||
|
aliases[0].Id))
|
||||||
|
if err != nil || resp.StatusCode() != http.StatusOK {
|
||||||
|
t.Logf("%+v", resp)
|
||||||
|
t.Fatal("failed to delete alias")
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err = client.R().
|
||||||
|
SetResult(&aliases).
|
||||||
|
Get("http://localhost:8080/api/aliases")
|
||||||
|
if err != nil || resp.StatusCode() != http.StatusOK {
|
||||||
|
t.Logf("%+v", resp)
|
||||||
|
t.Fatal("failed to get aliases")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(aliases) > 0 {
|
||||||
|
t.Fatal("alias not deleted")
|
||||||
|
}
|
||||||
|
}
|
||||||
46
tests/08_deleteImage_test.go
Normal file
46
tests/08_deleteImage_test.go
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type getImagesPayload struct {
|
||||||
|
Id int64 `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_08_DeleteImage(t *testing.T) {
|
||||||
|
resp, err := client.R().
|
||||||
|
SetBody(rawImage).
|
||||||
|
SetResult(&image).
|
||||||
|
Post("http://localhost:8080/api/image")
|
||||||
|
if err != nil || resp.StatusCode() != http.StatusOK {
|
||||||
|
t.Logf("%+v", resp)
|
||||||
|
t.Fatal("failed to post image")
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err = client.R().
|
||||||
|
Delete(fmt.Sprintf("http://localhost:8080/api/image/%d",
|
||||||
|
image.Id))
|
||||||
|
if err != nil || resp.StatusCode() != http.StatusOK {
|
||||||
|
t.Logf("%+v", resp)
|
||||||
|
t.Fatal("failed to delete image")
|
||||||
|
}
|
||||||
|
|
||||||
|
var imgs []getImagesPayload
|
||||||
|
|
||||||
|
resp, err = client.R().
|
||||||
|
SetResult(&imgs).
|
||||||
|
SetQueryParam("images", strconv.FormatInt(image.Id, 10)).
|
||||||
|
Get("http://localhost:8080/api/images")
|
||||||
|
if err != nil || resp.StatusCode() != http.StatusOK {
|
||||||
|
t.Logf("%+v", resp)
|
||||||
|
t.Fatal("failed to get image by image id")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(imgs) > 0 {
|
||||||
|
t.Fatal("image not deleted")
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
tests/resources/huh.png
Normal file
BIN
tests/resources/huh.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 170 KiB |
Reference in New Issue
Block a user