| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
- // Use of this source code is governed by a MIT style
- // license that can be found in the LICENSE file.
- package gin
- import (
- "bytes"
- "fmt"
- "math/rand"
- "testing"
- "github.com/stretchr/testify/assert"
- )
- type route struct {
- method string
- path string
- }
- // http://developer.github.com/v3/
- var githubAPI = []route{
- // 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/*ref"},
- {"GET", "/repos/:owner/:repo/git/refs"},
- {"POST", "/repos/:owner/:repo/git/refs"},
- //{"PATCH", "/repos/:owner/:repo/git/refs/*ref"},
- //{"DELETE", "/repos/:owner/:repo/git/refs/*ref"},
- {"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/*path"},
- //{"PUT", "/repos/:owner/:repo/contents/*path"},
- //{"DELETE", "/repos/:owner/:repo/contents/*path"},
- //{"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"},
- }
- func TestGithubAPI(t *testing.T) {
- router := New()
- for _, route := range githubAPI {
- router.Handle(route.method, route.path, HandlersChain{func(c *Context) {
- output := H{"status": "good"}
- for _, param := range c.Params {
- output[param.Key] = param.Value
- }
- c.JSON(200, output)
- }})
- }
- for _, route := range githubAPI {
- path, values := exampleFromPath(route.path)
- w := performRequest(router, route.method, path)
- // TEST
- assert.Contains(t, w.Body.String(), "\"status\":\"good\"")
- for _, value := range values {
- str := fmt.Sprintf("\"%s\":\"%s\"", value.Key, value.Value)
- assert.Contains(t, w.Body.String(), str)
- }
- }
- }
- func exampleFromPath(path string) (string, Params) {
- output := new(bytes.Buffer)
- params := make(Params, 0, 6)
- start := -1
- for i, c := range path {
- if c == ':' {
- start = i + 1
- }
- if start >= 0 {
- if c == '/' {
- value := fmt.Sprint(rand.Intn(100000))
- params = append(params, Param{
- Key: path[start:i],
- Value: value,
- })
- output.WriteString(value)
- output.WriteRune(c)
- start = -1
- }
- } else {
- output.WriteRune(c)
- }
- }
- if start >= 0 {
- value := fmt.Sprint(rand.Intn(100000))
- params = append(params, Param{
- Key: path[start:len(path)],
- Value: value,
- })
- output.WriteString(value)
- }
- return output.String(), params
- }
|