httpmocker

package module
v0.0.0-...-fb810b9 Latest Latest
Warning

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

Go to latest
Published: Nov 16, 2016 License: MIT Imports: 3 Imported by: 0

README

httpmocker

easy http response mocking by net/httptest

Build Status GoDoc

Examples:

https://github.com/yuroyoro/httpmocker/blob/master/example_test.go

simple mocking
	server := httpmocker.Launch().Add(
		"GET",
		"/hello",
		http.StatusOK,
		"hello, world",
	).Add(
		"POST",
		"/sushi",
		http.StatusCreated,
		"🍣",
	)
	defer server.Close()

	url := fmt.Sprintf("%s/hello", server.URL)
	resp, err := http.Get(url)
	defer resp.Body.Close()

	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}

	fmt.Println(resp.Status)

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}
	fmt.Println(string(body))
	resp.Body.Close()

	url = fmt.Sprintf("%s/sushi", server.URL)
	resp, err = http.Post(url, "text/plain", nil)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}

	fmt.Println(resp.Status)

	body, err = ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}
	fmt.Println(string(body))

	// Output:
	// 200 OK
	// hello, world
	// 201 Created
	// 🍣
mocking with custom header
	server := httpmocker.Launch(
		httpmocker.Response{
			Method:      "GET",
			Path:        "/hello",
			Code:        http.StatusOK,
			ContentType: "text/plain",
			Body:        "hello, world",
			Headers:     map[string][]string{"X-Custom-Header": []string{"custom header from mock"}},
		},
	)
	defer server.Close()

	url := fmt.Sprintf("%s/hello", server.URL)
	resp, err := http.Get(url)
	defer resp.Body.Close()

	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}

	fmt.Println(resp.Status)
	fmt.Println(resp.Header.Get("Content-Type"))
	fmt.Println(resp.Header.Get("X-Custom-Header"))

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}
	fmt.Println(string(body))

	// Output:
	// 200 OK
	// text/plain
	// custom header from mock
	// hello, world
mocking with multple response with query strings
	server := httpmocker.Launch(
		httpmocker.Response{
			Method: "GET",
			Path:   "/hello",
			Code:   http.StatusOK,
			Body:   "hello, world",
		},
		httpmocker.Response{
			Method: "GET",
			Path:   "/hello",
			Query:  "dummy=1",
			Code:   http.StatusOK,
			Body:   "hello, world with query string",
		},
	)
	defer server.Close()

	// if no query string is given, mock server should return first mock response
	url := fmt.Sprintf("%s/hello", server.URL)
	resp, err := http.Get(url)
	defer resp.Body.Close()
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}
	fmt.Println(string(body))
	resp.Body.Close()

	// if query string given and matched, mock server should return second mock response
	url = fmt.Sprintf("%s/hello?dummy=1", server.URL)
	resp, err = http.Get(url)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}

	body, err = ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}
	fmt.Println(string(body))
	resp.Body.Close()

	// if query string given and not matched, mock server should return first mock response
	url = fmt.Sprintf("%s/hello?dummy=2", server.URL)
	resp, err = http.Get(url)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}

	body, err = ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}
	fmt.Println(string(body))

	// Output:
	// hello, world
	// hello, world with query string
	// hello, world
mocking with custom response handler
	server := httpmocker.Launch(
		httpmocker.Response{
			Method: "GET",
			Path:   "/hello",
			Handler: func(w http.ResponseWriter, r *http.Request) {
				w.WriteHeader(http.StatusOK)
				io.WriteString(w, "hello, world from custom handler")
			},
		},
	)
	defer server.Close()

	url := fmt.Sprintf("%s/hello", server.URL)
	resp, err := http.Get(url)
	defer resp.Body.Close()
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}

	fmt.Println(resp.Status)

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}
	fmt.Println(string(body))

	// Output:
	// 200 OK
	// hello, world from custom handler
mocking with unknown request handler
	server := httpmocker.Launch()
	server.UnknownRequestHandler = func(w http.ResponseWriter, req *http.Request) {
		w.WriteHeader(http.StatusNotFound)
		io.WriteString(w, "not found from unknown handler")
	}
	defer server.Close()

	url := fmt.Sprintf("%s/sushi", server.URL)
	resp, err := http.Get(url)
	defer resp.Body.Close()
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}

	fmt.Println(resp.Status)

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}
	fmt.Println(string(body))

	// Output:
	// 404 Not Found
	// not found from unknown handler

Documentation

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Logger

type Logger interface {
	Logf(string, ...interface{})
}

Logger : logger for mock server

type Response

type Response struct {
	Method      string
	Path        string
	Query       string
	Code        int
	ContentType string
	Body        string
	Headers     http.Header

	Handler http.HandlerFunc
}

Response : mocke response

type Server

type Server struct {
	Server    *httptest.Server
	Responses map[string]map[string][]*Response
	URL       string
	Logger
	UnknownRequestHandler http.HandlerFunc
}

Server : mock server object

func Launch

func Launch(responses ...Response) *Server

Launch : launch mock server with given mock requests

Example
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"

	"github.com/yuroyoro/httpmocker"
)

func main() {
	server := httpmocker.Launch().Add(
		"GET",
		"/hello",
		http.StatusOK,
		"hello, world",
	).Add(
		"POST",
		"/sushi",
		http.StatusCreated,
		"🍣",
	)
	defer server.Close()

	url := fmt.Sprintf("%s/hello", server.URL)
	resp, err := http.Get(url)
	defer resp.Body.Close()

	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}

	fmt.Println(resp.Status)

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}
	fmt.Println(string(body))
	resp.Body.Close()

	url = fmt.Sprintf("%s/sushi", server.URL)
	resp, err = http.Post(url, "text/plain", nil)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}

	fmt.Println(resp.Status)

	body, err = ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("unexpected error : %+v", err)
	}
	fmt.Println(string(body))

}
Output:

200 OK
hello, world
201 Created
🍣

func (*Server) Add

func (server *Server) Add(method, path string, code int, body string) *Server

Add : add mock response to mock server

func (*Server) AddEmptyResponse

func (server *Server) AddEmptyResponse(method, path string, code int) *Server

AddEmptyResponse : add empyt mock response to mock server

func (*Server) AddResponses

func (server *Server) AddResponses(responses ...Response) *Server

AddResponses : add mock response to mock server

func (*Server) Close

func (server *Server) Close()

Close : shutdown mock server

func (*Server) Start

func (server *Server) Start() *Server

Start : start up mock server

Jump to

Keyboard shortcuts

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