瀏覽代碼

Merge branch 'master' into issue/3398

Nail Badiullin 2 年之前
父節點
當前提交
7b639d8332
共有 33 個文件被更改,包括 422 次插入254 次删除
  1. 15 2
      .github/workflows/branch-deploy.yml
  2. 0 32
      .github/workflows/build-template.yml
  3. 6 2
      .github/workflows/e2e-automation.yml
  4. 6 2
      .github/workflows/e2e-weekly.yml
  5. 2 0
      kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/ClustersProperties.java
  6. 19 7
      kafka-ui-api/src/main/java/com/provectus/kafka/ui/model/InternalTopic.java
  7. 7 2
      kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/TopicsService.java
  8. 8 8
      kafka-ui-api/src/test/java/com/provectus/kafka/ui/service/TopicsServicePaginationTest.java
  9. 11 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/BasePage.java
  10. 2 3
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/brokers/BrokersList.java
  11. 2 1
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connectors/KafkaConnectList.java
  12. 2 5
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/consumers/ConsumersList.java
  13. 99 97
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/KsqlDbList.java
  14. 16 23
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/panels/NaviSideBar.java
  15. 2 1
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/panels/TopPanel.java
  16. 28 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/panels/enums/MenuItem.java
  17. 2 1
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schemas/SchemaRegistryList.java
  18. 9 5
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/TopicsList.java
  19. 15 3
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/services/ApiService.java
  20. 1 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/settings/BaseSource.java
  21. 20 9
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/BaseTest.java
  22. 2 2
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/Facade.java
  23. 3 1
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/BaseManualTest.java
  24. 19 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/backlog/SanityBacklog.java
  25. 32 6
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/backlog/SmokeBacklog.java
  26. 10 16
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/suite/TopicsTest.java
  27. 4 4
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/suite/WizardTest.java
  28. 7 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/BaseQaseTest.java
  29. 1 1
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/Template.java
  30. 53 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/SmokeTest.java
  31. 9 11
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/connectors/ConnectorsTest.java
  32. 4 5
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/MessagesTest.java
  33. 6 5
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/TopicsTest.java

+ 15 - 2
.github/workflows/branch-deploy.yml

@@ -9,9 +9,9 @@ jobs:
     if: ${{ github.event.label.name == 'status/feature_testing' || github.event.label.name == 'status/feature_testing_public' }}
     runs-on: ubuntu-latest
     steps:
-      - uses: ./.github/workflows/build-template.yaml
+      - uses: actions/checkout@v3
         with:
-          APP_VERSION: $GITHUB_SHA
+          ref: ${{ github.event.pull_request.head.sha }}
       - name: get branch name
         id: extract_branch
         run: |
@@ -19,6 +19,19 @@ jobs:
           echo "tag=${tag}" >> $GITHUB_OUTPUT
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      - name: Set up JDK
+        uses: actions/setup-java@v3
+        with:
+          java-version: '17'
+          distribution: 'zulu'
+          cache: 'maven'
+      - name: Build
+        id: build
+        run: |
+          ./mvnw -B -ntp versions:set -DnewVersion=$GITHUB_SHA
+          ./mvnw -B -V -ntp clean package -Pprod -DskipTests
+          export VERSION=$(./mvnw -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
+          echo "version=${VERSION}" >> $GITHUB_OUTPUT
       - name: Set up QEMU
         uses: docker/setup-qemu-action@v2
       - name: Set up Docker Buildx

+ 0 - 32
.github/workflows/build-template.yml

@@ -1,32 +0,0 @@
-name: Maven build template
-on:
-  workflow_call:
-   inputs:
-    APP_VERSION:
-     required: true
-     type: string
-jobs:
-  build:
-    runs-on: ubuntu-latest
-    outputs:
-      version: ${{steps.build.outputs.version}}
-    steps:
-      - uses: actions/checkout@v3
-        with:
-          ref: ${{ github.event.pull_request.head.sha }}
-      - run: |
-          git config user.name github-actions
-          git config user.email github-actions@github.com
-      - name: Set up JDK
-        uses: actions/setup-java@v3
-        with:
-          java-version: '17'
-          distribution: 'zulu'
-          cache: 'maven'
-      - name: Build
-        id: build
-        run: |
-          ./mvnw -B -ntp versions:set -DnewVersion=${{ inputs.APP_VERSION }}
-          ./mvnw -B -V -ntp clean package -Pprod -DskipTests
-          export VERSION=$(./mvnw -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
-          echo "version=${VERSION}" >> $GITHUB_OUTPUT

+ 6 - 2
.github/workflows/e2e-automation.yml

@@ -23,6 +23,12 @@ jobs:
       - uses: actions/checkout@v3
         with:
           ref: ${{ github.sha }}
+      - name: Configure AWS credentials
+        uses: aws-actions/configure-aws-credentials@v1-node16
+        with:
+          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+          aws-region: eu-central-1
       - name: Set up environment
         id: set_env_values
         run: |
@@ -65,8 +71,6 @@ jobs:
         if: always()
         env:
           AWS_S3_BUCKET: 'kafkaui-allure-reports'
-          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
-          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
           AWS_REGION: 'eu-central-1'
           SOURCE_DIR: 'allure-history/allure-results'
       - name: Deploy report to Amazon S3

+ 6 - 2
.github/workflows/e2e-weekly.yml

@@ -10,6 +10,12 @@ jobs:
       - uses: actions/checkout@v3
         with:
           ref: ${{ github.sha }}
+      - name: Configure AWS credentials
+        uses: aws-actions/configure-aws-credentials@v1-node16
+        with:
+          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+          aws-region: eu-central-1
       - name: Set up environment
         id: set_env_values
         run: |
@@ -52,8 +58,6 @@ jobs:
         if: always()
         env:
           AWS_S3_BUCKET: 'kafkaui-allure-reports'
-          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
-          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
           AWS_REGION: 'eu-central-1'
           SOURCE_DIR: 'allure-history/allure-results'
       - name: Deploy report to Amazon S3

+ 2 - 0
kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/ClustersProperties.java

@@ -25,6 +25,8 @@ public class ClustersProperties {
 
   List<Cluster> clusters = new ArrayList<>();
 
+  String internalTopicPrefix;
+
   @Data
   public static class Cluster {
     String name;

+ 19 - 7
kafka-ui-api/src/main/java/com/provectus/kafka/ui/model/InternalTopic.java

@@ -1,9 +1,11 @@
 package com.provectus.kafka.ui.model;
 
+import com.provectus.kafka.ui.config.ClustersProperties;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+import javax.annotation.Nullable;
 import lombok.Builder;
 import lombok.Data;
 import org.apache.kafka.clients.admin.ConfigEntry;
@@ -14,6 +16,8 @@ import org.apache.kafka.common.TopicPartition;
 @Builder(toBuilder = true)
 public class InternalTopic {
 
+  ClustersProperties clustersProperties;
+
   // from TopicDescription
   private final String name;
   private final boolean internal;
@@ -40,9 +44,17 @@ public class InternalTopic {
                                    List<ConfigEntry> configs,
                                    InternalPartitionsOffsets partitionsOffsets,
                                    Metrics metrics,
-                                   InternalLogDirStats logDirInfo) {
+                                   InternalLogDirStats logDirInfo,
+                                   @Nullable String internalTopicPrefix) {
     var topic = InternalTopic.builder();
-    topic.internal(topicDescription.isInternal());
+
+    internalTopicPrefix = internalTopicPrefix == null || internalTopicPrefix.isEmpty()
+        ? "_"
+        : internalTopicPrefix;
+
+    topic.internal(
+        topicDescription.isInternal() || topicDescription.name().startsWith(internalTopicPrefix)
+    );
     topic.name(topicDescription.name());
 
     List<InternalPartition> partitions = topicDescription.partitions().stream()
@@ -56,10 +68,10 @@ public class InternalTopic {
           List<InternalReplica> replicas = partition.replicas().stream()
               .map(r ->
                   InternalReplica.builder()
-                    .broker(r.id())
-                    .inSync(partition.isr().contains(r))
-                    .leader(partition.leader() != null && partition.leader().id() == r.id())
-                    .build())
+                      .broker(r.id())
+                      .inSync(partition.isr().contains(r))
+                      .leader(partition.leader() != null && partition.leader().id() == r.id())
+                      .build())
               .collect(Collectors.toList());
           partitionDto.replicas(replicas);
 
@@ -79,7 +91,7 @@ public class InternalTopic {
 
           return partitionDto.build();
         })
-        .collect(Collectors.toList());
+        .toList();
 
     topic.partitions(partitions.stream().collect(
         Collectors.toMap(InternalPartition::getPartition, t -> t)));

+ 7 - 2
kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/TopicsService.java

@@ -3,6 +3,7 @@ package com.provectus.kafka.ui.service;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toMap;
 
+import com.provectus.kafka.ui.config.ClustersProperties;
 import com.provectus.kafka.ui.exception.TopicMetadataException;
 import com.provectus.kafka.ui.exception.TopicNotFoundException;
 import com.provectus.kafka.ui.exception.TopicRecreationException;
@@ -52,6 +53,7 @@ public class TopicsService {
 
   private final AdminClientService adminClientService;
   private final StatisticsCache statisticsCache;
+  private final ClustersProperties clustersProperties;
   @Value("${topic.recreate.maxRetries:15}")
   private int recreateMaxRetries;
   @Value("${topic.recreate.delay.seconds:1}")
@@ -127,7 +129,8 @@ public class TopicsService {
             configs.getOrDefault(t, List.of()),
             partitionsOffsets,
             metrics,
-            logDirInfo
+            logDirInfo,
+            clustersProperties.getInternalTopicPrefix()
         ))
         .collect(toList());
   }
@@ -459,7 +462,9 @@ public class TopicsService {
                     stats.getTopicConfigs().getOrDefault(topicName, List.of()),
                     InternalPartitionsOffsets.empty(),
                     stats.getMetrics(),
-                    stats.getLogDirInfo()))
+                    stats.getLogDirInfo(),
+                    clustersProperties.getInternalTopicPrefix()
+                    ))
             .collect(toList())
         );
   }

