mirror of
https://github.com/yusing/godoxy.git
synced 2026-01-18 16:17:07 +01:00
* Add comprehensive post-request rules support for response phase * Enable response body, status, and header manipulation via set commands * Refactor command handlers to support both request and response phases * Implement response modifier system for post-request template execution * Support response-based rule matching with status and header checks * Add comprehensive benchmarks for matcher performance * Refactor authentication and proxying commands for unified error handling * Support negated conditions with ! * Enhance error handling, error formatting and validation * Routes: add `rule_file` field with rule preset support * Environment variable substitution: now supports variables without `GODOXY_` prefix * new conditions: * `on resp_header <key> [<value>]` * `on status <status>` * new commands: * `require_auth` * `set resp_header <key> <template>` * `set resp_body <template>` * `set status <code>` * `log <level> <path> <template>` * `notify <level> <provider> <title_template> <body_template>`
146 lines
2.8 KiB
Go
146 lines
2.8 KiB
Go
package rules
|
|
|
|
import (
|
|
"testing"
|
|
|
|
expect "github.com/yusing/goutils/testing"
|
|
)
|
|
|
|
func TestParseCommands(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
wantErr error
|
|
}{
|
|
// bypass tests
|
|
{
|
|
name: "bypass_valid",
|
|
input: "bypass",
|
|
wantErr: nil,
|
|
},
|
|
{
|
|
name: "bypass_invalid_with_args",
|
|
input: "bypass /",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
// rewrite tests
|
|
{
|
|
name: "rewrite_valid",
|
|
input: "rewrite / /foo/bar",
|
|
wantErr: nil,
|
|
},
|
|
{
|
|
name: "rewrite_missing_target",
|
|
input: "rewrite /",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
{
|
|
name: "rewrite_too_many_args",
|
|
input: "rewrite / / /",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
// serve tests
|
|
{
|
|
name: "serve_valid",
|
|
input: "serve /",
|
|
wantErr: nil,
|
|
},
|
|
{
|
|
name: "serve_missing_path",
|
|
input: "serve ",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
{
|
|
name: "serve_non_exist_path",
|
|
input: "serve /non-exist-path",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
{
|
|
name: "serve_too_many_args",
|
|
input: "serve / / /",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
// redirect tests
|
|
{
|
|
name: "redirect_valid",
|
|
input: "redirect /",
|
|
wantErr: nil,
|
|
},
|
|
{
|
|
name: "redirect_too_many_args",
|
|
input: "redirect / /",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
// error directive tests
|
|
{
|
|
name: "error_valid",
|
|
input: "error 404 Not\\ Found",
|
|
wantErr: nil,
|
|
},
|
|
{
|
|
name: "error_missing_status_code",
|
|
input: "error Not\\ Found",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
{
|
|
name: "error_too_many_args",
|
|
input: "error 404 Not\\ Found extra",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
{
|
|
name: "error_no_escaped_space",
|
|
input: "error 404 Not Found",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
{
|
|
name: "error_invalid_status_code",
|
|
input: "error 123 abc",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
// proxy directive tests
|
|
{
|
|
name: "proxy_valid_abs",
|
|
input: "proxy http://localhost:8080",
|
|
wantErr: nil,
|
|
},
|
|
{
|
|
name: "proxy_valid_rel",
|
|
input: "proxy /foo/bar",
|
|
wantErr: nil,
|
|
},
|
|
{
|
|
name: "proxy_missing_target",
|
|
input: "proxy",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
{
|
|
name: "proxy_too_many_args",
|
|
input: "proxy http://localhost:8080 extra",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
{
|
|
name: "proxy_invalid_url",
|
|
input: "proxy invalid_url",
|
|
wantErr: ErrInvalidArguments,
|
|
},
|
|
// unknown directive test
|
|
{
|
|
name: "unknown_directive",
|
|
input: "unknown /",
|
|
wantErr: ErrUnknownDirective,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
cmd := Command{}
|
|
err := cmd.Parse(tt.input)
|
|
if tt.wantErr != nil {
|
|
expect.ErrorIs(t, tt.wantErr, err)
|
|
} else {
|
|
expect.NoError(t, err)
|
|
}
|
|
})
|
|
}
|
|
}
|