Vasiliy Tolstov
d44adafca5
* api/router: avoid unneeded loops and fix path match * if match found in google api path syntax, not try pcre loop * if path is not ending via $ sign, append it to pcre to avoid matching other strings like /api/account/register can be matched to /api/account * api: add tests and validations Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
153 lines
3.3 KiB
Go
153 lines
3.3 KiB
Go
package api
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestEncoding(t *testing.T) {
|
|
testData := []*Endpoint{
|
|
nil,
|
|
{
|
|
Name: "Foo.Bar",
|
|
Description: "A test endpoint",
|
|
Handler: "meta",
|
|
Host: []string{"foo.com"},
|
|
Method: []string{"GET"},
|
|
Path: []string{"/test"},
|
|
},
|
|
}
|
|
|
|
compare := func(expect, got []string) bool {
|
|
// no data to compare, return true
|
|
if len(expect) == 0 && len(got) == 0 {
|
|
return true
|
|
}
|
|
// no data expected but got some return false
|
|
if len(expect) == 0 && len(got) > 0 {
|
|
return false
|
|
}
|
|
|
|
// compare expected with what we got
|
|
for _, e := range expect {
|
|
var seen bool
|
|
for _, g := range got {
|
|
if e == g {
|
|
seen = true
|
|
break
|
|
}
|
|
}
|
|
if !seen {
|
|
return false
|
|
}
|
|
}
|
|
|
|
// we're done, return true
|
|
return true
|
|
}
|
|
|
|
for _, d := range testData {
|
|
// encode
|
|
e := Encode(d)
|
|
// decode
|
|
de := Decode(e)
|
|
|
|
// nil endpoint returns nil
|
|
if d == nil {
|
|
if e != nil {
|
|
t.Fatalf("expected nil got %v", e)
|
|
}
|
|
if de != nil {
|
|
t.Fatalf("expected nil got %v", de)
|
|
}
|
|
|
|
continue
|
|
}
|
|
|
|
// check encoded map
|
|
name := e["endpoint"]
|
|
desc := e["description"]
|
|
method := strings.Split(e["method"], ",")
|
|
path := strings.Split(e["path"], ",")
|
|
host := strings.Split(e["host"], ",")
|
|
handler := e["handler"]
|
|
|
|
if name != d.Name {
|
|
t.Fatalf("expected %v got %v", d.Name, name)
|
|
}
|
|
if desc != d.Description {
|
|
t.Fatalf("expected %v got %v", d.Description, desc)
|
|
}
|
|
if handler != d.Handler {
|
|
t.Fatalf("expected %v got %v", d.Handler, handler)
|
|
}
|
|
if ok := compare(d.Method, method); !ok {
|
|
t.Fatalf("expected %v got %v", d.Method, method)
|
|
}
|
|
if ok := compare(d.Path, path); !ok {
|
|
t.Fatalf("expected %v got %v", d.Path, path)
|
|
}
|
|
if ok := compare(d.Host, host); !ok {
|
|
t.Fatalf("expected %v got %v", d.Host, host)
|
|
}
|
|
|
|
if de.Name != d.Name {
|
|
t.Fatalf("expected %v got %v", d.Name, de.Name)
|
|
}
|
|
if de.Description != d.Description {
|
|
t.Fatalf("expected %v got %v", d.Description, de.Description)
|
|
}
|
|
if de.Handler != d.Handler {
|
|
t.Fatalf("expected %v got %v", d.Handler, de.Handler)
|
|
}
|
|
if ok := compare(d.Method, de.Method); !ok {
|
|
t.Fatalf("expected %v got %v", d.Method, de.Method)
|
|
}
|
|
if ok := compare(d.Path, de.Path); !ok {
|
|
t.Fatalf("expected %v got %v", d.Path, de.Path)
|
|
}
|
|
if ok := compare(d.Host, de.Host); !ok {
|
|
t.Fatalf("expected %v got %v", d.Host, de.Host)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestValidate(t *testing.T) {
|
|
epPcre := &Endpoint{
|
|
Name: "Foo.Bar",
|
|
Description: "A test endpoint",
|
|
Handler: "meta",
|
|
Host: []string{"foo.com"},
|
|
Method: []string{"GET"},
|
|
Path: []string{"^/test/?$"},
|
|
}
|
|
if err := Validate(epPcre); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
epGpath := &Endpoint{
|
|
Name: "Foo.Bar",
|
|
Description: "A test endpoint",
|
|
Handler: "meta",
|
|
Host: []string{"foo.com"},
|
|
Method: []string{"GET"},
|
|
Path: []string{"/test/{id}"},
|
|
}
|
|
if err := Validate(epGpath); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
epPcreInvalid := &Endpoint{
|
|
Name: "Foo.Bar",
|
|
Description: "A test endpoint",
|
|
Handler: "meta",
|
|
Host: []string{"foo.com"},
|
|
Method: []string{"GET"},
|
|
Path: []string{"/test/?$"},
|
|
}
|
|
if err := Validate(epPcreInvalid); err == nil {
|
|
t.Fatalf("invalid pcre %v", epPcreInvalid.Path[0])
|
|
}
|
|
|
|
}
|