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,
+	}),
+)