From 99f95b2561b89376ee83ab23a9a199e14e7ecf12 Mon Sep 17 00:00:00 2001 From: Fenny <25108519+Fenny@users.noreply.github.com> Date: Mon, 11 May 2020 13:42:42 +0200 Subject: [PATCH] v1.9.6 (#360) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **๐Ÿš€ Fiber `v1.9.6`** Special thanks to @renanbastos93 & @renewerner87 for optimizing the current router. Help use translate our API documentation by [clicking here](https://crowdin.com/project/gofiber) ๐Ÿ”ฅ New - `AcquireCtx` / `ReleaseCtx` The Ctx pool is now accessible for third-party packages - Fiber docs merged [Russian](https://docs.gofiber.io/v/ru/) translations **84%** - Fiber docs merged [Spanish](https://docs.gofiber.io/v/es/) translations **65%** - Fiber docs merged [French](https://docs.gofiber.io/v/fr/) translations **40%** - Fiber docs merged [German](https://docs.gofiber.io/v/de/) translations **32%** - Fiber docs merged [Portuguese](https://docs.gofiber.io/v/pt/) translations **24%** ๐Ÿฉน Fixes - Hotfix for interpolated params in nested routes https://github.com/gofiber/fiber/issues/354 - Some `Ctx` methods didn't work correctly when called without an `*App` pointer. - `ctx.Vary` sometimes added duplicates to the response header - Improved router by ditching regexp and increased performance by **817%** without allocations. ```go // Tested with 350 github API routes Benchmark_Router_OLD-4 614 2467460 ns/op 68902 B/op 600 allocs/op Benchmark_Router_NEW-4 3429 302033 ns/op 0 B/op 0 allocs/op ``` ๐Ÿงน Updates - Add context benchmarks - Remove some unnecessary functions from `utils` - Add router & param test cases - Add new coffee supporters to readme - Add third party middlewares to readme - Add more comments to source code - Cleanup some old helper functions ๐Ÿงฌ Middleware - [gofiber/adaptor](https://github.com/gofiber/adaptor) `v0.0.1` Converter for net/http handlers to/from Fiber handlers - [gofiber/session](https://github.com/gofiber/session) `v1.0.0` big improvements and support for storage providers - [gofiber/logger](https://github.com/gofiber/logger) `v0.0.6` supports `${error}` param - [gofiber/embed](https://github.com/gofiber/embed) `v0.0.9` minor improvements and support for directory browsing Co-authored-by: ReneWerner87 --- app_test.go | 30 +- params.go | 33 +- router.go | 2 +- router_bench_test.go | 1216 +++++++++++++++++++++--------------------- router_test.go | 61 +-- 5 files changed, 683 insertions(+), 659 deletions(-) diff --git a/app_test.go b/app_test.go index 3e82f2a53a..3ee75051f1 100644 --- a/app_test.go +++ b/app_test.go @@ -20,6 +20,33 @@ func testStatus200(t *testing.T, app *App, url string, method string) { assertEqual(t, 200, resp.StatusCode, "Status code") } +func Test_Nested_Params(t *testing.T) { + app := New() + + app.Get("/test", func(c *Ctx) { + t.Log(c.Route().Path) + c.Status(400).Send("Should move on") + }) + app.Get("/test/:param", func(c *Ctx) { + t.Log(c.Route().Path) + c.Status(400).Send("Should move on") + }) + app.Get("/test/:param/test", func(c *Ctx) { + t.Log(c.Route().Path) + c.Status(400).Send("Should move on") + }) + app.Get("/test/:param/test/:param2", func(c *Ctx) { + t.Log(c.Route().Path) + c.Status(200).Send("Good job") + }) + + req := httptest.NewRequest("GET", "/test/john/test/doe", nil) + resp, err := app.Test(req) + + assertEqual(t, nil, err, "app.Test(req)") + assertEqual(t, 200, resp.StatusCode, "Status code") +} + func Test_Raw(t *testing.T) { app := New() app.Get("/", func(c *Ctx) { @@ -65,9 +92,6 @@ func Test_Methods(t *testing.T) { app.Connect("/:john?/:doe?", dummyHandler) testStatus200(t, app, "/john/doe", "CONNECT") - app.Connect("/:john?/:doe?", dummyHandler) - testStatus200(t, app, "/john/doe", "CONNECT") - app.Put("/:john?/:doe?", dummyHandler) testStatus200(t, app, "/john/doe", "CONNECT") diff --git a/params.go b/params.go index eb33d17dcd..99086e3cfa 100644 --- a/params.go +++ b/params.go @@ -13,8 +13,8 @@ import ( // paramsParser holds the path segments and param names type parsedParams struct { - Segs []paramSeg - Keys []string + Segs []paramSeg + Params []string } // paramsSeg holds the segment metadata @@ -28,11 +28,10 @@ type paramSeg struct { var paramsDummy = make([]string, 100, 100) +const wildcardParam string = "*" + // New ... func parseParams(pattern string) (p parsedParams) { - if pattern[0] != '/' { - pattern = "/" + pattern - } var patternCount int aPattern := []string{""} if pattern != "" { @@ -53,7 +52,7 @@ func parseParams(pattern string) (p parsedParams) { out[segIndex] = paramSeg{ Param: paramTrimmer(aPattern[i]), IsParam: true, - IsOptional: aPattern[i] == "*" || aPattern[i][partLen-1] == '?', + IsOptional: aPattern[i] == wildcardParam || aPattern[i][partLen-1] == '?', } params = append(params, out[segIndex].Param) } else { @@ -75,14 +74,14 @@ func parseParams(pattern string) (p parsedParams) { } out[segIndex-1].IsLast = true - p = parsedParams{Segs: out[:segIndex:segIndex], Keys: params} - // fmt.Printf("%+v\n", p) + p = parsedParams{Segs: out[:segIndex:segIndex], Params: params} + //fmt.Printf("%+v\n", p) return } // Match ... func (p *parsedParams) matchParams(s string) ([]string, bool) { - lenKeys := len(p.Keys) + lenKeys := len(p.Params) params := paramsDummy[0:lenKeys:lenKeys] var i, j, paramsIterator, partLen int if len(s) > 0 { @@ -93,11 +92,13 @@ func (p *parsedParams) matchParams(s string) ([]string, bool) { // check parameter if segment.IsParam { // determine parameter length - if segment.IsLast { - i = partLen - } else if segment.Param == "*" { - // for the expressjs behavior -> "/api/*/:param" - "/api/joker/batman/robin/1" -> "joker/batman/robin", "1" - i = findCharPos(s, '/', strings.Count(s, "/")-(len(p.Segs)-(index+1))+1) + if segment.Param == wildcardParam { + if segment.IsLast { + i = partLen + } else { + // for the expressjs behavior -> "/api/*/:param" - "/api/joker/batman/robin/1" -> "joker/batman/robin", "1" + i = findCharPos(s, '/', strings.Count(s, "/")-(len(p.Segs)-(index+1))+1) + } } else { i = strings.IndexByte(s, '/') } @@ -129,10 +130,12 @@ func (p *parsedParams) matchParams(s string) ([]string, bool) { s = s[j:] } } + if len(s) != 0 { + return nil, false + } return params, true } - func paramTrimmer(param string) string { start := 0 end := len(param) diff --git a/router.go b/router.go index 5f892b7a30..72c553dd66 100644 --- a/router.go +++ b/router.go @@ -168,7 +168,7 @@ func (app *App) registerMethod(method, path string, handlers ...func(*Ctx)) { Path: path, Method: method, - Params: isParsed.Keys, + Params: isParsed.Params, Handler: handlers[i], } if method == "*" { diff --git a/router_bench_test.go b/router_bench_test.go index 71698549de..c83e3dfca1 100644 --- a/router_bench_test.go +++ b/router_bench_test.go @@ -4,611 +4,611 @@ package fiber -import ( - "testing" -) - -var app *App - -func init() { - app = New() - h := func(c *Ctx) {} - for _, r := range githubAPI { - switch r.method { - case "GET": - app.Get(r.path, h) - case "POST": - app.Post(r.path, h) - case "PUT": - app.Put(r.path, h) - case "PATCH": - app.Patch(r.path, h) - case "DELETE": - app.Delete(r.path, h) - default: - panic("Unknow HTTP method: " + r.method) - } - } -} - -func Benchmark_Router_Github_Routes(b *testing.B) { - var match bool - var params []string - for n := 0; n < b.N; n++ { - for i := range testRoutes { - match, params = matchRoute(testRoutes[i].method, testRoutes[i].path) - } - if match { - if len(params) > 0 { - - } - } - } -} - -func Benchmark_Router_Last_Route(b *testing.B) { - var match bool - var params []string - for n := 0; n < b.N; n++ { - match, params = matchRoute("DELETE", "/user/keys/1337") - } - if match { - if len(params) > 0 { - - } - } -} -func Benchmark_Router_First_Route(b *testing.B) { - var match bool - var params []string - for n := 0; n < b.N; n++ { - match, params = matchRoute("GET", "/authorizations") - } - if match { - if len(params) > 0 { - - } - } -} - -func matchRoute(method, path string) (match bool, values []string) { - mINT := methodINT[method] - for i := range app.routes[mINT] { - match, values = app.routes[mINT][i].matchRoute(path) - if match { - return true, values - } - } - return -} - -type testRoute struct { - method string - path string -} - -var testRoutes = []testRoute{ - // OAuth Authorizations - {"GET", "/authorizations"}, - {"GET", "/authorizations/1337"}, - {"POST", "/authorizations"}, - {"PUT", "/authorizations/clients/inf1nd873nf8912g9t"}, - {"PATCH", "/authorizations/1337"}, - {"DELETE", "/authorizations/1337"}, - {"GET", "/applications/2nds981mng6azl127y/tokens/sn108hbe1geheibf13f"}, - {"DELETE", "/applications/2nds981mng6azl127y/tokens"}, - {"DELETE", "/applications/2nds981mng6azl127y/tokens/sn108hbe1geheibf13f"}, - - // Activity - {"GET", "/events"}, - {"GET", "/repos/fenny/fiber/events"}, - {"GET", "/networks/fenny/fiber/events"}, - {"GET", "/orgs/gofiber/events"}, - {"GET", "/users/fenny/received_events"}, - {"GET", "/users/fenny/received_events/public"}, - {"GET", "/users/fenny/events"}, - {"GET", "/users/fenny/events/public"}, - {"GET", "/users/fenny/events/orgs/gofiber"}, - {"GET", "/feeds"}, - {"GET", "/notifications"}, - {"GET", "/repos/fenny/fiber/notifications"}, - {"PUT", "/notifications"}, - {"PUT", "/repos/fenny/fiber/notifications"}, - {"GET", "/notifications/threads/1337"}, - {"PATCH", "/notifications/threads/1337"}, - {"GET", "/notifications/threads/1337/subscription"}, - {"PUT", "/notifications/threads/1337/subscription"}, - {"DELETE", "/notifications/threads/1337/subscription"}, - {"GET", "/repos/fenny/fiber/stargazers"}, - {"GET", "/users/fenny/starred"}, - {"GET", "/user/starred"}, - {"GET", "/user/starred/fenny/fiber"}, - {"PUT", "/user/starred/fenny/fiber"}, - {"DELETE", "/user/starred/fenny/fiber"}, - {"GET", "/repos/fenny/fiber/subscribers"}, - {"GET", "/users/fenny/subscriptions"}, - {"GET", "/user/subscriptions"}, - {"GET", "/repos/fenny/fiber/subscription"}, - {"PUT", "/repos/fenny/fiber/subscription"}, - {"DELETE", "/repos/fenny/fiber/subscription"}, - {"GET", "/user/subscriptions/fenny/fiber"}, - {"PUT", "/user/subscriptions/fenny/fiber"}, - {"DELETE", "/user/subscriptions/fenny/fiber"}, - - // Gists - {"GET", "/users/fenny/gists"}, - {"GET", "/gists"}, - {"GET", "/gists/public"}, - {"GET", "/gists/starred"}, - {"GET", "/gists/1337"}, - {"POST", "/gists"}, - {"PATCH", "/gists/1337"}, - {"PUT", "/gists/1337/star"}, - {"DELETE", "/gists/1337/star"}, - {"GET", "/gists/1337/star"}, - {"POST", "/gists/1337/forks"}, - {"DELETE", "/gists/1337"}, - - // Git Data - {"GET", "/repos/fenny/fiber/git/blobs/v948b24g98ubngw9082bn02giub"}, - {"POST", "/repos/fenny/fiber/git/blobs"}, - {"GET", "/repos/fenny/fiber/git/commits/v948b24g98ubngw9082bn02giub"}, - {"POST", "/repos/fenny/fiber/git/commits"}, - {"GET", "/repos/fenny/fiber/git/refs/im/a/wildcard"}, - {"GET", "/repos/fenny/fiber/git/refs"}, - {"POST", "/repos/fenny/fiber/git/refs"}, - {"PATCH", "/repos/fenny/fiber/git/refs/im/a/wildcard"}, - {"DELETE", "/repos/fenny/fiber/git/refs/im/a/wildcard"}, - {"GET", "/repos/fenny/fiber/git/tags/v948b24g98ubngw9082bn02giub"}, - {"POST", "/repos/fenny/fiber/git/tags"}, - {"GET", "/repos/fenny/fiber/git/trees/v948b24g98ubngw9082bn02giub"}, - {"POST", "/repos/fenny/fiber/git/trees"}, - - // Issues - {"GET", "/issues"}, - {"GET", "/user/issues"}, - {"GET", "/orgs/gofiber/issues"}, - {"GET", "/repos/fenny/fiber/issues"}, - {"GET", "/repos/fenny/fiber/issues/1000"}, - {"POST", "/repos/fenny/fiber/issues"}, - {"PATCH", "/repos/fenny/fiber/issues/1000"}, - {"GET", "/repos/fenny/fiber/assignees"}, - {"GET", "/repos/fenny/fiber/assignees/nic"}, - {"GET", "/repos/fenny/fiber/issues/1000/comments"}, - {"GET", "/repos/fenny/fiber/issues/comments"}, - {"GET", "/repos/fenny/fiber/issues/comments/1337"}, - {"POST", "/repos/fenny/fiber/issues/1000/comments"}, - {"PATCH", "/repos/fenny/fiber/issues/comments/1337"}, - {"DELETE", "/repos/fenny/fiber/issues/comments/1337"}, - {"GET", "/repos/fenny/fiber/issues/1000/events"}, - {"GET", "/repos/fenny/fiber/issues/events"}, - {"GET", "/repos/fenny/fiber/issues/events/1337"}, - {"GET", "/repos/fenny/fiber/labels"}, - {"GET", "/repos/fenny/fiber/labels/john"}, - {"POST", "/repos/fenny/fiber/labels"}, - {"PATCH", "/repos/fenny/fiber/labels/john"}, - {"DELETE", "/repos/fenny/fiber/labels/john"}, - {"GET", "/repos/fenny/fiber/issues/1000/labels"}, - {"POST", "/repos/fenny/fiber/issues/1000/labels"}, - {"DELETE", "/repos/fenny/fiber/issues/1000/labels/john"}, - {"PUT", "/repos/fenny/fiber/issues/1000/labels"}, - {"DELETE", "/repos/fenny/fiber/issues/1000/labels"}, - {"GET", "/repos/fenny/fiber/milestones/1000/labels"}, - {"GET", "/repos/fenny/fiber/milestones"}, - {"GET", "/repos/fenny/fiber/milestones/1000"}, - {"POST", "/repos/fenny/fiber/milestones"}, - {"PATCH", "/repos/fenny/fiber/milestones/1000"}, - {"DELETE", "/repos/fenny/fiber/milestones/1000"}, - - // Miscellaneous - {"GET", "/emojis"}, - {"GET", "/gitignore/templates"}, - {"GET", "/gitignore/templates/john"}, - {"POST", "/markdown"}, - {"POST", "/markdown/raw"}, - {"GET", "/meta"}, - {"GET", "/rate_limit"}, - - // Organizations - {"GET", "/users/fenny/orgs"}, - {"GET", "/user/orgs"}, - {"GET", "/orgs/gofiber"}, - {"PATCH", "/orgs/gofiber"}, - {"GET", "/orgs/gofiber/members"}, - {"GET", "/orgs/gofiber/members/fenny"}, - {"DELETE", "/orgs/gofiber/members/fenny"}, - {"GET", "/orgs/gofiber/public_members"}, - {"GET", "/orgs/gofiber/public_members/fenny"}, - {"PUT", "/orgs/gofiber/public_members/fenny"}, - {"DELETE", "/orgs/gofiber/public_members/fenny"}, - {"GET", "/orgs/gofiber/teams"}, - {"GET", "/teams/1337"}, - {"POST", "/orgs/gofiber/teams"}, - {"PATCH", "/teams/1337"}, - {"DELETE", "/teams/1337"}, - {"GET", "/teams/1337/members"}, - {"GET", "/teams/1337/members/fenny"}, - {"PUT", "/teams/1337/members/fenny"}, - {"DELETE", "/teams/1337/members/fenny"}, - {"GET", "/teams/1337/repos"}, - {"GET", "/teams/1337/repos/fenny/fiber"}, - {"PUT", "/teams/1337/repos/fenny/fiber"}, - {"DELETE", "/teams/1337/repos/fenny/fiber"}, - {"GET", "/user/teams"}, - - // Pull Requests - {"GET", "/repos/fenny/fiber/pulls"}, - {"GET", "/repos/fenny/fiber/pulls/1000"}, - {"POST", "/repos/fenny/fiber/pulls"}, - {"PATCH", "/repos/fenny/fiber/pulls/1000"}, - {"GET", "/repos/fenny/fiber/pulls/1000/commits"}, - {"GET", "/repos/fenny/fiber/pulls/1000/files"}, - {"GET", "/repos/fenny/fiber/pulls/1000/merge"}, - {"PUT", "/repos/fenny/fiber/pulls/1000/merge"}, - {"GET", "/repos/fenny/fiber/pulls/1000/comments"}, - {"GET", "/repos/fenny/fiber/pulls/comments"}, - {"GET", "/repos/fenny/fiber/pulls/comments/1000"}, - {"PUT", "/repos/fenny/fiber/pulls/1000/comments"}, - {"PATCH", "/repos/fenny/fiber/pulls/comments/1000"}, - {"DELETE", "/repos/fenny/fiber/pulls/comments/1000"}, - - // Repositories - {"GET", "/user/repos"}, - {"GET", "/users/fenny/repos"}, - {"GET", "/orgs/gofiber/repos"}, - {"GET", "/repositories"}, - {"POST", "/user/repos"}, - {"POST", "/orgs/gofiber/repos"}, - {"GET", "/repos/fenny/fiber"}, - {"PATCH", "/repos/fenny/fiber"}, - {"GET", "/repos/fenny/fiber/contributors"}, - {"GET", "/repos/fenny/fiber/languages"}, - {"GET", "/repos/fenny/fiber/teams"}, - {"GET", "/repos/fenny/fiber/tags"}, - {"GET", "/repos/fenny/fiber/branches"}, - {"GET", "/repos/fenny/fiber/branches/master"}, - {"DELETE", "/repos/fenny/fiber"}, - {"GET", "/repos/fenny/fiber/collaborators"}, - {"GET", "/repos/fenny/fiber/collaborators/fenny"}, - {"PUT", "/repos/fenny/fiber/collaborators/fenny"}, - {"DELETE", "/repos/fenny/fiber/collaborators/fenny"}, - {"GET", "/repos/fenny/fiber/comments"}, - {"GET", "/repos/fenny/fiber/commits/v948b24g98ubngw9082bn02giub/comments"}, - {"POST", "/repos/fenny/fiber/commits/v948b24g98ubngw9082bn02giub/comments"}, - {"GET", "/repos/fenny/fiber/comments/1337"}, - {"PATCH", "/repos/fenny/fiber/comments/1337"}, - {"DELETE", "/repos/fenny/fiber/comments/1337"}, - {"GET", "/repos/fenny/fiber/commits"}, - {"GET", "/repos/fenny/fiber/commits/v948b24g98ubngw9082bn02giub"}, - {"GET", "/repos/fenny/fiber/readme"}, - {"GET", "/repos/fenny/fiber/contents/im/a/wildcard"}, - {"PUT", "/repos/fenny/fiber/contents/im/a/wildcard"}, - {"DELETE", "/repos/fenny/fiber/contents/im/a/wildcard"}, - {"GET", "/repos/fenny/fiber/gzip/google"}, - {"GET", "/repos/fenny/fiber/keys"}, - {"GET", "/repos/fenny/fiber/keys/1337"}, - {"POST", "/repos/fenny/fiber/keys"}, - {"PATCH", "/repos/fenny/fiber/keys/1337"}, - {"DELETE", "/repos/fenny/fiber/keys/1337"}, - {"GET", "/repos/fenny/fiber/downloads"}, - {"GET", "/repos/fenny/fiber/downloads/1337"}, - {"DELETE", "/repos/fenny/fiber/downloads/1337"}, - {"GET", "/repos/fenny/fiber/forks"}, - {"POST", "/repos/fenny/fiber/forks"}, - {"GET", "/repos/fenny/fiber/hooks"}, - {"GET", "/repos/fenny/fiber/hooks/1337"}, - {"POST", "/repos/fenny/fiber/hooks"}, - {"PATCH", "/repos/fenny/fiber/hooks/1337"}, - {"POST", "/repos/fenny/fiber/hooks/1337/tests"}, - {"DELETE", "/repos/fenny/fiber/hooks/1337"}, - {"POST", "/repos/fenny/fiber/merges"}, - {"GET", "/repos/fenny/fiber/releases"}, - {"GET", "/repos/fenny/fiber/releases/1337"}, - {"POST", "/repos/fenny/fiber/releases"}, - {"PATCH", "/repos/fenny/fiber/releases/1337"}, - {"DELETE", "/repos/fenny/fiber/releases/1337"}, - {"GET", "/repos/fenny/fiber/releases/1337/assets"}, - {"GET", "/repos/fenny/fiber/stats/contributors"}, - {"GET", "/repos/fenny/fiber/stats/commit_activity"}, - {"GET", "/repos/fenny/fiber/stats/code_frequency"}, - {"GET", "/repos/fenny/fiber/stats/participation"}, - {"GET", "/repos/fenny/fiber/stats/punch_card"}, - {"GET", "/repos/fenny/fiber/statuses/google"}, - {"POST", "/repos/fenny/fiber/statuses/google"}, - - // Search - {"GET", "/search/repositories"}, - {"GET", "/search/code"}, - {"GET", "/search/issues"}, - {"GET", "/search/users"}, - {"GET", "/legacy/issues/search/fenny/fibersitory/locked/finish"}, - {"GET", "/legacy/repos/search/finish"}, - {"GET", "/legacy/user/search/finish"}, - {"GET", "/legacy/user/email/info@gofiber.io"}, - - // Users - {"GET", "/users/fenny"}, - {"GET", "/user"}, - {"PATCH", "/user"}, - {"GET", "/users"}, - {"GET", "/user/emails"}, - {"POST", "/user/emails"}, - {"DELETE", "/user/emails"}, - {"GET", "/users/fenny/followers"}, - {"GET", "/user/followers"}, - {"GET", "/users/fenny/following"}, - {"GET", "/user/following"}, - {"GET", "/user/following/fenny"}, - {"GET", "/users/fenny/following/renan"}, - {"PUT", "/user/following/fenny"}, - {"DELETE", "/user/following/fenny"}, - {"GET", "/users/fenny/keys"}, - {"GET", "/user/keys"}, - {"GET", "/user/keys/1337"}, - {"POST", "/user/keys"}, - {"PATCH", "/user/keys/1337"}, - {"DELETE", "/user/keys/1337"}, -} - -var githubAPI = []testRoute{ - // OAuth Authorizations - {"GET", "/authorizations"}, - {"GET", "/authorizations/:id"}, - {"POST", "/authorizations"}, - {"PUT", "/authorizations/clients/:client_id"}, - {"PATCH", "/authorizations/:id"}, - {"DELETE", "/authorizations/:id"}, - {"GET", "/applications/:client_id/tokens/:access_token"}, - {"DELETE", "/applications/:client_id/tokens"}, - {"DELETE", "/applications/:client_id/tokens/:access_token"}, - - // Activity - {"GET", "/events"}, - {"GET", "/repos/:owner/:repo/events"}, - {"GET", "/networks/:owner/:repo/events"}, - {"GET", "/orgs/:org/events"}, - {"GET", "/users/:user/received_events"}, - {"GET", "/users/:user/received_events/public"}, - {"GET", "/users/:user/events"}, - {"GET", "/users/:user/events/public"}, - {"GET", "/users/:user/events/orgs/:org"}, - {"GET", "/feeds"}, - {"GET", "/notifications"}, - {"GET", "/repos/:owner/:repo/notifications"}, - {"PUT", "/notifications"}, - {"PUT", "/repos/:owner/:repo/notifications"}, - {"GET", "/notifications/threads/:id"}, - {"PATCH", "/notifications/threads/:id"}, - {"GET", "/notifications/threads/:id/subscription"}, - {"PUT", "/notifications/threads/:id/subscription"}, - {"DELETE", "/notifications/threads/:id/subscription"}, - {"GET", "/repos/:owner/:repo/stargazers"}, - {"GET", "/users/:user/starred"}, - {"GET", "/user/starred"}, - {"GET", "/user/starred/:owner/:repo"}, - {"PUT", "/user/starred/:owner/:repo"}, - {"DELETE", "/user/starred/:owner/:repo"}, - {"GET", "/repos/:owner/:repo/subscribers"}, - {"GET", "/users/:user/subscriptions"}, - {"GET", "/user/subscriptions"}, - {"GET", "/repos/:owner/:repo/subscription"}, - {"PUT", "/repos/:owner/:repo/subscription"}, - {"DELETE", "/repos/:owner/:repo/subscription"}, - {"GET", "/user/subscriptions/:owner/:repo"}, - {"PUT", "/user/subscriptions/:owner/:repo"}, - {"DELETE", "/user/subscriptions/:owner/:repo"}, - - // Gists - {"GET", "/users/:user/gists"}, - {"GET", "/gists"}, - {"GET", "/gists/public"}, - {"GET", "/gists/starred"}, - {"GET", "/gists/:id"}, - {"POST", "/gists"}, - {"PATCH", "/gists/:id"}, - {"PUT", "/gists/:id/star"}, - {"DELETE", "/gists/:id/star"}, - {"GET", "/gists/:id/star"}, - {"POST", "/gists/:id/forks"}, - {"DELETE", "/gists/:id"}, - - // Git Data - {"GET", "/repos/:owner/:repo/git/blobs/:sha"}, - {"POST", "/repos/:owner/:repo/git/blobs"}, - {"GET", "/repos/:owner/:repo/git/commits/:sha"}, - {"POST", "/repos/:owner/:repo/git/commits"}, - {"GET", "/repos/:owner/:repo/git/refs/*"}, - {"GET", "/repos/:owner/:repo/git/refs"}, - {"POST", "/repos/:owner/:repo/git/refs"}, - {"PATCH", "/repos/:owner/:repo/git/refs/*"}, - {"DELETE", "/repos/:owner/:repo/git/refs/*"}, - {"GET", "/repos/:owner/:repo/git/tags/:sha"}, - {"POST", "/repos/:owner/:repo/git/tags"}, - {"GET", "/repos/:owner/:repo/git/trees/:sha"}, - {"POST", "/repos/:owner/:repo/git/trees"}, - - // Issues - {"GET", "/issues"}, - {"GET", "/user/issues"}, - {"GET", "/orgs/:org/issues"}, - {"GET", "/repos/:owner/:repo/issues"}, - {"GET", "/repos/:owner/:repo/issues/:number"}, - {"POST", "/repos/:owner/:repo/issues"}, - {"PATCH", "/repos/:owner/:repo/issues/:number"}, - {"GET", "/repos/:owner/:repo/assignees"}, - {"GET", "/repos/:owner/:repo/assignees/:assignee"}, - {"GET", "/repos/:owner/:repo/issues/:number/comments"}, - {"GET", "/repos/:owner/:repo/issues/comments"}, - {"GET", "/repos/:owner/:repo/issues/comments/:id"}, - {"POST", "/repos/:owner/:repo/issues/:number/comments"}, - {"PATCH", "/repos/:owner/:repo/issues/comments/:id"}, - {"DELETE", "/repos/:owner/:repo/issues/comments/:id"}, - {"GET", "/repos/:owner/:repo/issues/:number/events"}, - {"GET", "/repos/:owner/:repo/issues/events"}, - {"GET", "/repos/:owner/:repo/issues/events/:id"}, - {"GET", "/repos/:owner/:repo/labels"}, - {"GET", "/repos/:owner/:repo/labels/:name"}, - {"POST", "/repos/:owner/:repo/labels"}, - {"PATCH", "/repos/:owner/:repo/labels/:name"}, - {"DELETE", "/repos/:owner/:repo/labels/:name"}, - {"GET", "/repos/:owner/:repo/issues/:number/labels"}, - {"POST", "/repos/:owner/:repo/issues/:number/labels"}, - {"DELETE", "/repos/:owner/:repo/issues/:number/labels/:name"}, - {"PUT", "/repos/:owner/:repo/issues/:number/labels"}, - {"DELETE", "/repos/:owner/:repo/issues/:number/labels"}, - {"GET", "/repos/:owner/:repo/milestones/:number/labels"}, - {"GET", "/repos/:owner/:repo/milestones"}, - {"GET", "/repos/:owner/:repo/milestones/:number"}, - {"POST", "/repos/:owner/:repo/milestones"}, - {"PATCH", "/repos/:owner/:repo/milestones/:number"}, - {"DELETE", "/repos/:owner/:repo/milestones/:number"}, - - // Miscellaneous - {"GET", "/emojis"}, - {"GET", "/gitignore/templates"}, - {"GET", "/gitignore/templates/:name"}, - {"POST", "/markdown"}, - {"POST", "/markdown/raw"}, - {"GET", "/meta"}, - {"GET", "/rate_limit"}, - - // Organizations - {"GET", "/users/:user/orgs"}, - {"GET", "/user/orgs"}, - {"GET", "/orgs/:org"}, - {"PATCH", "/orgs/:org"}, - {"GET", "/orgs/:org/members"}, - {"GET", "/orgs/:org/members/:user"}, - {"DELETE", "/orgs/:org/members/:user"}, - {"GET", "/orgs/:org/public_members"}, - {"GET", "/orgs/:org/public_members/:user"}, - {"PUT", "/orgs/:org/public_members/:user"}, - {"DELETE", "/orgs/:org/public_members/:user"}, - {"GET", "/orgs/:org/teams"}, - {"GET", "/teams/:id"}, - {"POST", "/orgs/:org/teams"}, - {"PATCH", "/teams/:id"}, - {"DELETE", "/teams/:id"}, - {"GET", "/teams/:id/members"}, - {"GET", "/teams/:id/members/:user"}, - {"PUT", "/teams/:id/members/:user"}, - {"DELETE", "/teams/:id/members/:user"}, - {"GET", "/teams/:id/repos"}, - {"GET", "/teams/:id/repos/:owner/:repo"}, - {"PUT", "/teams/:id/repos/:owner/:repo"}, - {"DELETE", "/teams/:id/repos/:owner/:repo"}, - {"GET", "/user/teams"}, - - // Pull Requests - {"GET", "/repos/:owner/:repo/pulls"}, - {"GET", "/repos/:owner/:repo/pulls/:number"}, - {"POST", "/repos/:owner/:repo/pulls"}, - {"PATCH", "/repos/:owner/:repo/pulls/:number"}, - {"GET", "/repos/:owner/:repo/pulls/:number/commits"}, - {"GET", "/repos/:owner/:repo/pulls/:number/files"}, - {"GET", "/repos/:owner/:repo/pulls/:number/merge"}, - {"PUT", "/repos/:owner/:repo/pulls/:number/merge"}, - {"GET", "/repos/:owner/:repo/pulls/:number/comments"}, - {"GET", "/repos/:owner/:repo/pulls/comments"}, - {"GET", "/repos/:owner/:repo/pulls/comments/:number"}, - {"PUT", "/repos/:owner/:repo/pulls/:number/comments"}, - {"PATCH", "/repos/:owner/:repo/pulls/comments/:number"}, - {"DELETE", "/repos/:owner/:repo/pulls/comments/:number"}, - - // Repositories - {"GET", "/user/repos"}, - {"GET", "/users/:user/repos"}, - {"GET", "/orgs/:org/repos"}, - {"GET", "/repositories"}, - {"POST", "/user/repos"}, - {"POST", "/orgs/:org/repos"}, - {"GET", "/repos/:owner/:repo"}, - {"PATCH", "/repos/:owner/:repo"}, - {"GET", "/repos/:owner/:repo/contributors"}, - {"GET", "/repos/:owner/:repo/languages"}, - {"GET", "/repos/:owner/:repo/teams"}, - {"GET", "/repos/:owner/:repo/tags"}, - {"GET", "/repos/:owner/:repo/branches"}, - {"GET", "/repos/:owner/:repo/branches/:branch"}, - {"DELETE", "/repos/:owner/:repo"}, - {"GET", "/repos/:owner/:repo/collaborators"}, - {"GET", "/repos/:owner/:repo/collaborators/:user"}, - {"PUT", "/repos/:owner/:repo/collaborators/:user"}, - {"DELETE", "/repos/:owner/:repo/collaborators/:user"}, - {"GET", "/repos/:owner/:repo/comments"}, - {"GET", "/repos/:owner/:repo/commits/:sha/comments"}, - {"POST", "/repos/:owner/:repo/commits/:sha/comments"}, - {"GET", "/repos/:owner/:repo/comments/:id"}, - {"PATCH", "/repos/:owner/:repo/comments/:id"}, - {"DELETE", "/repos/:owner/:repo/comments/:id"}, - {"GET", "/repos/:owner/:repo/commits"}, - {"GET", "/repos/:owner/:repo/commits/:sha"}, - {"GET", "/repos/:owner/:repo/readme"}, - {"GET", "/repos/:owner/:repo/contents/*"}, - {"PUT", "/repos/:owner/:repo/contents/*"}, - {"DELETE", "/repos/:owner/:repo/contents/*"}, - {"GET", "/repos/:owner/:repo/:archive_format/:ref"}, - {"GET", "/repos/:owner/:repo/keys"}, - {"GET", "/repos/:owner/:repo/keys/:id"}, - {"POST", "/repos/:owner/:repo/keys"}, - {"PATCH", "/repos/:owner/:repo/keys/:id"}, - {"DELETE", "/repos/:owner/:repo/keys/:id"}, - {"GET", "/repos/:owner/:repo/downloads"}, - {"GET", "/repos/:owner/:repo/downloads/:id"}, - {"DELETE", "/repos/:owner/:repo/downloads/:id"}, - {"GET", "/repos/:owner/:repo/forks"}, - {"POST", "/repos/:owner/:repo/forks"}, - {"GET", "/repos/:owner/:repo/hooks"}, - {"GET", "/repos/:owner/:repo/hooks/:id"}, - {"POST", "/repos/:owner/:repo/hooks"}, - {"PATCH", "/repos/:owner/:repo/hooks/:id"}, - {"POST", "/repos/:owner/:repo/hooks/:id/tests"}, - {"DELETE", "/repos/:owner/:repo/hooks/:id"}, - {"POST", "/repos/:owner/:repo/merges"}, - {"GET", "/repos/:owner/:repo/releases"}, - {"GET", "/repos/:owner/:repo/releases/:id"}, - {"POST", "/repos/:owner/:repo/releases"}, - {"PATCH", "/repos/:owner/:repo/releases/:id"}, - {"DELETE", "/repos/:owner/:repo/releases/:id"}, - {"GET", "/repos/:owner/:repo/releases/:id/assets"}, - {"GET", "/repos/:owner/:repo/stats/contributors"}, - {"GET", "/repos/:owner/:repo/stats/commit_activity"}, - {"GET", "/repos/:owner/:repo/stats/code_frequency"}, - {"GET", "/repos/:owner/:repo/stats/participation"}, - {"GET", "/repos/:owner/:repo/stats/punch_card"}, - {"GET", "/repos/:owner/:repo/statuses/:ref"}, - {"POST", "/repos/:owner/:repo/statuses/:ref"}, - - // Search - {"GET", "/search/repositories"}, - {"GET", "/search/code"}, - {"GET", "/search/issues"}, - {"GET", "/search/users"}, - {"GET", "/legacy/issues/search/:owner/:repository/:state/:keyword"}, - {"GET", "/legacy/repos/search/:keyword"}, - {"GET", "/legacy/user/search/:keyword"}, - {"GET", "/legacy/user/email/:email"}, - - // Users - {"GET", "/users/:user"}, - {"GET", "/user"}, - {"PATCH", "/user"}, - {"GET", "/users"}, - {"GET", "/user/emails"}, - {"POST", "/user/emails"}, - {"DELETE", "/user/emails"}, - {"GET", "/users/:user/followers"}, - {"GET", "/user/followers"}, - {"GET", "/users/:user/following"}, - {"GET", "/user/following"}, - {"GET", "/user/following/:user"}, - {"GET", "/users/:user/following/:target_user"}, - {"PUT", "/user/following/:user"}, - {"DELETE", "/user/following/:user"}, - {"GET", "/users/:user/keys"}, - {"GET", "/user/keys"}, - {"GET", "/user/keys/:id"}, - {"POST", "/user/keys"}, - {"PATCH", "/user/keys/:id"}, - {"DELETE", "/user/keys/:id"}, -} +// import ( +// "testing" +// ) + +// var router_bench_app *App + +// func init() { +// router_bench_app = New() +// h := func(c *Ctx) {} +// for _, r := range githubAPI { +// switch r.method { +// case "GET": +// router_bench_app.Get(r.path, h) +// case "POST": +// router_bench_app.Post(r.path, h) +// case "PUT": +// router_bench_app.Put(r.path, h) +// case "PATCH": +// router_bench_app.Patch(r.path, h) +// case "DELETE": +// router_bench_app.Delete(r.path, h) +// default: +// panic("Unknow HTTP method: " + r.method) +// } +// } +// } + +// func Benchmark_Router_Github_Routes(b *testing.B) { +// var match bool +// var params []string +// for n := 0; n < b.N; n++ { +// for i := range testRoutes { +// match, params = matchRoute(testRoutes[i].method, testRoutes[i].path) +// } +// if match { +// if len(params) > 0 { + +// } +// } +// } +// } + +// func Benchmark_Router_Last_Route(b *testing.B) { +// var match bool +// var params []string +// for n := 0; n < b.N; n++ { +// match, params = matchRoute("DELETE", "/user/keys/1337") +// } +// if match { +// if len(params) > 0 { + +// } +// } +// } +// func Benchmark_Router_First_Route(b *testing.B) { +// var match bool +// var params []string +// for n := 0; n < b.N; n++ { +// match, params = matchRoute("GET", "/authorizations") +// } +// if match { +// if len(params) > 0 { + +// } +// } +// } + +// func matchRoute(method, path string) (match bool, values []string) { +// mINT := methodINT[method] +// for i := range router_bench_app.routes[mINT] { +// match, values = router_bench_app.routes[mINT][i].matchRoute(path) +// if match { +// return true, values +// } +// } +// return +// } + +// type testRoute struct { +// method string +// path string +// } + +// var testRoutes = []testRoute{ +// // OAuth Authorizations +// {"GET", "/authorizations"}, +// {"GET", "/authorizations/1337"}, +// {"POST", "/authorizations"}, +// {"PUT", "/authorizations/clients/inf1nd873nf8912g9t"}, +// {"PATCH", "/authorizations/1337"}, +// {"DELETE", "/authorizations/1337"}, +// {"GET", "/applications/2nds981mng6azl127y/tokens/sn108hbe1geheibf13f"}, +// {"DELETE", "/applications/2nds981mng6azl127y/tokens"}, +// {"DELETE", "/applications/2nds981mng6azl127y/tokens/sn108hbe1geheibf13f"}, + +// // Activity +// {"GET", "/events"}, +// {"GET", "/repos/fenny/fiber/events"}, +// {"GET", "/networks/fenny/fiber/events"}, +// {"GET", "/orgs/gofiber/events"}, +// {"GET", "/users/fenny/received_events"}, +// {"GET", "/users/fenny/received_events/public"}, +// {"GET", "/users/fenny/events"}, +// {"GET", "/users/fenny/events/public"}, +// {"GET", "/users/fenny/events/orgs/gofiber"}, +// {"GET", "/feeds"}, +// {"GET", "/notifications"}, +// {"GET", "/repos/fenny/fiber/notifications"}, +// {"PUT", "/notifications"}, +// {"PUT", "/repos/fenny/fiber/notifications"}, +// {"GET", "/notifications/threads/1337"}, +// {"PATCH", "/notifications/threads/1337"}, +// {"GET", "/notifications/threads/1337/subscription"}, +// {"PUT", "/notifications/threads/1337/subscription"}, +// {"DELETE", "/notifications/threads/1337/subscription"}, +// {"GET", "/repos/fenny/fiber/stargazers"}, +// {"GET", "/users/fenny/starred"}, +// {"GET", "/user/starred"}, +// {"GET", "/user/starred/fenny/fiber"}, +// {"PUT", "/user/starred/fenny/fiber"}, +// {"DELETE", "/user/starred/fenny/fiber"}, +// {"GET", "/repos/fenny/fiber/subscribers"}, +// {"GET", "/users/fenny/subscriptions"}, +// {"GET", "/user/subscriptions"}, +// {"GET", "/repos/fenny/fiber/subscription"}, +// {"PUT", "/repos/fenny/fiber/subscription"}, +// {"DELETE", "/repos/fenny/fiber/subscription"}, +// {"GET", "/user/subscriptions/fenny/fiber"}, +// {"PUT", "/user/subscriptions/fenny/fiber"}, +// {"DELETE", "/user/subscriptions/fenny/fiber"}, + +// // Gists +// {"GET", "/users/fenny/gists"}, +// {"GET", "/gists"}, +// {"GET", "/gists/public"}, +// {"GET", "/gists/starred"}, +// {"GET", "/gists/1337"}, +// {"POST", "/gists"}, +// {"PATCH", "/gists/1337"}, +// {"PUT", "/gists/1337/star"}, +// {"DELETE", "/gists/1337/star"}, +// {"GET", "/gists/1337/star"}, +// {"POST", "/gists/1337/forks"}, +// {"DELETE", "/gists/1337"}, + +// // Git Data +// {"GET", "/repos/fenny/fiber/git/blobs/v948b24g98ubngw9082bn02giub"}, +// {"POST", "/repos/fenny/fiber/git/blobs"}, +// {"GET", "/repos/fenny/fiber/git/commits/v948b24g98ubngw9082bn02giub"}, +// {"POST", "/repos/fenny/fiber/git/commits"}, +// {"GET", "/repos/fenny/fiber/git/refs/im/a/wildcard"}, +// {"GET", "/repos/fenny/fiber/git/refs"}, +// {"POST", "/repos/fenny/fiber/git/refs"}, +// {"PATCH", "/repos/fenny/fiber/git/refs/im/a/wildcard"}, +// {"DELETE", "/repos/fenny/fiber/git/refs/im/a/wildcard"}, +// {"GET", "/repos/fenny/fiber/git/tags/v948b24g98ubngw9082bn02giub"}, +// {"POST", "/repos/fenny/fiber/git/tags"}, +// {"GET", "/repos/fenny/fiber/git/trees/v948b24g98ubngw9082bn02giub"}, +// {"POST", "/repos/fenny/fiber/git/trees"}, + +// // Issues +// {"GET", "/issues"}, +// {"GET", "/user/issues"}, +// {"GET", "/orgs/gofiber/issues"}, +// {"GET", "/repos/fenny/fiber/issues"}, +// {"GET", "/repos/fenny/fiber/issues/1000"}, +// {"POST", "/repos/fenny/fiber/issues"}, +// {"PATCH", "/repos/fenny/fiber/issues/1000"}, +// {"GET", "/repos/fenny/fiber/assignees"}, +// {"GET", "/repos/fenny/fiber/assignees/nic"}, +// {"GET", "/repos/fenny/fiber/issues/1000/comments"}, +// {"GET", "/repos/fenny/fiber/issues/comments"}, +// {"GET", "/repos/fenny/fiber/issues/comments/1337"}, +// {"POST", "/repos/fenny/fiber/issues/1000/comments"}, +// {"PATCH", "/repos/fenny/fiber/issues/comments/1337"}, +// {"DELETE", "/repos/fenny/fiber/issues/comments/1337"}, +// {"GET", "/repos/fenny/fiber/issues/1000/events"}, +// {"GET", "/repos/fenny/fiber/issues/events"}, +// {"GET", "/repos/fenny/fiber/issues/events/1337"}, +// {"GET", "/repos/fenny/fiber/labels"}, +// {"GET", "/repos/fenny/fiber/labels/john"}, +// {"POST", "/repos/fenny/fiber/labels"}, +// {"PATCH", "/repos/fenny/fiber/labels/john"}, +// {"DELETE", "/repos/fenny/fiber/labels/john"}, +// {"GET", "/repos/fenny/fiber/issues/1000/labels"}, +// {"POST", "/repos/fenny/fiber/issues/1000/labels"}, +// {"DELETE", "/repos/fenny/fiber/issues/1000/labels/john"}, +// {"PUT", "/repos/fenny/fiber/issues/1000/labels"}, +// {"DELETE", "/repos/fenny/fiber/issues/1000/labels"}, +// {"GET", "/repos/fenny/fiber/milestones/1000/labels"}, +// {"GET", "/repos/fenny/fiber/milestones"}, +// {"GET", "/repos/fenny/fiber/milestones/1000"}, +// {"POST", "/repos/fenny/fiber/milestones"}, +// {"PATCH", "/repos/fenny/fiber/milestones/1000"}, +// {"DELETE", "/repos/fenny/fiber/milestones/1000"}, + +// // Miscellaneous +// {"GET", "/emojis"}, +// {"GET", "/gitignore/templates"}, +// {"GET", "/gitignore/templates/john"}, +// {"POST", "/markdown"}, +// {"POST", "/markdown/raw"}, +// {"GET", "/meta"}, +// {"GET", "/rate_limit"}, + +// // Organizations +// {"GET", "/users/fenny/orgs"}, +// {"GET", "/user/orgs"}, +// {"GET", "/orgs/gofiber"}, +// {"PATCH", "/orgs/gofiber"}, +// {"GET", "/orgs/gofiber/members"}, +// {"GET", "/orgs/gofiber/members/fenny"}, +// {"DELETE", "/orgs/gofiber/members/fenny"}, +// {"GET", "/orgs/gofiber/public_members"}, +// {"GET", "/orgs/gofiber/public_members/fenny"}, +// {"PUT", "/orgs/gofiber/public_members/fenny"}, +// {"DELETE", "/orgs/gofiber/public_members/fenny"}, +// {"GET", "/orgs/gofiber/teams"}, +// {"GET", "/teams/1337"}, +// {"POST", "/orgs/gofiber/teams"}, +// {"PATCH", "/teams/1337"}, +// {"DELETE", "/teams/1337"}, +// {"GET", "/teams/1337/members"}, +// {"GET", "/teams/1337/members/fenny"}, +// {"PUT", "/teams/1337/members/fenny"}, +// {"DELETE", "/teams/1337/members/fenny"}, +// {"GET", "/teams/1337/repos"}, +// {"GET", "/teams/1337/repos/fenny/fiber"}, +// {"PUT", "/teams/1337/repos/fenny/fiber"}, +// {"DELETE", "/teams/1337/repos/fenny/fiber"}, +// {"GET", "/user/teams"}, + +// // Pull Requests +// {"GET", "/repos/fenny/fiber/pulls"}, +// {"GET", "/repos/fenny/fiber/pulls/1000"}, +// {"POST", "/repos/fenny/fiber/pulls"}, +// {"PATCH", "/repos/fenny/fiber/pulls/1000"}, +// {"GET", "/repos/fenny/fiber/pulls/1000/commits"}, +// {"GET", "/repos/fenny/fiber/pulls/1000/files"}, +// {"GET", "/repos/fenny/fiber/pulls/1000/merge"}, +// {"PUT", "/repos/fenny/fiber/pulls/1000/merge"}, +// {"GET", "/repos/fenny/fiber/pulls/1000/comments"}, +// {"GET", "/repos/fenny/fiber/pulls/comments"}, +// {"GET", "/repos/fenny/fiber/pulls/comments/1000"}, +// {"PUT", "/repos/fenny/fiber/pulls/1000/comments"}, +// {"PATCH", "/repos/fenny/fiber/pulls/comments/1000"}, +// {"DELETE", "/repos/fenny/fiber/pulls/comments/1000"}, + +// // Repositories +// {"GET", "/user/repos"}, +// {"GET", "/users/fenny/repos"}, +// {"GET", "/orgs/gofiber/repos"}, +// {"GET", "/repositories"}, +// {"POST", "/user/repos"}, +// {"POST", "/orgs/gofiber/repos"}, +// {"GET", "/repos/fenny/fiber"}, +// {"PATCH", "/repos/fenny/fiber"}, +// {"GET", "/repos/fenny/fiber/contributors"}, +// {"GET", "/repos/fenny/fiber/languages"}, +// {"GET", "/repos/fenny/fiber/teams"}, +// {"GET", "/repos/fenny/fiber/tags"}, +// {"GET", "/repos/fenny/fiber/branches"}, +// {"GET", "/repos/fenny/fiber/branches/master"}, +// {"DELETE", "/repos/fenny/fiber"}, +// {"GET", "/repos/fenny/fiber/collaborators"}, +// {"GET", "/repos/fenny/fiber/collaborators/fenny"}, +// {"PUT", "/repos/fenny/fiber/collaborators/fenny"}, +// {"DELETE", "/repos/fenny/fiber/collaborators/fenny"}, +// {"GET", "/repos/fenny/fiber/comments"}, +// {"GET", "/repos/fenny/fiber/commits/v948b24g98ubngw9082bn02giub/comments"}, +// {"POST", "/repos/fenny/fiber/commits/v948b24g98ubngw9082bn02giub/comments"}, +// {"GET", "/repos/fenny/fiber/comments/1337"}, +// {"PATCH", "/repos/fenny/fiber/comments/1337"}, +// {"DELETE", "/repos/fenny/fiber/comments/1337"}, +// {"GET", "/repos/fenny/fiber/commits"}, +// {"GET", "/repos/fenny/fiber/commits/v948b24g98ubngw9082bn02giub"}, +// {"GET", "/repos/fenny/fiber/readme"}, +// {"GET", "/repos/fenny/fiber/contents/im/a/wildcard"}, +// {"PUT", "/repos/fenny/fiber/contents/im/a/wildcard"}, +// {"DELETE", "/repos/fenny/fiber/contents/im/a/wildcard"}, +// {"GET", "/repos/fenny/fiber/gzip/google"}, +// {"GET", "/repos/fenny/fiber/keys"}, +// {"GET", "/repos/fenny/fiber/keys/1337"}, +// {"POST", "/repos/fenny/fiber/keys"}, +// {"PATCH", "/repos/fenny/fiber/keys/1337"}, +// {"DELETE", "/repos/fenny/fiber/keys/1337"}, +// {"GET", "/repos/fenny/fiber/downloads"}, +// {"GET", "/repos/fenny/fiber/downloads/1337"}, +// {"DELETE", "/repos/fenny/fiber/downloads/1337"}, +// {"GET", "/repos/fenny/fiber/forks"}, +// {"POST", "/repos/fenny/fiber/forks"}, +// {"GET", "/repos/fenny/fiber/hooks"}, +// {"GET", "/repos/fenny/fiber/hooks/1337"}, +// {"POST", "/repos/fenny/fiber/hooks"}, +// {"PATCH", "/repos/fenny/fiber/hooks/1337"}, +// {"POST", "/repos/fenny/fiber/hooks/1337/tests"}, +// {"DELETE", "/repos/fenny/fiber/hooks/1337"}, +// {"POST", "/repos/fenny/fiber/merges"}, +// {"GET", "/repos/fenny/fiber/releases"}, +// {"GET", "/repos/fenny/fiber/releases/1337"}, +// {"POST", "/repos/fenny/fiber/releases"}, +// {"PATCH", "/repos/fenny/fiber/releases/1337"}, +// {"DELETE", "/repos/fenny/fiber/releases/1337"}, +// {"GET", "/repos/fenny/fiber/releases/1337/assets"}, +// {"GET", "/repos/fenny/fiber/stats/contributors"}, +// {"GET", "/repos/fenny/fiber/stats/commit_activity"}, +// {"GET", "/repos/fenny/fiber/stats/code_frequency"}, +// {"GET", "/repos/fenny/fiber/stats/participation"}, +// {"GET", "/repos/fenny/fiber/stats/punch_card"}, +// {"GET", "/repos/fenny/fiber/statuses/google"}, +// {"POST", "/repos/fenny/fiber/statuses/google"}, + +// // Search +// {"GET", "/search/repositories"}, +// {"GET", "/search/code"}, +// {"GET", "/search/issues"}, +// {"GET", "/search/users"}, +// {"GET", "/legacy/issues/search/fenny/fibersitory/locked/finish"}, +// {"GET", "/legacy/repos/search/finish"}, +// {"GET", "/legacy/user/search/finish"}, +// {"GET", "/legacy/user/email/info@gofiber.io"}, + +// // Users +// {"GET", "/users/fenny"}, +// {"GET", "/user"}, +// {"PATCH", "/user"}, +// {"GET", "/users"}, +// {"GET", "/user/emails"}, +// {"POST", "/user/emails"}, +// {"DELETE", "/user/emails"}, +// {"GET", "/users/fenny/followers"}, +// {"GET", "/user/followers"}, +// {"GET", "/users/fenny/following"}, +// {"GET", "/user/following"}, +// {"GET", "/user/following/fenny"}, +// {"GET", "/users/fenny/following/renan"}, +// {"PUT", "/user/following/fenny"}, +// {"DELETE", "/user/following/fenny"}, +// {"GET", "/users/fenny/keys"}, +// {"GET", "/user/keys"}, +// {"GET", "/user/keys/1337"}, +// {"POST", "/user/keys"}, +// {"PATCH", "/user/keys/1337"}, +// {"DELETE", "/user/keys/1337"}, +// } + +// var githubAPI = []testRoute{ +// // OAuth Authorizations +// {"GET", "/authorizations"}, +// {"GET", "/authorizations/:id"}, +// {"POST", "/authorizations"}, +// {"PUT", "/authorizations/clients/:client_id"}, +// {"PATCH", "/authorizations/:id"}, +// {"DELETE", "/authorizations/:id"}, +// {"GET", "/applications/:client_id/tokens/:access_token"}, +// {"DELETE", "/applications/:client_id/tokens"}, +// {"DELETE", "/applications/:client_id/tokens/:access_token"}, + +// // Activity +// {"GET", "/events"}, +// {"GET", "/repos/:owner/:repo/events"}, +// {"GET", "/networks/:owner/:repo/events"}, +// {"GET", "/orgs/:org/events"}, +// {"GET", "/users/:user/received_events"}, +// {"GET", "/users/:user/received_events/public"}, +// {"GET", "/users/:user/events"}, +// {"GET", "/users/:user/events/public"}, +// {"GET", "/users/:user/events/orgs/:org"}, +// {"GET", "/feeds"}, +// {"GET", "/notifications"}, +// {"GET", "/repos/:owner/:repo/notifications"}, +// {"PUT", "/notifications"}, +// {"PUT", "/repos/:owner/:repo/notifications"}, +// {"GET", "/notifications/threads/:id"}, +// {"PATCH", "/notifications/threads/:id"}, +// {"GET", "/notifications/threads/:id/subscription"}, +// {"PUT", "/notifications/threads/:id/subscription"}, +// {"DELETE", "/notifications/threads/:id/subscription"}, +// {"GET", "/repos/:owner/:repo/stargazers"}, +// {"GET", "/users/:user/starred"}, +// {"GET", "/user/starred"}, +// {"GET", "/user/starred/:owner/:repo"}, +// {"PUT", "/user/starred/:owner/:repo"}, +// {"DELETE", "/user/starred/:owner/:repo"}, +// {"GET", "/repos/:owner/:repo/subscribers"}, +// {"GET", "/users/:user/subscriptions"}, +// {"GET", "/user/subscriptions"}, +// {"GET", "/repos/:owner/:repo/subscription"}, +// {"PUT", "/repos/:owner/:repo/subscription"}, +// {"DELETE", "/repos/:owner/:repo/subscription"}, +// {"GET", "/user/subscriptions/:owner/:repo"}, +// {"PUT", "/user/subscriptions/:owner/:repo"}, +// {"DELETE", "/user/subscriptions/:owner/:repo"}, + +// // Gists +// {"GET", "/users/:user/gists"}, +// {"GET", "/gists"}, +// {"GET", "/gists/public"}, +// {"GET", "/gists/starred"}, +// {"GET", "/gists/:id"}, +// {"POST", "/gists"}, +// {"PATCH", "/gists/:id"}, +// {"PUT", "/gists/:id/star"}, +// {"DELETE", "/gists/:id/star"}, +// {"GET", "/gists/:id/star"}, +// {"POST", "/gists/:id/forks"}, +// {"DELETE", "/gists/:id"}, + +// // Git Data +// {"GET", "/repos/:owner/:repo/git/blobs/:sha"}, +// {"POST", "/repos/:owner/:repo/git/blobs"}, +// {"GET", "/repos/:owner/:repo/git/commits/:sha"}, +// {"POST", "/repos/:owner/:repo/git/commits"}, +// {"GET", "/repos/:owner/:repo/git/refs/*"}, +// {"GET", "/repos/:owner/:repo/git/refs"}, +// {"POST", "/repos/:owner/:repo/git/refs"}, +// {"PATCH", "/repos/:owner/:repo/git/refs/*"}, +// {"DELETE", "/repos/:owner/:repo/git/refs/*"}, +// {"GET", "/repos/:owner/:repo/git/tags/:sha"}, +// {"POST", "/repos/:owner/:repo/git/tags"}, +// {"GET", "/repos/:owner/:repo/git/trees/:sha"}, +// {"POST", "/repos/:owner/:repo/git/trees"}, + +// // Issues +// {"GET", "/issues"}, +// {"GET", "/user/issues"}, +// {"GET", "/orgs/:org/issues"}, +// {"GET", "/repos/:owner/:repo/issues"}, +// {"GET", "/repos/:owner/:repo/issues/:number"}, +// {"POST", "/repos/:owner/:repo/issues"}, +// {"PATCH", "/repos/:owner/:repo/issues/:number"}, +// {"GET", "/repos/:owner/:repo/assignees"}, +// {"GET", "/repos/:owner/:repo/assignees/:assignee"}, +// {"GET", "/repos/:owner/:repo/issues/:number/comments"}, +// {"GET", "/repos/:owner/:repo/issues/comments"}, +// {"GET", "/repos/:owner/:repo/issues/comments/:id"}, +// {"POST", "/repos/:owner/:repo/issues/:number/comments"}, +// {"PATCH", "/repos/:owner/:repo/issues/comments/:id"}, +// {"DELETE", "/repos/:owner/:repo/issues/comments/:id"}, +// {"GET", "/repos/:owner/:repo/issues/:number/events"}, +// {"GET", "/repos/:owner/:repo/issues/events"}, +// {"GET", "/repos/:owner/:repo/issues/events/:id"}, +// {"GET", "/repos/:owner/:repo/labels"}, +// {"GET", "/repos/:owner/:repo/labels/:name"}, +// {"POST", "/repos/:owner/:repo/labels"}, +// {"PATCH", "/repos/:owner/:repo/labels/:name"}, +// {"DELETE", "/repos/:owner/:repo/labels/:name"}, +// {"GET", "/repos/:owner/:repo/issues/:number/labels"}, +// {"POST", "/repos/:owner/:repo/issues/:number/labels"}, +// {"DELETE", "/repos/:owner/:repo/issues/:number/labels/:name"}, +// {"PUT", "/repos/:owner/:repo/issues/:number/labels"}, +// {"DELETE", "/repos/:owner/:repo/issues/:number/labels"}, +// {"GET", "/repos/:owner/:repo/milestones/:number/labels"}, +// {"GET", "/repos/:owner/:repo/milestones"}, +// {"GET", "/repos/:owner/:repo/milestones/:number"}, +// {"POST", "/repos/:owner/:repo/milestones"}, +// {"PATCH", "/repos/:owner/:repo/milestones/:number"}, +// {"DELETE", "/repos/:owner/:repo/milestones/:number"}, + +// // Miscellaneous +// {"GET", "/emojis"}, +// {"GET", "/gitignore/templates"}, +// {"GET", "/gitignore/templates/:name"}, +// {"POST", "/markdown"}, +// {"POST", "/markdown/raw"}, +// {"GET", "/meta"}, +// {"GET", "/rate_limit"}, + +// // Organizations +// {"GET", "/users/:user/orgs"}, +// {"GET", "/user/orgs"}, +// {"GET", "/orgs/:org"}, +// {"PATCH", "/orgs/:org"}, +// {"GET", "/orgs/:org/members"}, +// {"GET", "/orgs/:org/members/:user"}, +// {"DELETE", "/orgs/:org/members/:user"}, +// {"GET", "/orgs/:org/public_members"}, +// {"GET", "/orgs/:org/public_members/:user"}, +// {"PUT", "/orgs/:org/public_members/:user"}, +// {"DELETE", "/orgs/:org/public_members/:user"}, +// {"GET", "/orgs/:org/teams"}, +// {"GET", "/teams/:id"}, +// {"POST", "/orgs/:org/teams"}, +// {"PATCH", "/teams/:id"}, +// {"DELETE", "/teams/:id"}, +// {"GET", "/teams/:id/members"}, +// {"GET", "/teams/:id/members/:user"}, +// {"PUT", "/teams/:id/members/:user"}, +// {"DELETE", "/teams/:id/members/:user"}, +// {"GET", "/teams/:id/repos"}, +// {"GET", "/teams/:id/repos/:owner/:repo"}, +// {"PUT", "/teams/:id/repos/:owner/:repo"}, +// {"DELETE", "/teams/:id/repos/:owner/:repo"}, +// {"GET", "/user/teams"}, + +// // Pull Requests +// {"GET", "/repos/:owner/:repo/pulls"}, +// {"GET", "/repos/:owner/:repo/pulls/:number"}, +// {"POST", "/repos/:owner/:repo/pulls"}, +// {"PATCH", "/repos/:owner/:repo/pulls/:number"}, +// {"GET", "/repos/:owner/:repo/pulls/:number/commits"}, +// {"GET", "/repos/:owner/:repo/pulls/:number/files"}, +// {"GET", "/repos/:owner/:repo/pulls/:number/merge"}, +// {"PUT", "/repos/:owner/:repo/pulls/:number/merge"}, +// {"GET", "/repos/:owner/:repo/pulls/:number/comments"}, +// {"GET", "/repos/:owner/:repo/pulls/comments"}, +// {"GET", "/repos/:owner/:repo/pulls/comments/:number"}, +// {"PUT", "/repos/:owner/:repo/pulls/:number/comments"}, +// {"PATCH", "/repos/:owner/:repo/pulls/comments/:number"}, +// {"DELETE", "/repos/:owner/:repo/pulls/comments/:number"}, + +// // Repositories +// {"GET", "/user/repos"}, +// {"GET", "/users/:user/repos"}, +// {"GET", "/orgs/:org/repos"}, +// {"GET", "/repositories"}, +// {"POST", "/user/repos"}, +// {"POST", "/orgs/:org/repos"}, +// {"GET", "/repos/:owner/:repo"}, +// {"PATCH", "/repos/:owner/:repo"}, +// {"GET", "/repos/:owner/:repo/contributors"}, +// {"GET", "/repos/:owner/:repo/languages"}, +// {"GET", "/repos/:owner/:repo/teams"}, +// {"GET", "/repos/:owner/:repo/tags"}, +// {"GET", "/repos/:owner/:repo/branches"}, +// {"GET", "/repos/:owner/:repo/branches/:branch"}, +// {"DELETE", "/repos/:owner/:repo"}, +// {"GET", "/repos/:owner/:repo/collaborators"}, +// {"GET", "/repos/:owner/:repo/collaborators/:user"}, +// {"PUT", "/repos/:owner/:repo/collaborators/:user"}, +// {"DELETE", "/repos/:owner/:repo/collaborators/:user"}, +// {"GET", "/repos/:owner/:repo/comments"}, +// {"GET", "/repos/:owner/:repo/commits/:sha/comments"}, +// {"POST", "/repos/:owner/:repo/commits/:sha/comments"}, +// {"GET", "/repos/:owner/:repo/comments/:id"}, +// {"PATCH", "/repos/:owner/:repo/comments/:id"}, +// {"DELETE", "/repos/:owner/:repo/comments/:id"}, +// {"GET", "/repos/:owner/:repo/commits"}, +// {"GET", "/repos/:owner/:repo/commits/:sha"}, +// {"GET", "/repos/:owner/:repo/readme"}, +// {"GET", "/repos/:owner/:repo/contents/*"}, +// {"PUT", "/repos/:owner/:repo/contents/*"}, +// {"DELETE", "/repos/:owner/:repo/contents/*"}, +// {"GET", "/repos/:owner/:repo/:archive_format/:ref"}, +// {"GET", "/repos/:owner/:repo/keys"}, +// {"GET", "/repos/:owner/:repo/keys/:id"}, +// {"POST", "/repos/:owner/:repo/keys"}, +// {"PATCH", "/repos/:owner/:repo/keys/:id"}, +// {"DELETE", "/repos/:owner/:repo/keys/:id"}, +// {"GET", "/repos/:owner/:repo/downloads"}, +// {"GET", "/repos/:owner/:repo/downloads/:id"}, +// {"DELETE", "/repos/:owner/:repo/downloads/:id"}, +// {"GET", "/repos/:owner/:repo/forks"}, +// {"POST", "/repos/:owner/:repo/forks"}, +// {"GET", "/repos/:owner/:repo/hooks"}, +// {"GET", "/repos/:owner/:repo/hooks/:id"}, +// {"POST", "/repos/:owner/:repo/hooks"}, +// {"PATCH", "/repos/:owner/:repo/hooks/:id"}, +// {"POST", "/repos/:owner/:repo/hooks/:id/tests"}, +// {"DELETE", "/repos/:owner/:repo/hooks/:id"}, +// {"POST", "/repos/:owner/:repo/merges"}, +// {"GET", "/repos/:owner/:repo/releases"}, +// {"GET", "/repos/:owner/:repo/releases/:id"}, +// {"POST", "/repos/:owner/:repo/releases"}, +// {"PATCH", "/repos/:owner/:repo/releases/:id"}, +// {"DELETE", "/repos/:owner/:repo/releases/:id"}, +// {"GET", "/repos/:owner/:repo/releases/:id/assets"}, +// {"GET", "/repos/:owner/:repo/stats/contributors"}, +// {"GET", "/repos/:owner/:repo/stats/commit_activity"}, +// {"GET", "/repos/:owner/:repo/stats/code_frequency"}, +// {"GET", "/repos/:owner/:repo/stats/participation"}, +// {"GET", "/repos/:owner/:repo/stats/punch_card"}, +// {"GET", "/repos/:owner/:repo/statuses/:ref"}, +// {"POST", "/repos/:owner/:repo/statuses/:ref"}, + +// // Search +// {"GET", "/search/repositories"}, +// {"GET", "/search/code"}, +// {"GET", "/search/issues"}, +// {"GET", "/search/users"}, +// {"GET", "/legacy/issues/search/:owner/:repository/:state/:keyword"}, +// {"GET", "/legacy/repos/search/:keyword"}, +// {"GET", "/legacy/user/search/:keyword"}, +// {"GET", "/legacy/user/email/:email"}, + +// // Users +// {"GET", "/users/:user"}, +// {"GET", "/user"}, +// {"PATCH", "/user"}, +// {"GET", "/users"}, +// {"GET", "/user/emails"}, +// {"POST", "/user/emails"}, +// {"DELETE", "/user/emails"}, +// {"GET", "/users/:user/followers"}, +// {"GET", "/user/followers"}, +// {"GET", "/users/:user/following"}, +// {"GET", "/user/following"}, +// {"GET", "/user/following/:user"}, +// {"GET", "/users/:user/following/:target_user"}, +// {"PUT", "/user/following/:user"}, +// {"DELETE", "/user/following/:user"}, +// {"GET", "/users/:user/keys"}, +// {"GET", "/user/keys"}, +// {"GET", "/user/keys/:id"}, +// {"POST", "/user/keys"}, +// {"PATCH", "/user/keys/:id"}, +// {"DELETE", "/user/keys/:id"}, +// } diff --git a/router_test.go b/router_test.go index d0566e921a..f82b9d1473 100644 --- a/router_test.go +++ b/router_test.go @@ -13,32 +13,17 @@ import ( "testing" ) -// params testing - -type testCase struct { +type testcase struct { uri string params []string ok bool } -func Test_With_Starting_Wildcard(t *testing.T) { - checkCases( - t, - parseParams("/*"), - []testCase{ - {uri: "/api/v1/entity", params: []string{"api/v1/entity"}, ok: true}, - {uri: "/api/v1/entity/", params: []string{"api/v1/entity/"}, ok: true}, - {uri: "/api/v1/entity/1", params: []string{"api/v1/entity/1"}, ok: true}, - {uri: "/", params: []string{""}, ok: true}, - }, - ) -} - func Test_With_Param_And_Wildcard(t *testing.T) { checkCases( t, parseParams("/api/v1/:param/*"), - []testCase{ + []testcase{ {uri: "/api/v1/entity", params: []string{"entity", ""}, ok: true}, {uri: "/api/v1/entity/", params: []string{"entity", ""}, ok: true}, {uri: "/api/v1/entity/1", params: []string{"entity", "1"}, ok: true}, @@ -53,7 +38,7 @@ func Test_With_A_Param_Optional(t *testing.T) { checkCases( t, parseParams("/api/v1/:param?"), - []testCase{ + []testcase{ {uri: "/api/v1", params: []string{""}, ok: true}, {uri: "/api/v1/", params: []string{""}, ok: true}, {uri: "/api/v1/optional", params: []string{"optional"}, ok: true}, @@ -68,7 +53,7 @@ func Test_With_With_Wildcard(t *testing.T) { checkCases( t, parseParams("/api/v1/*"), - []testCase{ + []testcase{ {uri: "/api/v1", params: []string{""}, ok: true}, {uri: "/api/v1/", params: []string{""}, ok: true}, {uri: "/api/v1/entity", params: []string{"entity"}, ok: true}, @@ -83,8 +68,9 @@ func Test_With_With_Param(t *testing.T) { checkCases( t, parseParams("/api/v1/:param"), - []testCase{ + []testcase{ {uri: "/api/v1/entity", params: []string{"entity"}, ok: true}, + {uri: "/api/v1/entity/8728382", params: nil, ok: false}, {uri: "/api/v1", params: nil, ok: false}, {uri: "/api/v1/", params: nil, ok: false}, }, @@ -95,7 +81,7 @@ func Test_With_Without_A_Param_Or_Wildcard(t *testing.T) { checkCases( t, parseParams("/api/v1/const"), - []testCase{ + []testcase{ {uri: "/api/v1/const", params: []string{}, ok: true}, {uri: "/api/v1", params: nil, ok: false}, {uri: "/api/v1/", params: nil, ok: false}, @@ -107,7 +93,7 @@ func Test_With_With_A_Param_And_Wildcard_Differents_Positions(t *testing.T) { checkCases( t, parseParams("/api/v1/:param/abc/*"), - []testCase{ + []testcase{ {uri: "/api/v1/well/abc/wildcard", params: []string{"well", "wildcard"}, ok: true}, {uri: "/api/v1/well/abc/", params: []string{"well", ""}, ok: true}, {uri: "/api/v1/well/abc", params: []string{"well", ""}, ok: true}, @@ -119,7 +105,7 @@ func Test_With_With_Params_And_Optional(t *testing.T) { checkCases( t, parseParams("/api/:day/:month?/:year?"), - []testCase{ + []testcase{ {uri: "/api/1", params: []string{"1", "", ""}, ok: true}, {uri: "/api/1/", params: []string{"1", "", ""}, ok: true}, {uri: "/api/1/2", params: []string{"1", "2", ""}, ok: true}, @@ -132,7 +118,7 @@ func Test_With_With_Simple_Wildcard(t *testing.T) { checkCases( t, parseParams("/api/*"), - []testCase{ + []testcase{ {uri: "/api/", params: []string{""}, ok: true}, {uri: "/api/joker", params: []string{"joker"}, ok: true}, {uri: "/api", params: []string{""}, ok: true}, @@ -146,7 +132,7 @@ func Test_With_With_Wildcard_And_Optional(t *testing.T) { checkCases( t, parseParams("/api/*/:param?"), - []testCase{ + []testcase{ {uri: "/api/", params: []string{"", ""}, ok: true}, {uri: "/api/joker", params: []string{"joker", ""}, ok: true}, {uri: "/api/joker/batman", params: []string{"joker", "batman"}, ok: true}, @@ -160,7 +146,7 @@ func Test_With_With_Wildcard_And_Param(t *testing.T) { checkCases( t, parseParams("/api/*/:param"), - []testCase{ + []testcase{ {uri: "/api/test/abc", params: []string{"test", "abc"}, ok: true}, {uri: "/api/joker/batman", params: []string{"joker", "batman"}, ok: true}, {uri: "/api/joker/batman/robin", params: []string{"joker/batman", "robin"}, ok: true}, @@ -173,7 +159,7 @@ func Test_With_With_Wildcard_And_2Params(t *testing.T) { checkCases( t, parseParams("/api/*/:param/:param2"), - []testCase{ + []testcase{ {uri: "/api/test/abc", params: nil, ok: false}, {uri: "/api/joker/batman", params: nil, ok: false}, {uri: "/api/joker/batman/robin", params: []string{"joker", "batman", "robin"}, ok: true}, @@ -187,7 +173,18 @@ func Test_With_With_Simple_Path(t *testing.T) { checkCases( t, parseParams("/"), - []testCase{ + []testcase{ + {uri: "/api", params: nil, ok: false}, + {uri: "", params: []string{}, ok: true}, + {uri: "/", params: []string{}, ok: true}, + }, + ) +} +func Test_With_With_Empty_Path(t *testing.T) { + checkCases( + t, + parseParams(""), + []testcase{ {uri: "/api", params: nil, ok: false}, {uri: "", params: []string{}, ok: true}, {uri: "/", params: []string{}, ok: true}, @@ -199,7 +196,7 @@ func Test_With_With_FileName(t *testing.T) { checkCases( t, parseParams("/config/abc.json"), - []testCase{ + []testcase{ {uri: "/config/abc.json", params: []string{}, ok: true}, {uri: "config/abc.json", params: nil, ok: false}, {uri: "/config/efg.json", params: nil, ok: false}, @@ -212,7 +209,7 @@ func Test_With_With_FileName_And_Wildcard(t *testing.T) { checkCases( t, parseParams("/config/*.json"), - []testCase{ + []testcase{ {uri: "/config/abc.json", params: []string{"abc.json"}, ok: true}, {uri: "/config/efg.json", params: []string{"efg.json"}, ok: true}, //{uri: "/config/efg.csv", params: nil, ok: false},// doesn`t work, current: params: "efg.csv", true @@ -226,14 +223,14 @@ func Test_With_With_Simple_Path_And_NoMatch(t *testing.T) { checkCases( t, parseParams("/xyz"), - []testCase{ + []testcase{ {uri: "xyz", params: nil, ok: false}, {uri: "xyz/", params: nil, ok: false}, }, ) } -func checkCases(tParent *testing.T, parser parsedParams, tcases []testCase) { +func checkCases(tParent *testing.T, parser parsedParams, tcases []testcase) { for _, tcase := range tcases { tParent.Run(fmt.Sprintf("%+v", tcase), func(t *testing.T) { params, ok := parser.matchParams(tcase.uri)