* 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])
 | |
| 	}
 | |
| 
 | |
| }
 |