Jelajahi Sumber

Issue/copy checking compare versions operation for schema (#2951)

* resolve conversation

* Refactored assetions in SchemasTests -> compareVersionOperation

* Rename method selectFirstVersionFromDropDown

* last changes

* resolve conversations

* resolve conversations

* rename elementLocatorDdl to ddlElementLocator

* Resolve conversation

* Resolve conversation

* Resolved

* Resolved conversation

* Resolved conversation

Co-authored-by: Vlad Senyuta <66071557+VladSenyuta@users.noreply.github.com>
Alexandr Nezboretskiy 2 tahun lalu
induk
melakukan
9457d5ff2b

+ 1 - 1
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/BasePage.java

@@ -18,7 +18,7 @@ public abstract class BasePage extends WebUtils {
   protected SelenideElement alertMessage = $x("//div[@role='alert']//div[@role='contentinfo']");
   protected SelenideElement alertMessage = $x("//div[@role='alert']//div[@role='contentinfo']");
   protected String summaryCellLocator = "//div[contains(text(),'%s')]";
   protected String summaryCellLocator = "//div[contains(text(),'%s')]";
   protected String tableElementNameLocator = "//tbody//a[contains(text(),'%s')]";
   protected String tableElementNameLocator = "//tbody//a[contains(text(),'%s')]";
-  protected String сolumnHeaderLocator = "//table//tr/th/div[text()='%s']";
+  protected String columnHeaderLocator = "//table//tr/th/div[text()='%s']";
 
 
   protected void waitUntilSpinnerDisappear() {
   protected void waitUntilSpinnerDisappear() {
     log.debug("\nwaitUntilSpinnerDisappear");
     log.debug("\nwaitUntilSpinnerDisappear");

+ 2 - 2
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/brokers/BrokersDetails.java

@@ -26,13 +26,13 @@ public class BrokersDetails extends BasePage {
 
 
   private List<SelenideElement> getVisibleColumnHeaders() {
   private List<SelenideElement> getVisibleColumnHeaders() {
     return Stream.of("Name", "Topics", "Error", "Partitions")
     return Stream.of("Name", "Topics", "Error", "Partitions")
-        .map(name -> $x(String.format(сolumnHeaderLocator, name)))
+        .map(name -> $x(String.format(columnHeaderLocator, name)))
         .collect(Collectors.toList());
         .collect(Collectors.toList());
   }
   }
 
 
   private List<SelenideElement> getEnabledColumnHeaders() {
   private List<SelenideElement> getEnabledColumnHeaders() {
     return Stream.of("Name", "Error")
     return Stream.of("Name", "Error")
-        .map(name -> $x(String.format(сolumnHeaderLocator, name)))
+        .map(name -> $x(String.format(columnHeaderLocator, name)))
         .collect(Collectors.toList());
         .collect(Collectors.toList());
   }
   }
 
 

+ 0 - 3
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connector/KafkaConnectList.java

@@ -5,12 +5,9 @@ import static com.codeborne.selenide.Selenide.$x;
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
 import com.codeborne.selenide.SelenideElement;
 import com.provectus.kafka.ui.pages.BasePage;
 import com.provectus.kafka.ui.pages.BasePage;
-import com.provectus.kafka.ui.utilities.WaitUtils;
 import io.qameta.allure.Step;
 import io.qameta.allure.Step;
-import lombok.experimental.ExtensionMethod;
 
 
 
 
-@ExtensionMethod(WaitUtils.class)
 public class KafkaConnectList extends BasePage {
 public class KafkaConnectList extends BasePage {
 
 
     protected SelenideElement createConnectorBtn = $x("//button[contains(text(),'Create Connector')]");
     protected SelenideElement createConnectorBtn = $x("//button[contains(text(),'Create Connector')]");

+ 30 - 3
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schema/SchemaCreateForm.java

@@ -1,6 +1,7 @@
 package com.provectus.kafka.ui.pages.schema;
 package com.provectus.kafka.ui.pages.schema;
 
 
 import static com.codeborne.selenide.Selenide.$;
 import static com.codeborne.selenide.Selenide.$;
+import static com.codeborne.selenide.Selenide.$$x;
 import static com.codeborne.selenide.Selenide.$x;
 import static com.codeborne.selenide.Selenide.$x;
 
 
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.Condition;
@@ -9,6 +10,7 @@ import com.provectus.kafka.ui.api.model.CompatibilityLevel;
 import com.provectus.kafka.ui.api.model.SchemaType;
 import com.provectus.kafka.ui.api.model.SchemaType;
 import com.provectus.kafka.ui.pages.BasePage;
 import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
 import io.qameta.allure.Step;
+import java.util.List;
 
 
 public class SchemaCreateForm extends BasePage {
 public class SchemaCreateForm extends BasePage {
 
 
@@ -19,7 +21,10 @@ public class SchemaCreateForm extends BasePage {
     protected SelenideElement schemaTypeDdl = $x("//ul[@name='schemaType']");
     protected SelenideElement schemaTypeDdl = $x("//ul[@name='schemaType']");
     protected SelenideElement compatibilityLevelList = $x("//ul[@name='compatibilityLevel']");
     protected SelenideElement compatibilityLevelList = $x("//ul[@name='compatibilityLevel']");
     protected SelenideElement newSchemaTextArea = $x("//div[@id='newSchema']");
     protected SelenideElement newSchemaTextArea = $x("//div[@id='newSchema']");
-    protected String elementLocatorDdl = "//li[@value='%s']";
+    protected SelenideElement schemaVersionDdl = $$x("//ul[@role='listbox']/li[text()='Version 2']").first();
+    protected List<SelenideElement> visibleMarkers = $$x("//div[@class='ace_scroller']//div[contains(@class,'codeMarker')]");
+    protected List<SelenideElement> elementsCompareVersionDdl = $$x("//ul[@role='listbox']/ul/li");
+    protected String ddlElementLocator = "//li[@value='%s']";
 
 
     @Step
     @Step
     public SchemaCreateForm waitUntilScreenReady(){
     public SchemaCreateForm waitUntilScreenReady(){
@@ -43,7 +48,7 @@ public class SchemaCreateForm extends BasePage {
     @Step
     @Step
     public SchemaCreateForm selectSchemaTypeFromDropdown(SchemaType schemaType) {
     public SchemaCreateForm selectSchemaTypeFromDropdown(SchemaType schemaType) {
         schemaTypeDdl.shouldBe(Condition.enabled).click();
         schemaTypeDdl.shouldBe(Condition.enabled).click();
-        $x(String.format(elementLocatorDdl, schemaType.getValue())).shouldBe(Condition.visible).click();
+        $x(String.format(ddlElementLocator, schemaType.getValue())).shouldBe(Condition.visible).click();
         return this;
         return this;
     }
     }
 
 
@@ -56,10 +61,32 @@ public class SchemaCreateForm extends BasePage {
     @Step
     @Step
     public SchemaCreateForm selectCompatibilityLevelFromDropdown(CompatibilityLevel.CompatibilityEnum level) {
     public SchemaCreateForm selectCompatibilityLevelFromDropdown(CompatibilityLevel.CompatibilityEnum level) {
         compatibilityLevelList.shouldBe(Condition.enabled).click();
         compatibilityLevelList.shouldBe(Condition.enabled).click();
-        $x(String.format(elementLocatorDdl, level.getValue())).shouldBe(Condition.visible).click();
+        $x(String.format(ddlElementLocator, level.getValue())).shouldBe(Condition.visible).click();
         return this;
         return this;
     }
     }
 
 
+    @Step
+    public SchemaCreateForm openSchemaVersionDdl(){
+      schemaVersionDdl.shouldBe(Condition.enabled).click();
+      return this;
+    }
+
+    @Step
+    public int getVersionsNumberFromList(){
+      return elementsCompareVersionDdl.size();
+    }
+
+    @Step
+    public SchemaCreateForm selectVersionFromDropDown(int versionNumberDd){
+      $x(String.format(ddlElementLocator,versionNumberDd)).shouldBe(Condition.visible).click();
+      return this;
+    }
+
+    @Step
+    public int getMarkedLinesNumber(){
+      return visibleMarkers.size();
+    }
+
     @Step
     @Step
     public SchemaCreateForm setNewSchemaValue(String configJson) {
     public SchemaCreateForm setNewSchemaValue(String configJson) {
         newSchemaTextArea.shouldBe(Condition.visible).click();
         newSchemaTextArea.shouldBe(Condition.visible).click();

+ 15 - 2
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schema/SchemaDetails.java

@@ -14,7 +14,9 @@ public class SchemaDetails extends BasePage {
     protected SelenideElement editSchemaBtn = $x("//button[contains(text(),'Edit Schema')]");
     protected SelenideElement editSchemaBtn = $x("//button[contains(text(),'Edit Schema')]");
     protected SelenideElement removeBtn = $x("//*[contains(text(),'Remove')]");
     protected SelenideElement removeBtn = $x("//*[contains(text(),'Remove')]");
     protected SelenideElement confirmBtn = $x("//div[@role='dialog']//button[contains(text(),'Confirm')]");
     protected SelenideElement confirmBtn = $x("//div[@role='dialog']//button[contains(text(),'Confirm')]");
-    protected SelenideElement schemaTypeDdl = $x("//h4[contains(text(),'Type')]/../p");
+    protected SelenideElement schemaTypeField = $x("//h4[contains(text(),'Type')]/../p");
+    protected SelenideElement latestVersionField = $x("//h4[contains(text(),'Latest version')]/../p");
+    protected SelenideElement compareVersionBtn = $x("//button[text()='Compare Versions']");
     protected String schemaHeaderLocator = "//h1[contains(text(),'%s')]";
     protected String schemaHeaderLocator = "//h1[contains(text(),'%s')]";
 
 
     @Step
     @Step
@@ -34,9 +36,14 @@ public class SchemaDetails extends BasePage {
         return isVisible($x(String.format(schemaHeaderLocator,schemaName)));
         return isVisible($x(String.format(schemaHeaderLocator,schemaName)));
     }
     }
 
 
+    @Step
+    public int getLatestVersion(){
+      return Integer.parseInt(latestVersionField.getText());
+    }
+
     @Step
     @Step
     public String getSchemaType() {
     public String getSchemaType() {
-        return schemaTypeDdl.getText();
+        return schemaTypeField.getText();
     }
     }
 
 
     @Step
     @Step
@@ -45,6 +52,12 @@ public class SchemaDetails extends BasePage {
         return this;
         return this;
     }
     }
 
 
+    @Step
+    public SchemaDetails openCompareVersionMenu(){
+      compareVersionBtn.shouldBe(Condition.enabled).click();
+      return this;
+    }
+
     @Step
     @Step
     public SchemaDetails removeSchema() {
     public SchemaDetails removeSchema() {
         clickByJavaScript(dotMenuBtn);
         clickByJavaScript(dotMenuBtn);

+ 0 - 3
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/TopicDetails.java

@@ -10,15 +10,12 @@ import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.ElementsCollection;
 import com.codeborne.selenide.ElementsCollection;
 import com.codeborne.selenide.SelenideElement;
 import com.codeborne.selenide.SelenideElement;
 import com.provectus.kafka.ui.pages.BasePage;
 import com.provectus.kafka.ui.pages.BasePage;
-import com.provectus.kafka.ui.utilities.WaitUtils;
 import io.qameta.allure.Step;
 import io.qameta.allure.Step;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.List;
 import java.util.List;
-import lombok.experimental.ExtensionMethod;
 import org.openqa.selenium.By;
 import org.openqa.selenium.By;
 
 
-@ExtensionMethod({WaitUtils.class})
 public class TopicDetails extends BasePage {
 public class TopicDetails extends BasePage {
 
 
   protected SelenideElement clearMessagesBtn = $x(("//div[contains(text(), 'Clear messages')]"));
   protected SelenideElement clearMessagesBtn = $x(("//div[contains(text(), 'Clear messages')]"));

+ 2 - 5
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/TopicsList.java

@@ -5,16 +5,13 @@ import static com.codeborne.selenide.Selenide.$x;
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
 import com.codeborne.selenide.SelenideElement;
 import com.provectus.kafka.ui.pages.BasePage;
 import com.provectus.kafka.ui.pages.BasePage;
-import com.provectus.kafka.ui.utilities.WaitUtils;
 import io.qameta.allure.Step;
 import io.qameta.allure.Step;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.List;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.Stream;
-import lombok.experimental.ExtensionMethod;
 
 
-@ExtensionMethod(WaitUtils.class)
 public class TopicsList extends BasePage {
 public class TopicsList extends BasePage {
 
 
     protected SelenideElement topicListHeader = $x("//*[text()='Topics']");
     protected SelenideElement topicListHeader = $x("//*[text()='Topics']");
@@ -56,13 +53,13 @@ public class TopicsList extends BasePage {
 
 
     private List<SelenideElement> getVisibleColumnHeaders() {
     private List<SelenideElement> getVisibleColumnHeaders() {
       return Stream.of("Replication Factor","Number of messages","Topic Name", "Partitions", "Out of sync replicas", "Size")
       return Stream.of("Replication Factor","Number of messages","Topic Name", "Partitions", "Out of sync replicas", "Size")
-          .map(name -> $x(String.format(сolumnHeaderLocator, name)))
+          .map(name -> $x(String.format(columnHeaderLocator, name)))
         .collect(Collectors.toList());
         .collect(Collectors.toList());
     }
     }
 
 
     private List<SelenideElement> getEnabledColumnHeaders(){
     private List<SelenideElement> getEnabledColumnHeaders(){
       return Stream.of("Topic Name", "Partitions", "Out of sync replicas", "Size")
       return Stream.of("Topic Name", "Partitions", "Out of sync replicas", "Size")
-          .map(name -> $x(String.format(сolumnHeaderLocator, name)))
+          .map(name -> $x(String.format(columnHeaderLocator, name)))
           .collect(Collectors.toList());
           .collect(Collectors.toList());
     }
     }
 
 

+ 0 - 31
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/WaitUtils.java

@@ -1,31 +0,0 @@
-package com.provectus.kafka.ui.utilities;
-
-import com.codeborne.selenide.Condition;
-import com.codeborne.selenide.SelenideElement;
-import org.junit.jupiter.api.Assertions;
-import org.openqa.selenium.By;
-
-import static com.codeborne.selenide.Selenide.*;
-import static com.codeborne.selenide.Selenide.$;
-
-public class WaitUtils {
-    public static void refreshUntil(By by, Condition condition) {
-        int i = 0;
-        do {
-            refresh();
-            i++;
-            sleep(2000);
-        } while ($$(by).size() < 1 && i != 20);
-        $(by).shouldBe(condition);
-    }
-
-    public static void waitForSelectedValue(SelenideElement element, String selectedValue) {
-        int i = 0;
-        do {
-            refresh();
-            i++;
-            sleep(2000);
-        } while (!selectedValue.equals(element.getSelectedValue()) && i != 60);
-        Assertions.assertEquals(selectedValue, element.getSelectedValue()) ;
-    }
-}

+ 44 - 17
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/schemas/SchemasTests.java

@@ -103,25 +103,52 @@ public class SchemasTests extends BaseTest {
         Assertions.assertEquals(CompatibilityLevel.CompatibilityEnum.NONE.toString(), schemaDetails.getCompatibility(), "getCompatibility()");
         Assertions.assertEquals(CompatibilityLevel.CompatibilityEnum.NONE.toString(), schemaDetails.getCompatibility(), "getCompatibility()");
     }
     }
 
 
+    @DisplayName("Checking Compare Versions operation for Schema")
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(186)
+    @Test
+    @Order(3)
+    void compareVersionsOperation() {
+      naviSideBar
+          .openSideMenu(SCHEMA_REGISTRY);
+      schemaRegistryList
+          .waitUntilScreenReady()
+          .openSchema(AVRO_API.getName());
+      int latestVersion = schemaDetails
+          .waitUntilScreenReady()
+          .getLatestVersion();
+      schemaDetails
+          .openCompareVersionMenu();
+      int versionsNumberFromDdl = schemaCreateForm
+          .waitUntilScreenReady()
+          .openSchemaVersionDdl()
+          .getVersionsNumberFromList();
+      Assertions.assertEquals(latestVersion,versionsNumberFromDdl,"Versions number is not matched");
+      schemaCreateForm
+          .selectVersionFromDropDown(1);
+      Assertions.assertEquals(53, schemaCreateForm.getMarkedLinesNumber(), "getAllMarkedLines()");
+    }
+
     @DisplayName("should delete AVRO schema")
     @DisplayName("should delete AVRO schema")
     @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
     @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
     @AutomationStatus(status = Status.AUTOMATED)
     @AutomationStatus(status = Status.AUTOMATED)
     @CaseId(187)
     @CaseId(187)
     @Test
     @Test
-    @Order(3)
+    @Order(4)
     void deleteSchemaAvro() {
     void deleteSchemaAvro() {
-        naviSideBar
-                .openSideMenu(SCHEMA_REGISTRY);
-        schemaRegistryList
-                .waitUntilScreenReady()
-                .openSchema(AVRO_API.getName());
-        schemaDetails
-                .waitUntilScreenReady()
-                .removeSchema();
-        schemaRegistryList
-                .waitUntilScreenReady();
-        Assertions.assertFalse(schemaRegistryList.isSchemaVisible(AVRO_API.getName()),"isSchemaVisible()");
-        SCHEMA_LIST.remove(AVRO_API);
+      naviSideBar
+          .openSideMenu(SCHEMA_REGISTRY);
+      schemaRegistryList
+          .waitUntilScreenReady()
+          .openSchema(AVRO_API.getName());
+      schemaDetails
+          .waitUntilScreenReady()
+          .removeSchema();
+      schemaRegistryList
+          .waitUntilScreenReady();
+      Assertions.assertFalse(schemaRegistryList.isSchemaVisible(AVRO_API.getName()),"isSchemaVisible()");
+      SCHEMA_LIST.remove(AVRO_API);
     }
     }
 
 
     @DisplayName("should create JSON schema")
     @DisplayName("should create JSON schema")
@@ -129,7 +156,7 @@ public class SchemasTests extends BaseTest {
     @AutomationStatus(status = Status.AUTOMATED)
     @AutomationStatus(status = Status.AUTOMATED)
     @CaseId(89)
     @CaseId(89)
     @Test
     @Test
-    @Order(4)
+    @Order(5)
     void createSchemaJson() {
     void createSchemaJson() {
         Schema schemaJson = Schema.createSchemaJson();
         Schema schemaJson = Schema.createSchemaJson();
         naviSideBar
         naviSideBar
@@ -162,7 +189,7 @@ public class SchemasTests extends BaseTest {
     @AutomationStatus(status = Status.AUTOMATED)
     @AutomationStatus(status = Status.AUTOMATED)
     @CaseId(189)
     @CaseId(189)
     @Test
     @Test
-    @Order(5)
+    @Order(6)
     void deleteSchemaJson() {
     void deleteSchemaJson() {
         naviSideBar
         naviSideBar
                 .openSideMenu(SCHEMA_REGISTRY);
                 .openSideMenu(SCHEMA_REGISTRY);
@@ -183,7 +210,7 @@ public class SchemasTests extends BaseTest {
     @AutomationStatus(status = Status.AUTOMATED)
     @AutomationStatus(status = Status.AUTOMATED)
     @CaseId(91)
     @CaseId(91)
     @Test
     @Test
-    @Order(6)
+    @Order(7)
     void createSchemaProtobuf() {
     void createSchemaProtobuf() {
         Schema schemaProtobuf = Schema.createSchemaProtobuf();
         Schema schemaProtobuf = Schema.createSchemaProtobuf();
         naviSideBar
         naviSideBar
@@ -216,7 +243,7 @@ public class SchemasTests extends BaseTest {
     @AutomationStatus(status = Status.AUTOMATED)
     @AutomationStatus(status = Status.AUTOMATED)
     @CaseId(223)
     @CaseId(223)
     @Test
     @Test
-    @Order(7)
+    @Order(8)
     void deleteSchemaProtobuf() {
     void deleteSchemaProtobuf() {
         naviSideBar
         naviSideBar
                 .openSideMenu(SCHEMA_REGISTRY);
                 .openSideMenu(SCHEMA_REGISTRY);