From 3edc58cbddd6df515aa89f6a9ef5b17cfee9da63 Mon Sep 17 00:00:00 2001 From: wind Date: Wed, 12 Jan 2022 10:31:17 +0800 Subject: [PATCH] [E2E] Add queue e2e test (#7941) --- .github/workflows/e2e.yml | 2 + .../e2e/cases/QueueE2ETest.java | 100 ++++++++++++++++++ .../e2e/pages/security/QueuePage.java | 94 ++++++++++++++++ .../e2e/pages/security/SecurityPage.java | 6 ++ .../pages/queue/_source/createQueue.vue | 4 + .../security/pages/queue/_source/list.vue | 6 +- .../home/pages/security/pages/queue/index.vue | 2 +- .../components/secondaryMenu/_source/menu.js | 3 +- 8 files changed, 212 insertions(+), 5 deletions(-) create mode 100644 dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/QueueE2ETest.java create mode 100644 dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/security/QueuePage.java diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index b4e3791aad..0cfbe5ab41 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -42,6 +42,8 @@ jobs: class: org.apache.dolphinscheduler.e2e.cases.WorkerGroupE2ETest - name: Project class: org.apache.dolphinscheduler.e2e.cases.ProjectE2ETest + - name: Queue + class: org.apache.dolphinscheduler.e2e.cases.QueueE2ETest - name: Workflow class: org.apache.dolphinscheduler.e2e.cases.WorkflowE2ETest env: diff --git a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/QueueE2ETest.java b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/QueueE2ETest.java new file mode 100644 index 0000000000..28338cc485 --- /dev/null +++ b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/QueueE2ETest.java @@ -0,0 +1,100 @@ +/* + * Licensed to 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. Apache Software Foundation (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 org.apache.dolphinscheduler.e2e.cases; + + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +import org.apache.dolphinscheduler.e2e.core.DolphinScheduler; +import org.apache.dolphinscheduler.e2e.pages.LoginPage; +import org.apache.dolphinscheduler.e2e.pages.security.QueuePage; +import org.apache.dolphinscheduler.e2e.pages.security.SecurityPage; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.remote.RemoteWebDriver; + +@DolphinScheduler(composeFiles = "docker/basic/docker-compose.yaml") +class QueueE2ETest { + + private static final String queueName = "test_queue_name"; + private static final String queueValue = "test_queue_value"; + private static final String editQueueName = "edit_test_queue_name"; + private static final String editQueueValue = "edit_test_queue_value"; + + private static RemoteWebDriver browser; + + @BeforeAll + public static void setup() { + new LoginPage(browser) + .login("admin", "dolphinscheduler123") + .goToNav(SecurityPage.class) + .goToTab(QueuePage.class) + ; + } + + @Test + @Order(10) + void testCreateQueue() { + final QueuePage page = new QueuePage(browser); + page.create(queueName, queueValue); + + await().untilAsserted(() -> { + browser.navigate().refresh(); + assertThat(page.queueList()) + .as("Queue list should contain newly-created queue") + .extracting(WebElement::getText) + .anyMatch(it -> it.contains(queueName)); + }); + } + + @Test + @Order(20) + void testCreateDuplicateQueue() { + final QueuePage page = new QueuePage(browser); + page.create(queueName, queueValue); + + await().untilAsserted(() -> + assertThat(browser.findElement(By.tagName("body")).getText()) + .contains("already exists") + ); + + page.createQueueForm().buttonCancel().click(); + } + + @Test + @Order(30) + void testEditQueue() { + final QueuePage page = new QueuePage(browser); + page.update(queueName, editQueueName, editQueueValue); + + await().untilAsserted(() -> { + browser.navigate().refresh(); + assertThat(page.queueList()) + .as("Queue list should contain newly-modified Queue") + .extracting(WebElement::getText) + .anyMatch(it -> it.contains(editQueueName)); + }); + } +} diff --git a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/security/QueuePage.java b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/security/QueuePage.java new file mode 100644 index 0000000000..35d0132d66 --- /dev/null +++ b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/security/QueuePage.java @@ -0,0 +1,94 @@ +/* + * Licensed to 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. Apache Software Foundation (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 org.apache.dolphinscheduler.e2e.pages.security; + +import org.apache.dolphinscheduler.e2e.pages.common.NavBarPage; + +import java.util.List; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; + +import lombok.Getter; + +@Getter +public final class QueuePage extends NavBarPage implements SecurityPage.Tab { + @FindBy(id = "btnCreateQueue") + private WebElement buttonCreateQueue; + + @FindBy(className = "items") + private List queueList; + + private final QueueForm createQueueForm; + private final QueueForm editQueueForm; + + public QueuePage(RemoteWebDriver driver) { + super(driver); + createQueueForm = new QueueForm(); + editQueueForm = new QueueForm(); + } + + public QueuePage create(String queueName, String queueValue) { + buttonCreateQueue().click(); + createQueueForm().inputQueueName().sendKeys(queueName); + createQueueForm().inputQueueValue().sendKeys(queueValue); + createQueueForm().buttonSubmit().click(); + return this; + } + + public QueuePage update(String queueName, String editQueueName, String editQueueValue) { + queueList() + .stream() + .filter(it -> it.findElement(By.className("queueName")).getAttribute("innerHTML").contains(queueName)) + .flatMap(it -> it.findElements(By.className("edit")).stream()) + .filter(WebElement::isDisplayed) + .findFirst() + .orElseThrow(() -> new RuntimeException("No edit button in queue list")) + .click(); + + editQueueForm().inputQueueName().sendKeys(editQueueName); + editQueueForm().inputQueueValue().sendKeys(editQueueValue); + editQueueForm().buttonSubmit().click(); + + return this; + } + + @Getter + public class QueueForm { + QueueForm() { + PageFactory.initElements(driver, this); + } + + @FindBy(id = "inputQueueName") + private WebElement inputQueueName; + + @FindBy(id = "inputQueueValue") + private WebElement inputQueueValue; + + @FindBy(id = "btnSubmit") + private WebElement buttonSubmit; + + @FindBy(id = "btnCancel") + private WebElement buttonCancel; + } +} diff --git a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/security/SecurityPage.java b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/security/SecurityPage.java index 67edcadfa8..7a4d219405 100644 --- a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/security/SecurityPage.java +++ b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/security/SecurityPage.java @@ -39,6 +39,8 @@ public class SecurityPage extends NavBarPage implements NavBarItem { @FindBy(className = "tab-worker-group-manage") private WebElement menWorkerGroupManage; + @FindBy(className = "tab-queue-manage") + private WebElement menuQueueManage; public SecurityPage(RemoteWebDriver driver) { super(driver); @@ -57,6 +59,10 @@ public class SecurityPage extends NavBarPage implements NavBarItem { menWorkerGroupManage().click(); return tab.cast(new WorkerGroupPage(driver)); } + if (tab == QueuePage.class) { + menuQueueManage().click(); + return tab.cast(new QueuePage(driver)); + } throw new UnsupportedOperationException("Unknown tab: " + tab.getName()); } diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/security/pages/queue/_source/createQueue.vue b/dolphinscheduler-ui/src/js/conf/home/pages/security/pages/queue/_source/createQueue.vue index f3a6155795..9344cda28b 100644 --- a/dolphinscheduler-ui/src/js/conf/home/pages/security/pages/queue/_source/createQueue.vue +++ b/dolphinscheduler-ui/src/js/conf/home/pages/security/pages/queue/_source/createQueue.vue @@ -16,6 +16,8 @@ */