diff --git a/api/test/e2enew/id_compatible/id_compatible_suite_test.go b/api/test/e2enew/id_compatible/id_compatible_suite_test.go new file mode 100644 index 0000000000..fa15893877 --- /dev/null +++ b/api/test/e2enew/id_compatible/id_compatible_suite_test.go @@ -0,0 +1,39 @@ +/* + * 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 id_compatible_test + +import ( + "testing" + "time" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + "github.com/apisix/manager-api/test/e2enew/base" +) + +func TestIdCompatible(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Id Compatible Suite") +} + +var _ = AfterSuite(func() { + base.CleanResource("routes") + base.CleanResource("upstreams") + base.CleanResource("services") + time.Sleep(base.SleepTime) +}) diff --git a/api/test/e2enew/id_compatible/id_crossing_test.go b/api/test/e2enew/id_compatible/id_crossing_test.go new file mode 100644 index 0000000000..be4561f567 --- /dev/null +++ b/api/test/e2enew/id_compatible/id_crossing_test.go @@ -0,0 +1,116 @@ +/* + * 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 id_compatible_test + +import ( + "net/http" + + . "github.com/onsi/ginkgo/extensions/table" + + "github.com/apisix/manager-api/test/e2enew/base" +) + +var _ = DescribeTable("Id Crossing", + func(tc base.HttpTestCase) { + base.RunTestCase(tc) + }, + Entry("create upstream by admin api", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/upstreams", + Body: `{ + "id": 3, + "nodes": [{ + "host": "` + base.UpstreamIp + `", + "port": 1980, + "weight": 1 + }], + "type": "roundrobin" + }`, + Headers: map[string]string{"X-API-KEY": "edd1c9f034335f136f87ad84b625c8f1"}, + ExpectStatus: http.StatusCreated, + }), + Entry("create route by admin api", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/3", + Body: `{ + "name": "route3", + "uri": "/hello", + "upstream_id": 3 + }`, + Headers: map[string]string{"X-API-KEY": "edd1c9f034335f136f87ad84b625c8f1"}, + ExpectStatus: http.StatusCreated, + Sleep: base.SleepTime, + }), + Entry("verify that the upstream is available for manager api", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/upstreams/3", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: `"id":3`, + Sleep: base.SleepTime, + }), + Entry("verify that the route is available for manager api", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/routes/3", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: `"upstream_id":3`, + Sleep: base.SleepTime, + }), + Entry("hit the route just created", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + Entry("delete the route", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/routes/3", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + Entry("delete the upstream", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/upstreams/3", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }), + Entry("make sure the upstream has been deleted", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/upstreams/3", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), + Entry("hit deleted route", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), +) diff --git a/api/test/e2enew/id_compatible/id_not_in_body_test.go b/api/test/e2enew/id_compatible/id_not_in_body_test.go new file mode 100644 index 0000000000..8227c769f3 --- /dev/null +++ b/api/test/e2enew/id_compatible/id_not_in_body_test.go @@ -0,0 +1,164 @@ +/* + * 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 id_compatible_test + +import ( + "io/ioutil" + "net/http" + "time" + + . "github.com/onsi/ginkgo/extensions/table" + . "github.com/onsi/gomega" + "github.com/tidwall/gjson" + + "github.com/apisix/manager-api/test/e2enew/base" +) + +var _ = DescribeTable("Id Not In Body", + func(f func()) { + f() + }, + Entry("make sure the route is not created", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }) + }), + Entry("create route that has no ID in request body by admin api", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/r1", + Body: `{ + "name": "route1", + "uri": "/hello", + "upstream": { + "type": "roundrobin", + "nodes": { + "` + base.UpstreamIp + `:1980": 1 + } + } + }`, + Headers: map[string]string{"X-API-KEY": "edd1c9f034335f136f87ad84b625c8f1"}, + ExpectStatus: http.StatusCreated, + Sleep: base.SleepTime, + }) + }), + Entry("verify that the route is available for manager api", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/routes/r1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: `"id":"r1"`, + Sleep: base.SleepTime, + }) + }), + Entry("hit the route just created", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }) + }), + Entry("delete the route", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/routes/r1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }) + }), + Entry("hit deleted route", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }) + }), + Entry("create route that has no ID in request body by admin api (POST)", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodPost, + Path: "/apisix/admin/routes", + Body: `{ + "uri": "/hello", + "upstream": { + "type": "roundrobin", + "nodes": { + "` + base.UpstreamIp + `:1980": 1 + } + } + }`, + Headers: map[string]string{"X-API-KEY": "edd1c9f034335f136f87ad84b625c8f1"}, + ExpectStatus: http.StatusCreated, + Sleep: base.SleepTime, + }) + }), + Entry("verify that the route is available for manager api", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/routes", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: `"uri":"/hello"`, + Sleep: base.SleepTime, + }) + }), + Entry("hit the route just created", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }) + }), + Entry("clear the route", func() { + time.Sleep(time.Duration(100) * time.Millisecond) + request, _ := http.NewRequest("GET", base.ManagerAPIHost+"/apisix/admin/routes", nil) + request.Header.Add("Authorization", base.GetToken()) + resp, err := http.DefaultClient.Do(request) + Expect(err).To(BeNil()) + defer resp.Body.Close() + respBody, _ := ioutil.ReadAll(resp.Body) + list := gjson.Get(string(respBody), "data.rows").Value().([]interface{}) + for _, item := range list { + route := item.(map[string]interface{}) + base.RunTestCase(base.HttpTestCase{ + Desc: "delete the route", + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/routes/" + route["id"].(string), + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }) + } + }), +) diff --git a/api/test/e2enew/id_compatible/id_using_int_test.go b/api/test/e2enew/id_compatible/id_using_int_test.go new file mode 100644 index 0000000000..779ccb3caf --- /dev/null +++ b/api/test/e2enew/id_compatible/id_using_int_test.go @@ -0,0 +1,144 @@ +/* + * 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 id_compatible_test + +import ( + "net/http" + + . "github.com/onsi/ginkgo/extensions/table" + + "github.com/apisix/manager-api/test/e2enew/base" +) + +var _ = DescribeTable("Id Using Int", + func(tc base.HttpTestCase) { + base.RunTestCase(tc) + }, + Entry("create upstream", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/upstreams", + Body: `{ + "id": 1, + "nodes": [{ + "host": "` + base.UpstreamIp + `", + "port": 1980, + "weight": 1 + }], + "type": "roundrobin" + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + Entry("create route using the upstream just created", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/1", + Body: `{ + "name": "route1", + "uri": "/hello", + "upstream_id": 1 + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }), + Entry("hit the route just created", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + Entry("create service", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/services", + Body: `{ + "id": 1, + "upstream_id": 1 + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + Entry("update route to use the service just created", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/1", + Body: `{ + "name": "route1", + "uri": "/hello", + "service_id": 1 + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }), + Entry("hit the route just updated", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + Entry("delete the route", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/routes/1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + Entry("delete the service", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/services/1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }), + Entry("make sure the service has been deleted", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/services/1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusNotFound, + }), + Entry("delete the upstream", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/upstreams/1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + Entry("make sure the upstream has been deleted", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/upstreams/1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), + Entry("hit deleted route", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), +) diff --git a/api/test/e2enew/id_compatible/id_using_string_test.go b/api/test/e2enew/id_compatible/id_using_string_test.go new file mode 100644 index 0000000000..54bb30eea5 --- /dev/null +++ b/api/test/e2enew/id_compatible/id_using_string_test.go @@ -0,0 +1,99 @@ +/* + * 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 id_compatible_test + +import ( + "net/http" + + . "github.com/onsi/ginkgo/extensions/table" + + "github.com/apisix/manager-api/test/e2enew/base" +) + +var _ = DescribeTable("Id Using String", + func(tc base.HttpTestCase) { + base.RunTestCase(tc) + }, + Entry("create upstream", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/upstreams", + Body: `{ + "id": "2", + "nodes": [{ + "host": "` + base.UpstreamIp + `", + "port": 1980, + "weight": 1 + }], + "type": "roundrobin" + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }), + Entry("create route using the upstream just created", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/2", + Body: `{ + "name": "route2", + "uri": "/hello", + "upstream_id": "2" + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }), + Entry("hit the route just created", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }), + Entry("delete the route", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/routes/2", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }), + Entry("delete the upstream", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/upstreams/2", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }), + Entry("make sure the upstream has been deleted", base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/upstreams/2", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), + Entry("hit deleted route", base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusNotFound, + Sleep: base.SleepTime, + }), +)