diff --git a/api/test/e2e/service_test.go b/api/test/e2e/service_test.go deleted file mode 100644 index 9e03fcad00..0000000000 --- a/api/test/e2e/service_test.go +++ /dev/null @@ -1,357 +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" - "time" - - "github.com/stretchr/testify/assert" -) - -func TestService(t *testing.T) { - tests := []HttpTestCase{ - { - Desc: "create service without plugin", - Object: ManagerApiExpect(t), - Method: http.MethodPut, - Path: "/apisix/admin/services/s1", - Headers: map[string]string{"Authorization": token}, - Body: `{ - "name": "testservice", - "upstream": { - "type": "roundrobin", - "nodes": [{ - "host": "172.16.238.20", - "port": 1980, - "weight": 1 - }, - { - "host": "172.16.238.20", - "port": 1981, - "weight": 2 - }, - { - "host": "172.16.238.20", - "port": 1982, - "weight": 3 - }] - } - }`, - ExpectStatus: http.StatusOK, - ExpectBody: []string{"\"id\":\"s1\"", "\"name\":\"testservice\""}, - }, - { - Desc: "get the service s1", - Object: ManagerApiExpect(t), - Method: http.MethodGet, - Path: "/apisix/admin/services/s1", - Headers: map[string]string{"Authorization": token}, - ExpectCode: http.StatusOK, - ExpectBody: "\"name\":\"testservice\",\"upstream\":{\"nodes\":[{\"host\":\"172.16.238.20\",\"port\":1980,\"weight\":1},{\"host\":\"172.16.238.20\",\"port\":1981,\"weight\":2},{\"host\":\"172.16.238.20\",\"port\":1982,\"weight\":3}],\"type\":\"roundrobin\"}", - }, - { - Desc: "create route using the service just created", - Object: ManagerApiExpect(t), - Method: http.MethodPut, - Path: "/apisix/admin/routes/r1", - Body: `{ - "uri": "/server_port", - "service_id": "s1" - }`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - Sleep: sleepTime, - }, - } - for _, tc := range tests { - testCaseCheck(tc, t) - } - - // batch test /server_port api - time.Sleep(sleepTime) - res := BatchTestServerPort(t, 18) - assert.True(t, res["1980"] == 3) - assert.True(t, res["1981"] == 6) - assert.True(t, res["1982"] == 9) - - tests = []HttpTestCase{ - { - Desc: "create service with plugin", - Object: ManagerApiExpect(t), - Method: http.MethodPut, - Path: "/apisix/admin/services/s1", - Headers: map[string]string{"Authorization": token}, - Body: `{ - "name": "testservice", - "plugins": { - "limit-count": { - "count": 100, - "time_window": 60, - "rejected_code": 503, - "key": "remote_addr" - } - }, - "upstream": { - "type": "roundrobin", - "nodes": [{ - "host": "172.16.238.20", - "port": 1980, - "weight": 1 - }] - } - }`, - ExpectStatus: http.StatusOK, - }, - { - Desc: "get the service s1", - Object: ManagerApiExpect(t), - Method: http.MethodGet, - Path: "/apisix/admin/services/s1", - Headers: map[string]string{"Authorization": token}, - ExpectCode: http.StatusOK, - ExpectBody: "\"upstream\":{\"nodes\":[{\"host\":\"172.16.238.20\",\"port\":1980,\"weight\":1}],\"type\":\"roundrobin\"},\"plugins\":{\"limit-count\":{\"count\":100,\"key\":\"remote_addr\",\"rejected_code\":503,\"time_window\":60}}", - }, - { - Desc: "create route using the service just created", - Object: ManagerApiExpect(t), - Method: http.MethodPut, - Path: "/apisix/admin/routes/r1", - Body: `{ - "uri": "/server_port", - "service_id": "s1" - }`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - Sleep: sleepTime, - }, - } - for _, tc := range tests { - testCaseCheck(tc, t) - } - - // hit routes and check the response header - time.Sleep(sleepTime) - basepath := "http://127.0.0.1:9080" - request, _ := http.NewRequest("GET", basepath+"/server_port", nil) - request.Header.Add("Authorization", token) - resp, err := http.DefaultClient.Do(request) - assert.Nil(t, err) - defer resp.Body.Close() - assert.Equal(t, 200, resp.StatusCode) - assert.Equal(t, "100", resp.Header["X-Ratelimit-Limit"][0]) - assert.Equal(t, "99", resp.Header["X-Ratelimit-Remaining"][0]) - - // Create another service(id=s2) via HTTP POST to check the - // returned value, still attached to route(id=r1) - tests = []HttpTestCase{ - { - Desc: "create service with all options via POST method", - Object: ManagerApiExpect(t), - Method: http.MethodPost, - Path: "/apisix/admin/services", - Headers: map[string]string{"Authorization": token}, - Body: `{ - "id": "s2", - "name": "testservice", - "desc": "testservice_desc", - "labels": { - "build":"16", - "env":"production", - "version":"v2" - }, - "enable_websocket":true, - "plugins": { - "limit-count": { - "count": 100, - "time_window": 60, - "rejected_code": 503, - "key": "remote_addr" - } - }, - "upstream": { - "type": "roundrobin", - "create_time":1602883670, - "update_time":1602893670, - "nodes": [{ - "host": "172.16.238.20", - "port": 1980, - "weight": 1 - }] - } - }`, - ExpectStatus: http.StatusOK, - ExpectBody: "\"id\":\"s2\"", - }, - { - Desc: "get the service s2", - Object: ManagerApiExpect(t), - Method: http.MethodGet, - Path: "/apisix/admin/services/s2", - Headers: map[string]string{"Authorization": token}, - ExpectCode: http.StatusOK, - ExpectBody: "\"name\":\"testservice\",\"desc\":\"testservice_desc\",\"upstream\":{\"nodes\":[{\"host\":\"172.16.238.20\",\"port\":1980,\"weight\":1}],\"type\":\"roundrobin\"},\"plugins\":{\"limit-count\":{\"count\":100,\"key\":\"remote_addr\",\"rejected_code\":503,\"time_window\":60}},\"labels\":{\"build\":\"16\",\"env\":\"production\",\"version\":\"v2\"},\"enable_websocket\":true}", - }, - { - Desc: "create route using the service just created", - Object: ManagerApiExpect(t), - Method: http.MethodPut, - Path: "/apisix/admin/routes/r1", - Body: `{ - "uri": "/hello", - "service_id": "s2" - }`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - Sleep: sleepTime, - }, - { - Desc: "verify route", - Object: APISIXExpect(t), - Method: http.MethodGet, - Path: "/hello", - ExpectStatus: http.StatusOK, - ExpectBody: "hello world", - }, - } - for _, tc := range tests { - testCaseCheck(tc, t) - } -} - -func TestService_Teardown(t *testing.T) { - tests := []HttpTestCase{ - { - // Delete the service created via HTTP PUT - Desc: "delete the service(id=s1)", - Object: ManagerApiExpect(t), - Method: http.MethodDelete, - Path: "/apisix/admin/services/s1", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - Sleep: sleepTime, - }, - { - // Delete the service created via HTTP POST - Desc: "delete the service(id=s2)", - Object: ManagerApiExpect(t), - Method: http.MethodDelete, - Path: "/apisix/admin/services/s2", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - 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, - }, - } - for _, tc := range tests { - testCaseCheck(tc, t) - } -} - -func TestService_Update_Use_Patch_Method(t *testing.T) { - tests := []HttpTestCase{ - { - Desc: "create service without plugin", - Object: ManagerApiExpect(t), - Method: http.MethodPut, - Path: "/apisix/admin/services/s5", - Headers: map[string]string{"Authorization": token}, - Body: `{ - "name": "testservice", - "upstream": { - "type": "roundrobin", - "nodes": [{ - "host": "172.16.238.20", - "port": 1980, - "weight": 1 - }] - } - }`, - ExpectStatus: http.StatusOK, - ExpectBody: "\"name\":\"testservice\",\"upstream\":{\"nodes\":[{\"host\":\"172.16.238.20\",\"port\":1980,\"weight\":1}],\"type\":\"roundrobin\"}}", - }, - { - Desc: "update service use patch method", - Object: ManagerApiExpect(t), - Method: http.MethodPatch, - Path: "/apisix/admin/services/s5", - Body: `{ - "name": "testpatch", - "upstream": { - "type": "roundrobin", - "nodes": [{ - "host": "172.16.238.20", - "port": 1981, - "weight": 1 - }] - } - }`, - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - }, - { - Desc: "get the service s5", - Object: ManagerApiExpect(t), - Method: http.MethodGet, - Path: "/apisix/admin/services/s5", - Headers: map[string]string{"Authorization": token}, - ExpectCode: http.StatusOK, - ExpectBody: "\"name\":\"testpatch\",\"upstream\":{\"nodes\":[{\"host\":\"172.16.238.20\",\"port\":1981,\"weight\":1}],\"type\":\"roundrobin\"}}", - }, - { - Desc: "Update service using path parameter patch method", - Object: ManagerApiExpect(t), - Method: http.MethodPatch, - Path: "/apisix/admin/services/s5/upstream", - Body: `{"type":"roundrobin","nodes":[{"host":"172.16.238.20","port":1980,"weight":1}]}`, - Headers: map[string]string{ - "Authorization": token, - "Content-Type": "text/plain", - }, - ExpectStatus: http.StatusOK, - }, - { - Desc: "get service data", - Object: ManagerApiExpect(t), - Method: http.MethodGet, - Path: "/apisix/admin/services/s5", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - ExpectBody: "\"name\":\"testpatch\",\"upstream\":{\"nodes\":[{\"host\":\"172.16.238.20\",\"port\":1980,\"weight\":1}],\"type\":\"roundrobin\"}}", - }, - { - Desc: "delete service", - Object: ManagerApiExpect(t), - Method: http.MethodDelete, - Path: "/apisix/admin/services/s5", - Headers: map[string]string{"Authorization": token}, - ExpectStatus: http.StatusOK, - }, - } - - for _, tc := range tests { - testCaseCheck(tc, t) - } -} diff --git a/api/test/e2enew/service/service_suite_test.go b/api/test/e2enew/service/service_suite_test.go new file mode 100644 index 0000000000..0e75694410 --- /dev/null +++ b/api/test/e2enew/service/service_suite_test.go @@ -0,0 +1,36 @@ +/* + * 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 service + +import ( + "testing" + "time" + + "github.com/onsi/ginkgo" + + "e2enew/base" +) + +func TestRoute(t *testing.T) { + ginkgo.RunSpecs(t, "service suite") +} + +var _ = ginkgo.AfterSuite(func() { + base.CleanResource("services") + base.CleanResource("routes") + time.Sleep(base.SleepTime) +}) diff --git a/api/test/e2enew/service/service_test.go b/api/test/e2enew/service/service_test.go new file mode 100644 index 0000000000..ac293743cb --- /dev/null +++ b/api/test/e2enew/service/service_test.go @@ -0,0 +1,464 @@ +/* + * 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 service + +import ( + "encoding/json" + "net/http" + "time" + + "github.com/onsi/ginkgo" + "github.com/stretchr/testify/assert" + + "e2enew/base" +) + +var _ = ginkgo.Describe("create service without plugin", func() { + ginkgo.It("create service without plugin", func() { + t := ginkgo.GinkgoT() + var createServiceBody map[string]interface{} = map[string]interface{}{ + "name": "testservice", + "upstream": map[string]interface{}{ + "type": "roundrobin", + "nodes": []map[string]interface{}{ + { + "host": base.UpstreamIp, + "port": 1980, + "weight": 1, + }, + { + "host": base.UpstreamIp, + "port": 1981, + "weight": 2, + }, + { + "host": base.UpstreamIp, + "port": 1982, + "weight": 3, + }, + }, + }, + } + _createServiceBody, err := json.Marshal(createServiceBody) + assert.Nil(t, err) + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/services/s1", + Headers: map[string]string{"Authorization": base.GetToken()}, + Body: string(_createServiceBody), + ExpectStatus: http.StatusOK, + ExpectBody: []string{"\"id\":\"s1\"", "\"name\":\"testservice\""}, + }) + }) + ginkgo.It("get the service s1", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/services/s1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectCode: http.StatusOK, + ExpectBody: "\"name\":\"testservice\",\"upstream\":{\"nodes\":[{\"host\":\"" + base.UpstreamIp + "\",\"port\":1980,\"weight\":1},{\"host\":\"" + base.UpstreamIp + "\",\"port\":1981,\"weight\":2},{\"host\":\"" + base.UpstreamIp + "\",\"port\":1982,\"weight\":3}],\"type\":\"roundrobin\"}", + Sleep: base.SleepTime, + }) + }) + ginkgo.It("create route using the service just created", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/r1", + Body: `{ + "uri": "/server_port", + "service_id": "s1" + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }) + }) + ginkgo.It("batch test /server_port api", func() { + t := ginkgo.GinkgoT() + time.Sleep(time.Duration(500) * time.Millisecond) + res := base.BatchTestServerPort(18) + assert.True(t, res["1980"] == 3) + assert.True(t, res["1981"] == 6) + assert.True(t, res["1982"] == 9) + }) + ginkgo.It("delete 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, + }) + }) + ginkgo.It("delete service", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/services/s1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }) + }) + ginkgo.It("hit the route just deleted", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/server_port", + ExpectStatus: http.StatusNotFound, + ExpectBody: "{\"error_msg\":\"404 Route Not Found\"}\n", + Sleep: base.SleepTime, + }) + }) +}) + +var _ = ginkgo.Describe("create service with plugin", func() { + ginkgo.It("create service without plugin", func() { + t := ginkgo.GinkgoT() + var createServiceBody map[string]interface{} = map[string]interface{}{ + "name": "testservice", + "plugins": map[string]interface{}{ + "limit-count": map[string]interface{}{ + "count": 100, + "time_window": 60, + "rejected_code": 503, + "key": "remote_addr", + }, + }, + "upstream": map[string]interface{}{ + "type": "roundrobin", + "nodes": []map[string]interface{}{ + { + "host": base.UpstreamIp, + "port": 1980, + "weight": 1, + }, + }, + }, + } + _createServiceBody, err := json.Marshal(createServiceBody) + assert.Nil(t, err) + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/services/s1", + Headers: map[string]string{"Authorization": base.GetToken()}, + Body: string(_createServiceBody), + ExpectStatus: http.StatusOK, + ExpectBody: []string{"\"id\":\"s1\"", "\"name\":\"testservice\""}, + }) + }) + ginkgo.It("get the service s1", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/services/s1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectCode: http.StatusOK, + ExpectBody: "\"upstream\":{\"nodes\":[{\"host\":\"" + base.UpstreamIp + "\",\"port\":1980,\"weight\":1}],\"type\":\"roundrobin\"},\"plugins\":{\"limit-count\":{\"count\":100,\"key\":\"remote_addr\",\"rejected_code\":503,\"time_window\":60}}", + Sleep: base.SleepTime, + }) + }) + ginkgo.It("create route using the service just created", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/r1", + Body: `{ + "uri": "/server_port", + "service_id": "s1" + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }) + }) + ginkgo.It(" hit routes and check the response header", func() { + t := ginkgo.GinkgoT() + time.Sleep(time.Duration(500) * time.Millisecond) + basepath := base.APISIXHost + request, err := http.NewRequest("GET", basepath+"/server_port", nil) + assert.Nil(t, err) + request.Header.Add("Authorization", base.GetToken()) + resp, err := http.DefaultClient.Do(request) + assert.Nil(t, err) + defer resp.Body.Close() + assert.Equal(t, 200, resp.StatusCode) + assert.Equal(t, "100", resp.Header["X-Ratelimit-Limit"][0]) + assert.Equal(t, "99", resp.Header["X-Ratelimit-Remaining"][0]) + }) + ginkgo.It("delete 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, + }) + }) + ginkgo.It("delete service", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/services/s1", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }) + }) + ginkgo.It("hit the route just deleted", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/server_port", + ExpectStatus: http.StatusNotFound, + ExpectBody: "{\"error_msg\":\"404 Route Not Found\"}\n", + Sleep: base.SleepTime, + }) + }) +}) + +var _ = ginkgo.Describe("create service with all options via POST method", func() { + ginkgo.It("create service with all options via POST method", func() { + t := ginkgo.GinkgoT() + var createServiceBody map[string]interface{} = map[string]interface{}{ + "id": "s2", + "name": "testservice", + "desc": "testservice_desc", + "labels": map[string]interface{}{ + "build": "16", + "env": "production", + "version": "v2", + }, + "enable_websocket": true, + "plugins": map[string]interface{}{ + "limit-count": map[string]interface{}{ + "count": 100, + "time_window": 60, + "rejected_code": 503, + "key": "remote_addr", + }, + }, + "upstream": map[string]interface{}{ + "type": "roundrobin", + "create_time": 1602883670, + "update_time": 1602893670, + "nodes": []map[string]interface{}{ + { + "host": base.UpstreamIp, + "port": 1980, + "weight": 1, + }, + }, + }, + } + _createServiceBody, err := json.Marshal(createServiceBody) + assert.Nil(t, err) + base.RunTestCase(base.HttpTestCase{ + Desc: "create service with all options via POST method", + Object: base.ManagerApiExpect(), + Method: http.MethodPost, + Path: "/apisix/admin/services", + Headers: map[string]string{"Authorization": base.GetToken()}, + Body: string(_createServiceBody), + ExpectStatus: http.StatusOK, + ExpectBody: "\"id\":\"s2\"", + }) + }) + ginkgo.It("get the service s2", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/services/s2", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectCode: http.StatusOK, + ExpectBody: "\"name\":\"testservice\",\"desc\":\"testservice_desc\",\"upstream\":{\"nodes\":[{\"host\":\"" + base.UpstreamIp + "\",\"port\":1980,\"weight\":1}],\"type\":\"roundrobin\"},\"plugins\":{\"limit-count\":{\"count\":100,\"key\":\"remote_addr\",\"rejected_code\":503,\"time_window\":60}},\"labels\":{\"build\":\"16\",\"env\":\"production\",\"version\":\"v2\"},\"enable_websocket\":true}", + Sleep: base.SleepTime, + }) + }) + ginkgo.It("create route using the service just created", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/routes/r1", + Body: `{ + "uri": "/hello", + "service_id": "s2" + }`, + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }) + }) + ginkgo.It("verify route", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusOK, + ExpectBody: "hello world", + Sleep: base.SleepTime, + }) + }) + ginkgo.It("delete 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, + }) + }) + ginkgo.It("delete service", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/services/s2", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }) + }) + ginkgo.It("hit the route just deleted", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.APISIXExpect(), + Method: http.MethodGet, + Path: "/hello", + ExpectStatus: http.StatusNotFound, + ExpectBody: "{\"error_msg\":\"404 Route Not Found\"}\n", + Sleep: base.SleepTime, + }) + }) +}) + +var _ = ginkgo.Describe("service update use patch method", func() { + ginkgo.It("create service without plugin", func() { + t := ginkgo.GinkgoT() + var createServiceBody map[string]interface{} = map[string]interface{}{ + "name": "testservice", + "upstream": map[string]interface{}{ + "type": "roundrobin", + "nodes": []map[string]interface{}{ + { + "host": base.UpstreamIp, + "port": 1980, + "weight": 1, + }, + }, + }, + } + _createServiceBody, err := json.Marshal(createServiceBody) + assert.Nil(t, err) + base.RunTestCase(base.HttpTestCase{ + Desc: "create service without plugin", + Object: base.ManagerApiExpect(), + Method: http.MethodPut, + Path: "/apisix/admin/services/s5", + Headers: map[string]string{"Authorization": base.GetToken()}, + Body: string(_createServiceBody), + ExpectStatus: http.StatusOK, + ExpectBody: "\"name\":\"testservice\",\"upstream\":{\"nodes\":[{\"host\":\"" + base.UpstreamIp + "\",\"port\":1980,\"weight\":1}],\"type\":\"roundrobin\"}}", + }) + }) + ginkgo.It("update service use patch method", func() { + t := ginkgo.GinkgoT() + var createServiceBody map[string]interface{} = map[string]interface{}{ + "name": "testpatch", + "upstream": map[string]interface{}{ + "type": "roundrobin", + "nodes": []map[string]interface{}{ + { + "host": base.UpstreamIp, + "port": 1981, + "weight": 1, + }, + }, + }, + } + _createServiceBody, err := json.Marshal(createServiceBody) + assert.Nil(t, err) + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPatch, + Path: "/apisix/admin/services/s5", + Body: string(_createServiceBody), + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + Sleep: base.SleepTime, + }) + }) + ginkgo.It("get the service s5", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/services/s5", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectCode: http.StatusOK, + ExpectBody: "\"name\":\"testpatch\",\"upstream\":{\"nodes\":[{\"host\":\"" + base.UpstreamIp + "\",\"port\":1981,\"weight\":1}],\"type\":\"roundrobin\"}}", + Sleep: base.SleepTime, + }) + }) + ginkgo.It("Update service using path parameter patch method", func() { + t := ginkgo.GinkgoT() + var createUpstreamBody map[string]interface{} = map[string]interface{}{ + "type": "roundrobin", + "nodes": []map[string]interface{}{ + { + "host": base.UpstreamIp, + "port": 1980, + "weight": 1, + }, + }, + } + _createUpstreamBody, err := json.Marshal(createUpstreamBody) + assert.Nil(t, err) + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodPatch, + Path: "/apisix/admin/services/s5/upstream", + Body: string(_createUpstreamBody), + Headers: map[string]string{ + "Authorization": base.GetToken(), + "Content-Type": "text/plain", + }, + ExpectStatus: http.StatusOK, + }) + }) + ginkgo.It("get service data", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodGet, + Path: "/apisix/admin/services/s5", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + ExpectBody: "\"name\":\"testpatch\",\"upstream\":{\"nodes\":[{\"host\":\"" + base.UpstreamIp + "\",\"port\":1980,\"weight\":1}],\"type\":\"roundrobin\"}}", + Sleep: base.SleepTime, + }) + }) + ginkgo.It("delete service", func() { + base.RunTestCase(base.HttpTestCase{ + Object: base.ManagerApiExpect(), + Method: http.MethodDelete, + Path: "/apisix/admin/services/s5", + Headers: map[string]string{"Authorization": base.GetToken()}, + ExpectStatus: http.StatusOK, + }) + }) +})