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}