mirror of
https://github.com/TecharoHQ/anubis.git
synced 2026-04-11 11:08:48 +00:00
139 lines
2.5 KiB
Go
139 lines
2.5 KiB
Go
package remoteaddress
|
|
|
|
import (
|
|
_ "embed"
|
|
"encoding/json"
|
|
"errors"
|
|
"net/http"
|
|
"testing"
|
|
|
|
"github.com/TecharoHQ/anubis/lib/checker"
|
|
"github.com/TecharoHQ/anubis/lib/policy/config"
|
|
)
|
|
|
|
func TestFactoryIsCheckerFactory(t *testing.T) {
|
|
if _, ok := (any(Factory{})).(checker.Factory); !ok {
|
|
t.Fatal("Factory is not an instance of checker.Factory")
|
|
}
|
|
}
|
|
|
|
func TestFactoryValidateConfig(t *testing.T) {
|
|
f := Factory{}
|
|
|
|
for _, tt := range []struct {
|
|
name string
|
|
data []byte
|
|
err error
|
|
}{
|
|
{
|
|
name: "basic valid",
|
|
data: []byte(`{
|
|
"remote_addresses": [
|
|
"1.1.1.1/32"
|
|
]
|
|
}`),
|
|
},
|
|
{
|
|
name: "not json",
|
|
data: []byte(`]`),
|
|
err: config.ErrUnparseableConfig,
|
|
},
|
|
{
|
|
name: "no cidr",
|
|
data: []byte(`{
|
|
"remote_addresses": []
|
|
}`),
|
|
err: ErrNoRemoteAddresses,
|
|
},
|
|
{
|
|
name: "bad cidr",
|
|
data: []byte(`{
|
|
"remote_addresses": [
|
|
"according to all laws of aviation"
|
|
]
|
|
}`),
|
|
err: config.ErrInvalidCIDR,
|
|
},
|
|
} {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
data := json.RawMessage(tt.data)
|
|
|
|
if err := f.Valid(t.Context(), data); !errors.Is(err, tt.err) {
|
|
t.Logf("want: %v", tt.err)
|
|
t.Logf("got: %v", err)
|
|
t.Fatal("validation didn't do what was expected")
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestFactoryCreate(t *testing.T) {
|
|
f := Factory{}
|
|
|
|
for _, tt := range []struct {
|
|
name string
|
|
data []byte
|
|
err error
|
|
ip string
|
|
match bool
|
|
}{
|
|
{
|
|
name: "basic valid",
|
|
data: []byte(`{
|
|
"remote_addresses": [
|
|
"1.1.1.1/32"
|
|
]
|
|
}`),
|
|
ip: "1.1.1.1",
|
|
match: true,
|
|
},
|
|
{
|
|
name: "bad cidr",
|
|
data: []byte(`{
|
|
"remote_addresses": [
|
|
"according to all laws of aviation"
|
|
]
|
|
}`),
|
|
err: config.ErrUnparseableConfig,
|
|
},
|
|
} {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
data := json.RawMessage(tt.data)
|
|
|
|
impl, err := f.Build(t.Context(), data)
|
|
if !errors.Is(err, tt.err) {
|
|
t.Logf("want: %v", tt.err)
|
|
t.Logf("got: %v", err)
|
|
t.Fatal("creation didn't do what was expected")
|
|
}
|
|
|
|
if tt.err != nil {
|
|
return
|
|
}
|
|
|
|
r, err := http.NewRequest(http.MethodGet, "/", nil)
|
|
if err != nil {
|
|
t.Fatalf("can't make request: %v", err)
|
|
}
|
|
|
|
if tt.ip != "" {
|
|
r.Header.Add("X-Real-Ip", tt.ip)
|
|
}
|
|
|
|
match, err := impl.Check(r)
|
|
|
|
if tt.match != match {
|
|
t.Errorf("match: %v, wanted: %v", match, tt.match)
|
|
}
|
|
|
|
if err != nil && tt.err != nil && !errors.Is(err, tt.err) {
|
|
t.Errorf("err: %v, wanted: %v", err, tt.err)
|
|
}
|
|
|
|
if impl.Hash() == "" {
|
|
t.Error("hash method returns empty string")
|
|
}
|
|
})
|
|
}
|
|
}
|