+ 8 - 8
kafka-ui-api/src/test/java/com/provectus/kafka/ui/service/TopicsServicePaginationTest.java

@@ -69,7 +69,7 @@ class TopicsServicePaginationTest {
             .map(Objects::toString)
             .map(name -> new TopicDescription(name, false, List.of()))
             .map(topicDescription -> InternalTopic.from(topicDescription, List.of(), null,
-                Metrics.empty(), InternalLogDirStats.empty()))
+                Metrics.empty(), InternalLogDirStats.empty(), "_"))
             .collect(Collectors.toMap(InternalTopic::getName, Function.identity()))
     );
 
@@ -95,7 +95,7 @@ class TopicsServicePaginationTest {
         .map(Objects::toString)
         .map(name -> new TopicDescription(name, false, List.of()))
         .map(topicDescription -> InternalTopic.from(topicDescription, List.of(), null,
-            Metrics.empty(), InternalLogDirStats.empty()))
+            Metrics.empty(), InternalLogDirStats.empty(), "_"))
         .collect(Collectors.toMap(InternalTopic::getName, Function.identity()));
     init(internalTopics);
 
@@ -122,7 +122,7 @@ class TopicsServicePaginationTest {
             .map(Objects::toString)
             .map(name -> new TopicDescription(name, false, List.of()))
             .map(topicDescription -> InternalTopic.from(topicDescription, List.of(), null,
-                Metrics.empty(), InternalLogDirStats.empty()))
+                Metrics.empty(), InternalLogDirStats.empty(), "_"))
             .collect(Collectors.toMap(InternalTopic::getName, Function.identity()))
     );
 
@@ -141,7 +141,7 @@ class TopicsServicePaginationTest {
             .map(Objects::toString)
             .map(name -> new TopicDescription(name, false, List.of()))
             .map(topicDescription -> InternalTopic.from(topicDescription, List.of(), null,
-                Metrics.empty(), InternalLogDirStats.empty()))
+                Metrics.empty(), InternalLogDirStats.empty(), "_"))
             .collect(Collectors.toMap(InternalTopic::getName, Function.identity()))
     );
 
@@ -160,7 +160,7 @@ class TopicsServicePaginationTest {
             .map(Objects::toString)
             .map(name -> new TopicDescription(name, Integer.parseInt(name) % 10 == 0, List.of()))
             .map(topicDescription -> InternalTopic.from(topicDescription, List.of(), null,
-                Metrics.empty(), InternalLogDirStats.empty()))
+                Metrics.empty(), InternalLogDirStats.empty(), "_"))
             .collect(Collectors.toMap(InternalTopic::getName, Function.identity()))
     );
 
@@ -181,7 +181,7 @@ class TopicsServicePaginationTest {
             .map(Objects::toString)
             .map(name -> new TopicDescription(name, Integer.parseInt(name) % 5 == 0, List.of()))
             .map(topicDescription -> InternalTopic.from(topicDescription, List.of(), null,
-                Metrics.empty(), InternalLogDirStats.empty()))
+                Metrics.empty(), InternalLogDirStats.empty(), "_"))
             .collect(Collectors.toMap(InternalTopic::getName, Function.identity()))
     );
 
@@ -202,7 +202,7 @@ class TopicsServicePaginationTest {
             .map(Objects::toString)
             .map(name -> new TopicDescription(name, false, List.of()))
             .map(topicDescription -> InternalTopic.from(topicDescription, List.of(), null,
-                Metrics.empty(), InternalLogDirStats.empty()))
+                Metrics.empty(), InternalLogDirStats.empty(), "_"))
             .collect(Collectors.toMap(InternalTopic::getName, Function.identity()))
     );
 
@@ -224,7 +224,7 @@ class TopicsServicePaginationTest {
                     new TopicPartitionInfo(p, null, List.of(), List.of()))
                 .collect(Collectors.toList())))
         .map(topicDescription -> InternalTopic.from(topicDescription, List.of(), InternalPartitionsOffsets.empty(),
-            Metrics.empty(), InternalLogDirStats.empty()))
+            Metrics.empty(), InternalLogDirStats.empty(), "_"))
         .collect(Collectors.toMap(InternalTopic::getName, Function.identity()));
 
     init(internalTopics);

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

