blob: 071add67ea6dbcf7a357a9a1ff63517187a31ee3 [file] [log] [blame]
// Copyright 2016 The Go 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 httptest
import (
"crypto/tls"
"io"
"net/http"
"net/url"
"reflect"
"strings"
"testing"
)
func TestNewRequest(t *testing.T) {
for _, tt := range [...]struct {
name string
method, uri string
body io.Reader
want *http.Request
wantBody string
}{
{
name: "Empty method means GET",
method: "",
uri: "/",
body: nil,
want: &http.Request{
Method: "GET",
Host: "example.com",
URL: &url.URL{Path: "/"},
Header: http.Header{},
Proto: "HTTP/1.1",
ProtoMajor: 1,
ProtoMinor: 1,
RemoteAddr: "192.0.2.1:1234",
RequestURI: "/",
},
wantBody: "",
},
{
name: "GET with full URL",
method: "GET",
uri: "http://foo.com/path/%2f/bar/",
body: nil,
want: &http.Request{
Method: "GET",
Host: "foo.com",
URL: &url.URL{
Scheme: "http",
Path: "/path///bar/",
RawPath: "/path/%2f/bar/",
Host: "foo.com",
},
Header: http.Header{},
Proto: "HTTP/1.1",
ProtoMajor: 1,
ProtoMinor: 1,
RemoteAddr: "192.0.2.1:1234",
RequestURI: "http://foo.com/path/%2f/bar/",
},
wantBody: "",
},
{
name: "GET with full https URL",
method: "GET",
uri: "https://foo.com/path/",
body: nil,
want: &http.Request{
Method: "GET",
Host: "foo.com",
URL: &url.URL{
Scheme: "https",
Path: "/path/",
Host: "foo.com",
},
Header: http.Header{},
Proto: "HTTP/1.1",
ProtoMajor: 1,
ProtoMinor: 1,
RemoteAddr: "192.0.2.1:1234",
RequestURI: "https://foo.com/path/",
TLS: &tls.ConnectionState{
Version: tls.VersionTLS12,
HandshakeComplete: true,
ServerName: "foo.com",
},
},
wantBody: "",
},
{
name: "Post with known length",
method: "POST",
uri: "/",
body: strings.NewReader("foo"),
want: &http.Request{
Method: "POST",
Host: "example.com",
URL: &url.URL{Path: "/"},
Header: http.Header{},
Proto: "HTTP/1.1",
ContentLength: 3,
ProtoMajor: 1,
ProtoMinor: 1,
RemoteAddr: "192.0.2.1:1234",
RequestURI: "/",
},
wantBody: "foo",
},
{
name: "Post with unknown length",
method: "POST",
uri: "/",
body: struct{ io.Reader }{strings.NewReader("foo")},
want: &http.Request{
Method: "POST",
Host: "example.com",
URL: &url.URL{Path: "/"},
Header: http.Header{},
Proto: "HTTP/1.1",
ContentLength: -1,
ProtoMajor: 1,
ProtoMinor: 1,
RemoteAddr: "192.0.2.1:1234",
RequestURI: "/",
},
wantBody: "foo",
},
{
name: "OPTIONS *",
method: "OPTIONS",
uri: "*",
want: &http.Request{
Method: "OPTIONS",
Host: "example.com",
URL: &url.URL{Path: "*"},
Header: http.Header{},
Proto: "HTTP/1.1",
ProtoMajor: 1,
ProtoMinor: 1,
RemoteAddr: "192.0.2.1:1234",
RequestURI: "*",
},
},
} {
t.Run(tt.name, func(t *testing.T) {
got := NewRequest(tt.method, tt.uri, tt.body)
slurp, err := io.ReadAll(got.Body)
if err != nil {
t.Errorf("ReadAll: %v", err)
}
if string(slurp) != tt.wantBody {
t.Errorf("Body = %q; want %q", slurp, tt.wantBody)
}
got.Body = nil // before DeepEqual
if !reflect.DeepEqual(got.URL, tt.want.URL) {
t.Errorf("Request.URL mismatch:\n got: %#v\nwant: %#v", got.URL, tt.want.URL)
}
if !reflect.DeepEqual(got.Header, tt.want.Header) {
t.Errorf("Request.Header mismatch:\n got: %#v\nwant: %#v", got.Header, tt.want.Header)
}
if !reflect.DeepEqual(got.TLS, tt.want.TLS) {
t.Errorf("Request.TLS mismatch:\n got: %#v\nwant: %#v", got.TLS, tt.want.TLS)
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("Request mismatch:\n got: %#v\nwant: %#v", got, tt.want)
}
})
}
}