1package assert
2
3import (
4	"fmt"
5	"net/http"
6	"net/url"
7	"testing"
8)
9
10func httpOK(w http.ResponseWriter, r *http.Request) {
11	w.WriteHeader(http.StatusOK)
12}
13
14func httpRedirect(w http.ResponseWriter, r *http.Request) {
15	w.WriteHeader(http.StatusTemporaryRedirect)
16}
17
18func httpError(w http.ResponseWriter, r *http.Request) {
19	w.WriteHeader(http.StatusInternalServerError)
20}
21
22func TestHTTPSuccess(t *testing.T) {
23	assert := New(t)
24
25	mockT1 := new(testing.T)
26	assert.Equal(HTTPSuccess(mockT1, httpOK, "GET", "/", nil), true)
27	assert.False(mockT1.Failed())
28
29	mockT2 := new(testing.T)
30	assert.Equal(HTTPSuccess(mockT2, httpRedirect, "GET", "/", nil), false)
31	assert.True(mockT2.Failed())
32
33	mockT3 := new(testing.T)
34	assert.Equal(HTTPSuccess(mockT3, httpError, "GET", "/", nil), false)
35	assert.True(mockT3.Failed())
36}
37
38func TestHTTPRedirect(t *testing.T) {
39	assert := New(t)
40
41	mockT1 := new(testing.T)
42	assert.Equal(HTTPRedirect(mockT1, httpOK, "GET", "/", nil), false)
43	assert.True(mockT1.Failed())
44
45	mockT2 := new(testing.T)
46	assert.Equal(HTTPRedirect(mockT2, httpRedirect, "GET", "/", nil), true)
47	assert.False(mockT2.Failed())
48
49	mockT3 := new(testing.T)
50	assert.Equal(HTTPRedirect(mockT3, httpError, "GET", "/", nil), false)
51	assert.True(mockT3.Failed())
52}
53
54func TestHTTPError(t *testing.T) {
55	assert := New(t)
56
57	mockT1 := new(testing.T)
58	assert.Equal(HTTPError(mockT1, httpOK, "GET", "/", nil), false)
59	assert.True(mockT1.Failed())
60
61	mockT2 := new(testing.T)
62	assert.Equal(HTTPError(mockT2, httpRedirect, "GET", "/", nil), false)
63	assert.True(mockT2.Failed())
64
65	mockT3 := new(testing.T)
66	assert.Equal(HTTPError(mockT3, httpError, "GET", "/", nil), true)
67	assert.False(mockT3.Failed())
68}
69
70func TestHTTPStatusesWrapper(t *testing.T) {
71	assert := New(t)
72	mockAssert := New(new(testing.T))
73
74	assert.Equal(mockAssert.HTTPSuccess(httpOK, "GET", "/", nil), true)
75	assert.Equal(mockAssert.HTTPSuccess(httpRedirect, "GET", "/", nil), false)
76	assert.Equal(mockAssert.HTTPSuccess(httpError, "GET", "/", nil), false)
77
78	assert.Equal(mockAssert.HTTPRedirect(httpOK, "GET", "/", nil), false)
79	assert.Equal(mockAssert.HTTPRedirect(httpRedirect, "GET", "/", nil), true)
80	assert.Equal(mockAssert.HTTPRedirect(httpError, "GET", "/", nil), false)
81
82	assert.Equal(mockAssert.HTTPError(httpOK, "GET", "/", nil), false)
83	assert.Equal(mockAssert.HTTPError(httpRedirect, "GET", "/", nil), false)
84	assert.Equal(mockAssert.HTTPError(httpError, "GET", "/", nil), true)
85}
86
87func httpHelloName(w http.ResponseWriter, r *http.Request) {
88	name := r.FormValue("name")
89	w.Write([]byte(fmt.Sprintf("Hello, %s!", name)))
90}
91
92func TestHTTPRequestWithNoParams(t *testing.T) {
93	var got *http.Request
94	handler := func(w http.ResponseWriter, r *http.Request) {
95		got = r
96		w.WriteHeader(http.StatusOK)
97	}
98
99	True(t, HTTPSuccess(t, handler, "GET", "/url", nil))
100
101	Empty(t, got.URL.Query())
102	Equal(t, "/url", got.URL.RequestURI())
103}
104
105func TestHTTPRequestWithParams(t *testing.T) {
106	var got *http.Request
107	handler := func(w http.ResponseWriter, r *http.Request) {
108		got = r
109		w.WriteHeader(http.StatusOK)
110	}
111	params := url.Values{}
112	params.Add("id", "12345")
113
114	True(t, HTTPSuccess(t, handler, "GET", "/url", params))
115
116	Equal(t, url.Values{"id": []string{"12345"}}, got.URL.Query())
117	Equal(t, "/url?id=12345", got.URL.String())
118	Equal(t, "/url?id=12345", got.URL.RequestURI())
119}
120
121func TestHttpBody(t *testing.T) {
122	assert := New(t)
123	mockT := new(testing.T)
124
125	assert.True(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!"))
126	assert.True(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World"))
127	assert.False(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world"))
128
129	assert.False(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!"))
130	assert.False(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World"))
131	assert.True(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world"))
132}
133
134func TestHttpBodyWrappers(t *testing.T) {
135	assert := New(t)
136	mockAssert := New(new(testing.T))
137
138	assert.True(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!"))
139	assert.True(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World"))
140	assert.False(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world"))
141
142	assert.False(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!"))
143	assert.False(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World"))
144	assert.True(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world"))
145
146}
147