aboutsummaryrefslogtreecommitdiff
path: root/request_test.go
diff options
context:
space:
mode:
authorAdnan Maolood <[email protected]>2021-02-15 19:20:37 -0500
committerAdnan Maolood <[email protected]>2021-02-15 19:20:37 -0500
commitec269c5c9d8bb338e472716f7c15b09235cade4b (patch)
treec1b1dea3ea639e4e2a6d09fbfd92c2affcbb9f95 /request_test.go
parentReturn ErrInvalidResponse on error reading status (diff)
downloadgo-gemini-ec269c5c9d8bb338e472716f7c15b09235cade4b.tar.xz
go-gemini-ec269c5c9d8bb338e472716f7c15b09235cade4b.zip
Add some tests
Diffstat (limited to 'request_test.go')
-rw-r--r--request_test.go148
1 files changed, 148 insertions, 0 deletions
diff --git a/request_test.go b/request_test.go
new file mode 100644
index 0000000..ea42c70
--- /dev/null
+++ b/request_test.go
@@ -0,0 +1,148 @@
+package gemini
+
+import (
+ "bufio"
+ "io"
+ "net/url"
+ "strings"
+ "testing"
+)
+
+// 1024 bytes
+const maxURL = "gemini://example.net/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+
+func TestReadRequest(t *testing.T) {
+ tests := []struct {
+ Raw string
+ URL *url.URL
+ Err error
+ }{
+ {
+ Raw: "gemini://example.com\r\n",
+ URL: &url.URL{
+ Scheme: "gemini",
+ Host: "example.com",
+ },
+ },
+ {
+ Raw: "http://example.org/path/?query#fragment\r\n",
+ URL: &url.URL{
+ Scheme: "http",
+ Host: "example.org",
+ Path: "/path/",
+ RawQuery: "query",
+ Fragment: "fragment",
+ },
+ },
+ {
+ Raw: "\r\n",
+ URL: &url.URL{},
+ },
+ {
+ Raw: "gemini://example.com\n",
+ Err: io.EOF,
+ },
+ {
+ Raw: "gemini://example.com",
+ Err: io.EOF,
+ },
+ {
+ Raw: "gemini://user:[email protected]\r\n",
+ Err: ErrInvalidURL,
+ },
+ {
+ Raw: "https://user:[email protected]\r\n",
+ Err: ErrInvalidURL,
+ },
+ {
+ // 1030 bytes
+ Raw: maxURL + "xxxxxx",
+ Err: io.EOF,
+ },
+ {
+ // 1027 bytes
+ Raw: maxURL + "x" + "\r\n",
+ Err: io.EOF,
+ },
+ {
+ // 1024 bytes
+ Raw: maxURL[:len(maxURL)-2] + "\r\n",
+ URL: &url.URL{
+ Scheme: "gemini",
+ Host: "example.net",
+ Path: maxURL[len("gemini://example.net") : len(maxURL)-2],
+ },
+ },
+ }
+
+ for _, test := range tests {
+ t.Logf("%#v", test.Raw)
+ req, err := ReadRequest(strings.NewReader(test.Raw))
+ if err != test.Err {
+ t.Errorf("expected err = %v, got %v", test.Err, err)
+ }
+ if req == nil && test.URL != nil {
+ t.Errorf("expected url = %s, got nil", test.URL)
+ } else if req != nil && test.URL == nil {
+ t.Errorf("expected req = nil, got %v", req)
+ } else if req != nil && *req.URL != *test.URL {
+ t.Errorf("expected url = %v, got %v", *test.URL, *req.URL)
+ }
+ }
+}
+
+func newRequest(rawurl string) *Request {
+ req, err := NewRequest(rawurl)
+ if err != nil {
+ panic(err)
+ }
+ return req
+}
+
+func TestWriteRequest(t *testing.T) {
+ tests := []struct {
+ Req *Request
+ Raw string
+ Err error
+ }{
+ {
+ Req: newRequest("gemini://example.com"),
+ Raw: "gemini://example.com\r\n",
+ },
+ {
+ Req: newRequest("gemini://example.com/path/?query#fragment"),
+ Raw: "gemini://example.com/path/?query#fragment\r\n",
+ },
+ {
+ Req: newRequest(maxURL),
+ Raw: maxURL + "\r\n",
+ },
+ {
+ Req: newRequest(maxURL + "x"),
+ Err: ErrInvalidRequest,
+ },
+ {
+ Req: newRequest("gemini://user:[email protected]"),
+ Err: ErrInvalidURL,
+ },
+ {
+ Req: newRequest("https://user:[email protected]"),
+ Err: ErrInvalidURL,
+ },
+ }
+
+ for _, test := range tests {
+ t.Logf("%s", test.Req.URL)
+ var b strings.Builder
+ bw := bufio.NewWriter(&b)
+ err := test.Req.Write(bw)
+ if err != test.Err {
+ t.Errorf("expected err = %v, got %v", test.Err, err)
+ }
+ bw.Flush()
+ got := b.String()
+ if got != test.Raw {
+ t.Errorf("expected %#v, got %#v", test.Raw, got)
+ }
+ }
+}