jsonhttptest.go 2.92 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
// Copyright 2020 The Swarm Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package jsonhttptest

import (
	"bytes"
	"encoding/json"
	"io"
	"io/ioutil"
	"net/http"
	"testing"
14 15

	"github.com/ethersphere/bee/pkg/jsonhttp"
16 17 18 19 20
)

func ResponseDirect(t *testing.T, client *http.Client, method, url string, body io.Reader, responseCode int, response interface{}) {
	t.Helper()

21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
	resp := request(t, client, method, url, body, responseCode, nil)
	defer resp.Body.Close()

	got, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		t.Fatal(err)
	}
	got = bytes.TrimSpace(got)

	want, err := json.Marshal(response)
	if err != nil {
		t.Error(err)
	}

	if !bytes.Equal(got, want) {
		t.Errorf("got response %s, want %s", string(got), string(want))
	}
}

// ResponseDirectWithJson checks for responses in json format. It is useful in cases where the response is json.
func ResponseDirectWithJson(t *testing.T, client *http.Client, method, url string, body io.Reader, responseCode int, response interface{}) {
	t.Helper()

	resp := request(t, client, method, url, body, responseCode, nil)
	defer resp.Body.Close()

	got, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		t.Fatal(err)
	}
	got = bytes.TrimSpace(got)

	want, err := json.Marshal(response)
	if err != nil {
		t.Error(err)
	}
	var wantJson jsonhttp.StatusResponse
	err = json.Unmarshal(want, &wantJson)
	if err != nil {
		t.Error(err)
	}
	wantString := "[" + wantJson.Message + "]"

	if wantString != string(got) {
		t.Errorf("got response %s, want %s", string(got), wantString)
	}
}

func ResponseDirectWithHeaders(t *testing.T, client *http.Client, method, url string, body io.Reader, responseCode int,
	response interface{}, headers http.Header) {
	t.Helper()

	resp := request(t, client, method, url, body, responseCode, headers)
74 75
	defer resp.Body.Close()

Janos Guljas's avatar
Janos Guljas committed
76
	got, err := ioutil.ReadAll(resp.Body)
77 78 79
	if err != nil {
		t.Fatal(err)
	}
Janos Guljas's avatar
Janos Guljas committed
80 81 82
	got = bytes.TrimSpace(got)

	want, err := json.Marshal(response)
83 84 85 86
	if err != nil {
		t.Error(err)
	}

Janos Guljas's avatar
Janos Guljas committed
87 88
	if !bytes.Equal(got, want) {
		t.Errorf("got response %s, want %s", string(got), string(want))
89 90 91 92 93 94
	}
}

func ResponseUnmarshal(t *testing.T, client *http.Client, method, url string, body io.Reader, responseCode int, response interface{}) {
	t.Helper()

95
	resp := request(t, client, method, url, body, responseCode, nil)
96 97
	defer resp.Body.Close()

Janos Guljas's avatar
Janos Guljas committed
98
	if err := json.NewDecoder(resp.Body).Decode(&response); err != nil {
99 100 101 102
		t.Fatal(err)
	}
}

103
func request(t *testing.T, client *http.Client, method, url string, body io.Reader, responseCode int, headers http.Header) *http.Response {
Janos Guljas's avatar
Janos Guljas committed
104 105
	t.Helper()

106 107
	req, err := http.NewRequest(method, url, body)
	if err != nil {
Janos Guljas's avatar
Janos Guljas committed
108 109
		t.Fatal(err)
	}
110
	req.Header = headers
Janos Guljas's avatar
Janos Guljas committed
111 112 113 114 115 116
	resp, err := client.Do(req)
	if err != nil {
		t.Fatal(err)
	}
	if resp.StatusCode != responseCode {
		t.Errorf("got response status %s, want %v %s", resp.Status, responseCode, http.StatusText(responseCode))
117
	}
Janos Guljas's avatar
Janos Guljas committed
118
	return resp
119
}