summaryrefslogtreecommitdiff
path: root/gemini/response_test.go
blob: 3e1f41ff8c2b19dddf28f7ecea0b65c7befc31df (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package gemini_test

import (
	"bytes"
	"errors"
	"io"
	"testing"

	"tildegit.org/tjp/gus/gemini"
)

func TestBuildResponses(t *testing.T) {
	table := []struct {
		name     string
		response *gemini.Response
		status   gemini.Status
		meta     string
		body     string
	}{
		{
			name:     "input response",
			response: gemini.Input("prompt here"),
			status:   gemini.StatusInput,
			meta:     "prompt here",
		},
		{
			name:     "sensitive input response",
			response: gemini.SensitiveInput("password please"),
			status:   gemini.StatusSensitiveInput,
			meta:     "password please",
		},
		{
			name:     "success response",
			response: gemini.Success("text/gemini", bytes.NewBufferString("body text here")),
			status:   gemini.StatusSuccess,
			meta:     "text/gemini",
			body:     "body text here",
		},
		{
			name:     "temporary redirect",
			response: gemini.Redirect("/foo/bar"),
			status:   gemini.StatusTemporaryRedirect,
			meta:     "/foo/bar",
		},
		{
			name:     "permanent redirect",
			response: gemini.PermanentRedirect("/baz/qux"),
			status:   gemini.StatusPermanentRedirect,
			meta:     "/baz/qux",
		},
		{
			name:     "fail response",
			response: gemini.Failure(errors.New("a failure")),
			status:   gemini.StatusTemporaryFailure,
			meta:     "a failure",
		},
		{
			name:     "server unavailable",
			response: gemini.Unavailable("server unavailable"),
			status:   gemini.StatusServerUnavailable,
			meta:     "server unavailable",
		},
		{
			name:     "cgi error",
			response: gemini.CGIError("some cgi error msg"),
			status:   gemini.StatusCGIError,
			meta:     "some cgi error msg",
		},
		{
			name:     "proxy error",
			response: gemini.ProxyError("upstream's full"),
			status:   gemini.StatusProxyError,
			meta:     "upstream's full",
		},
		{
			name:     "rate limiting",
			response: gemini.SlowDown(15),
			status:   gemini.StatusSlowDown,
			meta:     "15",
		},
		{
			name:     "permanent failure",
			response: gemini.PermanentFailure(errors.New("wut r u doin")),
			status:   gemini.StatusPermanentFailure,
			meta:     "wut r u doin",
		},
		{
			name:     "not found",
			response: gemini.NotFound("nope"),
			status:   gemini.StatusNotFound,
			meta:     "nope",
		},
		{
			name:     "gone",
			response: gemini.Gone("all out of that"),
			status:   gemini.StatusGone,
			meta:     "all out of that",
		},
		{
			name:     "refuse proxy",
			response: gemini.RefuseProxy("no I don't think I will"),
			status:   gemini.StatusProxyRequestRefused,
			meta:     "no I don't think I will",
		},
		{
			name:     "bad request",
			response: gemini.BadRequest("that don't make no sense"),
			status:   gemini.StatusBadRequest,
			meta:     "that don't make no sense",
		},
		{
			name:     "require cert",
			response: gemini.RequireCert("cert required"),
			status:   gemini.StatusClientCertificateRequired,
			meta:     "cert required",
		},
		{
			name:     "cert auth failure",
			response: gemini.CertAuthFailure("you can't see that"),
			status:   gemini.StatusCertificateNotAuthorized,
			meta:     "you can't see that",
		},
		{
			name:     "invalid cert",
			response: gemini.CertInvalid("bad cert dude"),
			status:   gemini.StatusCertificateNotValid,
			meta:     "bad cert dude",
		},
	}

	for _, test := range table {
		t.Run(test.name, func(t *testing.T) {
			if test.response.Status != test.status {
				t.Errorf("expected status %d, got %d", test.status, test.response.Status)
			}
			if test.response.Meta != test.meta {
				t.Errorf("expected meta %q, got %q", test.meta, test.response.Meta)
			}

			responseBytes, err := io.ReadAll(test.response)
			if err != nil {
				t.Fatalf("error reading response body: %q", err.Error())
			}

			body := string(bytes.SplitN(responseBytes, []byte("\r\n"), 2)[1])
			if body != test.body {
				t.Errorf("expected body %q, got %q", test.body, body)
			}
		})
	}
}