echoのHandlerのテストは基本公式ドキュメントの通りにやればできる https://echo.labstack.com/guide/testing/
ファイルのアップロードとテキストのパラメータを同時に送る
https://stackoverflow.com/questions/7223616/http-post-file-multipart
import (
"bytes"
"image"
"image/color"
"image/png"
"mime/multipart"
"net/http"
"net/http/httptest"
"net/textproto"
"testing"
"github.com/labstack/echo/v4"
)
func TestUpload(t *testing.T) {
// Setup
e := echo.New()
buf := new(bytes.Buffer)
writer := multipart.NewWriter(buf)
mh := make(textproto.MIMEHeader)
mh.Set("Content-Type", "text/plain")
fw, err := writer.CreateFormField("fileName")
if err != nil {
t.Error(err)
}
fw.Write([]byte("my-name"))
tw, err := writer.CreateFormField("timestamp")
if err != nil {
t.Error(err)
}
tw.Write([]byte("20220102150607"))
// create the form data
part, err := writer.CreateFormFile("file", "someimg.png")
if err != nil {
t.Error(err)
}
// https://yourbasic.org/golang/create-image/
img := createImage()
err = png.Encode(part, img)
if err != nil {
t.Error(err)
}
// 忘れると終了メッセージが書かれない
writer.Close()
req := httptest.NewRequest(http.MethodPost, "/", buf)
req.Header.Set(echo.HeaderContentType, writer.FormDataContentType())
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
c.SetPath("/upload")
h := &handler{}
err = h.Upload(c)
if err != nil {
t.Errorf("Should not be error: %v", err)
}
if rec.Code != http.StatusOK {
t.Errorf("Not ok: %v", rec.Code)
}
if rec.Body.String() != `{"result":"success"}` {
t.Errorf("Not match: %v", rec.Body.String())
}
}
func createImage() *image.RGBA {
width := 200
height := 100
upLeft := image.Point{0, 0}
lowRight := image.Point{width, height}
img := image.NewRGBA(image.Rectangle{upLeft, lowRight})
// Colors are defined by Red, Green, Blue, Alpha uint8 values.
cyan := color.RGBA{100, 200, 200, 0xff}
// Set color for each pixel.
for x := 0; x < width; x++ {
for y := 0; y < height; y++ {
switch {
case x < width/2 && y < height/2: // upper left quadrant
img.Set(x, y, cyan)
case x >= width/2 && y >= height/2: // lower right quadrant
img.Set(x, y, color.White)
default:
// Use zero value.
}
}
}
return img
}