diff --git a/api/test/e2e/route_with_methods_test.go b/api/test/e2e/route_with_methods_test.go deleted file mode 100644 index ea1006f901..0000000000 --- a/api/test/e2e/route_with_methods_test.go +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package e2e - -import ( - "net/http" - "testing" -) - -func TestRoute_with_methods(t *testing.T) { - tests := []HttpTestCase{ - { - Desc: "add route with invalid method", - Object: ManagerApiExpect(t), - Method: http.MethodPut, - Path: "/apisix/admin/routes/r1", - Body: `{ - "name": "route1", - "uri": "/hello", - "methods": ["TEST"], - "upstream": { - "type": "roundrobin", - "nodes": [{ - "host": "172.16.238.20", - "port": 1980, - "weight": 1 - }] - } - }`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusBadRequest, - }, - { - Desc: "verify route", - Object: APISIXExpect(t), - Method: http.MethodGet, - Path: "/hello", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusNotFound, - Sleep: sleepTime, - }, - { - Desc: "add route with valid method", - Object: ManagerApiExpect(t), - Method: http.MethodPut, - Path: "/apisix/admin/routes/r1", - Body: `{ - "name": "route1", - "uri": "/hello", - "methods": ["GET"], - "upstream": { - "type": "roundrobin", - "nodes": [{ - "host": "172.16.238.20", - "port": 1980, - "weight": 1 - }] - } - }`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - }, - { - Desc: "verify route", - Object: APISIXExpect(t), - Method: http.MethodGet, - Path: "/hello", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - ExpectBody: "hello world", - Sleep: sleepTime, - }, - { - Desc: "delete route", - Object: ManagerApiExpect(t), - Method: http.MethodDelete, - Path: "/apisix/admin/routes/r1", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - }, - { - Desc: "add route with valid methods", - Object: ManagerApiExpect(t), - Method: http.MethodPut, - Path: "/apisix/admin/routes/r1", - Body: `{ - "name": "route1", - "uri": "/hello", - "methods": ["GET", "POST", "PUT", "DELETE", "PATCH"], - "upstream": { - "type": "roundrobin", - "nodes": [{ - "host": "172.16.238.20", - "port": 1980, - "weight": 1 - }] - } - }`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - }, - { - Desc: "verify route by post", - Object: APISIXExpect(t), - Method: http.MethodPost, - Path: "/hello", - Body: `test=test`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - ExpectBody: "hello world", - Sleep: sleepTime, - }, - { - Desc: "verify route by put", - Object: APISIXExpect(t), - Method: http.MethodPut, - Path: "/hello", - Body: `test=test`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - ExpectBody: "hello world", - Sleep: sleepTime, - }, - { - Desc: "verify route by get", - Object: APISIXExpect(t), - Method: http.MethodGet, - Path: "/hello", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - ExpectBody: "hello world", - Sleep: sleepTime, - }, - { - Desc: "verify route by delete", - Object: APISIXExpect(t), - Method: http.MethodDelete, - Path: "/hello", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - ExpectBody: "hello world", - Sleep: sleepTime, - }, - { - Desc: "verify route by patch", - Object: APISIXExpect(t), - Method: http.MethodPatch, - Path: "/hello", - Body: `test=test`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - ExpectBody: "hello world", - Sleep: sleepTime, - }, - { - Desc: "delete route", - Object: ManagerApiExpect(t), - Method: http.MethodDelete, - Path: "/apisix/admin/routes/r1", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - }, - { - Desc: "add route with lower case methods", - Object: ManagerApiExpect(t), - Method: http.MethodPut, - Path: "/apisix/admin/routes/r1", - Body: `{ - "name": "route1", - "uri": "/hello", - "methods": ["GET", "post"], - "upstream": { - "type": "roundrobin", - "nodes": [{ - "host": "172.16.238.20", - "port": 1980, - "weight": 1 - }] - } - }`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusBadRequest, - }, - { - Desc: "verify route", - Object: APISIXExpect(t), - Method: http.MethodGet, - Path: "/hello", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusNotFound, - Sleep: sleepTime, - }, - { - Desc: "add route with methods GET", - Object: ManagerApiExpect(t), - Method: http.MethodPut, - Path: "/apisix/admin/routes/r1", - Body: `{ - "name": "route1", - "uri": "/hello", - "methods": ["GET"], - "upstream": { - "type": "roundrobin", - "nodes": [{ - "host": "172.16.238.20", - "port": 1980, - "weight": 1 - }] - } - }`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - }, - { - Desc: "verify route by get", - Object: APISIXExpect(t), - Method: http.MethodGet, - Path: "/hello", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - ExpectBody: "hello world", - Sleep: sleepTime, - }, - { - Desc: "verify route by post", - Object: APISIXExpect(t), - Method: http.MethodPost, - Path: "/hello", - Body: `test=test`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusNotFound, - Sleep: sleepTime, - }, - { - Desc: "update route methods to POST", - Object: ManagerApiExpect(t), - Method: http.MethodPut, - Path: "/apisix/admin/routes/r1", - Body: `{ - "name": "route1", - "uri": "/hello", - "methods": ["POST"], - "upstream": { - "type": "roundrobin", - "nodes": [{ - "host": "172.16.238.20", - "port": 1980, - "weight": 1 - }] - } - }`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - }, - { - Desc: "verify route by get", - Object: APISIXExpect(t), - Method: http.MethodGet, - Path: "/hello", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusNotFound, - Sleep: sleepTime, - }, - { - Desc: "verify route by post", - Object: APISIXExpect(t), - Method: http.MethodPost, - Path: "/hello", - Body: `test=test`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - ExpectBody: "hello world", - Sleep: sleepTime, - }, - { - Desc: "delete route", - Object: ManagerApiExpect(t), - Method: http.MethodDelete, - Path: "/apisix/admin/routes/r1", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - Sleep: sleepTime, - }, - } - - for _, tc := range tests { - testCaseCheck(tc, t) - } -} diff --git a/api/test/e2enew/route/route_with_methods_test.go b/api/test/e2enew/route/route_with_methods_test.go new file mode 100644 index 0000000000..79b72e2e98 --- /dev/null +++ b/api/test/e2enew/route/route_with_methods_test.go @@ -0,0 +1,351 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package route + +import ( + "net/http" + + "github.com/onsi/ginkgo" + "github.com/onsi/ginkgo/extensions/table" + + "github.com/apisix/manager-api/test/e2enew/base" +) + +var _ = ginkgo.Describe("route with methods", func() { + table.DescribeTable("test route with methods", + func(tc base.HttpTestCase) { + base.RunTestCase(tc) + }, + table.Entry("add route with invalid method", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/r1", + Body: `{ + "name": "route1", + "uri": "/hello", + "methods": ["TEST"], + "upstream": { + "type": "roundrobin", + "nodes": { + "` + base.UpstreamIp + `:1980": 1 + } + } + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusBadRequest, + }), + table.Entry("verify route", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), + table.Entry("add route with valid method", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/r1", + Body: `{ + "name": "route1", + "uri": "/hello", + "methods": ["GET"], + "upstream": { + "type": "roundrobin", + "nodes": { + "` + base.UpstreamIp + `:1980": 1 + } + } + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + table.Entry("verify route", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + table.Entry("update same route path", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/r1", + Body: `{ + "name": "route1", + "uri": "/hello_", + "methods": ["GET"], + "upstream": { + "type": "roundrobin", + "nodes": { + "` + base.UpstreamIp + `:1980": 1 + } + } + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + table.Entry("verify old route updated", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), + table.Entry("verify new update applied", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello_", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + table.Entry("delete route", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/routes/r1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + table.Entry("add route with valid methods", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/r1", + Body: `{ + "name": "route1", + "uri": "/hello", + "methods": ["GET", "POST", "PUT", "DELETE", "PATCH"], + "upstream": { + "type": "roundrobin", + "nodes": { + "` + base.UpstreamIp + `:1980": 1 + } + } + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + table.Entry("verify route by post", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodPost, + Path: "/hello", + Body: `test=test`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + table.Entry("verify route by put", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodPut, + Path: "/hello", + Body: `test=test`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + table.Entry("verify route by get", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + table.Entry("verify route by delete", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodDelete, + Path: "/hello", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + table.Entry("verify route by patch", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodPatch, + Path: "/hello", + Body: `test=test`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + table.Entry("update route methods to GET only", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/r1", + Body: `{ + "name": "route1", + "uri": "/hello", + "methods": ["GET"], + "upstream": { + "type": "roundrobin", + "nodes": { + "` + base.UpstreamIp + `:1980": 1 + } + } + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + table.Entry("verify post method isn't working now", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodPost, + Path: "/hello", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), + table.Entry("verify PUT method isn't working now", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodPut, + Path: "/hello", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), + table.Entry("verify route by GET only", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + table.Entry("delete route", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/routes/r1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + table.Entry("add route with lower case methods", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/r1", + Body: `{ + "name": "route1", + "uri": "/hello", + "methods": ["GET", "post"], + "upstream": { + "type": "roundrobin", + "nodes": { + "` + base.UpstreamIp + `:1980": 1 + } + } + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusBadRequest, + }), + table.Entry("verify route", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), + table.Entry("add route with methods GET", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/r1", + Body: `{ + "name": "route1", + "uri": "/hello", + "methods": ["GET"], + "upstream": { + "type": "roundrobin", + "nodes": { + "` + base.UpstreamIp + `:1980": 1 + } + } + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + table.Entry("verify route by get", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + table.Entry("verify route by post", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodPost, + Path: "/hello", + Body: `test=test`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), + table.Entry("update route methods to POST", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/r1", + Body: `{ + "name": "route1", + "uri": "/hello", + "methods": ["POST"], + "upstream": { + "type": "roundrobin", + "nodes": { + "` + base.UpstreamIp + `:1980": 1 + } + } + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + table.Entry("verify route by get", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), + table.Entry("verify route by post", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodPost, + Path: "/hello", + Body: `test=test`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + table.Entry("delete route", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/routes/r1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }), + ) +})