You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by bz...@apache.org on 2022/04/06 03:17:21 UTC
[apisix-dashboard] branch master updated: refactor: migrate id compatible tests to e2enew (#2400)
This is an automated email from the ASF dual-hosted git repository.
bzp2010 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-dashboard.git
The following commit(s) were added to refs/heads/master by this push:
new 865c02a0 refactor: migrate id compatible tests to e2enew (#2400)
865c02a0 is described below
commit 865c02a02907a855b710700a587162e9b0877530
Author: SkyeYoung <is...@outlook.com>
AuthorDate: Wed Apr 6 11:17:16 2022 +0800
refactor: migrate id compatible tests to e2enew (#2400)
---
.../id_compatible/id_compatible_suite_test.go | 39 +++++
api/test/e2enew/id_compatible/id_crossing_test.go | 116 +++++++++++++++
.../e2enew/id_compatible/id_not_in_body_test.go | 164 +++++++++++++++++++++
api/test/e2enew/id_compatible/id_using_int_test.go | 144 ++++++++++++++++++
.../e2enew/id_compatible/id_using_string_test.go | 99 +++++++++++++
5 files changed, 562 insertions(+)
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 00000000..fa158938
--- /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 00000000..be4561f5
--- /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 00000000..8227c769
--- /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 00000000..779ccb3c
--- /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 00000000..54bb30ee
--- /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,
+ }),
+)