@@ -4,6 +4,7 @@ import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.ElementsCollection;
 import com.codeborne.selenide.SelenideElement;
 import com.codeborne.selenide.WebDriverRunner;
+import com.provectus.kafka.ui.pages.panels.enums.MenuItem;
 import com.provectus.kafka.ui.utilities.WebUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.openqa.selenium.Keys;
@@ -33,6 +34,8 @@ public abstract class BasePage extends WebUtils {
     protected String summaryCellLocator = "//div[contains(text(),'%s')]";
     protected String tableElementNameLocator = "//tbody//a[contains(text(),'%s')]";
     protected String columnHeaderLocator = "//table//tr/th//div[text()='%s']";
+    protected String pageTitleFromHeader = "//h1[text()='%s']";
+    protected String pagePathFromHeader = "//a[text()='%s']/../h1";
 
     protected void waitUntilSpinnerDisappear() {
         log.debug("\nwaitUntilSpinnerDisappear");
@@ -41,6 +44,14 @@ public abstract class BasePage extends WebUtils {
         }
     }
 
+    protected SelenideElement getPageTitleFromHeader(MenuItem menuItem) {
+        return $x(String.format(pageTitleFromHeader, menuItem.getPageTitle()));
+    }
+
+    protected SelenideElement getPagePathFromHeader(MenuItem menuItem) {
+        return $x(String.format(pagePathFromHeader, menuItem.getPageTitle()));
+    }
+
     protected void clickSubmitBtn() {
         clickByJavaScript(submitBtn);
     }

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

@@ -12,15 +12,14 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import static com.codeborne.selenide.Selenide.$x;
+import static com.provectus.kafka.ui.pages.panels.enums.MenuItem.BROKERS;
 
 public class BrokersList extends BasePage {
 
-    protected SelenideElement brokersListHeader = $x("//h1[text()='Brokers']");
-
     @Step
     public BrokersList waitUntilScreenReady() {
         waitUntilSpinnerDisappear();
-        brokersListHeader.shouldBe(Condition.visible);
+        getPageTitleFromHeader(BROKERS).shouldBe(Condition.visible);
         return this;
     }
 

+ 2 - 1
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connectors/KafkaConnectList.java

@@ -6,6 +6,7 @@ import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
 
 import static com.codeborne.selenide.Selenide.$x;
+import static com.provectus.kafka.ui.pages.panels.enums.MenuItem.KAFKA_CONNECT;
 
 
 public class KafkaConnectList extends BasePage {
@@ -19,7 +20,7 @@ public class KafkaConnectList extends BasePage {
     @Step
     public KafkaConnectList waitUntilScreenReady() {
         waitUntilSpinnerDisappear();
-        createConnectorBtn.shouldBe(Condition.visible);
+        getPageTitleFromHeader(KAFKA_CONNECT).shouldBe(Condition.visible);
         return this;
     }
 

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

@@ -1,20 +1,17 @@
 package com.provectus.kafka.ui.pages.consumers;
 
 import com.codeborne.selenide.Condition;
-import com.codeborne.selenide.SelenideElement;
 import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
 
-import static com.codeborne.selenide.Selenide.$x;
+import static com.provectus.kafka.ui.pages.panels.enums.MenuItem.CONSUMERS;
 
 public class ConsumersList extends BasePage {
 
-    protected SelenideElement consumerListHeader = $x("//h1[text()='Consumers']");
-    
     @Step
     public ConsumersList waitUntilScreenReady() {
         waitUntilSpinnerDisappear();
-        consumerListHeader.shouldHave(Condition.visible);
+        getPageTitleFromHeader(CONSUMERS).shouldBe(Condition.visible);
         return this;
     }
 }

+ 99 - 97
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/KsqlDbList.java

@@ -1,137 +1,139 @@
 package com.provectus.kafka.ui.pages.ksqlDb;
 
-import static com.codeborne.selenide.Selenide.$;
-import static com.codeborne.selenide.Selenide.$x;
-
 import com.codeborne.selenide.CollectionCondition;
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
 import com.provectus.kafka.ui.pages.BasePage;
 import com.provectus.kafka.ui.pages.ksqlDb.enums.KsqlMenuTabs;
 import io.qameta.allure.Step;
+import org.openqa.selenium.By;
+
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
-import org.openqa.selenium.By;
+
+import static com.codeborne.selenide.Selenide.$;
+import static com.codeborne.selenide.Selenide.$x;
+import static com.provectus.kafka.ui.pages.panels.enums.MenuItem.KSQL_DB;
 
 public class KsqlDbList extends BasePage {
-  protected SelenideElement executeKsqlBtn = $x("//button[text()='Execute KSQL Request']");
-  protected SelenideElement tablesTab = $x("//nav[@role='navigation']/a[text()='Tables']");
-  protected SelenideElement streamsTab = $x("//nav[@role='navigation']/a[text()='Streams']");
-
-  @Step
-  public KsqlDbList waitUntilScreenReady() {
-    waitUntilSpinnerDisappear();
-    Arrays.asList(tablesTab, streamsTab).forEach(tab -> tab.shouldBe(Condition.visible));
-    return this;
-  }
-
-  @Step
-  public KsqlDbList clickExecuteKsqlRequestBtn() {
-    clickByJavaScript(executeKsqlBtn);
-    return this;
-  }
-
-  @Step
-  public KsqlDbList openDetailsTab(KsqlMenuTabs menu) {
-    $(By.linkText(menu.toString())).shouldBe(Condition.visible).click();
-    waitUntilSpinnerDisappear();
-    return this;
-  }
-
-  private List<KsqlDbList.KsqlTablesGridItem> initTablesItems() {
-    List<KsqlDbList.KsqlTablesGridItem> gridItemList = new ArrayList<>();
-    gridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
-        .forEach(item -> gridItemList.add(new KsqlDbList.KsqlTablesGridItem(item)));
-    return gridItemList;
-  }
-
-  @Step
-  public KsqlDbList.KsqlTablesGridItem getTableByName(String tableName) {
-    return initTablesItems().stream()
-        .filter(e -> e.getTableName().equals(tableName))
-        .findFirst().orElseThrow();
-  }
-
-  public static class KsqlTablesGridItem extends BasePage {
-
-    private final SelenideElement element;
-
-    public KsqlTablesGridItem(SelenideElement element) {
-      this.element = element;
-    }
+
+    protected SelenideElement executeKsqlBtn = $x("//button[text()='Execute KSQL Request']");
+    protected SelenideElement tablesTab = $x("//nav[@role='navigation']/a[text()='Tables']");
+    protected SelenideElement streamsTab = $x("//nav[@role='navigation']/a[text()='Streams']");
 
     @Step
-    public String getTableName() {
-      return element.$x("./td[1]").getText().trim();
+    public KsqlDbList waitUntilScreenReady() {
+        waitUntilSpinnerDisappear();
+        getPageTitleFromHeader(KSQL_DB).shouldBe(Condition.visible);
+        return this;
     }
 
     @Step
-    public String getTopicName() {
-      return element.$x("./td[2]").getText().trim();
+    public KsqlDbList clickExecuteKsqlRequestBtn() {
+        clickByJavaScript(executeKsqlBtn);
+        return this;
     }
 
     @Step
-    public String getKeyFormat() {
-      return element.$x("./td[3]").getText().trim();
+    public KsqlDbList openDetailsTab(KsqlMenuTabs menu) {
+        $(By.linkText(menu.toString())).shouldBe(Condition.visible).click();
+        waitUntilSpinnerDisappear();
+        return this;
+    }
+
+    private List<KsqlDbList.KsqlTablesGridItem> initTablesItems() {
+        List<KsqlDbList.KsqlTablesGridItem> gridItemList = new ArrayList<>();
+        gridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
+                .forEach(item -> gridItemList.add(new KsqlDbList.KsqlTablesGridItem(item)));
+        return gridItemList;
     }
 
     @Step
-    public String getValueFormat() {
-      return element.$x("./td[4]").getText().trim();
+    public KsqlDbList.KsqlTablesGridItem getTableByName(String tableName) {
+        return initTablesItems().stream()
+                .filter(e -> e.getTableName().equals(tableName))
+                .findFirst().orElseThrow();
+    }
+
+    private List<KsqlDbList.KsqlStreamsGridItem> initStreamsItems() {
+        List<KsqlDbList.KsqlStreamsGridItem> gridItemList = new ArrayList<>();
+        gridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
+                .forEach(item -> gridItemList.add(new KsqlDbList.KsqlStreamsGridItem(item)));
+        return gridItemList;
     }
 
     @Step
-    public String getIsWindowed() {
-      return element.$x("./td[5]").getText().trim();
+    public KsqlDbList.KsqlStreamsGridItem getStreamByName(String streamName) {
+        return initStreamsItems().stream()
+                .filter(e -> e.getStreamName().equals(streamName))
+                .findFirst().orElseThrow();
     }
-  }
 
-  private List<KsqlDbList.KsqlStreamsGridItem> initStreamsItems() {
-    List<KsqlDbList.KsqlStreamsGridItem> gridItemList = new ArrayList<>();
-    gridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
-        .forEach(item -> gridItemList.add(new KsqlDbList.KsqlStreamsGridItem(item)));
-    return gridItemList;
-  }
+    public static class KsqlTablesGridItem extends BasePage {
 
-  @Step
-  public KsqlDbList.KsqlStreamsGridItem getStreamByName(String streamName) {
-    return initStreamsItems().stream()
-        .filter(e -> e.getStreamName().equals(streamName))
-        .findFirst().orElseThrow();
-  }
+        private final SelenideElement element;
 
-  public static class KsqlStreamsGridItem extends BasePage {
+        public KsqlTablesGridItem(SelenideElement element) {
+            this.element = element;
+        }
 
-    private final SelenideElement element;
+        @Step
+        public String getTableName() {
+            return element.$x("./td[1]").getText().trim();
+        }
 
-    public KsqlStreamsGridItem(SelenideElement element) {
-      this.element = element;
-    }
+        @Step
+        public String getTopicName() {
+            return element.$x("./td[2]").getText().trim();
+        }
 
-    @Step
-    public String getStreamName() {
-      return element.$x("./td[1]").getText().trim();
-    }
+        @Step
+        public String getKeyFormat() {
+            return element.$x("./td[3]").getText().trim();
+        }
 
-    @Step
-    public String getTopicName() {
-      return element.$x("./td[2]").getText().trim();
-    }
+        @Step
+        public String getValueFormat() {
+            return element.$x("./td[4]").getText().trim();
+        }
 
-    @Step
-    public String getKeyFormat() {
-      return element.$x("./td[3]").getText().trim();
+        @Step
+        public String getIsWindowed() {
+            return element.$x("./td[5]").getText().trim();
+        }
     }
 
-    @Step
-    public String getValueFormat() {
-      return element.$x("./td[4]").getText().trim();
-    }
+    public static class KsqlStreamsGridItem extends BasePage {
 
-    @Step
-    public String getIsWindowed() {
-      return element.$x("./td[5]").getText().trim();
+        private final SelenideElement element;
+
+        public KsqlStreamsGridItem(SelenideElement element) {
+            this.element = element;
+        }
+
+        @Step
+        public String getStreamName() {
+            return element.$x("./td[1]").getText().trim();
+        }
+
+        @Step
+        public String getTopicName() {
+            return element.$x("./td[2]").getText().trim();
+        }
+
+        @Step
+        public String getKeyFormat() {
+            return element.$x("./td[3]").getText().trim();
+        }
+
+        @Step
+        public String getValueFormat() {
+            return element.$x("./td[4]").getText().trim();
+        }
+
+        @Step
+        public String getIsWindowed() {
+            return element.$x("./td[5]").getText().trim();
+        }
     }
-  }
 }

+ 16 - 23
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/NaviSideBar.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/panels/NaviSideBar.java

@@ -1,7 +1,9 @@
-package com.provectus.kafka.ui.pages;
+package com.provectus.kafka.ui.pages.panels;
 
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.panels.enums.MenuItem;
+import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
 
 import java.time.Duration;
@@ -34,38 +36,29 @@ public class NaviSideBar extends BasePage {
     }
 
     @Step
-    public NaviSideBar openSideMenu(String clusterName, SideMenuOption option) {
+    public String getPagePath(MenuItem menuItem) {
+        return getPagePathFromHeader(menuItem)
+                .shouldBe(Condition.visible)
+                .getText().trim();
+    }
+
+    @Step
+    public NaviSideBar openSideMenu(String clusterName, MenuItem menuItem) {
         clickByActions(expandCluster(clusterName).parent()
-                .$x(String.format(sideMenuOptionElementLocator, option.value)));
+                .$x(String.format(sideMenuOptionElementLocator, menuItem.getNaviTitle())));
         return this;
     }
 
     @Step
-    public NaviSideBar openSideMenu(SideMenuOption option) {
-        openSideMenu(CLUSTER_NAME, option);
+    public NaviSideBar openSideMenu(MenuItem menuItem) {
+        openSideMenu(CLUSTER_NAME, menuItem);
         return this;
     }
 
     public List<SelenideElement> getAllMenuButtons() {
         expandCluster(CLUSTER_NAME);
-        return Stream.of(SideMenuOption.values())
-                .map(option -> $x(String.format(sideMenuOptionElementLocator, option.value)))
+        return Stream.of(MenuItem.values())
+                .map(menuItem -> $x(String.format(sideMenuOptionElementLocator, menuItem.getNaviTitle())))
                 .collect(Collectors.toList());
     }
-
-    public enum SideMenuOption {
-        DASHBOARD("Dashboard"),
-        BROKERS("Brokers"),
-        TOPICS("Topics"),
-        CONSUMERS("Consumers"),
-        SCHEMA_REGISTRY("Schema Registry"),
-        KAFKA_CONNECT("Kafka Connect"),
-        KSQL_DB("KSQL DB");
-
-        final String value;
-
-        SideMenuOption(String value) {
-            this.value = value;
-        }
-    }
 }

+ 2 - 1
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/TopPanel.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/panels/TopPanel.java

@@ -1,6 +1,7 @@
-package com.provectus.kafka.ui.pages;
+package com.provectus.kafka.ui.pages.panels;
 
 import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
 
 import java.util.Arrays;
 import java.util.List;

+ 28 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/panels/enums/MenuItem.java

@@ -0,0 +1,28 @@
+package com.provectus.kafka.ui.pages.panels.enums;
+
+public enum MenuItem {
+    
+    DASHBOARD("Dashboard", "Dashboard"),
+    BROKERS("Brokers", "Brokers"),
+    TOPICS("Topics", "Topics"),
+    CONSUMERS("Consumers", "Consumers"),
+    SCHEMA_REGISTRY("Schema Registry", "Schema Registry"),
+    KAFKA_CONNECT("Kafka Connect", "Connectors"),
+    KSQL_DB("KSQL DB", "KSQL DB");
+    
+    private final String naviTitle;
+    private final String pageTitle;
+    
+    MenuItem(String naviTitle, String pageTitle) {
+        this.naviTitle = naviTitle;
+        this.pageTitle = pageTitle;
+    }
+    
+    public String getNaviTitle() {
+        return naviTitle;
+    }
+    
+    public String getPageTitle() {
+        return pageTitle;
+    }
+}

+ 2 - 1
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schemas/SchemaRegistryList.java

@@ -6,6 +6,7 @@ import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
 
 import static com.codeborne.selenide.Selenide.$x;
+import static com.provectus.kafka.ui.pages.panels.enums.MenuItem.SCHEMA_REGISTRY;
 
 public class SchemaRegistryList extends BasePage {
 
@@ -14,7 +15,7 @@ public class SchemaRegistryList extends BasePage {
     @Step
     public SchemaRegistryList waitUntilScreenReady() {
         waitUntilSpinnerDisappear();
-        createSchemaBtn.shouldBe(Condition.visible);
+        getPageTitleFromHeader(SCHEMA_REGISTRY).shouldBe(Condition.visible);
         return this;
     }
 

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

@@ -6,7 +6,6 @@ import com.codeborne.selenide.SelenideElement;
 import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
 
-import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -15,10 +14,10 @@ import java.util.stream.Stream;
 
 import static com.codeborne.selenide.Condition.visible;
 import static com.codeborne.selenide.Selenide.$x;
+import static com.provectus.kafka.ui.pages.panels.enums.MenuItem.TOPICS;
 
 public class TopicsList extends BasePage {
 
-    protected SelenideElement topicListHeader = $x("//h1[text()='Topics']");
     protected SelenideElement addTopicBtn = $x("//button[normalize-space(text()) ='Add a Topic']");
     protected SelenideElement searchField = $x("//input[@placeholder='Search by Topic Name']");
     protected SelenideElement showInternalRadioBtn = $x("//input[@name='ShowInternalTopics']");
@@ -32,7 +31,7 @@ public class TopicsList extends BasePage {
     @Step
     public TopicsList waitUntilScreenReady() {
         waitUntilSpinnerDisappear();
-        topicListHeader.shouldBe(visible);
+        getPageTitleFromHeader(TOPICS).shouldBe(visible);
         return this;
     }
 
@@ -175,6 +174,12 @@ public class TopicsList extends BasePage {
                 .findFirst().orElseThrow();
     }
 
+    @Step
+    public TopicGridItem getAnyNonInternalTopic() {
+        return getNonInternalTopics().stream()
+                .findAny().orElseThrow();
+    }
+
     @Step
     public List<TopicGridItem> getNonInternalTopics() {
         return initGridItems().stream()
@@ -207,8 +212,7 @@ public class TopicsList extends BasePage {
         public boolean isInternal() {
             boolean internal = false;
             try {
-                element.$x("./td[2]/a/span").shouldBe(visible, Duration.ofMillis(500));
-                internal = true;
+                internal = element.$x("./td[2]/a/span").isDisplayed();
             } catch (Throwable ignored) {
             }
             return internal;

+ 15 - 3
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/services/ApiService.java

@@ -67,8 +67,8 @@ public class ApiService extends BaseSource {
     }
 
     @Step
-    public ApiService createTopic(String topicName) {
-        createTopic(CLUSTER_NAME, topicName);
+    public ApiService createTopic(Topic topic) {
+        createTopic(CLUSTER_NAME, topic.getName());
         return this;
     }
 
@@ -133,6 +133,12 @@ public class ApiService extends BaseSource {
         return this;
     }
 
+    @Step
+    public ApiService deleteConnector(String connectorName) {
+        deleteConnector(CLUSTER_NAME, CONNECT_NAME, connectorName);
+        return this;
+    }
+
     @SneakyThrows
     private void createConnector(String clusterName, String connectName, Connector connector) {
         NewConnector connectorProperties = new NewConnector();
@@ -152,9 +158,15 @@ public class ApiService extends BaseSource {
         return this;
     }
 
+    @Step
+    public ApiService createConnector(Connector connector) {
+        createConnector(CLUSTER_NAME, CONNECT_NAME, connector);
+        return this;
+    }
+
     @Step
     public String getFirstConnectName(String clusterName) {
-        return connectorApi().getConnects(clusterName).blockFirst().getName();
+        return Objects.requireNonNull(connectorApi().getConnects(clusterName).blockFirst()).getName();
     }
 
     @SneakyThrows

+ 1 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/settings/BaseSource.java

@@ -8,6 +8,7 @@ public abstract class BaseSource {
     public static final String BASE_CONTAINER_URL = "http://host.testcontainers.internal:8080";
     public static final String BASE_LOCAL_URL = "http://localhost:8080";
     public static final String CLUSTER_NAME = "local";
+    public static final String CONNECT_NAME = "first";
     private static Config config;
     public static final String BROWSER = config().browser();
     public static final String SUITE_NAME = config().suite();

+ 20 - 9
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/BaseTest.java

@@ -22,7 +22,7 @@ import org.testng.asserts.SoftAssert;
 import java.time.Duration;
 import java.util.List;
 
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.*;
+import static com.provectus.kafka.ui.pages.panels.enums.MenuItem.*;
 import static com.provectus.kafka.ui.settings.BaseSource.*;
 import static com.provectus.kafka.ui.settings.drivers.LocalWebDriver.*;
 import static com.provectus.kafka.ui.utilities.qaseUtils.QaseSetup.qaseIntegrationSetup;
@@ -108,7 +108,7 @@ public abstract class BaseTest extends Facade {
     public void afterMethod() {
         browserClear();
     }
-    
+
     @Step
     protected void navigateToBrokers() {
         naviSideBar
@@ -117,6 +117,17 @@ public abstract class BaseTest extends Facade {
                 .waitUntilScreenReady();
     }
 
+    @Step
+    protected void navigateToBrokersAndOpenDetails(int brokerId) {
+        naviSideBar
+                .openSideMenu(BROKERS);
+        brokersList
+                .waitUntilScreenReady()
+                .openBroker(brokerId);
+        brokersDetails
+                .waitUntilScreenReady();
+    }
+
     @Step
     protected void navigateToTopics() {
         naviSideBar
@@ -135,7 +146,7 @@ public abstract class BaseTest extends Facade {
         topicDetails
                 .waitUntilScreenReady();
     }
-    
+
     @Step
     protected void navigateToConsumers() {
         naviSideBar
@@ -143,7 +154,7 @@ public abstract class BaseTest extends Facade {
         consumersList
                 .waitUntilScreenReady();
     }
-    
+
     @Step
     protected void navigateToSchemaRegistry() {
         naviSideBar
@@ -151,7 +162,7 @@ public abstract class BaseTest extends Facade {
         schemaRegistryList
                 .waitUntilScreenReady();
     }
-    
+
     @Step
     protected void navigateToSchemaRegistryAndOpenDetails(String schemaName) {
         navigateToSchemaRegistry();
@@ -160,7 +171,7 @@ public abstract class BaseTest extends Facade {
         schemaDetails
                 .waitUntilScreenReady();
     }
-    
+
     @Step
     protected void navigateToConnectors() {
         naviSideBar
@@ -168,7 +179,7 @@ public abstract class BaseTest extends Facade {
         kafkaConnectList
                 .waitUntilScreenReady();
     }
-    
+
     @Step
     protected void navigateToConnectorsAndOpenDetails(String connectorName) {
         navigateToConnectors();
@@ -177,7 +188,7 @@ public abstract class BaseTest extends Facade {
         connectorDetails
                 .waitUntilScreenReady();
     }
-    
+
     @Step
     protected void navigateToKsqlDb() {
         naviSideBar
@@ -185,7 +196,7 @@ public abstract class BaseTest extends Facade {
         ksqlDbList
                 .waitUntilScreenReady();
     }
-    
+
     @Step
     protected void verifyElementsCondition(List<SelenideElement> elementList, Condition expectedCondition) {
         SoftAssert softly = new SoftAssert();

+ 2 - 2
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/Facade.java

@@ -1,7 +1,7 @@
 package com.provectus.kafka.ui;
 
-import com.provectus.kafka.ui.pages.NaviSideBar;
-import com.provectus.kafka.ui.pages.TopPanel;
+import com.provectus.kafka.ui.pages.panels.NaviSideBar;
+import com.provectus.kafka.ui.pages.panels.TopPanel;
 import com.provectus.kafka.ui.pages.brokers.BrokersConfigTab;
 import com.provectus.kafka.ui.pages.brokers.BrokersDetails;
 import com.provectus.kafka.ui.pages.brokers.BrokersList;

+ 3 - 1
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/BaseManualTest.java

@@ -11,6 +11,7 @@ import java.lang.reflect.Method;
 
 import static com.provectus.kafka.ui.utilities.qaseUtils.QaseSetup.qaseIntegrationSetup;
 import static com.provectus.kafka.ui.utilities.qaseUtils.enums.State.NOT_AUTOMATED;
+import static com.provectus.kafka.ui.utilities.qaseUtils.enums.State.TO_BE_AUTOMATED;
 
 @Listeners(QaseResultListener.class)
 public abstract class BaseManualTest {
@@ -22,7 +23,8 @@ public abstract class BaseManualTest {
 
     @BeforeMethod
     public void beforeMethod(Method method) {
-        if (method.getAnnotation(Automation.class).state().equals(NOT_AUTOMATED))
+        if (method.getAnnotation(Automation.class).state().equals(NOT_AUTOMATED)
+                || method.getAnnotation(Automation.class).state().equals(TO_BE_AUTOMATED))
             throw new SkipException("Skip test exception");
     }
 }

+ 19 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/backlog/SanityBacklog.java

@@ -0,0 +1,19 @@
+package com.provectus.kafka.ui.manualSuite.backlog;
+
+import com.provectus.kafka.ui.manualSuite.BaseManualTest;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Automation;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
+import io.qase.api.annotation.QaseId;
+import org.testng.annotations.Test;
+
+import static com.provectus.kafka.ui.utilities.qaseUtils.enums.State.TO_BE_AUTOMATED;
+
+public class SanityBacklog extends BaseManualTest {
+
+    @Automation(state = TO_BE_AUTOMATED)
+    @Suite(id = 19)
+    @QaseId(285)
+    @Test
+    public void testCaseA() {
+    }
+}

+ 32 - 6
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/suite/KsqlDbTest.java → kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/backlog/SmokeBacklog.java

@@ -1,35 +1,61 @@
-package com.provectus.kafka.ui.manualSuite.suite;
+package com.provectus.kafka.ui.manualSuite.backlog;
 
 import com.provectus.kafka.ui.manualSuite.BaseManualTest;
 import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Automation;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
 import io.qase.api.annotation.QaseId;
 import org.testng.annotations.Test;
 
 import static com.provectus.kafka.ui.utilities.qaseUtils.enums.State.TO_BE_AUTOMATED;
 
-public class KsqlDbTest extends BaseManualTest {
+public class SmokeBacklog extends BaseManualTest {
 
     @Automation(state = TO_BE_AUTOMATED)
-    @QaseId(276)
+    @Suite(id = 1)
+    @QaseId(330)
     @Test
     public void testCaseA() {
     }
 
     @Automation(state = TO_BE_AUTOMATED)
-    @QaseId(277)
+    @Suite(id = 8)
+    @QaseId(276)
     @Test
     public void testCaseB() {
     }
 
     @Automation(state = TO_BE_AUTOMATED)
-    @QaseId(278)
+    @Suite(id = 8)
+    @QaseId(277)
     @Test
     public void testCaseC() {
     }
 
     @Automation(state = TO_BE_AUTOMATED)
-    @QaseId(284)
+    @Suite(id = 8)
+    @QaseId(278)
     @Test
     public void testCaseD() {
     }
+
+    @Automation(state = TO_BE_AUTOMATED)
+    @Suite(id = 8)
+    @QaseId(284)
+    @Test
+    public void testCaseE() {
+    }
+
+    @Automation(state = TO_BE_AUTOMATED)
+    @Suite(id = 1)
+    @QaseId(331)
+    @Test
+    public void testCaseF() {
+    }
+
+    @Automation(state = TO_BE_AUTOMATED)
+    @Suite(id = 1)
+    @QaseId(332)
+    @Test
+    public void testCaseG() {
+    }
 }

+ 10 - 16
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/suite/TopicsTest.java

@@ -33,69 +33,63 @@ public class TopicsTest extends BaseManualTest {
     public void testCaseD() {
     }
 
-    @Automation(state = NOT_AUTOMATED)
-    @QaseId(46)
-    @Test
-    public void testCaseE() {
-    }
-
     @Automation(state = NOT_AUTOMATED)
     @QaseId(47)
     @Test
-    public void testCaseF() {
+    public void testCaseE() {
     }
 
     @Automation(state = NOT_AUTOMATED)
     @QaseId(48)
     @Test
-    public void testCaseG() {
+    public void testCaseF() {
     }
 
     @Automation(state = NOT_AUTOMATED)
     @QaseId(49)
     @Test
-    public void testCaseH() {
+    public void testCaseG() {
     }
 
     @Automation(state = NOT_AUTOMATED)
     @QaseId(50)
     @Test
-    public void testCaseI() {
+    public void testCaseH() {
     }
 
     @Automation(state = NOT_AUTOMATED)
     @QaseId(57)
     @Test
-    public void testCaseJ() {
+    public void testCaseI() {
     }
 
     @Automation(state = NOT_AUTOMATED)
     @QaseId(58)
     @Test
-    public void testCaseK() {
+    public void testCaseJ() {
     }
 
     @Automation(state = NOT_AUTOMATED)
     @QaseId(269)
     @Test
-    public void testCaseL() {
+    public void testCaseK() {
     }
 
     @Automation(state = NOT_AUTOMATED)
     @QaseId(270)
     @Test
-    public void testCaseM() {
+    public void testCaseL() {
     }
 
     @Automation(state = NOT_AUTOMATED)
     @QaseId(271)
     @Test
-    public void testCaseN() {
+    public void testCaseM() {
     }
 
     @Automation(state = NOT_AUTOMATED)
     @QaseId(272)
     @Test
-    public void testCaseO() {
+    public void testCaseN() {
     }
 }

+ 4 - 4
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/suite/BrokersTest.java → kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/suite/WizardTest.java

@@ -5,12 +5,12 @@ import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Automation;
 import io.qase.api.annotation.QaseId;
 import org.testng.annotations.Test;
 
-import static com.provectus.kafka.ui.utilities.qaseUtils.enums.State.TO_BE_AUTOMATED;
+import static com.provectus.kafka.ui.utilities.qaseUtils.enums.State.NOT_AUTOMATED;
 
-public class BrokersTest extends BaseManualTest {
+public class WizardTest extends BaseManualTest {
 
-    @Automation(state = TO_BE_AUTOMATED)
-    @QaseId(330)
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(333)
     @Test
     public void testCaseA() {
     }

+ 7 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/BaseQaseTest.java

@@ -9,6 +9,13 @@ import static com.provectus.kafka.ui.utilities.qaseUtils.QaseSetup.qaseIntegrati
 @Listeners(QaseCreateListener.class)
 public abstract class BaseQaseTest {
 
+    protected static final long BROKERS_SUITE_ID = 1;
+    protected static final long CONNECTORS_SUITE_ID = 10;
+    protected static final long KSQL_DB_SUITE_ID = 8;
+    protected static final long SANITY_SUITE_ID = 19;
+    protected static final long SCHEMAS_SUITE_ID = 11;
+    protected static final long TOPICS_SUITE_ID = 2;
+
     @BeforeSuite
     public void beforeSuite() {
         qaseIntegrationSetup();

+ 1 - 1
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/Template.java

@@ -13,7 +13,7 @@ public class Template extends BaseQaseTest {
 
     /**
      * this class is a kind of placeholder or example, use is as template to create new one
-     * copy class into kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/suite
+     * copy Template into kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/
      * place it into regarding folder and rename according to test case summary from Qase.io
      * uncomment @Test and set all annotations according to kafka-ui-e2e-checks/QASE.md
      */

+ 53 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/SmokeTest.java

@@ -3,20 +3,46 @@ package com.provectus.kafka.ui.smokeSuite;
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.WebDriverRunner;
 import com.provectus.kafka.ui.BaseTest;
+import com.provectus.kafka.ui.pages.panels.enums.MenuItem;
+import com.provectus.kafka.ui.models.Connector;
+import com.provectus.kafka.ui.models.Schema;
+import com.provectus.kafka.ui.models.Topic;
 import io.qameta.allure.Step;
 import io.qase.api.annotation.QaseId;
 import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.provectus.kafka.ui.pages.panels.enums.MenuItem.*;
 import static com.provectus.kafka.ui.settings.BaseSource.BROWSER;
+import static com.provectus.kafka.ui.utilities.FileUtils.getResourceAsString;
 import static com.provectus.kafka.ui.variables.Browser.LOCAL;
 import static com.provectus.kafka.ui.variables.Url.*;
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
 
 public class SmokeTest extends BaseTest {
 
+    private static final int BROKER_ID = 1;
+    private static final Schema TEST_SCHEMA = Schema.createSchemaAvro();
+    private static final Topic TEST_TOPIC = new Topic()
+            .setName("new-topic-" + randomAlphabetic(5))
+            .setNumberOfPartitions(1);
+    private static final Connector TEST_CONNECTOR = new Connector()
+            .setName("new-connector-" + randomAlphabetic(5))
+            .setConfig(getResourceAsString("testData/connectors/config_for_create_connector_via_api.json"));
+
+    @BeforeClass(alwaysRun = true)
+    public void beforeClass() {
+        apiService
+                .createTopic(TEST_TOPIC)
+                .createSchema(TEST_SCHEMA)
+                .createConnector(TEST_CONNECTOR);
+    }
+
     @QaseId(198)
     @Test
     public void checkBasePageElements() {
@@ -45,10 +71,37 @@ public class SmokeTest extends BaseTest {
         verifyCurrentUrl(KSQL_DB_LIST_URL);
     }
 
+    @QaseId(46)
+    @Test
+    public void checkComponentsPathWhileNavigating() {
+        navigateToBrokersAndOpenDetails(BROKER_ID);
+        verifyComponentsPath(BROKERS, String.format("Broker %d", BROKER_ID));
+        navigateToTopicsAndOpenDetails(TEST_TOPIC.getName());
+        verifyComponentsPath(TOPICS, TEST_TOPIC.getName());
+        navigateToSchemaRegistryAndOpenDetails(TEST_SCHEMA.getName());
+        verifyComponentsPath(SCHEMA_REGISTRY, TEST_SCHEMA.getName());
+        navigateToConnectorsAndOpenDetails(TEST_CONNECTOR.getName());
+        verifyComponentsPath(KAFKA_CONNECT, TEST_CONNECTOR.getName());
+    }
+
     @Step
     private void verifyCurrentUrl(String expectedUrl) {
         String host = BROWSER.equals(LOCAL) ? "localhost" : "host.testcontainers.internal";
         Assert.assertEquals(WebDriverRunner.getWebDriver().getCurrentUrl(),
                 String.format(expectedUrl, host), "getCurrentUrl()");
     }
+
+    @Step
+    private void verifyComponentsPath(MenuItem menuItem, String expectedPath) {
+        Assert.assertEquals(naviSideBar.getPagePath(menuItem), expectedPath,
+                String.format("getPagePath() for %s", menuItem.getPageTitle().toUpperCase()));
+    }
+
+    @AfterClass(alwaysRun = true)
+    public void afterClass() {
+        apiService
+                .deleteTopic(TEST_TOPIC.getName())
+                .deleteSchema(TEST_SCHEMA.getName())
+                .deleteConnector(TEST_CONNECTOR.getName());
+    }
 }

+ 9 - 11
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/connectors/ConnectorsTest.java

@@ -18,44 +18,42 @@ import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
 
 public class ConnectorsTest extends BaseTest {
 
-    private static final String CONNECT_NAME = "first";
     private static final List<Topic> TOPIC_LIST = new ArrayList<>();
     private static final List<Connector> CONNECTOR_LIST = new ArrayList<>();
     private static final String MESSAGE_CONTENT = "testData/topics/message_content_create_topic.json";
     private static final String MESSAGE_KEY = " ";
     private static final Topic TOPIC_FOR_CREATE = new Topic()
-            .setName("topic_for_create_connector-" + randomAlphabetic(5))
+            .setName("topic-for-create-connector-" + randomAlphabetic(5))
             .setMessageContent(MESSAGE_CONTENT).setMessageKey(MESSAGE_KEY);
     private static final Topic TOPIC_FOR_DELETE = new Topic()
-            .setName("topic_for_delete_connector-" + randomAlphabetic(5))
+            .setName("topic-for-delete-connector-" + randomAlphabetic(5))
             .setMessageContent(MESSAGE_CONTENT).setMessageKey(MESSAGE_KEY);
     private static final Topic TOPIC_FOR_UPDATE = new Topic()
-            .setName("topic_for_update_connector-" + randomAlphabetic(5))
+            .setName("topic-for-update-connector-" + randomAlphabetic(5))
             .setMessageContent(MESSAGE_CONTENT).setMessageKey(MESSAGE_KEY);
     private static final Connector CONNECTOR_FOR_DELETE = new Connector()
-            .setName("sink_postgres_activities_e2e_checks_for_delete-" + randomAlphabetic(5))
+            .setName("connector-for-delete-" + randomAlphabetic(5))
             .setConfig(getResourceAsString("testData/connectors/delete_connector_config.json"));
     private static final Connector CONNECTOR_FOR_UPDATE = new Connector()
-            .setName("sink_postgres_activities_e2e_checks_for_update-" + randomAlphabetic(5))
+            .setName("connector-for-update-and-delete-" + randomAlphabetic(5))
             .setConfig(getResourceAsString("testData/connectors/config_for_create_connector_via_api.json"));
 
     @BeforeClass(alwaysRun = true)
     public void beforeClass() {
         TOPIC_LIST.addAll(List.of(TOPIC_FOR_CREATE, TOPIC_FOR_DELETE, TOPIC_FOR_UPDATE));
         TOPIC_LIST.forEach(topic -> apiService
-                .createTopic(topic.getName())
+                .createTopic(topic)
                 .sendMessage(topic)
         );
         CONNECTOR_LIST.addAll(List.of(CONNECTOR_FOR_DELETE, CONNECTOR_FOR_UPDATE));
-        CONNECTOR_LIST.forEach(connector -> apiService
-                .createConnector(CONNECT_NAME, connector));
+        CONNECTOR_LIST.forEach(connector -> apiService.createConnector(connector));
     }
 
     @QaseId(42)
     @Test
     public void createConnector() {
         Connector connectorForCreate = new Connector()
-                .setName("sink_postgres_activities_e2e_checks-" + randomAlphabetic(5))
+                .setName("connector-for-create-" + randomAlphabetic(5))
                 .setConfig(getResourceAsString("testData/connectors/config_for_create_connector.json"));
         navigateToConnectors();
         kafkaConnectList
@@ -102,7 +100,7 @@ public class ConnectorsTest extends BaseTest {
     @AfterClass(alwaysRun = true)
     public void afterClass() {
         CONNECTOR_LIST.forEach(connector ->
-                apiService.deleteConnector(CONNECT_NAME, connector.getName()));
+                apiService.deleteConnector(connector.getName()));
         TOPIC_LIST.forEach(topic -> apiService.deleteTopic(topic.getName()));
     }
 }

+ 4 - 5
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/MessagesTest.java

@@ -53,7 +53,7 @@ public class MessagesTest extends BaseTest {
     public void beforeClass() {
         TOPIC_LIST.addAll(List.of(TOPIC_FOR_MESSAGES, TOPIC_FOR_CHECK_FILTERS, TOPIC_TO_CLEAR_AND_PURGE_MESSAGES,
                 TOPIC_TO_RECREATE, TOPIC_FOR_CHECK_MESSAGES_COUNT));
-        TOPIC_LIST.forEach(topic -> apiService.createTopic(topic.getName()));
+        TOPIC_LIST.forEach(topic -> apiService.createTopic(topic));
         IntStream.range(1, 3).forEach(i -> apiService.sendMessage(TOPIC_FOR_CHECK_FILTERS));
         waitUntilNewMinuteStarted();
         IntStream.range(1, 3).forEach(i -> apiService.sendMessage(TOPIC_FOR_CHECK_FILTERS));
@@ -75,8 +75,6 @@ public class MessagesTest extends BaseTest {
         softly.assertAll();
     }
 
-    @Ignore
-    @Issue("https://github.com/provectus/kafka-ui/issues/2778")
     @QaseId(19)
     @Test(priority = 2)
     public void clearMessage() {
@@ -85,12 +83,13 @@ public class MessagesTest extends BaseTest {
                 .openDetailsTab(OVERVIEW);
         int messageAmount = topicDetails.getMessageCountAmount();
         produceMessage(TOPIC_FOR_MESSAGES);
-        Assert.assertEquals(messageAmount + 1, topicDetails.getMessageCountAmount(), "getMessageCountAmount()");
+        Assert.assertEquals(topicDetails.getMessageCountAmount(), messageAmount + 1, "getMessageCountAmount()");
         topicDetails
                 .openDotMenu()
                 .clickClearMessagesMenu()
+                .clickConfirmBtnMdl()
                 .waitUntilScreenReady();
-        Assert.assertEquals(0, topicDetails.getMessageCountAmount(), "getMessageCountAmount()");
+        Assert.assertEquals(topicDetails.getMessageCountAmount(), 0, "getMessageCountAmount()");
     }
 
     @QaseId(239)

+ 6 - 5
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/TopicsTest.java

@@ -52,13 +52,14 @@ public class TopicsTest extends BaseTest {
             .setMaxSizeOnDisk(NOT_SET);
     private static final Topic TOPIC_FOR_CHECK_FILTERS = new Topic()
             .setName("topic-for-check-filters-" + randomAlphabetic(5));
-    private static final Topic TOPIC_FOR_DELETE = new Topic().setName("topic-to-delete-" + randomAlphabetic(5));
+    private static final Topic TOPIC_FOR_DELETE = new Topic()
+            .setName("topic-to-delete-" + randomAlphabetic(5));
     private static final List<Topic> TOPIC_LIST = new ArrayList<>();
 
     @BeforeClass(alwaysRun = true)
     public void beforeClass() {
         TOPIC_LIST.addAll(List.of(TOPIC_TO_UPDATE_AND_DELETE, TOPIC_FOR_DELETE, TOPIC_FOR_CHECK_FILTERS));
-        TOPIC_LIST.forEach(topic -> apiService.createTopic(topic.getName()));
+        TOPIC_LIST.forEach(topic -> apiService.createTopic(topic));
     }
 
     @QaseId(199)
@@ -89,11 +90,11 @@ public class TopicsTest extends BaseTest {
     void checkAvailableOperations() {
         navigateToTopics();
         topicsList
-                .getTopicItem("my_ksql_1ksql_processing_log")
+                .getTopicItem(TOPIC_TO_UPDATE_AND_DELETE.getName())
                 .selectItem(true);
         verifyElementsCondition(topicsList.getActionButtons(), Condition.enabled);
         topicsList
-                .getTopicItem("_confluent-ksql-my_ksql_1_command_topic")
+                .getTopicItem(TOPIC_FOR_CHECK_FILTERS.getName())
                 .selectItem(true);
         Assert.assertFalse(topicsList.isCopySelectedTopicBtnEnabled(), "isCopySelectedTopicBtnEnabled()");
     }
@@ -456,7 +457,7 @@ public class TopicsTest extends BaseTest {
                 .setNumberOfPartitions(1);
         navigateToTopics();
         topicsList
-                .getTopicItem("_schemas")
+                .getAnyNonInternalTopic()
                 .selectItem(true)
                 .clickCopySelectedTopicBtn();
         topicCreateEditForm