summaryrefslogtreecommitdiff
path: root/service/http/response_test.go
blob: f885be7f64074e8b104c93775cdc2755818008ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package http

import (
	"bytes"
	"errors"
	"github.com/spiral/roadrunner"
	"github.com/stretchr/testify/assert"
	"net/http"
	"testing"
)

type testWriter struct {
	h           http.Header
	buf         bytes.Buffer
	wroteHeader bool
	code        int
	err         error
}

func (tw *testWriter) Header() http.Header { return tw.h }

func (tw *testWriter) Write(p []byte) (int, error) {
	if !tw.wroteHeader {
		tw.WriteHeader(http.StatusOK)
	}

	n, e := tw.buf.Write(p)
	if e == nil {
		e = tw.err
	}

	return n, e
}

func (tw *testWriter) WriteHeader(code int) { tw.wroteHeader = true; tw.code = code }

func TestNewResponse_Error(t *testing.T) {
	r, err := NewResponse(&roadrunner.Payload{Context: []byte(`invalid payload`)})
	assert.Error(t, err)
	assert.Nil(t, r)
}

func TestNewResponse_Write(t *testing.T) {
	r, err := NewResponse(&roadrunner.Payload{
		Context: []byte(`{"headers":{"key":["value"]},"status": 301}`),
		Body:    []byte(`sample body`),
	})

	assert.NoError(t, err)
	assert.NotNil(t, r)

	w := &testWriter{h: http.Header(make(map[string][]string))}
	assert.NoError(t, r.Write(w))

	assert.Equal(t, 301, w.code)
	assert.Equal(t, "value", w.h.Get("key"))
	assert.Equal(t, "sample body", w.buf.String())
}

func TestNewResponse_Stream(t *testing.T) {
	r, err := NewResponse(&roadrunner.Payload{
		Context: []byte(`{"headers":{"key":["value"]},"status": 301}`),
	})

	r.body = &bytes.Buffer{}
	r.body.(*bytes.Buffer).WriteString("hello world")

	assert.NoError(t, err)
	assert.NotNil(t, r)

	w := &testWriter{h: http.Header(make(map[string][]string))}
	assert.NoError(t, r.Write(w))

	assert.Equal(t, 301, w.code)
	assert.Equal(t, "value", w.h.Get("key"))
	assert.Equal(t, "hello world", w.buf.String())
}

func TestNewResponse_StreamError(t *testing.T) {
	r, err := NewResponse(&roadrunner.Payload{
		Context: []byte(`{"headers":{"key":["value"]},"status": 301}`),
	})

	r.body = &bytes.Buffer{}
	r.body.(*bytes.Buffer).WriteString("hello world")

	assert.NoError(t, err)
	assert.NotNil(t, r)

	w := &testWriter{h: http.Header(make(map[string][]string)), err: errors.New("error")}
	assert.Error(t, r.Write(w))
}