Browse Source
It didn't really make sense how we were doing them before. See https://caddy.community/t/map-directive-and-regular-expressions/13866/6?u=mattmaster
Matthew Holt
3 years ago
2 changed files with 101 additions and 1 deletions
@ -0,0 +1,96 @@ |
|||||
|
package maphandler |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"net/http" |
||||
|
"net/http/httptest" |
||||
|
"reflect" |
||||
|
"testing" |
||||
|
|
||||
|
"github.com/caddyserver/caddy/v2" |
||||
|
"github.com/caddyserver/caddy/v2/modules/caddyhttp" |
||||
|
) |
||||
|
|
||||
|
func TestHandler(t *testing.T) { |
||||
|
for i, tc := range []struct { |
||||
|
handler Handler |
||||
|
reqPath string |
||||
|
expect map[string]interface{} |
||||
|
}{ |
||||
|
{ |
||||
|
reqPath: "/foo", |
||||
|
handler: Handler{ |
||||
|
Source: "{http.request.uri.path}", |
||||
|
Destinations: []string{"{output}"}, |
||||
|
Mappings: []Mapping{ |
||||
|
{ |
||||
|
Input: "/foo", |
||||
|
Outputs: []interface{}{"FOO"}, |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
expect: map[string]interface{}{ |
||||
|
"output": "FOO", |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
reqPath: "/abcdef", |
||||
|
handler: Handler{ |
||||
|
Source: "{http.request.uri.path}", |
||||
|
Destinations: []string{"{output}"}, |
||||
|
Mappings: []Mapping{ |
||||
|
{ |
||||
|
InputRegexp: "(/abc)", |
||||
|
Outputs: []interface{}{"ABC"}, |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
expect: map[string]interface{}{ |
||||
|
"output": "ABC", |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
reqPath: "/ABCxyzDEF", |
||||
|
handler: Handler{ |
||||
|
Source: "{http.request.uri.path}", |
||||
|
Destinations: []string{"{output}"}, |
||||
|
Mappings: []Mapping{ |
||||
|
{ |
||||
|
InputRegexp: "(xyz)", |
||||
|
Outputs: []interface{}{"...${1}..."}, |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
expect: map[string]interface{}{ |
||||
|
"output": "...xyz...", |
||||
|
}, |
||||
|
}, |
||||
|
} { |
||||
|
if err := tc.handler.Provision(caddy.Context{}); err != nil { |
||||
|
t.Fatalf("Test %d: Provisioning handler: %v", i, err) |
||||
|
} |
||||
|
|
||||
|
req, err := http.NewRequest(http.MethodGet, tc.reqPath, nil) |
||||
|
if err != nil { |
||||
|
t.Fatalf("Test %d: Creating request: %v", i, err) |
||||
|
} |
||||
|
repl := caddyhttp.NewTestReplacer(req) |
||||
|
ctx := context.WithValue(req.Context(), caddy.ReplacerCtxKey, repl) |
||||
|
req = req.WithContext(ctx) |
||||
|
|
||||
|
rr := httptest.NewRecorder() |
||||
|
noop := caddyhttp.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) error { return nil }) |
||||
|
|
||||
|
if err := tc.handler.ServeHTTP(rr, req, noop); err != nil { |
||||
|
t.Errorf("Test %d: Handler returned error: %v", i, err) |
||||
|
continue |
||||
|
} |
||||
|
|
||||
|
for key, expected := range tc.expect { |
||||
|
actual, _ := repl.Get(key) |
||||
|
if !reflect.DeepEqual(actual, expected) { |
||||
|
t.Errorf("Test %d: Expected %#v but got %#v for {%s}", i, expected, actual, key) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue