go-http-easy-test

module
v2.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 23, 2023 License: MIT

README

Go http easy test

Go Reference Go Report Card Go codecov

A package that wraps net/http/httptest and allows you to easily test HTTP Handlers.

✅ Easy
✅ Intuitive
✅ Support application/json
✅ Support application/x-www-form-urlencoded
✅ Support multipart/form-data
✅ Support Echo package
✅ Support cookie

Install

go get -u github.com/cateiru/go-http-easy-test/v2

Mock

The user can choose from the following two options.

  • Actually start the server using httptest.NewServer
  • Mock the Handler arguments (w http.ResponseWriter, r *http.Request)
Actually start the server using httptest.NewServer
package main_test

import (
    "testing"

    "github.com/cateiru/go-http-easy-test/easy"
)

func Handler(w http.ResponseWriter, r *http.Request) {
    ...do something
}

func TestHandler(t *testing.T) {
    mux := http.NewServeMux()
    mux.HandleFunc("/", Handler)

    // create server
    s := easy.NewMockServer(mux)
    // Start the server with TLS using:
    // s := server.TestNewMockTLSServer(mux)
    defer s.Close()

    // Option: You can set cookies.
    cookie := &http.Cookie{
        Name:  "name",
        Value: "value",
    }
    s.Cookie([]*http.Cookie{
        cookie,
    })

    // GET
    resp := s.Get(t, "/")
    resp := s.GetOK(t, "/")

    // POST
    resp := s.Post(t, "/", "text/plain", body)
    resp := s.PostForm(t, "/", url) // application/x-www-form-urlencoded
    resp := s.PostJson(t, "/", obj) // application/json
    resp := s.PostString(t, "/", "text/plain", body)

    // Easily build multipart/form-data
    form := easy.NewMultipart()
    form.Insert("key", "value")
    resp := s.PostFormData(t, "/", form)
    resp := s.FormData(t, "/", "[method]", form)

    // Other
    resp := s.Do(t, "/", "[method]", body)

    // The `resp` of all return values are easy to compare.
    // Check status
    resp.Ok(t)
    resp.Status(t, 200)

    // get body
    body := resp.Body().String()

    // Compare response body
    resp.EqBody(t, body)
    resp.EqJson(t, obj)

    // prase response json
    body := new(JsonType)
    err := resp.Json(body)

    // returns Set-Cookie headers
    cookies := resp.SetCookies()
}
Mock the Handler arguments (w http.ResponseWriter, r *http.Request)
package main_test

import (
    "testing"

    "github.com/cateiru/go-http-easy-test/easy"
)

func Handler(w http.ResponseWriter, r *http.Request) {
    ...do something
}

func EchoHandler(c echo.Context) error {
    ...do something
}

func TestHandler(t *testing.T) {
    // Default
    m, err := easy.NewMock(body, http.MethodGet, "/")
    m, err := easy.NewMockReader(reader, http.MethodGet, "/")

    // GET
    m, err := easy.NewGet(body, "/")

    // POST or PUT send json
    m, err := easy.NewJson("/", data, http.MethodPost)

    // POST or PUT send x-www-form-urlencoded
    m, err := easy.NewURLEncoded("/", url, http.MethodPost)

    // POST or PUT send multipart/form-data
    // Easily build multipart/form-data using the `contents` package.
    m, err := easy.NewFormData("/", multipart, http.MethodPost)


    // Option: set remote addr
    m.SetAddr("203.0.113.0")

    // Option: You can set cookies.
    cookie := &http.Cookie{
        Name:  "name",
        Value: "value",
    }
    m.Cookie([]*http.Cookie{
        cookie,
    })

    // Set handler and run
    m.Handler(Handler)

    // Use echo package
    echoCtx := m.Echo()
    err := EchoHandler(echoCtx)

    // check response
    m.Ok(t)
    m.Status(t, 200)

    // Compare response body
    m.EqBody(t, body)
    m.EqJson(t, obj)

        // prase response json
    body := new(JsonType)
    err := m.Json(body)

    // returns Set-Cookie headers
    cookies := m.SetCookies()

    // Return http.Response
    response := m.Response()

    // set-cookie
    cookie := m.FindCookie("name")
}
multipart

Easily create multipart/form-data requests.
This method is used when submitting with multipart/form-data.

package main

import (
    "os"

    "github.com/cateiru/go-http-easy-test/easy"
)


func main() {
    m := easy.NewMultipart()

    // Add a string format form.
    err := m.Insert("key", "value")

    // Add a file format form.
    file, err := os.Open("path")
    err := m.InsertFile("key", file)

    // Outputs in the specified format.
    body := m.Export()
    contentType := m.ContentType()

    // Use `handler` package
    // Actually start the server using `httptest.NewServer`
    s := server.NewMockServer(mux)
    defer s.Close()
    resp := s.PostFormData(t, "/", m)
    // Mock the Handler arguments (`w http.ResponseWriter, r *http.Request`)
    m, err := mock.NewFormData("/", m, http.MethodPost)
}

License

MIT

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL