github.com/craicoverflow/tyk@v2.9.6-rc3+incompatible/gateway/mw_version_check_test.go (about) 1 package gateway 2 3 import ( 4 "net/http" 5 "sync" 6 "testing" 7 8 "github.com/TykTechnologies/tyk/apidef" 9 "github.com/TykTechnologies/tyk/test" 10 "github.com/TykTechnologies/tyk/user" 11 ) 12 13 func testPrepareVersioning() (string, string) { 14 BuildAndLoadAPI(func(spec *APISpec) { 15 spec.UseKeylessAccess = false 16 spec.VersionData.NotVersioned = false 17 spec.VersionDefinition.Location = "header" 18 spec.VersionDefinition.Key = "version" 19 spec.Proxy.ListenPath = "/" 20 spec.VersionData.Versions["expired"] = apidef.VersionInfo{ 21 Name: "expired", 22 Expires: "2006-01-02 15:04", 23 } 24 spec.VersionData.Versions["v2"] = apidef.VersionInfo{ 25 Name: "v2", 26 UseExtendedPaths: true, 27 ExtendedPaths: apidef.ExtendedPathsSet{ 28 WhiteList: []apidef.EndPointMeta{ 29 { 30 Path: "/mock", 31 MethodActions: map[string]apidef.EndpointMethodMeta{ 32 http.MethodGet: { 33 Action: apidef.Reply, 34 Code: http.StatusOK, 35 Data: "testbody", 36 Headers: map[string]string{"testheader": "testvalue"}, 37 }, 38 }, 39 }, 40 }, 41 URLRewrite: []apidef.URLRewriteMeta{ 42 { 43 Path: "/a", 44 Method: http.MethodGet, 45 MatchPattern: "/a(.*)", 46 RewriteTo: "/b", 47 }, 48 { 49 Path: "/c", 50 Method: http.MethodPost, 51 MatchPattern: "/c(.*)", 52 RewriteTo: "/d", 53 }, 54 }, 55 Ignored: []apidef.EndPointMeta{ 56 { 57 Path: "/ignore", 58 }, 59 }, 60 }, 61 } 62 }) 63 64 keyWrongVersion := CreateSession(func(s *user.SessionState) { 65 s.AccessRights = map[string]user.AccessDefinition{"test": { 66 APIID: "test", Versions: []string{"v3"}, 67 }} 68 s.Mutex = &sync.RWMutex{} 69 }) 70 71 keyKnownVersion := CreateSession(func(s *user.SessionState) { 72 s.AccessRights = map[string]user.AccessDefinition{"test": { 73 APIID: "test", Versions: []string{"v1", "v2", "expired"}, 74 }} 75 s.Mutex = &sync.RWMutex{} 76 }) 77 78 return keyWrongVersion, keyKnownVersion 79 } 80 81 func TestVersioning(t *testing.T) { 82 ts := StartTest() 83 defer ts.Close() 84 85 keyWrongVersion, keyKnownVersion := testPrepareVersioning() 86 87 wrongVersionHeaders := map[string]string{ 88 "authorization": keyWrongVersion, 89 "version": "v3", 90 } 91 92 disallowedAccessHeaders := map[string]string{ 93 "authorization": keyWrongVersion, 94 "version": "v1", 95 } 96 97 knownVersionHeaders := map[string]string{ 98 "authorization": keyKnownVersion, 99 "version": "v1", 100 } 101 102 expiredVersionHeaders := map[string]string{ 103 "authorization": keyKnownVersion, 104 "version": "expired", 105 } 106 107 mockVersionHeaders := map[string]string{ 108 "authorization": keyKnownVersion, 109 "version": "v2", 110 } 111 112 ts.Run(t, []test.TestCase{ 113 {Path: "/", Code: 403, Headers: wrongVersionHeaders, BodyMatch: "This API version does not seem to exist"}, 114 {Path: "/", Code: 403, Headers: disallowedAccessHeaders, BodyMatch: "Access to this API has been disallowed"}, 115 {Path: "/", Code: 200, Headers: knownVersionHeaders}, 116 {Path: "/", Code: 403, Headers: expiredVersionHeaders, BodyMatch: string(VersionExpired)}, 117 {Path: "/mock", Code: 200, Headers: mockVersionHeaders, BodyMatch: "testbody", HeadersMatch: map[string]string{"testheader": "testvalue"}}, 118 {Path: "/ignore", Code: 200, Headers: mockVersionHeaders}, 119 }...) 120 } 121 122 func BenchmarkVersioning(b *testing.B) { 123 b.ReportAllocs() 124 125 ts := StartTest() 126 defer ts.Close() 127 128 keyWrongVersion, keyKnownVersion := testPrepareVersioning() 129 wrongVersionHeaders := map[string]string{ 130 "authorization": keyWrongVersion, 131 "version": "v3", 132 } 133 134 disallowedAccessHeaders := map[string]string{ 135 "authorization": keyWrongVersion, 136 "version": "v1", 137 } 138 139 knownVersionHeaders := map[string]string{ 140 "authorization": keyKnownVersion, 141 "version": "v1", 142 } 143 144 expiredVersionHeaders := map[string]string{ 145 "authorization": keyKnownVersion, 146 "version": "expired", 147 } 148 mockVersionHeaders := map[string]string{ 149 "authorization": keyKnownVersion, 150 "version": "v2", 151 } 152 153 for i := 0; i < b.N; i++ { 154 ts.Run(b, []test.TestCase{ 155 {Path: "/", Code: 403, Headers: wrongVersionHeaders, BodyMatch: "This API version does not seem to exist"}, 156 {Path: "/", Code: 403, Headers: disallowedAccessHeaders, BodyMatch: "Access to this API has been disallowed"}, 157 {Path: "/", Code: 200, Headers: knownVersionHeaders}, 158 {Path: "/", Code: 403, Headers: expiredVersionHeaders, BodyMatch: string(VersionExpired)}, 159 {Path: "/mock", Code: 200, Headers: mockVersionHeaders, BodyMatch: "testbody", HeadersMatch: map[string]string{"testheader": "testvalue"}}, 160 {Path: "/ignore", Code: 200, Headers: mockVersionHeaders}, 161 }...) 162 } 163 } 164 165 func TestNotVersioned(t *testing.T) { 166 g := StartTest() 167 defer g.Close() 168 169 api := BuildAPI(func(spec *APISpec) { 170 spec.Proxy.ListenPath = "/" 171 spec.VersionData.NotVersioned = false 172 spec.VersionData.Versions["Default"] = apidef.VersionInfo{ 173 Name: "Default", 174 OverrideTarget: "www.example.com", 175 } 176 })[0] 177 178 t.Run("Versioning enabled, override target URL", func(t *testing.T) { 179 LoadAPI(api) 180 _, _ = g.Run(t, test.TestCase{Code: http.StatusInternalServerError}) 181 }) 182 183 t.Run("Versioning disabled, use original target URL", func(t *testing.T) { 184 api.VersionData.NotVersioned = true 185 LoadAPI(api) 186 187 _, _ = g.Run(t, test.TestCase{Code: http.StatusOK}) 188 }) 189 }