waldo_proxy_test.go
1package rtw
2
3import (
4 "net/http"
5 "net/http/httptest"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10)
11
12func TestWaldoProxyHandler_Forward(t *testing.T) {
13 upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
14 assert.Equal(t, "/forward", r.URL.Path)
15 assert.Equal(t, "test query", r.URL.Query().Get("q"))
16 assert.Equal(t, "1.0", r.URL.Query().Get("lon"))
17 assert.Equal(t, "2.0", r.URL.Query().Get("lat"))
18 assert.Equal(t, "custom-value", r.Header.Get("X-Custom-Header"))
19 w.Header().Set("Content-Type", "application/json")
20 w.WriteHeader(http.StatusOK)
21 _, writeErr := w.Write([]byte(`{"results":[],"num_results":0}`))
22 assert.NoError(t, writeErr)
23 }))
24 defer upstream.Close()
25
26 handler := WaldoProxyHandler(upstream.URL)
27
28 req := httptest.NewRequest(http.MethodGet, "/forward?q=test+query&lon=1.0&lat=2.0", nil)
29 req.Header.Set("X-Custom-Header", "custom-value")
30 rr := httptest.NewRecorder()
31
32 handler.ServeHTTP(rr, req)
33
34 require.Equal(t, http.StatusOK, rr.Code)
35 assert.Contains(t, rr.Body.String(), "num_results")
36 assert.Equal(t, "application/json", rr.Header().Get("Content-Type"))
37}
38
39func TestWaldoProxyHandler_Reverse(t *testing.T) {
40 upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
41 assert.Equal(t, "/reverse", r.URL.Path)
42 assert.Equal(t, "10.0", r.URL.Query().Get("lon"))
43 assert.Equal(t, "20.0", r.URL.Query().Get("lat"))
44 w.Header().Set("Content-Type", "application/json")
45 w.WriteHeader(http.StatusOK)
46 _, writeErr := w.Write([]byte(`{"results":[],"num_results":0}`))
47 assert.NoError(t, writeErr)
48 }))
49 defer upstream.Close()
50
51 handler := WaldoProxyHandler(upstream.URL)
52
53 req := httptest.NewRequest(http.MethodGet, "/reverse?lon=10.0&lat=20.0", nil)
54 rr := httptest.NewRecorder()
55
56 handler.ServeHTTP(rr, req)
57
58 require.Equal(t, http.StatusOK, rr.Code)
59 assert.Contains(t, rr.Body.String(), "num_results")
60}
61
62func TestWaldoProxyHandler_InvalidURL(t *testing.T) {
63 handler := WaldoProxyHandler("://invalid-url")
64
65 req := httptest.NewRequest(http.MethodGet, "/forward", nil)
66 rr := httptest.NewRecorder()
67
68 handler.ServeHTTP(rr, req)
69
70 assert.Equal(t, http.StatusInternalServerError, rr.Code)
71 assert.Contains(t, rr.Body.String(), "invalid geocoder configuration")
72}
73
74func TestWaldoProxyHandler_MethodNotAllowed(t *testing.T) {
75 upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
76 t.Error("upstream should not be called for non-GET requests")
77 }))
78 defer upstream.Close()
79
80 handler := WaldoProxyHandler(upstream.URL)
81
82 req := httptest.NewRequest(http.MethodPost, "/forward?q=test", nil)
83 rr := httptest.NewRecorder()
84
85 handler.ServeHTTP(rr, req)
86
87 assert.Equal(t, http.StatusMethodNotAllowed, rr.Code)
88 assert.Equal(t, "GET, HEAD", rr.Header().Get("Allow"))
89 assert.Contains(t, rr.Body.String(), "method not allowed")
90}
91
92func TestWaldoProxyHandler_HEAD(t *testing.T) {
93 upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
94 assert.Equal(t, http.MethodHead, r.Method)
95 w.Header().Set("Content-Type", "application/json")
96 w.WriteHeader(http.StatusOK)
97 _, writeErr := w.Write([]byte(`{"results":[],"num_results":0}`))
98 assert.NoError(t, writeErr)
99 }))
100 defer upstream.Close()
101
102 handler := WaldoProxyHandler(upstream.URL)
103
104 req := httptest.NewRequest(http.MethodHead, "/forward", nil)
105 rr := httptest.NewRecorder()
106
107 handler.ServeHTTP(rr, req)
108
109 require.Equal(t, http.StatusOK, rr.Code)
110 assert.Equal(t, "application/json", rr.Header().Get("Content-Type"))
111 // HEAD responses should have empty body (httputil.ReverseProxy strips it)
112}
113
114func TestWaldoProxyHandler_UpstreamError(t *testing.T) {
115 handler := WaldoProxyHandler("http://127.0.0.1:1") // unreachable port
116
117 req := httptest.NewRequest(http.MethodGet, "/forward", nil)
118 rr := httptest.NewRecorder()
119
120 handler.ServeHTTP(rr, req)
121
122 assert.Equal(t, http.StatusBadGateway, rr.Code)
123 assert.Contains(t, rr.Body.String(), "upstream error")
124}