Codebase list golang-github-go-kit-kit / 75666f7 transport / http / binding_test.go
75666f7

Tree @75666f7 (Download .tar.gz)

binding_test.go @75666f7raw · history · blame

package http_test

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
	"net/http/httptest"
	"reflect"
	"testing"

	"golang.org/x/net/context"

	"github.com/go-kit/kit/server"
	jsoncodec "github.com/go-kit/kit/transport/codec/json"
	httptransport "github.com/go-kit/kit/transport/http"
)

func TestBinding(t *testing.T) {
	type myRequest struct {
		In int `json:"in"`
	}

	type myResponse struct {
		Out int `json:"out"`
	}

	transform := func(i int) int {
		return 3 * i // doesn't matter, just do something
	}

	endpoint := func(_ context.Context, req server.Request) (server.Response, error) {
		r, ok := req.(*myRequest)
		if !ok {
			return nil, fmt.Errorf("not myRequest (%s)", reflect.TypeOf(req))
		}
		return myResponse{transform(r.In)}, nil
	}

	ctx := context.Background()
	requestType := reflect.TypeOf(myRequest{})
	codec := jsoncodec.New()
	binding := httptransport.NewBinding(ctx, requestType, codec, endpoint)
	server := httptest.NewServer(binding)
	defer server.Close()

	n := 123
	requestBody, err := json.Marshal(myRequest{n})
	if err != nil {
		t.Fatal(err)
	}

	resp, err := http.Post(server.URL, "application/json", bytes.NewBuffer(requestBody))
	if err != nil {
		t.Fatal(err)
	}
	defer resp.Body.Close()

	var r myResponse
	if err := json.NewDecoder(resp.Body).Decode(&r); err != nil {
		t.Fatal(err)
	}

	if want, have := transform(n), r.Out; want != have {
		t.Errorf("want %d, have %d", want, have)
	}
}