From 3c8e75209c671d17fbb34ba257ccfbe284fa2ebd Mon Sep 17 00:00:00 2001 From: li wencheng Date: Wed, 14 Jul 2021 16:15:06 +0800 Subject: [PATCH 1/6] fix: make service chash key Input can inputable and selectable Fixes #<1952> --- .../components/Upstream/components/Type.tsx | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/web/src/components/Upstream/components/Type.tsx b/web/src/components/Upstream/components/Type.tsx index 8788ebb783..5025ad5ef1 100644 --- a/web/src/components/Upstream/components/Type.tsx +++ b/web/src/components/Upstream/components/Type.tsx @@ -14,8 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React from 'react' -import { Form, Select } from 'antd' +import React, { useState } from 'react' +import { AutoComplete, Form, Select } from 'antd' import { useIntl } from 'umi' import type { FormInstance } from 'antd/es/form' @@ -28,6 +28,11 @@ type Props = { const CHash: React.FC> = ({ readonly }) => { const { formatMessage } = useIntl() + const [keySearchWord, setKeySearchWord] = useState(''); + + const handleSearch = (search: string) => { + setKeySearchWord(search); + }; return ( @@ -39,14 +44,18 @@ const CHash: React.FC> = ({ readonly }) => { ))} - - + + + {Object.entries(CommonHashKeyEnum) + .filter((([label, value]) => label.startsWith(keySearchWord) || value.startsWith(keySearchWord))) + .map(([label, value]) => ( + + {label} + + ))} + ) From 58b19ee3ba679b29b167dec584145f8a3151432c Mon Sep 17 00:00:00 2001 From: li wencheng Date: Wed, 14 Jul 2021 16:43:15 +0800 Subject: [PATCH 2/6] fix: make service chash key Input can inputable and selectable Fixes #<1952> --- web/src/components/Upstream/components/Type.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/components/Upstream/components/Type.tsx b/web/src/components/Upstream/components/Type.tsx index 5025ad5ef1..f9e8906ba0 100644 --- a/web/src/components/Upstream/components/Type.tsx +++ b/web/src/components/Upstream/components/Type.tsx @@ -47,7 +47,7 @@ const CHash: React.FC> = ({ readonly }) => { - + {Object.entries(CommonHashKeyEnum) .filter((([label, value]) => label.startsWith(keySearchWord) || value.startsWith(keySearchWord))) .map(([label, value]) => ( From 8a97ff75a21d827dd1a23b2e92ff2ccffed7fe40 Mon Sep 17 00:00:00 2001 From: li wencheng Date: Mon, 26 Jul 2021 11:54:13 +0800 Subject: [PATCH 3/6] refine code and add e2e test Fixes #<1952> --- ...create-service-with-chash-upstream.spec.js | 104 ++++++++++++++++++ .../components/Upstream/components/Type.tsx | 2 +- 2 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 web/cypress/integration/service/create-service-with-chash-upstream.spec.js diff --git a/web/cypress/integration/service/create-service-with-chash-upstream.spec.js b/web/cypress/integration/service/create-service-with-chash-upstream.spec.js new file mode 100644 index 0000000000..eff918c20e --- /dev/null +++ b/web/cypress/integration/service/create-service-with-chash-upstream.spec.js @@ -0,0 +1,104 @@ +/* + * 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. + */ +/* eslint-disable no-undef */ + +context('Create and Edit Service with custom chash key Upstream', () => { + const selector = { + name: '#name', + description: '#desc', + nodes_0_host: '#nodes_0_host', + nodes_0_port: '#nodes_0_port', + nodes_0_weight: '#nodes_0_weight', + upstreamType: ".ant-select-item-option-content", + hashPosition: ".ant-select-item-option-content", + chash_key: '#key', + notification: '.ant-notification-notice-message', + nameSearch: '[title=Name]', + notificationCloseIcon: '.ant-notification-close-icon', + }; + + const data = { + serviceName: 'chash-service', + createServiceSuccess: 'Create Service Successfully', + deleteServiceSuccess: 'Delete Service Successfully', + editServiceSuccess: 'Configure Service Successfully', + port: '80', + weight: 1, + description: 'desc_by_autotest', + ip1: '127.0.0.1', + port0: '7000', + weight0: '1', + custom_key: 'custom_key', + new_key: 'new_key', + }; + + beforeEach(() => { + cy.login(); + }); + + it('should create a service with custom chash key Upstream', function () { + cy.visit('/'); + cy.contains('Service').click(); + cy.contains('Create').click(); + cy.get(selector.name).type(data.serviceName); + cy.get(selector.description).type(data.description); + cy.get('[title="Round Robin"]').click(); + cy.get(selector.upstreamType).within(() => { + cy.contains('CHash').click(); + }); + cy.get('[title="vars"]').click(); + cy.get(selector.hashPosition).within(() => { + cy.contains('cookie').click(); + }); + cy.get('[value="remote_addr"]').click(); + cy.get('[value="remote_addr"]').clear().type('custom_key'); + cy.get(selector.nodes_0_host).click(); + cy.get(selector.nodes_0_host).type(data.ip1); + cy.get(selector.nodes_0_port).clear().type(data.port0); + cy.get(selector.nodes_0_weight).clear().type(data.weight0); + cy.contains('Next').click(); + cy.contains('Next').click(); + cy.contains('Submit').click(); + cy.get(selector.notification).should('contain', data.createServiceSuccess); + }); + + it('should edit the service', function () { + cy.visit('/service/list'); + + cy.get(selector.nameSearch).type(data.serviceName); + cy.contains('Search').click(); + cy.contains(data.serviceName).siblings().contains('Configure').click(); + cy.wait(500); + cy.get(selector.chash_key).should('value', data.custom_key); + cy.get(selector.chash_key).clear().type(data.new_key); + cy.contains('Next').click(); + cy.contains('Next').click(); + cy.contains('Submit').click(); + cy.get(selector.notification).should('contain', data.editServiceSuccess); + }); + + + it('should delete this service', function () { + cy.visit('/service/list'); + cy.get(selector.nameSearch).type(data.serviceName); + cy.contains('Search').click(); + cy.contains(data.serviceName).siblings().contains('Delete').click(); + cy.contains('button', 'Confirm').click(); + cy.get(selector.notification).should('contain', data.deleteServiceSuccess); + cy.get(selector.notificationCloseIcon).click(); + }); +}); diff --git a/web/src/components/Upstream/components/Type.tsx b/web/src/components/Upstream/components/Type.tsx index f9e8906ba0..ed656700fc 100644 --- a/web/src/components/Upstream/components/Type.tsx +++ b/web/src/components/Upstream/components/Type.tsx @@ -28,7 +28,7 @@ type Props = { const CHash: React.FC> = ({ readonly }) => { const { formatMessage } = useIntl() - const [keySearchWord, setKeySearchWord] = useState(''); + const [keySearchWord, setKeySearchWord] = useState(''); const handleSearch = (search: string) => { setKeySearchWord(search); From 7066d851705759d7e24ba753933bfd51c65576e4 Mon Sep 17 00:00:00 2001 From: foolwc <2934625339@qq.com> Date: Tue, 27 Jul 2021 17:34:29 +0800 Subject: [PATCH 4/6] Refine `Service` test cases and add tests cases for`Route` and `Upstream` Fixes #<1952> --- .../create-route-with-chash-upstream.spec.js | 121 ++++++++++++++++++ ...create-service-with-chash-upstream.spec.js | 5 +- ...dit_upstream_with_custom_chash_key.spec.js | 106 +++++++++++++++ 3 files changed, 229 insertions(+), 3 deletions(-) create mode 100644 web/cypress/integration/route/create-route-with-chash-upstream.spec.js create mode 100644 web/cypress/integration/upstream/create_and_edit_upstream_with_custom_chash_key.spec.js diff --git a/web/cypress/integration/route/create-route-with-chash-upstream.spec.js b/web/cypress/integration/route/create-route-with-chash-upstream.spec.js new file mode 100644 index 0000000000..13d6c6798f --- /dev/null +++ b/web/cypress/integration/route/create-route-with-chash-upstream.spec.js @@ -0,0 +1,121 @@ +/* + * 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. + */ +/* eslint-disable no-undef */ + +context('Create and Edit Route With Custom CHash Key Upstream', () => { + const selector = { + name: '#name', + upstreamType: ".ant-select-item-option-content", + hashPosition: ".ant-select-item-option-content", + nodes_0_host: '#nodes_0_host', + nodes_0_port: '#nodes_0_port', + nodes_0_weight: '#nodes_0_weight', + nameSelector: '[title=Name]', + chash_key: '#key', + deleteAlert: '.ant-modal-body', + notificationCloseIcon: '.ant-notification-close-icon', + notification: '.ant-notification-notice-message', + }; + + const data = { + routeName: 'roteName', + ip: '127.0.0.1', + port: '7000', + weight: '1', + deleteRouteSuccess: 'Delete Route Successfully', + submitSuccess: 'Submit Successfully', + custom_key: 'custom_key', + new_key: 'new_key', + }; + + beforeEach(() => { + cy.login(); + }); + + it('should create route with custom chash key Upstream', function () { + cy.visit('/'); + cy.get('[role=menu]') + .should('be.visible') + .within(() => { + cy.contains('Route').click(); + }); + cy.contains('Create').click(); + + cy.contains('Next').click().click(); + cy.get(selector.name).type(data.routeName); + cy.contains('Next').click(); + + cy.get('[title="Round Robin"]').click(); + cy.get(selector.upstreamType).within(() => { + cy.contains('CHash').click(); + }); + cy.get('[title="vars"]').click(); + cy.get(selector.hashPosition).within(() => { + cy.contains('cookie').click(); + }); + cy.get('[value="remote_addr"]').click(); + cy.get('[value="remote_addr"]').clear().type(data.custom_key); + cy.get(selector.nodes_0_host).click(); + cy.get(selector.nodes_0_host).type(data.ip); + cy.get(selector.nodes_0_port).clear().type(data.port); + cy.get(selector.nodes_0_weight).clear().type(data.weight); + + + cy.contains('Next').click(); + cy.contains('Next').click(); + cy.contains('Submit').click(); + cy.contains(data.submitSuccess).should('be.visible'); + + // back to route list page + cy.contains('Goto List').click(); + cy.url().should('contains', 'routes/list'); + }); + + it('should edit this route ', function () { + cy.visit('/'); + cy.contains('Route').click(); + cy.get(selector.nameSelector).type(data.routeName); + + cy.contains('Search').click(); + cy.contains(data.routeName).siblings().contains('Configure').click(); + cy.get(selector.name).should('value', data.routeName); + cy.contains('Next').click({ + force: true, + }); + cy.get(selector.chash_key).should('value', data.custom_key); + cy.get(selector.chash_key).clear().type(data.new_key); + cy.contains('Next').click(); + cy.contains('Next').click(); + cy.contains('Submit').click(); + cy.contains(data.submitSuccess).should('be.visible'); + }); + + it('should delete the route', function () { + cy.visit('/routes/list'); + cy.get(selector.name).clear().type(data.routeName); + cy.contains('Search').click(); + cy.contains(data.routeName).siblings().contains('More').click(); + cy.contains('Delete').click(); + cy.get(selector.deleteAlert) + .should('be.visible') + .within(() => { + cy.contains('OK').click(); + }); + cy.get(selector.notification).should('contain', data.deleteRouteSuccess); + cy.get(selector.notificationCloseIcon).click({multiple: true}); + }); +}); diff --git a/web/cypress/integration/service/create-service-with-chash-upstream.spec.js b/web/cypress/integration/service/create-service-with-chash-upstream.spec.js index eff918c20e..88b404c617 100644 --- a/web/cypress/integration/service/create-service-with-chash-upstream.spec.js +++ b/web/cypress/integration/service/create-service-with-chash-upstream.spec.js @@ -16,7 +16,7 @@ */ /* eslint-disable no-undef */ -context('Create and Edit Service with custom chash key Upstream', () => { +context('Create and Edit Service with Custom CHash Key Upstream', () => { const selector = { name: '#name', description: '#desc', @@ -50,7 +50,7 @@ context('Create and Edit Service with custom chash key Upstream', () => { cy.login(); }); - it('should create a service with custom chash key Upstream', function () { + it('should create a service with custom CHash key Upstream', function () { cy.visit('/'); cy.contains('Service').click(); cy.contains('Create').click(); @@ -82,7 +82,6 @@ context('Create and Edit Service with custom chash key Upstream', () => { cy.get(selector.nameSearch).type(data.serviceName); cy.contains('Search').click(); cy.contains(data.serviceName).siblings().contains('Configure').click(); - cy.wait(500); cy.get(selector.chash_key).should('value', data.custom_key); cy.get(selector.chash_key).clear().type(data.new_key); cy.contains('Next').click(); diff --git a/web/cypress/integration/upstream/create_and_edit_upstream_with_custom_chash_key.spec.js b/web/cypress/integration/upstream/create_and_edit_upstream_with_custom_chash_key.spec.js new file mode 100644 index 0000000000..57de8477a6 --- /dev/null +++ b/web/cypress/integration/upstream/create_and_edit_upstream_with_custom_chash_key.spec.js @@ -0,0 +1,106 @@ +/* + * 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. + */ +/* eslint-disable no-undef */ + +context('Create and Delete Upstream With Custom CHash Key', () => { + const selector = { + name: '#name', + description: '#desc', + nodes_0_host: '#nodes_0_host', + nodes_0_port: '#nodes_0_port', + nodes_0_weight: '#nodes_0_weight', + upstreamType: ".ant-select-item-option-content", + hashPosition: ".ant-select-item-option-content", + chash_key: '#key', + notification: '.ant-notification-notice-message', + nameSelector: '[title=Name]', + }; + + const data = { + upstreamName: 'test_upstream', + description: 'desc_by_autotest', + custom_key: 'custom_key', + new_key: 'new_key', + ip: '127.0.0.1', + port: '7000', + weight: '1', + createUpstreamSuccess: 'Create Upstream Successfully', + configureUpstreamSuccess: 'Configure Upstream Successfully', + deleteUpstreamSuccess: 'Delete Upstream Successfully', + }; + + beforeEach(() => { + cy.login(); + }); + + it('should create upstream with custom chash key', function () { + cy.visit('/'); + cy.contains('Upstream').click(); + cy.contains('Create').click(); + + cy.get(selector.name).type(data.upstreamName); + cy.get(selector.description).type(data.description); + + cy.get('[title="Round Robin"]').click(); + cy.get(selector.upstreamType).within(() => { + cy.contains('CHash').click(); + }); + cy.get('[title="vars"]').click(); + cy.get(selector.hashPosition).within(() => { + cy.contains('cookie').click(); + }); + cy.get('[value="remote_addr"]').click(); + cy.get('[value="remote_addr"]').clear().type(data.custom_key); + cy.get(selector.nodes_0_host).click(); + cy.get(selector.nodes_0_host).type(data.ip); + cy.get(selector.nodes_0_port).clear().type(data.port); + cy.get(selector.nodes_0_weight).clear().type(data.weight); + + cy.contains('Next').click(); + cy.contains('Submit').click(); + cy.get(selector.notification).should('contain', data.createUpstreamSuccess); + cy.url().should('contains', 'upstream/list'); + }); + + it('should configure the upstream', function () { + cy.visit('/'); + cy.contains('Upstream').click(); + + cy.get(selector.nameSelector).type(data.upstreamName); + cy.contains('Search').click(); + cy.contains(data.upstreamName).siblings().contains('Configure').click(); + + cy.get(selector.chash_key).should('value', data.custom_key); + cy.get(selector.chash_key).clear().type(data.new_key); + + cy.contains('Next').click(); + cy.contains('Submit').click({ + force: true, + }); + + cy.get(selector.notification).should('contain', data.configureUpstreamSuccess); + cy.url().should('contains', 'upstream/list'); + }); + + it('should delete the upstream', function () { + cy.visit('/'); + cy.contains('Upstream').click(); + cy.contains(data.upstreamName).siblings().contains('Delete').click(); + cy.contains('button', 'Confirm').click(); + cy.get(selector.notification).should('contain', data.deleteUpstreamSuccess); + }); +}); From 657527f59d368fd2fbccfe7a1e21d67aa16261ad Mon Sep 17 00:00:00 2001 From: foolwc <2934625339@qq.com> Date: Wed, 28 Jul 2021 18:11:52 +0800 Subject: [PATCH 5/6] fix: keep test case context consistent when using selector. --- .../route/create-route-with-chash-upstream.spec.js | 14 +++++++++----- .../create-service-with-chash-upstream.spec.js | 11 +++++++---- ...and_edit_upstream_with_custom_chash_key.spec.js | 11 +++++++---- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/web/cypress/integration/route/create-route-with-chash-upstream.spec.js b/web/cypress/integration/route/create-route-with-chash-upstream.spec.js index 13d6c6798f..b8d37b8b67 100644 --- a/web/cypress/integration/route/create-route-with-chash-upstream.spec.js +++ b/web/cypress/integration/route/create-route-with-chash-upstream.spec.js @@ -19,6 +19,10 @@ context('Create and Edit Route With Custom CHash Key Upstream', () => { const selector = { name: '#name', + menu: '[role=menu]', + roundRobinSelect: '[title="Round Robin"]', + varSelect: '[title="vars"]', + defaultCHashKey: '[value="remote_addr"]', upstreamType: ".ant-select-item-option-content", hashPosition: ".ant-select-item-option-content", nodes_0_host: '#nodes_0_host', @@ -48,7 +52,7 @@ context('Create and Edit Route With Custom CHash Key Upstream', () => { it('should create route with custom chash key Upstream', function () { cy.visit('/'); - cy.get('[role=menu]') + cy.get(selector.menu) .should('be.visible') .within(() => { cy.contains('Route').click(); @@ -59,16 +63,16 @@ context('Create and Edit Route With Custom CHash Key Upstream', () => { cy.get(selector.name).type(data.routeName); cy.contains('Next').click(); - cy.get('[title="Round Robin"]').click(); + cy.get(selector.roundRobinSelect).click(); cy.get(selector.upstreamType).within(() => { cy.contains('CHash').click(); }); - cy.get('[title="vars"]').click(); + cy.get(selector.varSelect).click(); cy.get(selector.hashPosition).within(() => { cy.contains('cookie').click(); }); - cy.get('[value="remote_addr"]').click(); - cy.get('[value="remote_addr"]').clear().type(data.custom_key); + cy.get(selector.defaultCHashKey).click(); + cy.get(selector.defaultCHashKey).clear().type(data.custom_key); cy.get(selector.nodes_0_host).click(); cy.get(selector.nodes_0_host).type(data.ip); cy.get(selector.nodes_0_port).clear().type(data.port); diff --git a/web/cypress/integration/service/create-service-with-chash-upstream.spec.js b/web/cypress/integration/service/create-service-with-chash-upstream.spec.js index 88b404c617..e61358616e 100644 --- a/web/cypress/integration/service/create-service-with-chash-upstream.spec.js +++ b/web/cypress/integration/service/create-service-with-chash-upstream.spec.js @@ -20,6 +20,9 @@ context('Create and Edit Service with Custom CHash Key Upstream', () => { const selector = { name: '#name', description: '#desc', + roundRobinSelect: '[title="Round Robin"]', + varSelect: '[title="vars"]', + defaultCHashKey: '[value="remote_addr"]', nodes_0_host: '#nodes_0_host', nodes_0_port: '#nodes_0_port', nodes_0_weight: '#nodes_0_weight', @@ -56,16 +59,16 @@ context('Create and Edit Service with Custom CHash Key Upstream', () => { cy.contains('Create').click(); cy.get(selector.name).type(data.serviceName); cy.get(selector.description).type(data.description); - cy.get('[title="Round Robin"]').click(); + cy.get(selector.roundRobinSelect).click(); cy.get(selector.upstreamType).within(() => { cy.contains('CHash').click(); }); - cy.get('[title="vars"]').click(); + cy.get(selector.varSelect).click(); cy.get(selector.hashPosition).within(() => { cy.contains('cookie').click(); }); - cy.get('[value="remote_addr"]').click(); - cy.get('[value="remote_addr"]').clear().type('custom_key'); + cy.get(selector.defaultCHashKey).click(); + cy.get(selector.defaultCHashKey).clear().type('custom_key'); cy.get(selector.nodes_0_host).click(); cy.get(selector.nodes_0_host).type(data.ip1); cy.get(selector.nodes_0_port).clear().type(data.port0); diff --git a/web/cypress/integration/upstream/create_and_edit_upstream_with_custom_chash_key.spec.js b/web/cypress/integration/upstream/create_and_edit_upstream_with_custom_chash_key.spec.js index 57de8477a6..dda114593f 100644 --- a/web/cypress/integration/upstream/create_and_edit_upstream_with_custom_chash_key.spec.js +++ b/web/cypress/integration/upstream/create_and_edit_upstream_with_custom_chash_key.spec.js @@ -20,6 +20,9 @@ context('Create and Delete Upstream With Custom CHash Key', () => { const selector = { name: '#name', description: '#desc', + roundRobinSelect: '[title="Round Robin"]', + varSelect: '[title="vars"]', + defaultCHashKey: '[value="remote_addr"]', nodes_0_host: '#nodes_0_host', nodes_0_port: '#nodes_0_port', nodes_0_weight: '#nodes_0_weight', @@ -55,16 +58,16 @@ context('Create and Delete Upstream With Custom CHash Key', () => { cy.get(selector.name).type(data.upstreamName); cy.get(selector.description).type(data.description); - cy.get('[title="Round Robin"]').click(); + cy.get(selector.roundRobinSelect).click(); cy.get(selector.upstreamType).within(() => { cy.contains('CHash').click(); }); - cy.get('[title="vars"]').click(); + cy.get(selector.varSelect).click(); cy.get(selector.hashPosition).within(() => { cy.contains('cookie').click(); }); - cy.get('[value="remote_addr"]').click(); - cy.get('[value="remote_addr"]').clear().type(data.custom_key); + cy.get(selector.defaultCHashKey).click(); + cy.get(selector.defaultCHashKey).clear().type(data.custom_key); cy.get(selector.nodes_0_host).click(); cy.get(selector.nodes_0_host).type(data.ip); cy.get(selector.nodes_0_port).clear().type(data.port); From 46fe51c5a4087e4dd82d393416b276d96fb79e3a Mon Sep 17 00:00:00 2001 From: foolwc <2934625339@qq.com> Date: Thu, 29 Jul 2021 09:41:50 +0800 Subject: [PATCH 6/6] remove empty line Co-authored-by: litesun --- .../integration/route/create-route-with-chash-upstream.spec.js | 1 - 1 file changed, 1 deletion(-) diff --git a/web/cypress/integration/route/create-route-with-chash-upstream.spec.js b/web/cypress/integration/route/create-route-with-chash-upstream.spec.js index b8d37b8b67..f2aef94371 100644 --- a/web/cypress/integration/route/create-route-with-chash-upstream.spec.js +++ b/web/cypress/integration/route/create-route-with-chash-upstream.spec.js @@ -78,7 +78,6 @@ context('Create and Edit Route With Custom CHash Key Upstream', () => { cy.get(selector.nodes_0_port).clear().type(data.port); cy.get(selector.nodes_0_weight).clear().type(data.weight); - cy.contains('Next').click(); cy.contains('Next').click(); cy.contains('Submit').click();