Ver Fonte

[e2e] switch to TestNG (#3301)

* test commit

* fix BaseTest

* upd global

* upd global

* upd global

* add local browser VM option

* fix TopicsList column header locator

* fix withStartupTimeout()

* switch e2e to TestNG

* upd pom

* upd page classes

* upd -pl kafka-ui-e2e-checks
Vlad Senyuta há 2 anos atrás
pai
commit
9e1e9b3799
69 ficheiros alterados com 3314 adições e 3395 exclusões
  1. 1 1
      .github/workflows/e2e-checks.yaml
  2. 42 13
      kafka-ui-e2e-checks/README.md
  3. 50 93
      kafka-ui-e2e-checks/pom.xml
  4. 0 1
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/models/Connector.java
  5. 5 5
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/models/Schema.java
  6. 5 4
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/models/Topic.java
  7. 88 87
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/BasePage.java
  8. 11 10
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/NaviSideBar.java
  9. 5 3
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/TopPanel.java
  10. 28 27
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/brokers/BrokersConfigTab.java
  11. 74 73
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/brokers/BrokersDetails.java
  12. 90 89
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/brokers/BrokersList.java
  13. 6 6
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connectors/ConnectorCreateForm.java
  14. 21 21
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connectors/ConnectorDetails.java
  15. 8 8
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connectors/KafkaConnectList.java
  16. 3 3
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/consumers/ConsumersDetails.java
  17. 4 3
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/consumers/ConsumersList.java
  18. 4 4
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/KsqlDbList.java
  19. 3 3
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/KsqlQueryForm.java
  20. 4 3
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/enums/KsqlMenuTabs.java
  21. 6 5
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/enums/KsqlQueryConfig.java
  22. 3 2
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/models/Stream.java
  23. 3 2
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/models/Table.java
  24. 22 24
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schemas/SchemaCreateForm.java
  25. 10 10
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schemas/SchemaDetails.java
  26. 4 4
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schemas/SchemaRegistryList.java
  27. 0 289
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/TopicCreateEditForm.java
  28. 0 452
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/TopicDetails.java
  29. 0 65
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/TopicSettingsTab.java
  30. 0 260
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/TopicsList.java
  31. 0 24
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/enums/CleanupPolicyValue.java
  32. 0 36
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/enums/CustomParameterType.java
  33. 0 26
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/enums/MaxSizeOnDisk.java
  34. 0 25
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/enums/TimeToRetain.java
  35. 6 5
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/ProduceMessagePanel.java
  36. 267 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/TopicCreateEditForm.java
  37. 446 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/TopicDetails.java
  38. 66 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/TopicSettingsTab.java
  39. 261 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/TopicsList.java
  40. 25 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/enums/CleanupPolicyValue.java
  41. 37 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/enums/CustomParameterType.java
  42. 27 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/enums/MaxSizeOnDisk.java
  43. 26 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/enums/TimeToRetain.java
  44. 126 125
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/services/ApiService.java
  45. 35 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/settings/listeners/AllureListener.java
  46. 37 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/settings/listeners/LoggerListener.java
  47. 8 7
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/TimeUtils.java
  48. 58 58
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/WebUtils.java
  49. 0 33
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/DisplayNameGenerator.java
  50. 8 7
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/QaseExtension.java
  51. 1 1
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/TestCaseGenerator.java
  52. 135 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/BaseTest.java
  53. 12 17
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/Facade.java
  54. 0 142
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/base/BaseTest.java
  55. 26 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/SmokeTest.java
  56. 61 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/brokers/BrokersTest.java
  57. 48 52
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/connectors/ConnectorsTest.java
  58. 58 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/ksqlDb/KsqlDbTest.java
  59. 229 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/schemas/SchemasTest.java
  60. 292 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/MessagesTest.java
  61. 503 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/TopicsTest.java
  62. 0 23
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/SmokeTests.java
  63. 0 63
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/brokers/BrokersTests.java
  64. 0 65
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/ksqldb/KsqlTests.java
  65. 0 249
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/schemas/SchemasTests.java
  66. 0 316
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/topics/TopicMessagesTests.java
  67. 0 551
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/topics/TopicsTests.java
  68. 8 0
      kafka-ui-e2e-checks/src/test/resources/regression.xml
  69. 8 0
      kafka-ui-e2e-checks/src/test/resources/smoke.xml

+ 1 - 1
.github/workflows/e2e-checks.yaml

@@ -42,7 +42,7 @@ jobs:
       - name: e2e run
         run: |
           ./mvnw -B -ntp versions:set -DnewVersion=${{ github.event.pull_request.head.sha }}
-          ./mvnw -B -V -ntp -DQASEIO_API_TOKEN=${{ secrets.QASEIO_API_TOKEN }} -pl '!kafka-ui-api' test -Pprod
+          ./mvnw -B -V -ntp -DQASEIO_API_TOKEN=${{ secrets.QASEIO_API_TOKEN }} -pl 'kafka-ui-e2e-checks' test -Dsurefire.suiteXmlFiles='src/test/resources/smoke.xml' -Pprod
       - name: Generate allure report
         uses: simple-elf/allure-report-action@master
         if: always()

+ 42 - 13
kafka-ui-e2e-checks/README.md

@@ -1,6 +1,6 @@
 ### E2E UI automation for Kafka-ui
 
-This repository is for E2E UI automation. 
+This repository is for E2E UI automation.
 
 ### Table of Contents
 
@@ -16,28 +16,42 @@ This repository is for E2E UI automation.
 - [How to develop](#how-to-develop)
 
 ### Prerequisites
+
 - Docker & Docker-compose
 - Java (install aarch64 jdk if you have M1/arm chip)
 - Maven
-  
+
 ### How to install
+
 ```
 git clone https://github.com/provectus/kafka-ui.git
 cd  kafka-ui-e2e-checks
 docker pull selenoid/vnc:chrome_86.0  
 ```
+
 ### How to run checks
 
-1. Run `kafka-ui`: 
+1. Run `kafka-ui`:
+
 ```
 cd kafka-ui
 docker-compose -f documentation/compose/e2e-tests.yaml up -d
 ```
-2. Run tests using your QaseIO API token as environment variable (put instead %s into command below)
+
+2. Run Smoke test suite using your QaseIO API token as environment variable (put instead %s into command below)
+
+```
+./mvnw -DQASEIO_API_TOKEN='%s' -pl 'kafka-ui-e2e-checks' test -Dsurefire.suiteXmlFiles='src/test/resources/smoke.xml' -Pprod
 ```
-./mvnw -DQASEIO_API_TOKEN='%s' -pl '!kafka-ui-api' test -Pprod
+
+3. Run Regression test suite using your QaseIO API token as environment variable (put instead %s into command below)
+
 ```
-3. To run tests on your local Chrome browser just add next VM option to the Run Configuration
+./mvnw -DQASEIO_API_TOKEN='%s' -pl 'kafka-ui-e2e-checks' test -Dsurefire.suiteXmlFiles='src/test/resources/regression.xml' -Pprod
+```
+
+4. To run tests on your local Chrome browser just add next VM option to the Run Configuration
+
 ```
 -Dbrowser=local
 ```
@@ -47,25 +61,40 @@ docker-compose -f documentation/compose/e2e-tests.yaml up -d
 Reports are in `allure-results` folder.
 If you have installed allure commandline [here](https://www.npmjs.com/package/allure-commandline))
 You can see allure report with command:
+
 ```
 allure serve
 ```
+
 ### Screenshots
 
 Reference screenshots are in `SCREENSHOTS_FOLDER`  (default,`kafka-ui-e2e-checks/screenshots`)
 
 ### How to develop
-> ⚠️ todo 
+
+> ⚠️ todo
+
 ### Setting for different environments
-> ⚠️ todo 
+
+> ⚠️ todo
+
 ### Test Data
-> ⚠️ todo 
+
+> ⚠️ todo
+
 ### Actions
-> ⚠️ todo 
+
+> ⚠️ todo
+
 ### Checks
-> ⚠️ todo 
+
+> ⚠️ todo
+
 ### Parallelization
-> ⚠️ todo 
+
+> ⚠️ todo
+
 ### Tips
- - install `Selenium UI Testing plugin` in IDEA
+
+- install `Selenium UI Testing plugin` in IDEA
 

+ 50 - 93
kafka-ui-e2e-checks/pom.xml

@@ -1,42 +1,34 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>kafka-ui</artifactId>
         <groupId>com.provectus</groupId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
-    <modelVersion>4.0.0</modelVersion>
 
+    <modelVersion>4.0.0</modelVersion>
     <artifactId>kafka-ui-e2e-checks</artifactId>
+
     <properties>
+        <maven.surefire-plugin.version>3.0.0-M8</maven.surefire-plugin.version>
         <kafka-ui-contract>${project.version}</kafka-ui-contract>
-        <aspectj.version>1.9.9.1</aspectj.version>
-        <allure.version>2.18.1</allure.version>
-        <json-smart.version>2.4.8</json-smart.version>
+        <testcontainers.version>1.17.6</testcontainers.version>
+        <junit.platform.version>1.9.2</junit.platform.version>
         <selenide.version>6.6.3</selenide.version>
+        <testng.version>7.6.1</testng.version>
+        <allure.version>2.20.1</allure.version>
+        <aspectj.version>1.9.9.1</aspectj.version>
         <assertj.version>3.23.1</assertj.version>
-        <google.auto-service.version>1.0.1</google.auto-service.version>
         <hamcrest.version>2.2</hamcrest.version>
         <slf4j.version>1.7.36</slf4j.version>
-        <allure.java-commons.version>2.20.1</allure.java-commons.version>
         <dotenv.version>2.3.1</dotenv.version>
-        <allure.maven-plugin.version>2.6</allure.maven-plugin.version>
-        <ashot.version>1.5.4</ashot.version>
-        <allure.screendiff-plugin.version>2.18.1</allure.screendiff-plugin.version>
-        <maven.surefire-plugin.version>2.22.2</maven.surefire-plugin.version>
-        <allure-maven.version>2.10.0</allure-maven.version>
         <kafka.version>3.3.1</kafka.version>
         <qase.io.version>2.1.3</qase.io.version>
     </properties>
 
     <dependencies>
-        <dependency>
-            <groupId>net.minidev</groupId>
-            <artifactId>json-smart</artifactId>
-            <version>${json-smart.version}</version>
-        </dependency>
         <dependency>
             <groupId>org.apache.kafka</groupId>
             <artifactId>kafka_2.13</artifactId>
@@ -122,23 +114,43 @@
         <dependency>
             <groupId>org.testcontainers</groupId>
             <artifactId>testcontainers</artifactId>
+            <version>${testcontainers.version}</version>
         </dependency>
-
         <dependency>
-            <groupId>io.qameta.allure</groupId>
-            <artifactId>allure-junit5</artifactId>
-            <version>${allure.version}</version>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>selenium</artifactId>
+            <version>${testcontainers.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.platform</groupId>
+            <artifactId>junit-platform-launcher</artifactId>
+            <version>${junit.platform.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.platform</groupId>
+            <artifactId>junit-platform-engine</artifactId>
+            <version>${junit.platform.version}</version>
         </dependency>
         <dependency>
             <groupId>com.codeborne</groupId>
             <artifactId>selenide</artifactId>
             <version>${selenide.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <version>${testng.version}</version>
+        </dependency>
         <dependency>
             <groupId>io.qameta.allure</groupId>
             <artifactId>allure-selenide</artifactId>
             <version>${allure.version}</version>
         </dependency>
+        <dependency>
+            <groupId>io.qameta.allure</groupId>
+            <artifactId>allure-testng</artifactId>
+            <version>${allure.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.hamcrest</groupId>
             <artifactId>hamcrest</artifactId>
@@ -150,20 +162,9 @@
             <version>${assertj.version}</version>
         </dependency>
         <dependency>
-            <groupId>com.google.auto.service</groupId>
-            <artifactId>auto-service</artifactId>
-            <version>${google.auto-service.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.junit.jupiter</groupId>
-            <artifactId>junit-jupiter-api</artifactId>
-            <version>${junit.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.junit.jupiter</groupId>
-            <artifactId>junit-jupiter-engine</artifactId>
-            <version>${junit.version}</version>
-            <scope>test</scope>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjrt</artifactId>
+            <version>${aspectj.version}</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
@@ -175,61 +176,16 @@
             <artifactId>lombok</artifactId>
             <version>${org.projectlombok.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjrt</artifactId>
-            <version>${aspectj.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>junit-jupiter</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.qameta.allure</groupId>
-            <artifactId>allure-java-commons</artifactId>
-            <version>${allure.java-commons.version}</version>
-        </dependency>
         <dependency>
             <groupId>io.github.cdimascio</groupId>
             <artifactId>dotenv-java</artifactId>
             <version>${dotenv.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.junit.platform</groupId>
-            <artifactId>junit-platform-launcher</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>ru.yandex.qatools.allure</groupId>
-            <artifactId>allure-maven-plugin</artifactId>
-            <version>${allure.maven-plugin.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>ru.yandex.qatools.ashot</groupId>
-            <artifactId>ashot</artifactId>
-            <version>${ashot.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.seleniumhq.selenium</groupId>
-                    <artifactId>selenium-remote-driver</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>io.qameta.allure.plugins</groupId>
-            <artifactId>screen-diff-plugin</artifactId>
-            <version>${allure.screendiff-plugin.version}</version>
-        </dependency>
         <dependency>
             <groupId>com.provectus</groupId>
             <artifactId>kafka-ui-contract</artifactId>
             <version>${kafka-ui-contract}</version>
         </dependency>
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>selenium</artifactId>
-            <scope>test</scope>
-        </dependency>
         <dependency>
             <groupId>io.qase</groupId>
             <artifactId>qase-api</artifactId>
@@ -252,6 +208,13 @@
                         <configuration>
                             <skipTests>true</skipTests>
                         </configuration>
+                        <dependencies>
+                            <dependency>
+                                <groupId>org.apache.maven.surefire</groupId>
+                                <artifactId>surefire-testng</artifactId>
+                                <version>${maven.surefire-plugin.version}</version>
+                            </dependency>
+                        </dependencies>
                     </plugin>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
@@ -269,18 +232,16 @@
                         <artifactId>maven-surefire-plugin</artifactId>
                         <version>${maven.surefire-plugin.version}</version>
                         <configuration>
-                            <testFailureIgnore>false</testFailureIgnore>
-                            <systemProperties>
-                                <property>
-                                    <name>junit.jupiter.extensions.autodetection.enabled</name>
-                                    <value>true</value>
-                                </property>
-                            </systemProperties>
                             <argLine>
                                 -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
                             </argLine>
                         </configuration>
                         <dependencies>
+                            <dependency>
+                                <groupId>org.apache.maven.surefire</groupId>
+                                <artifactId>surefire-testng</artifactId>
+                                <version>${maven.surefire-plugin.version}</version>
+                            </dependency>
                             <dependency>
                                 <groupId>org.aspectj</groupId>
                                 <artifactId>aspectjweaver</artifactId>
@@ -291,11 +252,7 @@
                     <plugin>
                         <groupId>io.qameta.allure</groupId>
                         <artifactId>allure-maven</artifactId>
-                        <version>${allure-maven.version}</version>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-compiler-plugin</artifactId>
+                        <version>2.10.0</version>
                     </plugin>
                 </plugins>
             </build>

+ 0 - 1
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/models/Connector.java

@@ -8,5 +8,4 @@ import lombok.experimental.Accessors;
 public class Connector {
 
     private String name, config;
-
 }

+ 5 - 5
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/models/Schema.java

@@ -4,28 +4,28 @@ import com.provectus.kafka.ui.api.model.SchemaType;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
-import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
 
 @Data
 @Accessors(chain = true)
 public class Schema {
 
-    private String name,valuePath;
+    private String name, valuePath;
     private SchemaType type;
 
-    public static Schema createSchemaAvro(){
+    public static Schema createSchemaAvro() {
         return new Schema().setName("schema_avro-" + randomAlphabetic(5))
                 .setType(SchemaType.AVRO)
                 .setValuePath(System.getProperty("user.dir") + "/src/main/resources/testData/schema_avro_value.json");
     }
 
-    public static Schema createSchemaJson(){
+    public static Schema createSchemaJson() {
         return new Schema().setName("schema_json-" + randomAlphabetic(5))
                 .setType(SchemaType.JSON)
                 .setValuePath(System.getProperty("user.dir") + "/src/main/resources/testData/schema_Json_Value.json");
     }
 
-    public static Schema createSchemaProtobuf(){
+    public static Schema createSchemaProtobuf() {
         return new Schema().setName("schema_protobuf-" + randomAlphabetic(5))
                 .setType(SchemaType.PROTOBUF)
                 .setValuePath(System.getProperty("user.dir") + "/src/main/resources/testData/schema_protobuf_value.txt");

+ 5 - 4
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/models/Topic.java

@@ -1,15 +1,16 @@
 package com.provectus.kafka.ui.models;
 
-import com.provectus.kafka.ui.pages.topic.enums.CleanupPolicyValue;
-import com.provectus.kafka.ui.pages.topic.enums.CustomParameterType;
-import com.provectus.kafka.ui.pages.topic.enums.MaxSizeOnDisk;
-import com.provectus.kafka.ui.pages.topic.enums.TimeToRetain;
+import com.provectus.kafka.ui.pages.topics.enums.CleanupPolicyValue;
+import com.provectus.kafka.ui.pages.topics.enums.CustomParameterType;
+import com.provectus.kafka.ui.pages.topics.enums.MaxSizeOnDisk;
+import com.provectus.kafka.ui.pages.topics.enums.TimeToRetain;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
 @Data
 @Accessors(chain = true)
 public class Topic {
+
     private String name, timeToRetainData, maxMessageBytes, messageKey, messageContent, customParameterValue;
     private int numberOfPartitions;
     private CustomParameterType customParameterType;

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

@@ -1,103 +1,104 @@
 package com.provectus.kafka.ui.pages;
 
-import static com.codeborne.selenide.Selenide.$$x;
-import static com.codeborne.selenide.Selenide.$x;
-
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.ElementsCollection;
 import com.codeborne.selenide.SelenideElement;
 import com.provectus.kafka.ui.utilities.WebUtils;
-import java.time.Duration;
 import lombok.extern.slf4j.Slf4j;
 
+import java.time.Duration;
+
+import static com.codeborne.selenide.Selenide.$$x;
+import static com.codeborne.selenide.Selenide.$x;
+
 @Slf4j
 public abstract class BasePage extends WebUtils {
 
-  protected SelenideElement loadingSpinner = $x("//div[@role='progressbar']");
-  protected SelenideElement submitBtn = $x("//button[@type='submit']");
-  protected SelenideElement tableGrid = $x("//table");
-  protected SelenideElement dotMenuBtn = $x("//button[@aria-label='Dropdown Toggle']");
-  protected SelenideElement alertHeader = $x("//div[@role='alert']//div[@role='heading']");
-  protected SelenideElement alertMessage = $x("//div[@role='alert']//div[@role='contentinfo']");
-  protected SelenideElement confirmationMdl = $x("//div[text()= 'Confirm the action']/..");
-  protected SelenideElement confirmBtn = $x("//button[contains(text(),'Confirm')]");
-  protected SelenideElement cancelBtn = $x("//button[contains(text(),'Cancel')]");
-  protected ElementsCollection allGridItems = $$x("//tr[@class]");
-  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 void waitUntilSpinnerDisappear() {
-    log.debug("\nwaitUntilSpinnerDisappear");
-    if(isVisible(loadingSpinner)){
-      loadingSpinner.shouldBe(Condition.disappear, Duration.ofSeconds(30));
+    protected SelenideElement loadingSpinner = $x("//div[@role='progressbar']");
+    protected SelenideElement submitBtn = $x("//button[@type='submit']");
+    protected SelenideElement tableGrid = $x("//table");
+    protected SelenideElement dotMenuBtn = $x("//button[@aria-label='Dropdown Toggle']");
+    protected SelenideElement alertHeader = $x("//div[@role='alert']//div[@role='heading']");
+    protected SelenideElement alertMessage = $x("//div[@role='alert']//div[@role='contentinfo']");
+    protected SelenideElement confirmationMdl = $x("//div[text()= 'Confirm the action']/..");
+    protected SelenideElement confirmBtn = $x("//button[contains(text(),'Confirm')]");
+    protected SelenideElement cancelBtn = $x("//button[contains(text(),'Cancel')]");
+    protected ElementsCollection allGridItems = $$x("//tr[@class]");
+    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 void waitUntilSpinnerDisappear() {
+        log.debug("\nwaitUntilSpinnerDisappear");
+        if (isVisible(loadingSpinner)) {
+            loadingSpinner.shouldBe(Condition.disappear, Duration.ofSeconds(30));
+        }
+    }
+
+    protected void clickSubmitBtn() {
+        clickByJavaScript(submitBtn);
     }
-  }
-
-  protected void clickSubmitBtn() {
-    clickByJavaScript(submitBtn);
-  }
-
-  protected SelenideElement getTableElement(String elementName) {
-    log.debug("\ngetTableElement: {}", elementName);
-    return $x(String.format(tableElementNameLocator, elementName));
-  }
-
-  protected String getAlertHeader() {
-    log.debug("\ngetAlertHeader");
-    String result = alertHeader.shouldBe(Condition.visible).getText();
-    log.debug("-> {}", result);
-    return result;
-  }
-
-  protected String getAlertMessage() {
-    log.debug("\ngetAlertMessage");
-    String result = alertMessage.shouldBe(Condition.visible).getText();
-    log.debug("-> {}", result);
-    return result;
-  }
-
-  protected boolean isAlertVisible(AlertHeader header) {
-    log.debug("\nisAlertVisible: {}", header.toString());
-    boolean result = getAlertHeader().equals(header.toString());
-    log.debug("-> {}", result);
-    return result;
-  }
-
-  protected boolean isAlertVisible(AlertHeader header, String message) {
-    log.debug("\nisAlertVisible: {} {}", header, message);
-    boolean result = isAlertVisible(header) && getAlertMessage().equals(message);
-    log.debug("-> {}", result);
-    return result;
-  }
-
-  protected void clickConfirmButton() {
-    confirmBtn.shouldBe(Condition.enabled).click();
-    confirmBtn.shouldBe(Condition.disappear);
-  }
-
-  protected void clickCancelButton() {
-    cancelBtn.shouldBe(Condition.enabled).click();
-    cancelBtn.shouldBe(Condition.disappear);
-  }
-
-  protected boolean isConfirmationModalVisible() {
-    return isVisible(confirmationMdl);
-  }
-
-  public enum AlertHeader {
-    SUCCESS("Success"),
-    VALIDATION_ERROR("Validation Error"),
-    BAD_REQUEST("400 Bad Request");
-
-    private final String value;
-
-    AlertHeader(String value) {
-      this.value = value;
+
+    protected SelenideElement getTableElement(String elementName) {
+        log.debug("\ngetTableElement: {}", elementName);
+        return $x(String.format(tableElementNameLocator, elementName));
     }
 
-    public String toString() {
-      return value;
+    protected String getAlertHeader() {
+        log.debug("\ngetAlertHeader");
+        String result = alertHeader.shouldBe(Condition.visible).getText();
+        log.debug("-> {}", result);
+        return result;
+    }
+
+    protected String getAlertMessage() {
+        log.debug("\ngetAlertMessage");
+        String result = alertMessage.shouldBe(Condition.visible).getText();
+        log.debug("-> {}", result);
+        return result;
+    }
+
+    protected boolean isAlertVisible(AlertHeader header) {
+        log.debug("\nisAlertVisible: {}", header.toString());
+        boolean result = getAlertHeader().equals(header.toString());
+        log.debug("-> {}", result);
+        return result;
+    }
+
+    protected boolean isAlertVisible(AlertHeader header, String message) {
+        log.debug("\nisAlertVisible: {} {}", header, message);
+        boolean result = isAlertVisible(header) && getAlertMessage().equals(message);
+        log.debug("-> {}", result);
+        return result;
+    }
+
+    protected void clickConfirmButton() {
+        confirmBtn.shouldBe(Condition.enabled).click();
+        confirmBtn.shouldBe(Condition.disappear);
+    }
+
+    protected void clickCancelButton() {
+        cancelBtn.shouldBe(Condition.enabled).click();
+        cancelBtn.shouldBe(Condition.disappear);
+    }
+
+    protected boolean isConfirmationModalVisible() {
+        return isVisible(confirmationMdl);
+    }
+
+    public enum AlertHeader {
+        SUCCESS("Success"),
+        VALIDATION_ERROR("Validation Error"),
+        BAD_REQUEST("400 Bad Request");
+
+        private final String value;
+
+        AlertHeader(String value) {
+            this.value = value;
+        }
+
+        public String toString() {
+            return value;
+        }
     }
-  }
 }

+ 11 - 10
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/NaviSideBar.java

@@ -1,16 +1,17 @@
 package com.provectus.kafka.ui.pages;
 
-import static com.codeborne.selenide.Selenide.$x;
-import static com.provectus.kafka.ui.settings.BaseSource.CLUSTER_NAME;
-
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
 import io.qameta.allure.Step;
+
 import java.time.Duration;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.codeborne.selenide.Selenide.$x;
+import static com.provectus.kafka.ui.settings.BaseSource.CLUSTER_NAME;
+
 public class NaviSideBar extends BasePage {
 
     protected SelenideElement dashboardMenuItem = $x("//a[@title='Dashboard']");
@@ -45,6 +46,13 @@ public class NaviSideBar extends BasePage {
         return this;
     }
 
+    public List<SelenideElement> getAllMenuButtons() {
+        expandCluster(CLUSTER_NAME);
+        return Stream.of(SideMenuOption.values())
+                .map(option -> $x(String.format(sideMenuOptionElementLocator, option.value)))
+                .collect(Collectors.toList());
+    }
+
     public enum SideMenuOption {
         DASHBOARD("Dashboard"),
         BROKERS("Brokers"),
@@ -60,11 +68,4 @@ public class NaviSideBar extends BasePage {
             this.value = value;
         }
     }
-
-    public List<SelenideElement> getAllMenuButtons() {
-        expandCluster(CLUSTER_NAME);
-        return Stream.of(SideMenuOption.values())
-                .map(option -> $x(String.format(sideMenuOptionElementLocator, option.value)))
-                .collect(Collectors.toList());
-    }
 }

+ 5 - 3
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/TopPanel.java

@@ -1,12 +1,14 @@
 package com.provectus.kafka.ui.pages;
 
-import static com.codeborne.selenide.Selenide.$x;
-
 import com.codeborne.selenide.SelenideElement;
+
 import java.util.Arrays;
 import java.util.List;
 
-public class TopPanel extends BasePage{
+import static com.codeborne.selenide.Selenide.$x;
+
+public class TopPanel extends BasePage {
+
     protected SelenideElement kafkaLogo = $x("//a[contains(text(),'UI for Apache Kafka')]");
     protected SelenideElement kafkaVersion = $x("//a[@title='Current commit']");
     protected SelenideElement logOutBtn = $x("//button[contains(text(),'Log out')]");

+ 28 - 27
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/brokers/BrokersConfigTab.java

@@ -1,40 +1,41 @@
 package com.provectus.kafka.ui.pages.brokers;
 
-import static com.codeborne.selenide.Selenide.$$x;
-import static com.codeborne.selenide.Selenide.$x;
-
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
 import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
+
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.codeborne.selenide.Selenide.$$x;
+import static com.codeborne.selenide.Selenide.$x;
+
 public class BrokersConfigTab extends BasePage {
 
-  protected List<SelenideElement> editBtn = $$x("//button[@aria-label='editAction']");
-  protected SelenideElement searchByKeyField = $x("//input[@placeholder='Search by Key']");
-
-  @Step
-  public BrokersConfigTab waitUntilScreenReady(){
-    waitUntilSpinnerDisappear();
-    searchByKeyField.shouldBe(Condition.visible);
-    return this;
-  }
-
-  @Step
-  public boolean isSearchByKeyVisible() {
-   return isVisible(searchByKeyField);
-  }
-
-  public List<SelenideElement> getColumnHeaders() {
-    return Stream.of("Key", "Value", "Source")
-        .map(name -> $x(String.format(columnHeaderLocator, name)))
-        .collect(Collectors.toList());
-  }
-
-  public List<SelenideElement> getEditButtons() {
-    return editBtn;
-  }
+    protected List<SelenideElement> editBtn = $$x("//button[@aria-label='editAction']");
+    protected SelenideElement searchByKeyField = $x("//input[@placeholder='Search by Key']");
+
+    @Step
+    public BrokersConfigTab waitUntilScreenReady() {
+        waitUntilSpinnerDisappear();
+        searchByKeyField.shouldBe(Condition.visible);
+        return this;
+    }
+
+    @Step
+    public boolean isSearchByKeyVisible() {
+        return isVisible(searchByKeyField);
+    }
+
+    public List<SelenideElement> getColumnHeaders() {
+        return Stream.of("Key", "Value", "Source")
+                .map(name -> $x(String.format(columnHeaderLocator, name)))
+                .collect(Collectors.toList());
+    }
+
+    public List<SelenideElement> getEditButtons() {
+        return editBtn;
+    }
 }

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

@@ -1,91 +1,92 @@
 package com.provectus.kafka.ui.pages.brokers;
 
-import static com.codeborne.selenide.Selenide.$;
-import static com.codeborne.selenide.Selenide.$x;
-
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
 import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
+import org.openqa.selenium.By;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import org.openqa.selenium.By;
+
+import static com.codeborne.selenide.Selenide.$;
+import static com.codeborne.selenide.Selenide.$x;
 
 public class BrokersDetails extends BasePage {
 
-  protected SelenideElement logDirectoriesTab = $x("//a[text()='Log directories']");
-  protected SelenideElement metricsTab = $x("//a[text()='Metrics']");
-  protected String brokersTabLocator = "//a[text()='%s']";
-
-  @Step
-  public BrokersDetails waitUntilScreenReady() {
-    waitUntilSpinnerDisappear();
-    Arrays.asList(logDirectoriesTab, metricsTab).forEach(element -> element.shouldBe(Condition.visible));
-    return this;
-  }
-
-  @Step
-  public BrokersDetails openDetailsTab(DetailsTab menu) {
-    $(By.linkText(menu.toString())).shouldBe(Condition.enabled).click();
-    waitUntilSpinnerDisappear();
-    return this;
-  }
-
-  private List<SelenideElement> getVisibleColumnHeaders() {
-    return Stream.of("Name", "Topics", "Error", "Partitions")
-        .map(name -> $x(String.format(columnHeaderLocator, name)))
-        .collect(Collectors.toList());
-  }
-
-  private List<SelenideElement> getEnabledColumnHeaders() {
-    return Stream.of("Name", "Error")
-        .map(name -> $x(String.format(columnHeaderLocator, name)))
-        .collect(Collectors.toList());
-  }
-
-  private List<SelenideElement> getVisibleSummaryCells() {
-    return Stream.of("Segment Size", "Segment Count", "Port", "Host")
-        .map(name -> $x(String.format(summaryCellLocator, name)))
-        .collect(Collectors.toList());
-  }
-
-  private List<SelenideElement> getDetailsTabs() {
-    return Stream.of(DetailsTab.values())
-        .map(name -> $x(String.format(brokersTabLocator, name)))
-        .collect(Collectors.toList());
-  }
-
-  @Step
-  public List<SelenideElement> getAllEnabledElements() {
-    List<SelenideElement> enabledElements = new ArrayList<>(getEnabledColumnHeaders());
-    enabledElements.addAll(getDetailsTabs());
-    return enabledElements;
-  }
-
-  @Step
-  public List<SelenideElement> getAllVisibleElements() {
-    List<SelenideElement> visibleElements = new ArrayList<>(getVisibleSummaryCells());
-    visibleElements.addAll(getVisibleColumnHeaders());
-    visibleElements.addAll(getDetailsTabs());
-    return visibleElements;
-  }
-
-  public enum DetailsTab {
-    LOG_DIRECTORIES("Log directories"),
-    CONFIGS("Configs"),
-    METRICS("Metrics");
-
-    private final String value;
-
-    DetailsTab(String value) {
-      this.value = value;
+    protected SelenideElement logDirectoriesTab = $x("//a[text()='Log directories']");
+    protected SelenideElement metricsTab = $x("//a[text()='Metrics']");
+    protected String brokersTabLocator = "//a[text()='%s']";
+
+    @Step
+    public BrokersDetails waitUntilScreenReady() {
+        waitUntilSpinnerDisappear();
+        Arrays.asList(logDirectoriesTab, metricsTab).forEach(element -> element.shouldBe(Condition.visible));
+        return this;
+    }
+
+    @Step
+    public BrokersDetails openDetailsTab(DetailsTab menu) {
+        $(By.linkText(menu.toString())).shouldBe(Condition.enabled).click();
+        waitUntilSpinnerDisappear();
+        return this;
+    }
+
+    private List<SelenideElement> getVisibleColumnHeaders() {
+        return Stream.of("Name", "Topics", "Error", "Partitions")
+                .map(name -> $x(String.format(columnHeaderLocator, name)))
+                .collect(Collectors.toList());
     }
 
-    public String toString() {
-      return value;
+    private List<SelenideElement> getEnabledColumnHeaders() {
+        return Stream.of("Name", "Error")
+                .map(name -> $x(String.format(columnHeaderLocator, name)))
+                .collect(Collectors.toList());
+    }
+
+    private List<SelenideElement> getVisibleSummaryCells() {
+        return Stream.of("Segment Size", "Segment Count", "Port", "Host")
+                .map(name -> $x(String.format(summaryCellLocator, name)))
+                .collect(Collectors.toList());
+    }
+
+    private List<SelenideElement> getDetailsTabs() {
+        return Stream.of(DetailsTab.values())
+                .map(name -> $x(String.format(brokersTabLocator, name)))
+                .collect(Collectors.toList());
+    }
+
+    @Step
+    public List<SelenideElement> getAllEnabledElements() {
+        List<SelenideElement> enabledElements = new ArrayList<>(getEnabledColumnHeaders());
+        enabledElements.addAll(getDetailsTabs());
+        return enabledElements;
+    }
+
+    @Step
+    public List<SelenideElement> getAllVisibleElements() {
+        List<SelenideElement> visibleElements = new ArrayList<>(getVisibleSummaryCells());
+        visibleElements.addAll(getVisibleColumnHeaders());
+        visibleElements.addAll(getDetailsTabs());
+        return visibleElements;
+    }
+
+    public enum DetailsTab {
+        LOG_DIRECTORIES("Log directories"),
+        CONFIGS("Configs"),
+        METRICS("Metrics");
+
+        private final String value;
+
+        DetailsTab(String value) {
+            this.value = value;
+        }
+
+        public String toString() {
+            return value;
+        }
     }
-  }
 }

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

@@ -1,123 +1,124 @@
 package com.provectus.kafka.ui.pages.brokers;
 
-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 io.qameta.allure.Step;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.codeborne.selenide.Selenide.$x;
+
 public class BrokersList extends BasePage {
 
-  protected SelenideElement brokersListHeader = $x("//h1[text()='Brokers']");
-
-  @Step
-  public BrokersList waitUntilScreenReady() {
-    waitUntilSpinnerDisappear();
-    brokersListHeader.shouldBe(Condition.visible);
-    return this;
-  }
-
-  @Step
-  public BrokersList openBroker(int brokerId) {
-    getBrokerItem(brokerId).openItem();
-    return this;
-  }
-
-  private List<SelenideElement> getUptimeSummaryCells() {
-    return Stream.of("Broker Count", "Active Controller", "Version")
-        .map(name -> $x(String.format(summaryCellLocator, name)))
-        .collect(Collectors.toList());
-  }
-
-  private List<SelenideElement> getPartitionsSummaryCells() {
-    return Stream.of("Online", "URP", "In Sync Replicas", "Out Of Sync Replicas")
-        .map(name -> $x(String.format(summaryCellLocator, name)))
-        .collect(Collectors.toList());
-  }
-
-  @Step
-  public List<SelenideElement> getAllVisibleElements() {
-    List<SelenideElement> visibleElements = new ArrayList<>(getUptimeSummaryCells());
-    visibleElements.addAll(getPartitionsSummaryCells());
-    return visibleElements;
-  }
-
-  private List<SelenideElement> getEnabledColumnHeaders() {
-    return Stream.of("Broker ID", "Segment Size", "Segment Count", "Port", "Host")
-        .map(name -> $x(String.format(columnHeaderLocator, name)))
-        .collect(Collectors.toList());
-  }
-
-  @Step
-  public List<SelenideElement> getAllEnabledElements() {
-    return getEnabledColumnHeaders();
-  }
-
-  private List<BrokersList.BrokerGridItem> initGridItems() {
-    List<BrokersList.BrokerGridItem> gridItemList = new ArrayList<>();
-    allGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
-        .forEach(item -> gridItemList.add(new BrokersList.BrokerGridItem(item)));
-    return gridItemList;
-  }
-
-  @Step
-  public BrokerGridItem getBrokerItem(int id){
-    return initGridItems().stream()
-        .filter(e ->e.getId() == id)
-        .findFirst().orElse(null);
-  }
-
-  @Step
-  public List<BrokerGridItem> getAllBrokers(){
-    return initGridItems();
-  }
-
-  public static class BrokerGridItem extends BasePage {
-
-    private final SelenideElement element;
-
-    public BrokerGridItem(SelenideElement element) {
-      this.element = element;
-    }
+    protected SelenideElement brokersListHeader = $x("//h1[text()='Brokers']");
 
-    private SelenideElement getIdElm() {
-      return element.$x("./td[1]/div/a");
+    @Step
+    public BrokersList waitUntilScreenReady() {
+        waitUntilSpinnerDisappear();
+        brokersListHeader.shouldBe(Condition.visible);
+        return this;
     }
 
     @Step
-    public int getId() {
-      return Integer.parseInt(getIdElm().getText().trim());
+    public BrokersList openBroker(int brokerId) {
+        getBrokerItem(brokerId).openItem();
+        return this;
     }
 
-    @Step
-    public void openItem() {
-      getIdElm().click();
+    private List<SelenideElement> getUptimeSummaryCells() {
+        return Stream.of("Broker Count", "Active Controller", "Version")
+                .map(name -> $x(String.format(summaryCellLocator, name)))
+                .collect(Collectors.toList());
+    }
+
+    private List<SelenideElement> getPartitionsSummaryCells() {
+        return Stream.of("Online", "URP", "In Sync Replicas", "Out Of Sync Replicas")
+                .map(name -> $x(String.format(summaryCellLocator, name)))
+                .collect(Collectors.toList());
     }
 
     @Step
-    public int getSegmentSize(){
-      return Integer.parseInt(element.$x("./td[2]").getText().trim());
+    public List<SelenideElement> getAllVisibleElements() {
+        List<SelenideElement> visibleElements = new ArrayList<>(getUptimeSummaryCells());
+        visibleElements.addAll(getPartitionsSummaryCells());
+        return visibleElements;
+    }
+
+    private List<SelenideElement> getEnabledColumnHeaders() {
+        return Stream.of("Broker ID", "Segment Size", "Segment Count", "Port", "Host")
+                .map(name -> $x(String.format(columnHeaderLocator, name)))
+                .collect(Collectors.toList());
     }
 
     @Step
-    public int getSegmentCount(){
-      return Integer.parseInt(element.$x("./td[3]").getText().trim());
+    public List<SelenideElement> getAllEnabledElements() {
+        return getEnabledColumnHeaders();
+    }
+
+    private List<BrokersList.BrokerGridItem> initGridItems() {
+        List<BrokersList.BrokerGridItem> gridItemList = new ArrayList<>();
+        allGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
+                .forEach(item -> gridItemList.add(new BrokersList.BrokerGridItem(item)));
+        return gridItemList;
     }
 
     @Step
-    public int getPort(){
-      return Integer.parseInt(element.$x("./td[4]").getText().trim());
+    public BrokerGridItem getBrokerItem(int id) {
+        return initGridItems().stream()
+                .filter(e -> e.getId() == id)
+                .findFirst().orElseThrow();
     }
 
     @Step
-    public String getHost(){
-      return element.$x("./td[5]").getText().trim();
+    public List<BrokerGridItem> getAllBrokers() {
+        return initGridItems();
+    }
+
+    public static class BrokerGridItem extends BasePage {
+
+        private final SelenideElement element;
+
+        public BrokerGridItem(SelenideElement element) {
+            this.element = element;
+        }
+
+        private SelenideElement getIdElm() {
+            return element.$x("./td[1]/div/a");
+        }
+
+        @Step
+        public int getId() {
+            return Integer.parseInt(getIdElm().getText().trim());
+        }
+
+        @Step
+        public void openItem() {
+            getIdElm().click();
+        }
+
+        @Step
+        public int getSegmentSize() {
+            return Integer.parseInt(element.$x("./td[2]").getText().trim());
+        }
+
+        @Step
+        public int getSegmentCount() {
+            return Integer.parseInt(element.$x("./td[3]").getText().trim());
+        }
+
+        @Step
+        public int getPort() {
+            return Integer.parseInt(element.$x("./td[4]").getText().trim());
+        }
+
+        @Step
+        public String getHost() {
+            return element.$x("./td[5]").getText().trim();
+        }
     }
-  }
 }

+ 6 - 6
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connector/ConnectorCreateForm.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connectors/ConnectorCreateForm.java

@@ -1,12 +1,12 @@
-package com.provectus.kafka.ui.pages.connector;
-
-import static com.codeborne.selenide.Selenide.$x;
+package com.provectus.kafka.ui.pages.connectors;
 
 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;
+
 public class ConnectorCreateForm extends BasePage {
 
     protected SelenideElement nameField = $x("//input[@name='name']");
@@ -31,8 +31,8 @@ public class ConnectorCreateForm extends BasePage {
 
     @Step
     public ConnectorCreateForm clickSubmitButton() {
-      clickSubmitBtn();
-      waitUntilSpinnerDisappear();
-      return this;
+        clickSubmitBtn();
+        waitUntilSpinnerDisappear();
+        return this;
     }
 }

+ 21 - 21
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connector/ConnectorDetails.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connectors/ConnectorDetails.java

@@ -1,28 +1,28 @@
-package com.provectus.kafka.ui.pages.connector;
-
-import static com.codeborne.selenide.Selenide.$x;
+package com.provectus.kafka.ui.pages.connectors;
 
 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;
+
 public class ConnectorDetails extends BasePage {
 
-  protected SelenideElement deleteBtn = $x("//li/div[contains(text(),'Delete')]");
-  protected SelenideElement confirmBtnMdl = $x("//div[@role='dialog']//button[contains(text(),'Confirm')]");
-  protected SelenideElement contentTextArea = $x("//textarea[@class='ace_text-input']");
-  protected SelenideElement taskTab = $x("//a[contains(text(),'Tasks')]");
-  protected SelenideElement configTab = $x("//a[contains(text(),'Config')]");
-  protected SelenideElement configField = $x("//div[@id='config']");
-  protected String connectorHeaderLocator = "//h1[contains(text(),'%s')]";
+    protected SelenideElement deleteBtn = $x("//li/div[contains(text(),'Delete')]");
+    protected SelenideElement confirmBtnMdl = $x("//div[@role='dialog']//button[contains(text(),'Confirm')]");
+    protected SelenideElement contentTextArea = $x("//textarea[@class='ace_text-input']");
+    protected SelenideElement taskTab = $x("//a[contains(text(),'Tasks')]");
+    protected SelenideElement configTab = $x("//a[contains(text(),'Config')]");
+    protected SelenideElement configField = $x("//div[@id='config']");
+    protected String connectorHeaderLocator = "//h1[contains(text(),'%s')]";
 
-  @Step
-  public ConnectorDetails waitUntilScreenReady() {
-    waitUntilSpinnerDisappear();
-    dotMenuBtn.shouldBe(Condition.visible);
-    return this;
-  }
+    @Step
+    public ConnectorDetails waitUntilScreenReady() {
+        waitUntilSpinnerDisappear();
+        dotMenuBtn.shouldBe(Condition.visible);
+        return this;
+    }
 
     @Step
     public ConnectorDetails openConfigTab() {
@@ -41,8 +41,8 @@ public class ConnectorDetails extends BasePage {
 
     @Step
     public ConnectorDetails clickSubmitButton() {
-      clickSubmitBtn();
-      return this;
+        clickSubmitBtn();
+        return this;
     }
 
     @Step
@@ -74,11 +74,11 @@ public class ConnectorDetails extends BasePage {
 
     @Step
     public boolean isConnectorHeaderVisible(String connectorName) {
-        return isVisible($x(String.format(connectorHeaderLocator,connectorName)));
+        return isVisible($x(String.format(connectorHeaderLocator, connectorName)));
     }
 
     @Step
-    public boolean isAlertWithMessageVisible(AlertHeader header, String message){
-      return isAlertVisible(header, message);
+    public boolean isAlertWithMessageVisible(AlertHeader header, String message) {
+        return isAlertVisible(header, message);
     }
 }

+ 8 - 8
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connector/KafkaConnectList.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/connectors/KafkaConnectList.java

@@ -1,26 +1,26 @@
-package com.provectus.kafka.ui.pages.connector;
-
-import static com.codeborne.selenide.Selenide.$x;
+package com.provectus.kafka.ui.pages.connectors;
 
 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;
+
 
 public class KafkaConnectList extends BasePage {
 
     protected SelenideElement createConnectorBtn = $x("//button[contains(text(),'Create Connector')]");
 
-    public KafkaConnectList(){
+    public KafkaConnectList() {
         tableElementNameLocator = "//tbody//td[contains(text(),'%s')]";
     }
 
     @Step
     public KafkaConnectList waitUntilScreenReady() {
-      waitUntilSpinnerDisappear();
-      createConnectorBtn.shouldBe(Condition.visible);
-      return this;
+        waitUntilSpinnerDisappear();
+        createConnectorBtn.shouldBe(Condition.visible);
+        return this;
     }
 
     @Step
@@ -31,7 +31,7 @@ public class KafkaConnectList extends BasePage {
 
     @Step
     public KafkaConnectList openConnector(String connectorName) {
-      getTableElement(connectorName).shouldBe(Condition.enabled).click();
+        getTableElement(connectorName).shouldBe(Condition.enabled).click();
         return this;
     }
 

+ 3 - 3
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/consumer/ConsumersDetails.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/consumers/ConsumersDetails.java

@@ -1,11 +1,11 @@
-package com.provectus.kafka.ui.pages.consumer;
-
-import static com.codeborne.selenide.Selenide.$x;
+package com.provectus.kafka.ui.pages.consumers;
 
 import com.codeborne.selenide.Condition;
 import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
 
+import static com.codeborne.selenide.Selenide.$x;
+
 public class ConsumersDetails extends BasePage {
 
     protected String consumerIdHeaderLocator = "//h1[contains(text(),'%s')]";

+ 4 - 3
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/consumer/ConsumersList.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/consumers/ConsumersList.java

@@ -1,9 +1,10 @@
-package com.provectus.kafka.ui.pages.consumer;
-
-import static com.codeborne.selenide.Selenide.$x;
+package com.provectus.kafka.ui.pages.consumers;
 
 import com.codeborne.selenide.SelenideElement;
 import com.provectus.kafka.ui.pages.BasePage;
+
+import static com.codeborne.selenide.Selenide.$x;
+
 public class ConsumersList extends BasePage {
 
     protected SelenideElement consumerListHeader = $x("//h1[text()='Consumers']");

+ 4 - 4
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqldb/KsqlDbList.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/KsqlDbList.java

@@ -1,4 +1,4 @@
-package com.provectus.kafka.ui.pages.ksqldb;
+package com.provectus.kafka.ui.pages.ksqlDb;
 
 import static com.codeborne.selenide.Selenide.$;
 import static com.codeborne.selenide.Selenide.$x;
@@ -7,7 +7,7 @@ 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 com.provectus.kafka.ui.pages.ksqlDb.enums.KsqlMenuTabs;
 import io.qameta.allure.Step;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -50,7 +50,7 @@ public class KsqlDbList extends BasePage {
   public KsqlDbList.KsqlTablesGridItem getTableByName(String tableName) {
     return initTablesItems().stream()
         .filter(e -> e.getTableName().equals(tableName))
-        .findFirst().orElse(null);
+        .findFirst().orElseThrow();
   }
 
   public static class KsqlTablesGridItem extends BasePage {
@@ -98,7 +98,7 @@ public class KsqlDbList extends BasePage {
   public KsqlDbList.KsqlStreamsGridItem getStreamByName(String streamName) {
     return initStreamsItems().stream()
         .filter(e -> e.getStreamName().equals(streamName))
-        .findFirst().orElse(null);
+        .findFirst().orElseThrow();
   }
 
   public static class KsqlStreamsGridItem extends BasePage {

+ 3 - 3
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqldb/KsqlQueryForm.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/KsqlQueryForm.java

@@ -1,4 +1,4 @@
-package com.provectus.kafka.ui.pages.ksqldb;
+package com.provectus.kafka.ui.pages.ksqlDb;
 
 import static com.codeborne.selenide.Condition.visible;
 import static com.codeborne.selenide.Selenide.$$x;
@@ -24,7 +24,7 @@ public class KsqlQueryForm extends BasePage {
   protected SelenideElement queryAreaValue = $x("//div[@class='ace_content']");
   protected SelenideElement queryArea = $x("//div[@id='ksql']/textarea[@class='ace_text-input']");
   protected ElementsCollection ksqlGridItems = $$x("//tbody//tr");
-  protected ElementsCollection keyField = $$x("//input[@aria-label='value']");
+  protected ElementsCollection keyField = $$x("//input[@aria-label='key']");
   protected ElementsCollection valueField = $$x("//input[@aria-label='value']");
 
   @Step
@@ -89,7 +89,7 @@ public class KsqlQueryForm extends BasePage {
   public KsqlQueryForm.KsqlResponseGridItem getTableByName(String name) {
     return initItems().stream()
         .filter(e -> e.getName().equalsIgnoreCase(name))
-        .findFirst().orElse(null);
+        .findFirst().orElseThrow();
   }
 
   public static class KsqlResponseGridItem extends BasePage {

+ 4 - 3
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqldb/enums/KsqlMenuTabs.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/enums/KsqlMenuTabs.java

@@ -1,16 +1,17 @@
-package com.provectus.kafka.ui.pages.ksqldb.enums;
+package com.provectus.kafka.ui.pages.ksqlDb.enums;
 
 public enum KsqlMenuTabs {
+
     TABLES("Table"),
     STREAMS("Streams");
 
     private final String value;
 
     KsqlMenuTabs(String value) {
-      this.value = value;
+        this.value = value;
     }
 
     public String toString() {
-      return value;
+        return value;
     }
 }

+ 6 - 5
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqldb/enums/KsqlQueryConfig.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/enums/KsqlQueryConfig.java

@@ -1,18 +1,19 @@
-package com.provectus.kafka.ui.pages.ksqldb.enums;
+package com.provectus.kafka.ui.pages.ksqlDb.enums;
 
 public enum KsqlQueryConfig {
+
     SHOW_TABLES("show tables;"),
     SHOW_STREAMS("show streams;"),
     SELECT_ALL_FROM("SELECT * FROM %s\n" +
-        "EMIT CHANGES;");
+            "EMIT CHANGES;");
 
     private final String query;
 
     KsqlQueryConfig(String query) {
-      this.query = query;
+        this.query = query;
     }
 
-    public String getQuery(){
-      return query;
+    public String getQuery() {
+        return query;
     }
 }

+ 3 - 2
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqldb/models/Stream.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/models/Stream.java

@@ -1,4 +1,4 @@
-package com.provectus.kafka.ui.pages.ksqldb.models;
+package com.provectus.kafka.ui.pages.ksqlDb.models;
 
 import lombok.Data;
 import lombok.experimental.Accessors;
@@ -6,5 +6,6 @@ import lombok.experimental.Accessors;
 @Data
 @Accessors(chain = true)
 public class Stream {
-  private String name, topicName, valueFormat, partitions;
+
+    private String name, topicName, valueFormat, partitions;
 }

+ 3 - 2
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqldb/models/Table.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/ksqlDb/models/Table.java

@@ -1,4 +1,4 @@
-package com.provectus.kafka.ui.pages.ksqldb.models;
+package com.provectus.kafka.ui.pages.ksqlDb.models;
 
 import lombok.Data;
 import lombok.experimental.Accessors;
@@ -6,5 +6,6 @@ import lombok.experimental.Accessors;
 @Data
 @Accessors(chain = true)
 public class Table {
-  private String name, streamName;
+
+    private String name, streamName;
 }

+ 22 - 24
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schema/SchemaCreateForm.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schemas/SchemaCreateForm.java

@@ -1,8 +1,4 @@
-package com.provectus.kafka.ui.pages.schema;
-
-import static com.codeborne.selenide.Selenide.$;
-import static com.codeborne.selenide.Selenide.$$x;
-import static com.codeborne.selenide.Selenide.$x;
+package com.provectus.kafka.ui.pages.schemas;
 
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
@@ -10,10 +6,13 @@ import com.provectus.kafka.ui.api.model.CompatibilityLevel;
 import com.provectus.kafka.ui.api.model.SchemaType;
 import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
+
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.codeborne.selenide.Selenide.*;
+
 public class SchemaCreateForm extends BasePage {
 
     protected SelenideElement schemaNameField = $x("//input[@name='subject']");
@@ -30,7 +29,7 @@ public class SchemaCreateForm extends BasePage {
     protected String ddlElementLocator = "//li[@value='%s']";
 
     @Step
-    public SchemaCreateForm waitUntilScreenReady(){
+    public SchemaCreateForm waitUntilScreenReady() {
         waitUntilSpinnerDisappear();
         pageTitle.shouldBe(Condition.visible);
         return this;
@@ -69,25 +68,25 @@ public class SchemaCreateForm extends BasePage {
     }
 
     @Step
-    public SchemaCreateForm openSchemaVersionDdl(){
-      schemaVersionDdl.shouldBe(Condition.enabled).click();
-      return this;
+    public SchemaCreateForm openSchemaVersionDdl() {
+        schemaVersionDdl.shouldBe(Condition.enabled).click();
+        return this;
     }
 
     @Step
-    public int getVersionsNumberFromList(){
-      return elementsCompareVersionDdl.size();
+    public int getVersionsNumberFromList() {
+        return elementsCompareVersionDdl.size();
     }
 
     @Step
-    public SchemaCreateForm selectVersionFromDropDown(int versionNumberDd){
-      $x(String.format(ddlElementLocator,versionNumberDd)).shouldBe(Condition.visible).click();
-      return this;
+    public SchemaCreateForm selectVersionFromDropDown(int versionNumberDd) {
+        $x(String.format(ddlElementLocator, versionNumberDd)).shouldBe(Condition.visible).click();
+        return this;
     }
 
     @Step
-    public int getMarkedLinesNumber(){
-      return visibleMarkers.size();
+    public int getMarkedLinesNumber() {
+        return visibleMarkers.size();
     }
 
     @Step
@@ -100,23 +99,22 @@ public class SchemaCreateForm extends BasePage {
 
     @Step
     public List<SelenideElement> getAllDetailsPageElements() {
-      return Stream.of(compatibilityLevelList, newSchemaTextArea, latestSchemaTextArea, submitBtn, schemaTypeDdl)
-          .collect(Collectors.toList());
+        return Stream.of(compatibilityLevelList, newSchemaTextArea, latestSchemaTextArea, submitBtn, schemaTypeDdl)
+                .collect(Collectors.toList());
     }
 
     @Step
-    public boolean isSubmitBtnEnabled(){
-      return isEnabled(submitBtn);
+    public boolean isSubmitBtnEnabled() {
+        return isEnabled(submitBtn);
     }
 
     @Step
-    public boolean isSchemaDropDownEnabled(){
+    public boolean isSchemaDropDownEnabled() {
         boolean enabled = true;
-        try{
+        try {
             String attribute = schemaTypeDdl.getAttribute("disabled");
             enabled = false;
-        }
-        catch (Throwable ignored){
+        } catch (Throwable ignored) {
         }
         return enabled;
     }

+ 10 - 10
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schema/SchemaDetails.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schemas/SchemaDetails.java

@@ -1,12 +1,12 @@
-package com.provectus.kafka.ui.pages.schema;
-
-import static com.codeborne.selenide.Selenide.$x;
+package com.provectus.kafka.ui.pages.schemas;
 
 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;
+
 public class SchemaDetails extends BasePage {
 
     protected SelenideElement actualVersionTextArea = $x("//div[@id='schema']");
@@ -33,12 +33,12 @@ public class SchemaDetails extends BasePage {
 
     @Step
     public boolean isSchemaHeaderVisible(String schemaName) {
-        return isVisible($x(String.format(schemaHeaderLocator,schemaName)));
+        return isVisible($x(String.format(schemaHeaderLocator, schemaName)));
     }
 
     @Step
-    public int getLatestVersion(){
-      return Integer.parseInt(latestVersionField.getText());
+    public int getLatestVersion() {
+        return Integer.parseInt(latestVersionField.getText());
     }
 
     @Step
@@ -47,15 +47,15 @@ public class SchemaDetails extends BasePage {
     }
 
     @Step
-    public SchemaDetails openEditSchema(){
+    public SchemaDetails openEditSchema() {
         editSchemaBtn.shouldBe(Condition.visible).click();
         return this;
     }
 
     @Step
-    public SchemaDetails openCompareVersionMenu(){
-      compareVersionBtn.shouldBe(Condition.enabled).click();
-      return this;
+    public SchemaDetails openCompareVersionMenu() {
+        compareVersionBtn.shouldBe(Condition.enabled).click();
+        return this;
     }
 
     @Step

+ 4 - 4
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schema/SchemaRegistryList.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/schemas/SchemaRegistryList.java

@@ -1,18 +1,18 @@
-package com.provectus.kafka.ui.pages.schema;
-
-import static com.codeborne.selenide.Selenide.$x;
+package com.provectus.kafka.ui.pages.schemas;
 
 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;
+
 public class SchemaRegistryList extends BasePage {
 
     protected SelenideElement createSchemaBtn = $x("//button[contains(text(),'Create Schema')]");
 
     @Step
-    public SchemaRegistryList waitUntilScreenReady(){
+    public SchemaRegistryList waitUntilScreenReady() {
         waitUntilSpinnerDisappear();
         createSchemaBtn.shouldBe(Condition.visible);
         return this;

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

@@ -1,289 +0,0 @@
-package com.provectus.kafka.ui.pages.topic;
-
-import static com.codeborne.selenide.Selenide.$;
-import static com.codeborne.selenide.Selenide.$$;
-import static com.codeborne.selenide.Selenide.$x;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import com.codeborne.selenide.ClickOptions;
-import com.codeborne.selenide.Condition;
-import com.codeborne.selenide.ElementsCollection;
-import com.codeborne.selenide.SelenideElement;
-import com.provectus.kafka.ui.pages.BasePage;
-import com.provectus.kafka.ui.pages.topic.enums.CleanupPolicyValue;
-import com.provectus.kafka.ui.pages.topic.enums.CustomParameterType;
-import com.provectus.kafka.ui.pages.topic.enums.MaxSizeOnDisk;
-import com.provectus.kafka.ui.pages.topic.enums.TimeToRetain;
-import io.qameta.allure.Step;
-
-public class TopicCreateEditForm extends BasePage {
-
-  protected SelenideElement timeToRetainField = $x("//input[@id='timeToRetain']");
-  protected SelenideElement partitionsField = $x("//input[@name='partitions']");
-  protected SelenideElement nameField = $x("//input[@name='name']");
-  protected SelenideElement maxMessageBytesField = $x("//input[@name='maxMessageBytes']");
-  protected SelenideElement minInSyncReplicasField = $x("//input[@name='minInSyncReplicas']");
-  protected SelenideElement cleanUpPolicyDdl = $x("//ul[@id='topicFormCleanupPolicy']");
-  protected SelenideElement maxSizeOnDiscDdl = $x("//ul[@id='topicFormRetentionBytes']");
-  protected SelenideElement customParameterDdl = $x("//ul[contains(@name,'customParams')]");
-  protected SelenideElement deleteCustomParameterBtn = $x("//span[contains(@title,'Delete customParam')]");
-  protected SelenideElement addCustomParameterTypeBtn = $x("//button[contains(text(),'Add Custom Parameter')]");
-  protected SelenideElement customParameterValueField = $x("//input[@placeholder='Value']");
-  protected SelenideElement validationCustomParameterValueMsg = $x("//p[contains(text(),'Value is required')]");
-  protected String ddlElementLocator = "//li[@value='%s']";
-  protected String btnTimeToRetainLocator = "//button[@class][text()='%s']";
-
-
-  @Step
-  public TopicCreateEditForm waitUntilScreenReady() {
-    waitUntilSpinnerDisappear();
-    nameField.shouldBe(Condition.visible);
-    return this;
-  }
-
-  public boolean isCreateTopicButtonEnabled() {
-    return isEnabled(submitBtn);
-  }
-
-  public boolean isDeleteCustomParameterButtonEnabled() {
-    return isEnabled(deleteCustomParameterBtn);
-  }
-
-  public boolean isNameFieldEnabled(){
-    return isEnabled(nameField);
-  }
-
-  @Step
-  public TopicCreateEditForm setTopicName(String topicName) {
-    nameField.shouldBe(Condition.enabled).clear();
-    if (topicName != null) {
-      nameField.sendKeys(topicName);
-    }
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm setMinInsyncReplicas(Integer minInsyncReplicas) {
-    minInSyncReplicasField.setValue(minInsyncReplicas.toString());
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm setTimeToRetainDataInMs(Long ms) {
-    timeToRetainField.setValue(ms.toString());
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm setTimeToRetainDataInMs(String ms) {
-    timeToRetainField.setValue(ms);
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm setMaxSizeOnDiskInGB(MaxSizeOnDisk MaxSizeOnDisk) {
-    maxSizeOnDiscDdl.shouldBe(Condition.visible).click();
-    $x(String.format(ddlElementLocator, MaxSizeOnDisk.getOptionValue())).shouldBe(Condition.visible).click();
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm clickAddCustomParameterTypeButton() {
-    addCustomParameterTypeBtn.click();
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm setCustomParameterType(CustomParameterType customParameterType) {
-    customParameterDdl.shouldBe(Condition.visible).click();
-    $x(String.format(ddlElementLocator, customParameterType.getOptionValue())).shouldBe(Condition.visible).click();
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm clearCustomParameterValue() {
-    clearByKeyboard(customParameterValueField);
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm setMaxMessageBytes(Long bytes) {
-    maxMessageBytesField.setValue(bytes.toString());
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm setMaxMessageBytes(String bytes) {
-    return setMaxMessageBytes(Long.parseLong(bytes));
-  }
-
-  @Step
-  public TopicCreateEditForm setNumberOfPartitions(int partitions) {
-    partitionsField.shouldBe(Condition.enabled).clear();
-    partitionsField.sendKeys(String.valueOf(partitions));
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm setTimeToRetainDataByButtons(TimeToRetain timeToRetain) {
-    $x(String.format(btnTimeToRetainLocator, timeToRetain.getButton())).shouldBe(Condition.enabled).click();
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm selectCleanupPolicy(CleanupPolicyValue cleanupPolicyOptionValue) {
-    cleanUpPolicyDdl.shouldBe(Condition.visible).click();
-    $x(String.format(ddlElementLocator, cleanupPolicyOptionValue.getOptionValue())).shouldBe(Condition.visible).click();
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm selectRetentionBytes(String visibleValue) {
-    return selectFromDropDownByVisibleText("retentionBytes", visibleValue);
-  }
-
-  @Step
-  public TopicCreateEditForm selectRetentionBytes(Long optionValue) {
-    return selectFromDropDownByOptionValue("retentionBytes", optionValue.toString());
-  }
-
-  @Step
-  public TopicCreateEditForm clickCreateTopicBtn() {
-    clickSubmitBtn();
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm addCustomParameter(String customParameterName,
-                                                String customParameterValue) {
-    ElementsCollection customParametersElements =
-        $$("ul[role=listbox][name^=customParams][name$=name]");
-    KafkaUISelectElement kafkaUISelectElement = null;
-    if (customParametersElements.size() == 1) {
-      if ("Select".equals(customParametersElements.first().getText())) {
-        kafkaUISelectElement = new KafkaUISelectElement(customParametersElements.first());
-      }
-    } else {
-      $$("button")
-          .find(Condition.exactText("Add Custom Parameter"))
-          .click();
-      customParametersElements = $$("ul[role=listbox][name^=customParams][name$=name]");
-      kafkaUISelectElement = new KafkaUISelectElement(customParametersElements.last());
-    }
-    if (kafkaUISelectElement != null) {
-      kafkaUISelectElement.selectByVisibleText(customParameterName);
-    }
-    $(String.format("input[name=\"customParams.%d.value\"]", customParametersElements.size() - 1))
-        .setValue(customParameterValue);
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm updateCustomParameter(String customParameterName,
-                                                   String customParameterValue) {
-    SelenideElement selenideElement = $$("ul[role=listbox][name^=customParams][name$=name]")
-        .find(Condition.exactText(customParameterName));
-    String name = selenideElement.getAttribute("name");
-    if (name != null) {
-      name = name.substring(0, name.lastIndexOf("."));
-    }
-    $(String.format("input[name^=%s]", name)).setValue(customParameterValue);
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm cleanupPolicyIs(String value) {
-    String cleanupPolicy = new KafkaUISelectElement("cleanupPolicy")
-        .getCurrentValue();
-    assertThat(cleanupPolicy)
-        .as("Clear policy value should be " + value)
-        .isEqualToIgnoringCase(value);
-    return this;
-  }
-
-  @Step
-  public TopicCreateEditForm timeToRetainIs(String time) {
-    String value = timeToRetainField.getValue();
-    assertThat(value)
-        .as("Time to retain data (in ms) should be " + time)
-        .isEqualTo(time);
-    return this;
-  }
-
-  @Step
-  public String getCleanupPolicy() {
-    return new KafkaUISelectElement("cleanupPolicy").getCurrentValue();
-  }
-
-  @Step
-  public String getTimeToRetain() {
-    return timeToRetainField.getValue();
-  }
-
-  @Step
-  public String getMaxSizeOnDisk() {
-    return new KafkaUISelectElement("retentionBytes").getCurrentValue();
-  }
-
-  @Step
-  public String getMaxMessageBytes() {
-    return maxMessageBytesField.getValue();
-  }
-
-  @Step
-  public boolean isValidationMessageCustomParameterValueVisible() {
-    return isVisible(validationCustomParameterValueMsg);
-  }
-
-  @Step
-  public String getCustomParameterValue() {
-    return customParameterValueField.getValue();
-  }
-
-  private static class KafkaUISelectElement {
-
-    private final SelenideElement selectElement;
-
-    public KafkaUISelectElement(String selectElementName) {
-      this.selectElement = $("ul[role=listbox][name=" + selectElementName + "]");
-    }
-
-    public KafkaUISelectElement(SelenideElement selectElement) {
-      this.selectElement = selectElement;
-    }
-
-    public void selectByOptionValue(String optionValue) {
-      selectElement.click();
-      selectElement
-          .$$x(".//ul/li[@role='option']")
-          .find(Condition.attribute("value", optionValue))
-          .click(ClickOptions.usingJavaScript());
-    }
-
-    public void selectByVisibleText(String visibleText) {
-      selectElement.click();
-      selectElement
-          .$$("ul>li[role=option]")
-          .find(Condition.exactText(visibleText))
-          .click();
-    }
-
-    public String getCurrentValue() {
-      return selectElement.$("li").getText();
-    }
-  }
-
-  private TopicCreateEditForm selectFromDropDownByOptionValue(String dropDownElementName,
-                                                              String optionValue) {
-    KafkaUISelectElement select = new KafkaUISelectElement(dropDownElementName);
-    select.selectByOptionValue(optionValue);
-    return this;
-  }
-
-  private TopicCreateEditForm selectFromDropDownByVisibleText(String dropDownElementName,
-                                                              String visibleText) {
-    KafkaUISelectElement select = new KafkaUISelectElement(dropDownElementName);
-    select.selectByVisibleText(visibleText);
-    return this;
-  }
-}

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

@@ -1,452 +0,0 @@
-package com.provectus.kafka.ui.pages.topic;
-
-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.sleep;
-import static org.apache.commons.lang.math.RandomUtils.nextInt;
-
-import com.codeborne.selenide.CollectionCondition;
-import com.codeborne.selenide.Condition;
-import com.codeborne.selenide.ElementsCollection;
-import com.codeborne.selenide.SelenideElement;
-import com.provectus.kafka.ui.pages.BasePage;
-import io.qameta.allure.Step;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.YearMonth;
-import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeFormatterBuilder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-import java.util.Objects;
-import org.openqa.selenium.By;
-
-public class TopicDetails extends BasePage {
-
-  protected SelenideElement clearMessagesBtn = $x(("//div[contains(text(), 'Clear messages')]"));
-  protected SelenideElement recreateTopicBtn = $x("//div[text()='Recreate Topic']");
-  protected SelenideElement messageAmountCell = $x("//tbody/tr/td[5]");
-  protected SelenideElement overviewTab = $x("//a[contains(text(),'Overview')]");
-  protected SelenideElement messagesTab = $x("//a[contains(text(),'Messages')]");
-  protected SelenideElement seekTypeDdl = $x("//ul[@id='selectSeekType']/li");
-  protected SelenideElement seekTypeField = $x("//label[text()='Seek Type']//..//div/input");
-  protected SelenideElement addFiltersBtn = $x("//button[text()='Add Filters']");
-  protected SelenideElement savedFiltersLink = $x("//div[text()='Saved Filters']");
-  protected SelenideElement addFilterCodeModalTitle = $x("//label[text()='Filter code']");
-  protected SelenideElement addFilterCodeInput = $x("//div[@id='ace-editor']//textarea");
-  protected SelenideElement saveThisFilterCheckBoxAddFilterMdl = $x("//input[@name='saveFilter']");
-  protected SelenideElement displayNameInputAddFilterMdl = $x("//input[@placeholder='Enter Name']");
-  protected SelenideElement cancelBtnAddFilterMdl = $x("//button[text()='Cancel']");
-  protected SelenideElement addFilterBtnAddFilterMdl = $x("//button[text()='Add filter']");
-  protected SelenideElement addFiltersBtnMessages = $x("//button[text()='Add Filters']");
-  protected SelenideElement selectFilterBtnAddFilterMdl = $x("//button[text()='Select filter']");
-  protected SelenideElement editSettingsMenu = $x("//li[@role][contains(text(),'Edit settings')]");
-  protected SelenideElement removeTopicBtn = $x("//ul[@role='menu']//div[contains(text(),'Remove Topic')]");
-  protected SelenideElement produceMessageBtn = $x("//div//button[text()='Produce Message']");
-  protected SelenideElement contentMessageTab = $x("//html//div[@id='root']/div/main//table//p");
-  protected SelenideElement cleanUpPolicyField = $x("//div[contains(text(),'Clean Up Policy')]/../span/*");
-  protected SelenideElement partitionsField = $x("//div[contains(text(),'Partitions')]/../span");
-  protected SelenideElement backToCreateFiltersLink = $x("//div[text()='Back To create filters']");
-  protected ElementsCollection messageGridItems = $$x("//tbody//tr");
-  protected SelenideElement actualCalendarDate = $x("//div[@class='react-datepicker__current-month']");
-  protected SelenideElement previousMonthButton = $x("//button[@aria-label='Previous Month']");
-  protected SelenideElement nextMonthButton = $x("//button[@aria-label='Next Month']");
-  protected SelenideElement calendarTimeFld = $x("//input[@placeholder='Time']");
-  protected String dayCellLtr = "//div[@role='option'][contains(text(),'%d')]";
-  protected String seekFilterDdlLocator = "//ul[@id='selectSeekType']/ul/li[text()='%s']";
-  protected String savedFilterNameLocator = "//div[@role='savedFilter']/div[contains(text(),'%s')]";
-  protected String consumerIdLocator = "//a[@title='%s']";
-  protected String topicHeaderLocator = "//h1[contains(text(),'%s')]";
-  protected String activeFilterNameLocator = "//div[@data-testid='activeSmartFilter'][contains(text(),'%s')]";
-  protected String settingsGridValueLocator = "//tbody/tr/td/span[text()='%s']//ancestor::tr/td[2]/span";
-
-  @Step
-  public TopicDetails waitUntilScreenReady() {
-    waitUntilSpinnerDisappear();
-    overviewTab.shouldBe(Condition.visible);
-    return this;
-  }
-
-  @Step
-  public TopicDetails openDetailsTab(TopicMenu menu) {
-    $(By.linkText(menu.toString())).shouldBe(Condition.visible).click();
-    waitUntilSpinnerDisappear();
-    return this;
-  }
-
-  @Step
-  public String getSettingsGridValueByKey(String key){
-    return $x(String.format(settingsGridValueLocator, key)).scrollTo().shouldBe(Condition.visible).getText();
-  }
-
-  @Step
-  public TopicDetails openDotMenu() {
-    clickByJavaScript(dotMenuBtn);
-    return this;
-  }
-
-  @Step
-  public boolean isAlertWithMessageVisible(AlertHeader header, String message){
-    return isAlertVisible(header, message);
-  }
-
-  @Step
-  public TopicDetails clickEditSettingsMenu() {
-    editSettingsMenu.shouldBe(Condition.visible).click();
-    return this;
-  }
-
-  @Step
-  public boolean isConfirmationMdlVisible(){
-    return isConfirmationModalVisible();
-  }
-
-  @Step
-  public TopicDetails clickClearMessagesMenu() {
-    clearMessagesBtn.shouldBe(Condition.visible).click();
-    return this;
-  }
-
-  @Step
-  public TopicDetails clickRecreateTopicMenu(){
-    recreateTopicBtn.shouldBe(Condition.visible).click();
-    return this;
-  }
-
-  @Step
-  public String getCleanUpPolicy() {
-    return cleanUpPolicyField.getText();
-  }
-
-  @Step
-  public int getPartitions() {
-    return Integer.parseInt(partitionsField.getText().trim());
-  }
-
-  @Step
-  public boolean isTopicHeaderVisible(String topicName) {
-    return isVisible($x(String.format(topicHeaderLocator, topicName)));
-  }
-
-  @Step
-  public TopicDetails clickDeleteTopicMenu() {
-    removeTopicBtn.shouldBe(Condition.visible).click();
-    return this;
-  }
-
-  @Step
-  public TopicDetails clickConfirmBtnMdl() {
-    clickConfirmButton();
-    return this;
-  }
-
-  @Step
-  public TopicDetails clickProduceMessageBtn() {
-    clickByJavaScript(produceMessageBtn);
-    return this;
-  }
-
-  @Step
-  public TopicDetails selectSeekTypeDdlMessagesTab(String seekTypeName){
-    seekTypeDdl.shouldBe(Condition.enabled).click();
-    $x(String.format(seekFilterDdlLocator, seekTypeName)).shouldBe(Condition.visible).click();
-    return this;
-  }
-
-  @Step
-  public TopicDetails setSeekTypeValueFldMessagesTab(String seekTypeValue){
-    seekTypeField.shouldBe(Condition.enabled).sendKeys(seekTypeValue);
-    return this;
-  }
-
-  @Step
-  public TopicDetails clickSubmitFiltersBtnMessagesTab(){
-    clickByJavaScript(submitBtn);
-    waitUntilSpinnerDisappear();
-    return this;
-  }
-
-  @Step
-  public TopicDetails clickMessagesAddFiltersBtn() {
-    addFiltersBtn.shouldBe(Condition.enabled).click();
-    return this;
-  }
-
-  @Step
-  public TopicDetails openSavedFiltersListMdl(){
-    savedFiltersLink.shouldBe(Condition.enabled).click();
-    backToCreateFiltersLink.shouldBe(Condition.visible);
-    return this;
-  }
-
-  @Step
-  public boolean isFilterVisibleAtSavedFiltersMdl(String filterName){
-    return isVisible($x(String.format(savedFilterNameLocator,filterName)));
-  }
-
-  @Step
-  public TopicDetails selectFilterAtSavedFiltersMdl(String filterName){
-    $x(String.format(savedFilterNameLocator, filterName)).shouldBe(Condition.enabled).click();
-    return this;
-  }
-
-  @Step
-  public TopicDetails clickSelectFilterBtnAtSavedFiltersMdl(){
-    selectFilterBtnAddFilterMdl.shouldBe(Condition.enabled).click();
-    addFilterCodeModalTitle.shouldBe(Condition.disappear);
-    return this;
-  }
-
-  @Step
-  public TopicDetails waitUntilAddFiltersMdlVisible() {
-    addFilterCodeModalTitle.shouldBe(Condition.visible);
-    return this;
-  }
-
-  @Step
-  public TopicDetails setFilterCodeFieldAddFilterMdl(String filterCode) {
-    addFilterCodeInput.shouldBe(Condition.enabled).sendKeys(filterCode);
-    return this;
-  }
-
-  @Step
-  public TopicDetails selectSaveThisFilterCheckboxMdl(boolean select){
-    selectElement(saveThisFilterCheckBoxAddFilterMdl, select);
-    return this;
-  }
-
-  @Step
-  public boolean isSaveThisFilterCheckBoxSelected() {
-    return isSelected(saveThisFilterCheckBoxAddFilterMdl);
-  }
-
-  @Step
-  public TopicDetails setDisplayNameFldAddFilterMdl(String displayName) {
-    displayNameInputAddFilterMdl.shouldBe(Condition.enabled).sendKeys(displayName);
-    return this;
-  }
-
-  @Step
-  public TopicDetails clickAddFilterBtnAndCloseMdl(boolean closeModal) {
-    addFilterBtnAddFilterMdl.shouldBe(Condition.enabled).click();
-    if(closeModal){
-      addFilterCodeModalTitle.shouldBe(Condition.hidden);}
-    else{
-      addFilterCodeModalTitle.shouldBe(Condition.visible);
-    }
-    return this;
-  }
-
-  @Step
-  public boolean isAddFilterBtnAddFilterMdlEnabled() {
-    return isEnabled(addFilterBtnAddFilterMdl);
-  }
-
-  @Step
-  public boolean isActiveFilterVisible(String activeFilterName) {
-    return isVisible($x(String.format(activeFilterNameLocator, activeFilterName)));
-  }
-
-  public List<SelenideElement> getAllAddFilterModalVisibleElements() {
-    return Arrays.asList(savedFiltersLink, displayNameInputAddFilterMdl, addFilterBtnAddFilterMdl, cancelBtnAddFilterMdl);
-  }
-
-  public List<SelenideElement> getAllAddFilterModalEnabledElements() {
-    return Arrays.asList(displayNameInputAddFilterMdl, cancelBtnAddFilterMdl);
-  }
-
-  public List<SelenideElement> getAllAddFilterModalDisabledElements() {
-    return Arrays.asList(addFilterBtnAddFilterMdl);
-  }
-
-  @Step
-  public TopicDetails openConsumerGroup(String consumerId) {
-    $x(String.format(consumerIdLocator, consumerId)).click();
-    return this;
-  }
-
-  @Step
-  public boolean isKeyMessageVisible(String keyMessage) {
-    return keyMessage.equals($("td[title]").getText());
-  }
-
-  @Step
-  public boolean isContentMessageVisible(String contentMessage) {
-    return contentMessage.matches(contentMessageTab.getText().trim());
-  }
-
-  private void selectYear(int expectedYear) {
-    while (getActualCalendarDate().getYear() > expectedYear) {
-      clickByJavaScript(previousMonthButton);
-      sleep(1000);
-      if (LocalTime.now().plusMinutes(3).isBefore(LocalTime.now())) {
-        throw new IllegalArgumentException("Unable to select year");
-      }
-    }
-  }
-
-  private void selectMonth(int expectedMonth) {
-    while (getActualCalendarDate().getMonthValue() > expectedMonth) {
-      clickByJavaScript(previousMonthButton);
-      sleep(1000);
-      if (LocalTime.now().plusMinutes(3).isBefore(LocalTime.now())) {
-        throw new IllegalArgumentException("Unable to select month");
-      }
-    }
-  }
-
-  private void selectDay(int expectedDay) {
-    Objects.requireNonNull($$x(String.format(dayCellLtr, expectedDay)).stream()
-        .filter(day -> !Objects.requireNonNull(day.getAttribute("class")).contains("outside-month"))
-        .findFirst().orElse(null)).shouldBe(Condition.enabled).click();
-  }
-
-  private void setTime(LocalDateTime dateTime) {
-    calendarTimeFld.shouldBe(Condition.enabled)
-        .sendKeys(String.valueOf(dateTime.getHour()), String.valueOf(dateTime.getMinute()));
-  }
-
-  @Step
-  public TopicDetails selectDateAndTimeByCalendar(LocalDateTime dateTime) {
-    setTime(dateTime);
-    selectYear(dateTime.getYear());
-    selectMonth(dateTime.getMonthValue());
-    selectDay(dateTime.getDayOfMonth());
-    return this;
-  }
-
-  private LocalDate getActualCalendarDate() {
-    String monthAndYearStr = actualCalendarDate.getText().trim();
-    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
-        .parseCaseInsensitive()
-        .append(DateTimeFormatter.ofPattern("MMMM yyyy"))
-        .toFormatter(Locale.ENGLISH);
-    YearMonth yearMonth = formatter.parse(monthAndYearStr, YearMonth::from);
-    return yearMonth.atDay(1);
-  }
-
-  @Step
-  public TopicDetails openCalendarSeekType(){
-    seekTypeField.shouldBe(Condition.enabled).click();
-    actualCalendarDate.shouldBe(Condition.visible);
-    return this;
-  }
-
-  @Step
-  public int getMessageCountAmount() {
-    return Integer.parseInt(messageAmountCell.getText().trim());
-  }
-
-  private List<TopicDetails.MessageGridItem> initItems() {
-    List<TopicDetails.MessageGridItem> gridItemList = new ArrayList<>();
-    allGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
-        .forEach(item -> gridItemList.add(new TopicDetails.MessageGridItem(item)));
-    return gridItemList;
-  }
-
-  @Step
-  public TopicDetails.MessageGridItem getMessageByOffset(int offset) {
-    return initItems().stream()
-        .filter(e -> e.getOffset() == offset)
-        .findFirst().orElse(null);
-  }
-
-  @Step
-  public List<MessageGridItem> getAllMessages(){
-    return initItems();
-  }
-
-  @Step
-  public TopicDetails.MessageGridItem getRandomMessage() {
-    return getMessageByOffset(nextInt(initItems().size() - 1));
-  }
-
-  public enum TopicMenu {
-    OVERVIEW("Overview"),
-    MESSAGES("Messages"),
-    CONSUMERS("Consumers"),
-    SETTINGS("Settings");
-
-    private final String value;
-
-    TopicMenu(String value) {
-      this.value = value;
-    }
-
-    public String toString() {
-      return value;
-    }
-  }
-
-  public static class MessageGridItem extends BasePage {
-
-    private final SelenideElement element;
-
-    private MessageGridItem(SelenideElement element) {
-      this.element = element;
-    }
-
-    @Step
-    public MessageGridItem clickExpand() {
-      clickByJavaScript(element.$x("./td[1]/span"));
-      return this;
-    }
-
-    private SelenideElement getOffsetElm() {
-      return element.$x("./td[2]");
-    }
-
-    @Step
-    public int getOffset() {
-      return Integer.parseInt(getOffsetElm().getText().trim());
-    }
-
-    @Step
-    public int getPartition() {
-      return Integer.parseInt(element.$x("./td[3]").getText().trim());
-    }
-
-    @Step
-    public LocalDateTime getTimestamp() {
-      String timestampValue = element.$x("./td[4]/div").getText().trim();
-      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy, HH:mm:ss");
-      return LocalDateTime.parse(timestampValue, formatter);
-    }
-
-    @Step
-    public String getKey() {
-      return element.$x("./td[5]").getText().trim();
-    }
-
-    @Step
-    public String getValue() {
-      return element.$x("./td[6]/span/p").getText().trim();
-    }
-
-    @Step
-    public MessageGridItem openDotMenu() {
-      getOffsetElm().hover();
-      element.$x("./td[7]/div/button[@aria-label='Dropdown Toggle']")
-          .shouldBe(Condition.visible).click();
-      return this;
-    }
-
-    @Step
-    public MessageGridItem clickCopyToClipBoard() {
-      clickByJavaScript(element.$x("./td[7]//li[text() = 'Copy to clipboard']")
-          .shouldBe(Condition.visible));
-      return this;
-    }
-
-    @Step
-    public MessageGridItem clickSaveAsFile() {
-      clickByJavaScript(element.$x("./td[7]//li[text() = 'Save as a file']")
-          .shouldBe(Condition.visible));
-      return this;
-    }
-  }
-}

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

@@ -1,65 +0,0 @@
-package com.provectus.kafka.ui.pages.topic;
-
-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 io.qameta.allure.Step;
-import java.util.ArrayList;
-import java.util.List;
-
-public class TopicSettingsTab extends BasePage {
-
-  protected SelenideElement defaultValueColumnHeaderLocator = $x("//div[text() = 'Default Value']");
-
-  @Step
-  public TopicSettingsTab waitUntilScreenReady(){
-    waitUntilSpinnerDisappear();
-    defaultValueColumnHeaderLocator.shouldBe(Condition.visible);
-    return this;
-  }
-
-  private List<SettingsGridItem> initGridItems() {
-    List<SettingsGridItem> gridItemList = new ArrayList<>();
-    allGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
-        .forEach(item -> gridItemList.add(new SettingsGridItem(item)));
-    return gridItemList;
-  }
-
-  private TopicSettingsTab.SettingsGridItem getItemByKey(String key){
-    return initGridItems().stream()
-        .filter(e ->e.getKey().equals(key))
-        .findFirst().orElse(null);
-  }
-
-  @Step
-  public String getValueByKey(String key){
-    return getItemByKey(key).getValue();
-  }
-
-  public static class SettingsGridItem extends BasePage {
-
-    private final SelenideElement element;
-
-    public SettingsGridItem(SelenideElement element) {
-      this.element = element;
-    }
-
-    @Step
-    public String getKey(){
-      return element.$x("./td[1]/span").getText().trim();
-    }
-
-    @Step
-    public String getValue(){
-      return element.$x("./td[2]/span").getText().trim();
-    }
-
-    @Step
-    public String getDefaultValue() {
-      return element.$x("./td[3]/span").getText().trim();
-    }
-  }
-}

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

@@ -1,260 +0,0 @@
-package com.provectus.kafka.ui.pages.topic;
-
-import static com.codeborne.selenide.Condition.visible;
-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 io.qameta.allure.Step;
-import java.time.Duration;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-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']");
-    protected SelenideElement deleteSelectedTopicsBtn = $x("//button[text()='Delete selected topics']");
-    protected SelenideElement copySelectedTopicBtn = $x("//button[text()='Copy selected topic']");
-    protected SelenideElement purgeMessagesOfSelectedTopicsBtn = $x("//button[text()='Purge messages of selected topics']");
-    protected SelenideElement clearMessagesBtn = $x("//ul[contains(@class ,'open')]//div[text()='Clear Messages']");
-    protected SelenideElement recreateTopicBtn = $x("//ul[contains(@class ,'open')]//div[text()='Recreate Topic']");
-    protected SelenideElement removeTopicBtn = $x("//ul[contains(@class ,'open')]//div[text()='Remove Topic']");
-
-    @Step
-    public TopicsList waitUntilScreenReady() {
-        waitUntilSpinnerDisappear();
-        topicListHeader.shouldBe(visible);
-        return this;
-    }
-
-    @Step
-    public TopicsList clickAddTopicBtn() {
-        clickByJavaScript(addTopicBtn);
-        return this;
-    }
-
-    @Step
-    public boolean isTopicVisible(String topicName) {
-        tableGrid.shouldBe(visible);
-        return isVisible(getTableElement(topicName));
-    }
-
-    @Step
-    public boolean isShowInternalRadioBtnSelected() {
-      return isSelected(showInternalRadioBtn);
-    }
-
-    @Step
-    public TopicsList setShowInternalRadioButton(boolean select) {
-      selectElement(showInternalRadioBtn, select);
-      return this;
-    }
-
-    @Step
-    public TopicsList openTopic(String topicName) {
-        getTopicItem(topicName).openItem();
-        return this;
-    }
-
-    @Step
-    public TopicsList openDotMenuByTopicName(String topicName){
-      getTopicItem(topicName).openDotMenu();
-      return this;
-    }
-
-    @Step
-    public boolean isCopySelectedTopicBtnEnabled(){
-      return isEnabled(copySelectedTopicBtn);
-    }
-
-    @Step
-    public List<SelenideElement> getActionButtons() {
-      return Stream.of(deleteSelectedTopicsBtn, copySelectedTopicBtn, purgeMessagesOfSelectedTopicsBtn)
-          .collect(Collectors.toList());
-    }
-
-    @Step
-    public TopicsList clickCopySelectedTopicBtn(){
-      copySelectedTopicBtn.shouldBe(Condition.enabled).click();
-      return this;
-    }
-
-    @Step
-    public TopicsList clickPurgeMessagesOfSelectedTopicsBtn(){
-    purgeMessagesOfSelectedTopicsBtn.shouldBe(Condition.enabled).click();
-    return this;
-    }
-
-    @Step
-    public TopicsList clickClearMessagesBtn(){
-      clickByJavaScript(clearMessagesBtn.shouldBe(visible));
-      return this;
-    }
-
-    @Step
-    public TopicsList clickRecreateTopicBtn(){
-      clickByJavaScript(recreateTopicBtn.shouldBe(visible));
-      return this;
-    }
-
-    @Step
-    public TopicsList clickRemoveTopicBtn(){
-      clickByJavaScript(removeTopicBtn.shouldBe(visible));
-      return this;
-    }
-
-    @Step
-    public TopicsList clickConfirmBtnMdl() {
-    clickConfirmButton();
-    return this;
-    }
-
-    @Step
-    public TopicsList clickCancelBtnMdl(){
-      clickCancelButton();
-      return this;
-    }
-
-    @Step
-    public boolean isConfirmationMdlVisible(){
-      return isConfirmationModalVisible();
-    }
-
-    @Step
-    public boolean isAlertWithMessageVisible(AlertHeader header, String message) {
-      return isAlertVisible(header, message);
-    }
-
-    private List<SelenideElement> getVisibleColumnHeaders() {
-      return Stream.of("Replication Factor","Number of messages","Topic Name", "Partitions", "Out of sync replicas", "Size")
-          .map(name -> $x(String.format(columnHeaderLocator, name)))
-        .collect(Collectors.toList());
-    }
-
-    private List<SelenideElement> getEnabledColumnHeaders(){
-      return Stream.of("Topic Name", "Partitions", "Out of sync replicas", "Size")
-          .map(name -> $x(String.format(columnHeaderLocator, name)))
-          .collect(Collectors.toList());
-    }
-
-    @Step
-    public List<SelenideElement> getAllVisibleElements() {
-      List<SelenideElement> visibleElements = new ArrayList<>(getVisibleColumnHeaders());
-      visibleElements.addAll(Arrays.asList(searchField, addTopicBtn, tableGrid));
-      visibleElements.addAll(getActionButtons());
-      return visibleElements;
-    }
-
-    @Step
-    public List<SelenideElement> getAllEnabledElements() {
-      List<SelenideElement> enabledElements = new ArrayList<>(getEnabledColumnHeaders());
-      enabledElements.addAll(Arrays.asList(searchField, showInternalRadioBtn,addTopicBtn));
-      return enabledElements;
-    }
-
-    private List<TopicGridItem> initGridItems() {
-      List<TopicGridItem> gridItemList = new ArrayList<>();
-      allGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
-          .forEach(item -> gridItemList.add(new TopicGridItem(item)));
-      return gridItemList;
-    }
-
-    @Step
-    public TopicGridItem getTopicItem(String name) {
-      return initGridItems().stream()
-        .filter(e -> e.getName().equals(name))
-        .findFirst().orElse(null);
-    }
-
-    @Step
-    public List<TopicGridItem> getNonInternalTopics() {
-      return initGridItems().stream()
-          .filter(e -> !e.isInternal())
-          .collect(Collectors.toList());
-    }
-
-    @Step
-    public List<TopicGridItem> getInternalTopics() {
-      return initGridItems().stream()
-          .filter(TopicGridItem::isInternal)
-          .collect(Collectors.toList());
-    }
-
-    public static class TopicGridItem extends BasePage {
-
-      private final SelenideElement element;
-
-      public TopicGridItem(SelenideElement element) {
-        this.element = element;
-      }
-
-      @Step
-      public TopicsList selectItem(boolean select) {
-         selectElement(element.$x("./td[1]/input"), select);
-         return new TopicsList();
-      }
-
-      @Step
-      public boolean isInternal() {
-        boolean internal = false;
-        try {
-          element.$x("./td[2]/a/span").shouldBe(visible, Duration.ofMillis(500));
-          internal = true;
-        } catch (Throwable ignored) {
-        }
-        return internal;
-      }
-
-      private SelenideElement getNameElm() {
-        return element.$x("./td[2]");
-      }
-
-      @Step
-      public String getName() {
-        return getNameElm().getText().trim();
-      }
-
-      @Step
-      public void openItem() {
-        getNameElm().click();
-      }
-
-      @Step
-      public int getPartition() {
-        return Integer.parseInt(element.$x("./td[3]").getText().trim());
-      }
-
-      @Step
-      public int getOutOfSyncReplicas() {
-        return Integer.parseInt(element.$x("./td[4]").getText().trim());
-      }
-
-      @Step
-      public int getReplicationFactor() {
-        return Integer.parseInt(element.$x("./td[5]").getText().trim());
-      }
-
-      @Step
-      public int getNumberOfMessages() {
-        return Integer.parseInt(element.$x("./td[6]").getText().trim());
-      }
-
-      @Step
-      public int getSize() {
-        return Integer.parseInt(element.$x("./td[7]").getText().trim());
-      }
-
-      @Step
-      public void openDotMenu(){
-        element.$x("./td[8]//button").click();
-      }
-    }
-}

+ 0 - 24
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/enums/CleanupPolicyValue.java

@@ -1,24 +0,0 @@
-package com.provectus.kafka.ui.pages.topic.enums;
-
-public enum CleanupPolicyValue {
-  DELETE("delete", "Delete"),
-  COMPACT("compact", "Compact"),
-  COMPACT_DELETE("compact,delete", "Compact,Delete");
-
-  private final String optionValue;
-  private final String visibleText;
-
-  CleanupPolicyValue(String optionValue, String visibleText) {
-    this.optionValue = optionValue;
-    this.visibleText = visibleText;
-  }
-
-  public String getOptionValue() {
-    return optionValue;
-  }
-
-  public String getVisibleText() {
-    return visibleText;
-  }
-}
-

+ 0 - 36
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/enums/CustomParameterType.java

@@ -1,36 +0,0 @@
-package com.provectus.kafka.ui.pages.topic.enums;
-
-public enum CustomParameterType {
-  COMPRESSION_TYPE("compression.type"),
-  DELETE_RETENTION_MS("delete.retention.ms"),
-  FILE_DELETE_DELAY_MS("file.delete.delay.ms"),
-  FLUSH_MESSAGES("flush.messages"),
-  FLUSH_MS("flush.ms"),
-  FOLLOWER_REPLICATION_THROTTLED_REPLICAS("follower.replication.throttled.replicas"),
-  INDEX_INTERVAL_BYTES("index.interval.bytes"),
-  LEADER_REPLICATION_THROTTLED_REPLICAS("leader.replication.throttled.replicas"),
-  MAX_COMPACTION_LAG_MS("max.compaction.lag.ms"),
-  MESSAGE_DOWNCONVERSION_ENABLE("message.downconversion.enable"),
-  MESSAGE_FORMAT_VERSION("message.format.version"),
-  MESSAGE_TIMESTAMP_DIFFERENCE_MAX_MS("message.timestamp.difference.max.ms"),
-  MESSAGE_TIMESTAMP_TYPE("message.timestamp.type"),
-  MIN_CLEANABLE_DIRTY_RATIO("min.cleanable.dirty.ratio"),
-  MIN_COMPACTION_LAG_MS("min.compaction.lag.ms"),
-  PREALLOCATE("preallocate"),
-  RETENTION_BYTES("retention.bytes"),
-  SEGMENT_BYTES("segment.bytes"),
-  SEGMENT_INDEX_BYTES("segment.index.bytes"),
-  SEGMENT_JITTER_MS("segment.jitter.ms"),
-  SEGMENT_MS("segment.ms"),
-  UNCLEAN_LEADER_ELECTION_ENABLE("unclean.leader.election.enable");
-
-  private final String optionValue;
-
-  CustomParameterType(String optionValue) {
-    this.optionValue = optionValue;
-  }
-
-  public String getOptionValue() {
-    return optionValue;
-  }
-}

+ 0 - 26
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/enums/MaxSizeOnDisk.java

@@ -1,26 +0,0 @@
-package com.provectus.kafka.ui.pages.topic.enums;
-
-public enum MaxSizeOnDisk {
-  NOT_SET("-1", "Not Set"),
-  SIZE_1_GB("1073741824", "1 GB"),
-  SIZE_10_GB("10737418240", "10 GB"),
-  SIZE_20_GB("21474836480", "20 GB"),
-  SIZE_50_GB("53687091200", "50 GB");
-
-  private final String optionValue;
-  private final String visibleText;
-
-  MaxSizeOnDisk(String optionValue, String visibleText) {
-    this.optionValue = optionValue;
-    this.visibleText = visibleText;
-  }
-
-  public String getOptionValue() {
-    return optionValue;
-  }
-
-  public String getVisibleText() {
-    return visibleText;
-  }
-}
-

+ 0 - 25
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/enums/TimeToRetain.java

@@ -1,25 +0,0 @@
-package com.provectus.kafka.ui.pages.topic.enums;
-
-public enum TimeToRetain {
-  BTN_12_HOURS("12 hours", "43200000"),
-  BTN_1_DAY("1 day", "86400000"),
-  BTN_2_DAYS("2 days", "172800000"),
-  BTN_7_DAYS("7 days", "604800000"),
-  BTN_4_WEEKS("4 weeks", "2419200000");
-
-  private final String button;
-  private final String value;
-
-  TimeToRetain(String button, String value) {
-    this.button = button;
-    this.value = value;
-  }
-
-  public String getButton(){
-    return button;
-  }
-
-  public String getValue(){
-    return value;
-  }
-}

+ 6 - 5
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topic/ProduceMessagePanel.java → kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/ProduceMessagePanel.java

@@ -1,14 +1,15 @@
-package com.provectus.kafka.ui.pages.topic;
-
-import static com.codeborne.selenide.Selenide.$x;
-import static com.codeborne.selenide.Selenide.refresh;
+package com.provectus.kafka.ui.pages.topics;
 
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
 import com.provectus.kafka.ui.pages.BasePage;
 import io.qameta.allure.Step;
+
 import java.util.Arrays;
 
+import static com.codeborne.selenide.Selenide.$x;
+import static com.codeborne.selenide.Selenide.refresh;
+
 public class ProduceMessagePanel extends BasePage {
 
     protected SelenideElement keyTextArea = $x("//div[@id='key']/textarea");
@@ -20,7 +21,7 @@ public class ProduceMessagePanel extends BasePage {
     protected SelenideElement contentSerdeDdl = $x("//ul[@name='valueSerde']");
 
     @Step
-    public ProduceMessagePanel waitUntilScreenReady(){
+    public ProduceMessagePanel waitUntilScreenReady() {
         waitUntilSpinnerDisappear();
         Arrays.asList(partitionDdl, keySerdeDdl, contentSerdeDdl).forEach(element -> element.shouldBe(Condition.visible));
         return this;

+ 267 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/TopicCreateEditForm.java

@@ -0,0 +1,267 @@
+package com.provectus.kafka.ui.pages.topics;
+
+import com.codeborne.selenide.ClickOptions;
+import com.codeborne.selenide.Condition;
+import com.codeborne.selenide.ElementsCollection;
+import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
+import com.provectus.kafka.ui.pages.topics.enums.CleanupPolicyValue;
+import com.provectus.kafka.ui.pages.topics.enums.CustomParameterType;
+import com.provectus.kafka.ui.pages.topics.enums.MaxSizeOnDisk;
+import com.provectus.kafka.ui.pages.topics.enums.TimeToRetain;
+import io.qameta.allure.Step;
+
+import static com.codeborne.selenide.Selenide.*;
+
+public class TopicCreateEditForm extends BasePage {
+
+    protected SelenideElement timeToRetainField = $x("//input[@id='timeToRetain']");
+    protected SelenideElement partitionsField = $x("//input[@name='partitions']");
+    protected SelenideElement nameField = $x("//input[@name='name']");
+    protected SelenideElement maxMessageBytesField = $x("//input[@name='maxMessageBytes']");
+    protected SelenideElement minInSyncReplicasField = $x("//input[@name='minInSyncReplicas']");
+    protected SelenideElement cleanUpPolicyDdl = $x("//ul[@id='topicFormCleanupPolicy']");
+    protected SelenideElement maxSizeOnDiscDdl = $x("//ul[@id='topicFormRetentionBytes']");
+    protected SelenideElement customParameterDdl = $x("//ul[contains(@name,'customParams')]");
+    protected SelenideElement deleteCustomParameterBtn = $x("//span[contains(@title,'Delete customParam')]");
+    protected SelenideElement addCustomParameterTypeBtn = $x("//button[contains(text(),'Add Custom Parameter')]");
+    protected SelenideElement customParameterValueField = $x("//input[@placeholder='Value']");
+    protected SelenideElement validationCustomParameterValueMsg = $x("//p[contains(text(),'Value is required')]");
+    protected String ddlElementLocator = "//li[@value='%s']";
+    protected String btnTimeToRetainLocator = "//button[@class][text()='%s']";
+
+
+    @Step
+    public TopicCreateEditForm waitUntilScreenReady() {
+        waitUntilSpinnerDisappear();
+        nameField.shouldBe(Condition.visible);
+        return this;
+    }
+
+    public boolean isCreateTopicButtonEnabled() {
+        return isEnabled(submitBtn);
+    }
+
+    public boolean isDeleteCustomParameterButtonEnabled() {
+        return isEnabled(deleteCustomParameterBtn);
+    }
+
+    public boolean isNameFieldEnabled() {
+        return isEnabled(nameField);
+    }
+
+    @Step
+    public TopicCreateEditForm setTopicName(String topicName) {
+        nameField.shouldBe(Condition.enabled).clear();
+        if (topicName != null) {
+            nameField.sendKeys(topicName);
+        }
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm setMinInsyncReplicas(Integer minInsyncReplicas) {
+        minInSyncReplicasField.setValue(minInsyncReplicas.toString());
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm setTimeToRetainDataInMs(Long ms) {
+        timeToRetainField.setValue(ms.toString());
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm setTimeToRetainDataInMs(String ms) {
+        timeToRetainField.setValue(ms);
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm setMaxSizeOnDiskInGB(MaxSizeOnDisk MaxSizeOnDisk) {
+        maxSizeOnDiscDdl.shouldBe(Condition.visible).click();
+        $x(String.format(ddlElementLocator, MaxSizeOnDisk.getOptionValue())).shouldBe(Condition.visible).click();
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm clickAddCustomParameterTypeButton() {
+        addCustomParameterTypeBtn.click();
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm setCustomParameterType(CustomParameterType customParameterType) {
+        customParameterDdl.shouldBe(Condition.visible).click();
+        $x(String.format(ddlElementLocator, customParameterType.getOptionValue())).shouldBe(Condition.visible).click();
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm clearCustomParameterValue() {
+        clearByKeyboard(customParameterValueField);
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm setNumberOfPartitions(int partitions) {
+        partitionsField.shouldBe(Condition.enabled).clear();
+        partitionsField.sendKeys(String.valueOf(partitions));
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm setTimeToRetainDataByButtons(TimeToRetain timeToRetain) {
+        $x(String.format(btnTimeToRetainLocator, timeToRetain.getButton())).shouldBe(Condition.enabled).click();
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm selectCleanupPolicy(CleanupPolicyValue cleanupPolicyOptionValue) {
+        cleanUpPolicyDdl.shouldBe(Condition.visible).click();
+        $x(String.format(ddlElementLocator, cleanupPolicyOptionValue.getOptionValue())).shouldBe(Condition.visible).click();
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm selectRetentionBytes(String visibleValue) {
+        return selectFromDropDownByVisibleText("retentionBytes", visibleValue);
+    }
+
+    @Step
+    public TopicCreateEditForm selectRetentionBytes(Long optionValue) {
+        return selectFromDropDownByOptionValue("retentionBytes", optionValue.toString());
+    }
+
+    @Step
+    public TopicCreateEditForm clickCreateTopicBtn() {
+        clickSubmitBtn();
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm addCustomParameter(String customParameterName,
+                                                  String customParameterValue) {
+        ElementsCollection customParametersElements =
+                $$("ul[role=listbox][name^=customParams][name$=name]");
+        KafkaUISelectElement kafkaUISelectElement = null;
+        if (customParametersElements.size() == 1) {
+            if ("Select".equals(customParametersElements.first().getText())) {
+                kafkaUISelectElement = new KafkaUISelectElement(customParametersElements.first());
+            }
+        } else {
+            $$("button")
+                    .find(Condition.exactText("Add Custom Parameter"))
+                    .click();
+            customParametersElements = $$("ul[role=listbox][name^=customParams][name$=name]");
+            kafkaUISelectElement = new KafkaUISelectElement(customParametersElements.last());
+        }
+        if (kafkaUISelectElement != null) {
+            kafkaUISelectElement.selectByVisibleText(customParameterName);
+        }
+        $(String.format("input[name=\"customParams.%d.value\"]", customParametersElements.size() - 1))
+                .setValue(customParameterValue);
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm updateCustomParameter(String customParameterName,
+                                                     String customParameterValue) {
+        SelenideElement selenideElement = $$("ul[role=listbox][name^=customParams][name$=name]")
+                .find(Condition.exactText(customParameterName));
+        String name = selenideElement.getAttribute("name");
+        if (name != null) {
+            name = name.substring(0, name.lastIndexOf("."));
+        }
+        $(String.format("input[name^=%s]", name)).setValue(customParameterValue);
+        return this;
+    }
+
+    @Step
+    public String getCleanupPolicy() {
+        return new KafkaUISelectElement("cleanupPolicy").getCurrentValue();
+    }
+
+    @Step
+    public String getTimeToRetain() {
+        return timeToRetainField.getValue();
+    }
+
+    @Step
+    public String getMaxSizeOnDisk() {
+        return new KafkaUISelectElement("retentionBytes").getCurrentValue();
+    }
+
+    @Step
+    public String getMaxMessageBytes() {
+        return maxMessageBytesField.getValue();
+    }
+
+    @Step
+    public TopicCreateEditForm setMaxMessageBytes(Long bytes) {
+        maxMessageBytesField.setValue(bytes.toString());
+        return this;
+    }
+
+    @Step
+    public TopicCreateEditForm setMaxMessageBytes(String bytes) {
+        return setMaxMessageBytes(Long.parseLong(bytes));
+    }
+
+    @Step
+    public boolean isValidationMessageCustomParameterValueVisible() {
+        return isVisible(validationCustomParameterValueMsg);
+    }
+
+    @Step
+    public String getCustomParameterValue() {
+        return customParameterValueField.getValue();
+    }
+
+    private TopicCreateEditForm selectFromDropDownByOptionValue(String dropDownElementName,
+                                                                String optionValue) {
+        KafkaUISelectElement select = new KafkaUISelectElement(dropDownElementName);
+        select.selectByOptionValue(optionValue);
+        return this;
+    }
+
+    private TopicCreateEditForm selectFromDropDownByVisibleText(String dropDownElementName,
+                                                                String visibleText) {
+        KafkaUISelectElement select = new KafkaUISelectElement(dropDownElementName);
+        select.selectByVisibleText(visibleText);
+        return this;
+    }
+
+    private static class KafkaUISelectElement {
+
+        private final SelenideElement selectElement;
+
+        public KafkaUISelectElement(String selectElementName) {
+            this.selectElement = $("ul[role=listbox][name=" + selectElementName + "]");
+        }
+
+        public KafkaUISelectElement(SelenideElement selectElement) {
+            this.selectElement = selectElement;
+        }
+
+        public void selectByOptionValue(String optionValue) {
+            selectElement.click();
+            selectElement
+                    .$$x(".//ul/li[@role='option']")
+                    .find(Condition.attribute("value", optionValue))
+                    .click(ClickOptions.usingJavaScript());
+        }
+
+        public void selectByVisibleText(String visibleText) {
+            selectElement.click();
+            selectElement
+                    .$$("ul>li[role=option]")
+                    .find(Condition.exactText(visibleText))
+                    .click();
+        }
+
+        public String getCurrentValue() {
+            return selectElement.$("li").getText();
+        }
+    }
+}

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

@@ -0,0 +1,446 @@
+package com.provectus.kafka.ui.pages.topics;
+
+import com.codeborne.selenide.CollectionCondition;
+import com.codeborne.selenide.Condition;
+import com.codeborne.selenide.ElementsCollection;
+import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
+import io.qameta.allure.Step;
+import org.openqa.selenium.By;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.YearMonth;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.util.*;
+
+import static com.codeborne.selenide.Selenide.*;
+import static org.testcontainers.shaded.org.apache.commons.lang3.RandomUtils.nextInt;
+
+public class TopicDetails extends BasePage {
+
+    protected SelenideElement clearMessagesBtn = $x(("//div[contains(text(), 'Clear messages')]"));
+    protected SelenideElement recreateTopicBtn = $x("//div[text()='Recreate Topic']");
+    protected SelenideElement messageAmountCell = $x("//tbody/tr/td[5]");
+    protected SelenideElement overviewTab = $x("//a[contains(text(),'Overview')]");
+    protected SelenideElement messagesTab = $x("//a[contains(text(),'Messages')]");
+    protected SelenideElement seekTypeDdl = $x("//ul[@id='selectSeekType']/li");
+    protected SelenideElement seekTypeField = $x("//label[text()='Seek Type']//..//div/input");
+    protected SelenideElement addFiltersBtn = $x("//button[text()='Add Filters']");
+    protected SelenideElement savedFiltersLink = $x("//div[text()='Saved Filters']");
+    protected SelenideElement addFilterCodeModalTitle = $x("//label[text()='Filter code']");
+    protected SelenideElement addFilterCodeInput = $x("//div[@id='ace-editor']//textarea");
+    protected SelenideElement saveThisFilterCheckBoxAddFilterMdl = $x("//input[@name='saveFilter']");
+    protected SelenideElement displayNameInputAddFilterMdl = $x("//input[@placeholder='Enter Name']");
+    protected SelenideElement cancelBtnAddFilterMdl = $x("//button[text()='Cancel']");
+    protected SelenideElement addFilterBtnAddFilterMdl = $x("//button[text()='Add filter']");
+    protected SelenideElement addFiltersBtnMessages = $x("//button[text()='Add Filters']");
+    protected SelenideElement selectFilterBtnAddFilterMdl = $x("//button[text()='Select filter']");
+    protected SelenideElement editSettingsMenu = $x("//li[@role][contains(text(),'Edit settings')]");
+    protected SelenideElement removeTopicBtn = $x("//ul[@role='menu']//div[contains(text(),'Remove Topic')]");
+    protected SelenideElement produceMessageBtn = $x("//div//button[text()='Produce Message']");
+    protected SelenideElement contentMessageTab = $x("//html//div[@id='root']/div/main//table//p");
+    protected SelenideElement cleanUpPolicyField = $x("//div[contains(text(),'Clean Up Policy')]/../span/*");
+    protected SelenideElement partitionsField = $x("//div[contains(text(),'Partitions')]/../span");
+    protected SelenideElement backToCreateFiltersLink = $x("//div[text()='Back To create filters']");
+    protected ElementsCollection messageGridItems = $$x("//tbody//tr");
+    protected SelenideElement actualCalendarDate = $x("//div[@class='react-datepicker__current-month']");
+    protected SelenideElement previousMonthButton = $x("//button[@aria-label='Previous Month']");
+    protected SelenideElement nextMonthButton = $x("//button[@aria-label='Next Month']");
+    protected SelenideElement calendarTimeFld = $x("//input[@placeholder='Time']");
+    protected String dayCellLtr = "//div[@role='option'][contains(text(),'%d')]";
+    protected String seekFilterDdlLocator = "//ul[@id='selectSeekType']/ul/li[text()='%s']";
+    protected String savedFilterNameLocator = "//div[@role='savedFilter']/div[contains(text(),'%s')]";
+    protected String consumerIdLocator = "//a[@title='%s']";
+    protected String topicHeaderLocator = "//h1[contains(text(),'%s')]";
+    protected String activeFilterNameLocator = "//div[@data-testid='activeSmartFilter'][contains(text(),'%s')]";
+    protected String settingsGridValueLocator = "//tbody/tr/td/span[text()='%s']//ancestor::tr/td[2]/span";
+
+    @Step
+    public TopicDetails waitUntilScreenReady() {
+        waitUntilSpinnerDisappear();
+        overviewTab.shouldBe(Condition.visible);
+        return this;
+    }
+
+    @Step
+    public TopicDetails openDetailsTab(TopicMenu menu) {
+        $(By.linkText(menu.toString())).shouldBe(Condition.visible).click();
+        waitUntilSpinnerDisappear();
+        return this;
+    }
+
+    @Step
+    public String getSettingsGridValueByKey(String key) {
+        return $x(String.format(settingsGridValueLocator, key)).scrollTo().shouldBe(Condition.visible).getText();
+    }
+
+    @Step
+    public TopicDetails openDotMenu() {
+        clickByJavaScript(dotMenuBtn);
+        return this;
+    }
+
+    @Step
+    public boolean isAlertWithMessageVisible(AlertHeader header, String message) {
+        return isAlertVisible(header, message);
+    }
+
+    @Step
+    public TopicDetails clickEditSettingsMenu() {
+        editSettingsMenu.shouldBe(Condition.visible).click();
+        return this;
+    }
+
+    @Step
+    public boolean isConfirmationMdlVisible() {
+        return isConfirmationModalVisible();
+    }
+
+    @Step
+    public TopicDetails clickClearMessagesMenu() {
+        clearMessagesBtn.shouldBe(Condition.visible).click();
+        return this;
+    }
+
+    @Step
+    public TopicDetails clickRecreateTopicMenu() {
+        recreateTopicBtn.shouldBe(Condition.visible).click();
+        return this;
+    }
+
+    @Step
+    public String getCleanUpPolicy() {
+        return cleanUpPolicyField.getText();
+    }
+
+    @Step
+    public int getPartitions() {
+        return Integer.parseInt(partitionsField.getText().trim());
+    }
+
+    @Step
+    public boolean isTopicHeaderVisible(String topicName) {
+        return isVisible($x(String.format(topicHeaderLocator, topicName)));
+    }
+
+    @Step
+    public TopicDetails clickDeleteTopicMenu() {
+        removeTopicBtn.shouldBe(Condition.visible).click();
+        return this;
+    }
+
+    @Step
+    public TopicDetails clickConfirmBtnMdl() {
+        clickConfirmButton();
+        return this;
+    }
+
+    @Step
+    public TopicDetails clickProduceMessageBtn() {
+        clickByJavaScript(produceMessageBtn);
+        return this;
+    }
+
+    @Step
+    public TopicDetails selectSeekTypeDdlMessagesTab(String seekTypeName) {
+        seekTypeDdl.shouldBe(Condition.enabled).click();
+        $x(String.format(seekFilterDdlLocator, seekTypeName)).shouldBe(Condition.visible).click();
+        return this;
+    }
+
+    @Step
+    public TopicDetails setSeekTypeValueFldMessagesTab(String seekTypeValue) {
+        seekTypeField.shouldBe(Condition.enabled).sendKeys(seekTypeValue);
+        return this;
+    }
+
+    @Step
+    public TopicDetails clickSubmitFiltersBtnMessagesTab() {
+        clickByJavaScript(submitBtn);
+        waitUntilSpinnerDisappear();
+        return this;
+    }
+
+    @Step
+    public TopicDetails clickMessagesAddFiltersBtn() {
+        addFiltersBtn.shouldBe(Condition.enabled).click();
+        return this;
+    }
+
+    @Step
+    public TopicDetails openSavedFiltersListMdl() {
+        savedFiltersLink.shouldBe(Condition.enabled).click();
+        backToCreateFiltersLink.shouldBe(Condition.visible);
+        return this;
+    }
+
+    @Step
+    public boolean isFilterVisibleAtSavedFiltersMdl(String filterName) {
+        return isVisible($x(String.format(savedFilterNameLocator, filterName)));
+    }
+
+    @Step
+    public TopicDetails selectFilterAtSavedFiltersMdl(String filterName) {
+        $x(String.format(savedFilterNameLocator, filterName)).shouldBe(Condition.enabled).click();
+        return this;
+    }
+
+    @Step
+    public TopicDetails clickSelectFilterBtnAtSavedFiltersMdl() {
+        selectFilterBtnAddFilterMdl.shouldBe(Condition.enabled).click();
+        addFilterCodeModalTitle.shouldBe(Condition.disappear);
+        return this;
+    }
+
+    @Step
+    public TopicDetails waitUntilAddFiltersMdlVisible() {
+        addFilterCodeModalTitle.shouldBe(Condition.visible);
+        return this;
+    }
+
+    @Step
+    public TopicDetails setFilterCodeFieldAddFilterMdl(String filterCode) {
+        addFilterCodeInput.shouldBe(Condition.enabled).sendKeys(filterCode);
+        return this;
+    }
+
+    @Step
+    public TopicDetails selectSaveThisFilterCheckboxMdl(boolean select) {
+        selectElement(saveThisFilterCheckBoxAddFilterMdl, select);
+        return this;
+    }
+
+    @Step
+    public boolean isSaveThisFilterCheckBoxSelected() {
+        return isSelected(saveThisFilterCheckBoxAddFilterMdl);
+    }
+
+    @Step
+    public TopicDetails setDisplayNameFldAddFilterMdl(String displayName) {
+        displayNameInputAddFilterMdl.shouldBe(Condition.enabled).sendKeys(displayName);
+        return this;
+    }
+
+    @Step
+    public TopicDetails clickAddFilterBtnAndCloseMdl(boolean closeModal) {
+        addFilterBtnAddFilterMdl.shouldBe(Condition.enabled).click();
+        if (closeModal) {
+            addFilterCodeModalTitle.shouldBe(Condition.hidden);
+        } else {
+            addFilterCodeModalTitle.shouldBe(Condition.visible);
+        }
+        return this;
+    }
+
+    @Step
+    public boolean isAddFilterBtnAddFilterMdlEnabled() {
+        return isEnabled(addFilterBtnAddFilterMdl);
+    }
+
+    @Step
+    public boolean isActiveFilterVisible(String activeFilterName) {
+        return isVisible($x(String.format(activeFilterNameLocator, activeFilterName)));
+    }
+
+    public List<SelenideElement> getAllAddFilterModalVisibleElements() {
+        return Arrays.asList(savedFiltersLink, displayNameInputAddFilterMdl, addFilterBtnAddFilterMdl, cancelBtnAddFilterMdl);
+    }
+
+    public List<SelenideElement> getAllAddFilterModalEnabledElements() {
+        return Arrays.asList(displayNameInputAddFilterMdl, cancelBtnAddFilterMdl);
+    }
+
+    public List<SelenideElement> getAllAddFilterModalDisabledElements() {
+        return Collections.singletonList(addFilterBtnAddFilterMdl);
+    }
+
+    @Step
+    public TopicDetails openConsumerGroup(String consumerId) {
+        $x(String.format(consumerIdLocator, consumerId)).click();
+        return this;
+    }
+
+    @Step
+    public boolean isKeyMessageVisible(String keyMessage) {
+        return keyMessage.equals($("td[title]").getText());
+    }
+
+    @Step
+    public boolean isContentMessageVisible(String contentMessage) {
+        return contentMessage.matches(contentMessageTab.getText().trim());
+    }
+
+    private void selectYear(int expectedYear) {
+        while (getActualCalendarDate().getYear() > expectedYear) {
+            clickByJavaScript(previousMonthButton);
+            sleep(1000);
+            if (LocalTime.now().plusMinutes(3).isBefore(LocalTime.now())) {
+                throw new IllegalArgumentException("Unable to select year");
+            }
+        }
+    }
+
+    private void selectMonth(int expectedMonth) {
+        while (getActualCalendarDate().getMonthValue() > expectedMonth) {
+            clickByJavaScript(previousMonthButton);
+            sleep(1000);
+            if (LocalTime.now().plusMinutes(3).isBefore(LocalTime.now())) {
+                throw new IllegalArgumentException("Unable to select month");
+            }
+        }
+    }
+
+    private void selectDay(int expectedDay) {
+        Objects.requireNonNull($$x(String.format(dayCellLtr, expectedDay)).stream()
+                .filter(day -> !Objects.requireNonNull(day.getAttribute("class")).contains("outside-month"))
+                .findFirst().orElseThrow()).shouldBe(Condition.enabled).click();
+    }
+
+    private void setTime(LocalDateTime dateTime) {
+        calendarTimeFld.shouldBe(Condition.enabled)
+                .sendKeys(String.valueOf(dateTime.getHour()), String.valueOf(dateTime.getMinute()));
+    }
+
+    @Step
+    public TopicDetails selectDateAndTimeByCalendar(LocalDateTime dateTime) {
+        setTime(dateTime);
+        selectYear(dateTime.getYear());
+        selectMonth(dateTime.getMonthValue());
+        selectDay(dateTime.getDayOfMonth());
+        return this;
+    }
+
+    private LocalDate getActualCalendarDate() {
+        String monthAndYearStr = actualCalendarDate.getText().trim();
+        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
+                .parseCaseInsensitive()
+                .append(DateTimeFormatter.ofPattern("MMMM yyyy"))
+                .toFormatter(Locale.ENGLISH);
+        YearMonth yearMonth = formatter.parse(monthAndYearStr, YearMonth::from);
+        return yearMonth.atDay(1);
+    }
+
+    @Step
+    public TopicDetails openCalendarSeekType() {
+        seekTypeField.shouldBe(Condition.enabled).click();
+        actualCalendarDate.shouldBe(Condition.visible);
+        return this;
+    }
+
+    @Step
+    public int getMessageCountAmount() {
+        return Integer.parseInt(messageAmountCell.getText().trim());
+    }
+
+    private List<TopicDetails.MessageGridItem> initItems() {
+        List<TopicDetails.MessageGridItem> gridItemList = new ArrayList<>();
+        allGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
+                .forEach(item -> gridItemList.add(new TopicDetails.MessageGridItem(item)));
+        return gridItemList;
+    }
+
+    @Step
+    public TopicDetails.MessageGridItem getMessageByOffset(int offset) {
+        return initItems().stream()
+                .filter(e -> e.getOffset() == offset)
+                .findFirst().orElseThrow();
+    }
+
+    @Step
+    public List<MessageGridItem> getAllMessages() {
+        return initItems();
+    }
+
+    @Step
+    public TopicDetails.MessageGridItem getRandomMessage() {
+        return getMessageByOffset(nextInt(0, initItems().size() - 1));
+    }
+
+    public enum TopicMenu {
+        OVERVIEW("Overview"),
+        MESSAGES("Messages"),
+        CONSUMERS("Consumers"),
+        SETTINGS("Settings");
+
+        private final String value;
+
+        TopicMenu(String value) {
+            this.value = value;
+        }
+
+        public String toString() {
+            return value;
+        }
+    }
+
+    public static class MessageGridItem extends BasePage {
+
+        private final SelenideElement element;
+
+        private MessageGridItem(SelenideElement element) {
+            this.element = element;
+        }
+
+        @Step
+        public MessageGridItem clickExpand() {
+            clickByJavaScript(element.$x("./td[1]/span"));
+            return this;
+        }
+
+        private SelenideElement getOffsetElm() {
+            return element.$x("./td[2]");
+        }
+
+        @Step
+        public int getOffset() {
+            return Integer.parseInt(getOffsetElm().getText().trim());
+        }
+
+        @Step
+        public int getPartition() {
+            return Integer.parseInt(element.$x("./td[3]").getText().trim());
+        }
+
+        @Step
+        public LocalDateTime getTimestamp() {
+            String timestampValue = element.$x("./td[4]/div").getText().trim();
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy, HH:mm:ss");
+            return LocalDateTime.parse(timestampValue, formatter);
+        }
+
+        @Step
+        public String getKey() {
+            return element.$x("./td[5]").getText().trim();
+        }
+
+        @Step
+        public String getValue() {
+            return element.$x("./td[6]/span/p").getText().trim();
+        }
+
+        @Step
+        public MessageGridItem openDotMenu() {
+            getOffsetElm().hover();
+            element.$x("./td[7]/div/button[@aria-label='Dropdown Toggle']")
+                    .shouldBe(Condition.visible).click();
+            return this;
+        }
+
+        @Step
+        public MessageGridItem clickCopyToClipBoard() {
+            clickByJavaScript(element.$x("./td[7]//li[text() = 'Copy to clipboard']")
+                    .shouldBe(Condition.visible));
+            return this;
+        }
+
+        @Step
+        public MessageGridItem clickSaveAsFile() {
+            clickByJavaScript(element.$x("./td[7]//li[text() = 'Save as a file']")
+                    .shouldBe(Condition.visible));
+            return this;
+        }
+    }
+}

+ 66 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/TopicSettingsTab.java

@@ -0,0 +1,66 @@
+package com.provectus.kafka.ui.pages.topics;
+
+import com.codeborne.selenide.CollectionCondition;
+import com.codeborne.selenide.Condition;
+import com.codeborne.selenide.SelenideElement;
+import com.provectus.kafka.ui.pages.BasePage;
+import io.qameta.allure.Step;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.codeborne.selenide.Selenide.$x;
+
+public class TopicSettingsTab extends BasePage {
+
+    protected SelenideElement defaultValueColumnHeaderLocator = $x("//div[text() = 'Default Value']");
+
+    @Step
+    public TopicSettingsTab waitUntilScreenReady() {
+        waitUntilSpinnerDisappear();
+        defaultValueColumnHeaderLocator.shouldBe(Condition.visible);
+        return this;
+    }
+
+    private List<SettingsGridItem> initGridItems() {
+        List<SettingsGridItem> gridItemList = new ArrayList<>();
+        allGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
+                .forEach(item -> gridItemList.add(new SettingsGridItem(item)));
+        return gridItemList;
+    }
+
+    private TopicSettingsTab.SettingsGridItem getItemByKey(String key) {
+        return initGridItems().stream()
+                .filter(e -> e.getKey().equals(key))
+                .findFirst().orElseThrow();
+    }
+
+    @Step
+    public String getValueByKey(String key) {
+        return getItemByKey(key).getValue();
+    }
+
+    public static class SettingsGridItem extends BasePage {
+
+        private final SelenideElement element;
+
+        public SettingsGridItem(SelenideElement element) {
+            this.element = element;
+        }
+
+        @Step
+        public String getKey() {
+            return element.$x("./td[1]/span").getText().trim();
+        }
+
+        @Step
+        public String getValue() {
+            return element.$x("./td[2]/span").getText().trim();
+        }
+
+        @Step
+        public String getDefaultValue() {
+            return element.$x("./td[3]/span").getText().trim();
+        }
+    }
+}

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

@@ -0,0 +1,261 @@
+package com.provectus.kafka.ui.pages.topics;
+
+import com.codeborne.selenide.CollectionCondition;
+import com.codeborne.selenide.Condition;
+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;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.codeborne.selenide.Condition.visible;
+import static com.codeborne.selenide.Selenide.$x;
+
+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']");
+    protected SelenideElement deleteSelectedTopicsBtn = $x("//button[text()='Delete selected topics']");
+    protected SelenideElement copySelectedTopicBtn = $x("//button[text()='Copy selected topic']");
+    protected SelenideElement purgeMessagesOfSelectedTopicsBtn = $x("//button[text()='Purge messages of selected topics']");
+    protected SelenideElement clearMessagesBtn = $x("//ul[contains(@class ,'open')]//div[text()='Clear Messages']");
+    protected SelenideElement recreateTopicBtn = $x("//ul[contains(@class ,'open')]//div[text()='Recreate Topic']");
+    protected SelenideElement removeTopicBtn = $x("//ul[contains(@class ,'open')]//div[text()='Remove Topic']");
+
+    @Step
+    public TopicsList waitUntilScreenReady() {
+        waitUntilSpinnerDisappear();
+        topicListHeader.shouldBe(visible);
+        return this;
+    }
+
+    @Step
+    public TopicsList clickAddTopicBtn() {
+        clickByJavaScript(addTopicBtn);
+        return this;
+    }
+
+    @Step
+    public boolean isTopicVisible(String topicName) {
+        tableGrid.shouldBe(visible);
+        return isVisible(getTableElement(topicName));
+    }
+
+    @Step
+    public boolean isShowInternalRadioBtnSelected() {
+        return isSelected(showInternalRadioBtn);
+    }
+
+    @Step
+    public TopicsList setShowInternalRadioButton(boolean select) {
+        selectElement(showInternalRadioBtn, select);
+        return this;
+    }
+
+    @Step
+    public TopicsList openTopic(String topicName) {
+        getTopicItem(topicName).openItem();
+        return this;
+    }
+
+    @Step
+    public TopicsList openDotMenuByTopicName(String topicName) {
+        getTopicItem(topicName).openDotMenu();
+        return this;
+    }
+
+    @Step
+    public boolean isCopySelectedTopicBtnEnabled() {
+        return isEnabled(copySelectedTopicBtn);
+    }
+
+    @Step
+    public List<SelenideElement> getActionButtons() {
+        return Stream.of(deleteSelectedTopicsBtn, copySelectedTopicBtn, purgeMessagesOfSelectedTopicsBtn)
+                .collect(Collectors.toList());
+    }
+
+    @Step
+    public TopicsList clickCopySelectedTopicBtn() {
+        copySelectedTopicBtn.shouldBe(Condition.enabled).click();
+        return this;
+    }
+
+    @Step
+    public TopicsList clickPurgeMessagesOfSelectedTopicsBtn() {
+        purgeMessagesOfSelectedTopicsBtn.shouldBe(Condition.enabled).click();
+        return this;
+    }
+
+    @Step
+    public TopicsList clickClearMessagesBtn() {
+        clickByJavaScript(clearMessagesBtn.shouldBe(visible));
+        return this;
+    }
+
+    @Step
+    public TopicsList clickRecreateTopicBtn() {
+        clickByJavaScript(recreateTopicBtn.shouldBe(visible));
+        return this;
+    }
+
+    @Step
+    public TopicsList clickRemoveTopicBtn() {
+        clickByJavaScript(removeTopicBtn.shouldBe(visible));
+        return this;
+    }
+
+    @Step
+    public TopicsList clickConfirmBtnMdl() {
+        clickConfirmButton();
+        return this;
+    }
+
+    @Step
+    public TopicsList clickCancelBtnMdl() {
+        clickCancelButton();
+        return this;
+    }
+
+    @Step
+    public boolean isConfirmationMdlVisible() {
+        return isConfirmationModalVisible();
+    }
+
+    @Step
+    public boolean isAlertWithMessageVisible(AlertHeader header, String message) {
+        return isAlertVisible(header, message);
+    }
+
+    private List<SelenideElement> getVisibleColumnHeaders() {
+        return Stream.of("Replication Factor", "Number of messages", "Topic Name", "Partitions", "Out of sync replicas", "Size")
+                .map(name -> $x(String.format(columnHeaderLocator, name)))
+                .collect(Collectors.toList());
+    }
+
+    private List<SelenideElement> getEnabledColumnHeaders() {
+        return Stream.of("Topic Name", "Partitions", "Out of sync replicas", "Size")
+                .map(name -> $x(String.format(columnHeaderLocator, name)))
+                .collect(Collectors.toList());
+    }
+
+    @Step
+    public List<SelenideElement> getAllVisibleElements() {
+        List<SelenideElement> visibleElements = new ArrayList<>(getVisibleColumnHeaders());
+        visibleElements.addAll(Arrays.asList(searchField, addTopicBtn, tableGrid));
+        visibleElements.addAll(getActionButtons());
+        return visibleElements;
+    }
+
+    @Step
+    public List<SelenideElement> getAllEnabledElements() {
+        List<SelenideElement> enabledElements = new ArrayList<>(getEnabledColumnHeaders());
+        enabledElements.addAll(Arrays.asList(searchField, showInternalRadioBtn, addTopicBtn));
+        return enabledElements;
+    }
+
+    private List<TopicGridItem> initGridItems() {
+        List<TopicGridItem> gridItemList = new ArrayList<>();
+        allGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
+                .forEach(item -> gridItemList.add(new TopicGridItem(item)));
+        return gridItemList;
+    }
+
+    @Step
+    public TopicGridItem getTopicItem(String name) {
+        return initGridItems().stream()
+                .filter(e -> e.getName().equals(name))
+                .findFirst().orElseThrow();
+    }
+
+    @Step
+    public List<TopicGridItem> getNonInternalTopics() {
+        return initGridItems().stream()
+                .filter(e -> !e.isInternal())
+                .collect(Collectors.toList());
+    }
+
+    @Step
+    public List<TopicGridItem> getInternalTopics() {
+        return initGridItems().stream()
+                .filter(TopicGridItem::isInternal)
+                .collect(Collectors.toList());
+    }
+
+    public static class TopicGridItem extends BasePage {
+
+        private final SelenideElement element;
+
+        public TopicGridItem(SelenideElement element) {
+            this.element = element;
+        }
+
+        @Step
+        public TopicsList selectItem(boolean select) {
+            selectElement(element.$x("./td[1]/input"), select);
+            return new TopicsList();
+        }
+
+        @Step
+        public boolean isInternal() {
+            boolean internal = false;
+            try {
+                element.$x("./td[2]/a/span").shouldBe(visible, Duration.ofMillis(500));
+                internal = true;
+            } catch (Throwable ignored) {
+            }
+            return internal;
+        }
+
+        private SelenideElement getNameElm() {
+            return element.$x("./td[2]");
+        }
+
+        @Step
+        public String getName() {
+            return getNameElm().getText().trim();
+        }
+
+        @Step
+        public void openItem() {
+            getNameElm().click();
+        }
+
+        @Step
+        public int getPartition() {
+            return Integer.parseInt(element.$x("./td[3]").getText().trim());
+        }
+
+        @Step
+        public int getOutOfSyncReplicas() {
+            return Integer.parseInt(element.$x("./td[4]").getText().trim());
+        }
+
+        @Step
+        public int getReplicationFactor() {
+            return Integer.parseInt(element.$x("./td[5]").getText().trim());
+        }
+
+        @Step
+        public int getNumberOfMessages() {
+            return Integer.parseInt(element.$x("./td[6]").getText().trim());
+        }
+
+        @Step
+        public int getSize() {
+            return Integer.parseInt(element.$x("./td[7]").getText().trim());
+        }
+
+        @Step
+        public void openDotMenu() {
+            element.$x("./td[8]//button").click();
+        }
+    }
+}

+ 25 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/enums/CleanupPolicyValue.java

@@ -0,0 +1,25 @@
+package com.provectus.kafka.ui.pages.topics.enums;
+
+public enum CleanupPolicyValue {
+
+    DELETE("delete", "Delete"),
+    COMPACT("compact", "Compact"),
+    COMPACT_DELETE("compact,delete", "Compact,Delete");
+
+    private final String optionValue;
+    private final String visibleText;
+
+    CleanupPolicyValue(String optionValue, String visibleText) {
+        this.optionValue = optionValue;
+        this.visibleText = visibleText;
+    }
+
+    public String getOptionValue() {
+        return optionValue;
+    }
+
+    public String getVisibleText() {
+        return visibleText;
+    }
+}
+

+ 37 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/enums/CustomParameterType.java

@@ -0,0 +1,37 @@
+package com.provectus.kafka.ui.pages.topics.enums;
+
+public enum CustomParameterType {
+
+    COMPRESSION_TYPE("compression.type"),
+    DELETE_RETENTION_MS("delete.retention.ms"),
+    FILE_DELETE_DELAY_MS("file.delete.delay.ms"),
+    FLUSH_MESSAGES("flush.messages"),
+    FLUSH_MS("flush.ms"),
+    FOLLOWER_REPLICATION_THROTTLED_REPLICAS("follower.replication.throttled.replicas"),
+    INDEX_INTERVAL_BYTES("index.interval.bytes"),
+    LEADER_REPLICATION_THROTTLED_REPLICAS("leader.replication.throttled.replicas"),
+    MAX_COMPACTION_LAG_MS("max.compaction.lag.ms"),
+    MESSAGE_DOWNCONVERSION_ENABLE("message.downconversion.enable"),
+    MESSAGE_FORMAT_VERSION("message.format.version"),
+    MESSAGE_TIMESTAMP_DIFFERENCE_MAX_MS("message.timestamp.difference.max.ms"),
+    MESSAGE_TIMESTAMP_TYPE("message.timestamp.type"),
+    MIN_CLEANABLE_DIRTY_RATIO("min.cleanable.dirty.ratio"),
+    MIN_COMPACTION_LAG_MS("min.compaction.lag.ms"),
+    PREALLOCATE("preallocate"),
+    RETENTION_BYTES("retention.bytes"),
+    SEGMENT_BYTES("segment.bytes"),
+    SEGMENT_INDEX_BYTES("segment.index.bytes"),
+    SEGMENT_JITTER_MS("segment.jitter.ms"),
+    SEGMENT_MS("segment.ms"),
+    UNCLEAN_LEADER_ELECTION_ENABLE("unclean.leader.election.enable");
+
+    private final String optionValue;
+
+    CustomParameterType(String optionValue) {
+        this.optionValue = optionValue;
+    }
+
+    public String getOptionValue() {
+        return optionValue;
+    }
+}

+ 27 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/enums/MaxSizeOnDisk.java

@@ -0,0 +1,27 @@
+package com.provectus.kafka.ui.pages.topics.enums;
+
+public enum MaxSizeOnDisk {
+
+    NOT_SET("-1", "Not Set"),
+    SIZE_1_GB("1073741824", "1 GB"),
+    SIZE_10_GB("10737418240", "10 GB"),
+    SIZE_20_GB("21474836480", "20 GB"),
+    SIZE_50_GB("53687091200", "50 GB");
+
+    private final String optionValue;
+    private final String visibleText;
+
+    MaxSizeOnDisk(String optionValue, String visibleText) {
+        this.optionValue = optionValue;
+        this.visibleText = visibleText;
+    }
+
+    public String getOptionValue() {
+        return optionValue;
+    }
+
+    public String getVisibleText() {
+        return visibleText;
+    }
+}
+

+ 26 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/enums/TimeToRetain.java

@@ -0,0 +1,26 @@
+package com.provectus.kafka.ui.pages.topics.enums;
+
+public enum TimeToRetain {
+
+    BTN_12_HOURS("12 hours", "43200000"),
+    BTN_1_DAY("1 day", "86400000"),
+    BTN_2_DAYS("2 days", "172800000"),
+    BTN_7_DAYS("7 days", "604800000"),
+    BTN_4_WEEKS("4 weeks", "2419200000");
+
+    private final String button;
+    private final String value;
+
+    TimeToRetain(String button, String value) {
+        this.button = button;
+        this.value = value;
+    }
+
+    public String getButton() {
+        return button;
+    }
+
+    public String getValue() {
+        return value;
+    }
+}

+ 126 - 125
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/services/ApiService.java

@@ -1,36 +1,27 @@
 package com.provectus.kafka.ui.services;
 
-import static com.codeborne.selenide.Selenide.sleep;
-import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
-
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.provectus.kafka.ui.api.ApiClient;
-import com.provectus.kafka.ui.api.api.KafkaConnectApi;
-import com.provectus.kafka.ui.api.api.KsqlApi;
-import com.provectus.kafka.ui.api.api.MessagesApi;
-import com.provectus.kafka.ui.api.api.SchemasApi;
-import com.provectus.kafka.ui.api.api.TopicsApi;
-import com.provectus.kafka.ui.api.model.CreateTopicMessage;
-import com.provectus.kafka.ui.api.model.KsqlCommandV2;
-import com.provectus.kafka.ui.api.model.KsqlCommandV2Response;
-import com.provectus.kafka.ui.api.model.KsqlResponse;
-import com.provectus.kafka.ui.api.model.NewConnector;
-import com.provectus.kafka.ui.api.model.NewSchemaSubject;
-import com.provectus.kafka.ui.api.model.TopicCreation;
+import com.provectus.kafka.ui.api.api.*;
+import com.provectus.kafka.ui.api.model.*;
 import com.provectus.kafka.ui.models.Connector;
 import com.provectus.kafka.ui.models.Schema;
 import com.provectus.kafka.ui.models.Topic;
-import com.provectus.kafka.ui.pages.ksqldb.models.Stream;
-import com.provectus.kafka.ui.pages.ksqldb.models.Table;
+import com.provectus.kafka.ui.pages.ksqlDb.models.Stream;
+import com.provectus.kafka.ui.pages.ksqlDb.models.Table;
 import com.provectus.kafka.ui.settings.BaseSource;
 import io.qameta.allure.Step;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.reactive.function.client.WebClientResponseException;
+
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.reactive.function.client.WebClientResponseException;
+
+import static com.codeborne.selenide.Selenide.sleep;
+import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
 
 
 @Slf4j
@@ -38,45 +29,47 @@ public class ApiService extends BaseSource {
 
     @SneakyThrows
     private TopicsApi topicApi() {
-      return new TopicsApi(new ApiClient().setBasePath(BASE_LOCAL_URL));
+        return new TopicsApi(new ApiClient().setBasePath(BASE_LOCAL_URL));
     }
 
     @SneakyThrows
     private SchemasApi schemaApi() {
-      return new SchemasApi(new ApiClient().setBasePath(BASE_LOCAL_URL));
+        return new SchemasApi(new ApiClient().setBasePath(BASE_LOCAL_URL));
     }
 
     @SneakyThrows
     private KafkaConnectApi connectorApi() {
-      return new KafkaConnectApi(new ApiClient().setBasePath(BASE_LOCAL_URL));
+        return new KafkaConnectApi(new ApiClient().setBasePath(BASE_LOCAL_URL));
     }
 
     @SneakyThrows
     private MessagesApi messageApi() {
-      return new MessagesApi(new ApiClient().setBasePath(BASE_LOCAL_URL));
+        return new MessagesApi(new ApiClient().setBasePath(BASE_LOCAL_URL));
     }
 
     @SneakyThrows
-    private KsqlApi ksqlApi(){return new KsqlApi(new ApiClient().setBasePath(BASE_LOCAL_URL));}
+    private KsqlApi ksqlApi() {
+        return new KsqlApi(new ApiClient().setBasePath(BASE_LOCAL_URL));
+    }
 
     @SneakyThrows
     private void createTopic(String clusterName, String topicName) {
-      TopicCreation topic = new TopicCreation();
-      topic.setName(topicName);
-      topic.setPartitions(1);
-      topic.setReplicationFactor(1);
-      try {
-        topicApi().createTopic(clusterName, topic).block();
-        sleep(2000);
-      } catch (WebClientResponseException ex) {
-        ex.printStackTrace();
-      }
+        TopicCreation topic = new TopicCreation();
+        topic.setName(topicName);
+        topic.setPartitions(1);
+        topic.setReplicationFactor(1);
+        try {
+            topicApi().createTopic(clusterName, topic).block();
+            sleep(2000);
+        } catch (WebClientResponseException ex) {
+            ex.printStackTrace();
+        }
     }
 
     @Step
     public ApiService createTopic(String topicName) {
-      createTopic(CLUSTER_NAME, topicName);
-      return this;
+        createTopic(CLUSTER_NAME, topicName);
+        return this;
     }
 
     @SneakyThrows
@@ -88,9 +81,9 @@ public class ApiService extends BaseSource {
     }
 
     @Step
-    public ApiService deleteTopic(String topicName){
-      deleteTopic(CLUSTER_NAME, topicName);
-      return this;
+    public ApiService deleteTopic(String topicName) {
+        deleteTopic(CLUSTER_NAME, topicName);
+        return this;
     }
 
     @SneakyThrows
@@ -107,9 +100,9 @@ public class ApiService extends BaseSource {
     }
 
     @Step
-    public ApiService createSchema(Schema schema){
-      createSchema(CLUSTER_NAME, schema);
-      return this;
+    public ApiService createSchema(Schema schema) {
+        createSchema(CLUSTER_NAME, schema);
+        return this;
     }
 
     @SneakyThrows
@@ -121,9 +114,9 @@ public class ApiService extends BaseSource {
     }
 
     @Step
-    public ApiService deleteSchema(String schemaName){
-      deleteSchema(CLUSTER_NAME, schemaName);
-      return this;
+    public ApiService deleteSchema(String schemaName) {
+        deleteSchema(CLUSTER_NAME, schemaName);
+        return this;
     }
 
     @SneakyThrows
@@ -135,9 +128,9 @@ public class ApiService extends BaseSource {
     }
 
     @Step
-    public ApiService deleteConnector(String connectName, String connectorName){
-      deleteConnector(CLUSTER_NAME, connectName, connectorName);
-      return this;
+    public ApiService deleteConnector(String connectName, String connectorName) {
+        deleteConnector(CLUSTER_NAME, connectName, connectorName);
+        return this;
     }
 
     @SneakyThrows
@@ -154,9 +147,9 @@ public class ApiService extends BaseSource {
     }
 
     @Step
-    public ApiService createConnector(String connectName, Connector connector){
-      createConnector(CLUSTER_NAME, connectName, connector);
-      return this;
+    public ApiService createConnector(String connectName, Connector connector) {
+        createConnector(CLUSTER_NAME, connectName, connector);
+        return this;
     }
 
     @Step
@@ -166,94 +159,102 @@ public class ApiService extends BaseSource {
 
     @SneakyThrows
     private void sendMessage(String clusterName, Topic topic) {
-      CreateTopicMessage createMessage = new CreateTopicMessage();
-      createMessage.setPartition(0);
-      createMessage.setKeySerde("String");
-      createMessage.setValueSerde("String");
-      createMessage.setKey(topic.getMessageKey());
-      createMessage.setContent(topic.getMessageContent());
-      try {
-        messageApi().sendTopicMessages(clusterName, topic.getName(), createMessage).block();
-      } catch (WebClientResponseException ex) {
-        ex.getRawStatusCode();
-      }
+        CreateTopicMessage createMessage = new CreateTopicMessage();
+        createMessage.setPartition(0);
+        createMessage.setKeySerde("String");
+        createMessage.setValueSerde("String");
+        createMessage.setKey(topic.getMessageKey());
+        createMessage.setContent(topic.getMessageContent());
+        try {
+            messageApi().sendTopicMessages(clusterName, topic.getName(), createMessage).block();
+        } catch (WebClientResponseException ex) {
+            ex.getRawStatusCode();
+        }
     }
 
     @Step
     public ApiService sendMessage(Topic topic) {
-      sendMessage(CLUSTER_NAME, topic);
-      return this;
+        sendMessage(CLUSTER_NAME, topic);
+        return this;
     }
 
     @Step
     public ApiService createStream(Stream stream) {
-      KsqlCommandV2Response pipeIdStream = ksqlApi().executeKsql(
-          CLUSTER_NAME, new KsqlCommandV2()
-              .ksql(String.format("CREATE STREAM %s (profileId VARCHAR, latitude DOUBLE, longitude DOUBLE) ",
-                  stream.getName())
-                  + String.format("WITH (kafka_topic='%s', value_format='json', partitions=1);",
-                  stream.getTopicName())))
-          .block();
-      assert pipeIdStream != null;
-      List<KsqlResponse> responseListStream =
-          ksqlApi().openKsqlResponsePipe(CLUSTER_NAME, pipeIdStream.getPipeId()).collectList().block();
-      assert Objects.requireNonNull(responseListStream).size() != 0;
-      return this;
+        KsqlCommandV2Response pipeIdStream = ksqlApi()
+                .executeKsql(CLUSTER_NAME, new KsqlCommandV2()
+                        .ksql(String.format("CREATE STREAM %s (profileId VARCHAR, latitude DOUBLE, longitude DOUBLE) ",
+                                stream.getName())
+                                + String.format("WITH (kafka_topic='%s', value_format='json', partitions=1);",
+                                stream.getTopicName())))
+                .block();
+        assert pipeIdStream != null;
+        List<KsqlResponse> responseListStream = ksqlApi()
+                .openKsqlResponsePipe(CLUSTER_NAME, pipeIdStream.getPipeId())
+                .collectList()
+                .block();
+        assert Objects.requireNonNull(responseListStream).size() != 0;
+        return this;
     }
 
     @Step
     public ApiService createTables(Table firstTable, Table secondTable) {
-      KsqlCommandV2Response pipeIdTable1 = ksqlApi().executeKsql(
-          CLUSTER_NAME, new KsqlCommandV2().ksql(
-              String.format("CREATE TABLE %s AS ", firstTable.getName())
-                  + "  SELECT profileId, "
-                  + "         LATEST_BY_OFFSET(latitude) AS la, "
-                  + "         LATEST_BY_OFFSET(longitude) AS lo "
-                  + String.format("  FROM %s ", firstTable.getStreamName())
-                  + "  GROUP BY profileId "
-                  + "  EMIT CHANGES;"))
-          .block();
-      assert pipeIdTable1 != null;
-      List<KsqlResponse> responseListTable =
-          ksqlApi().openKsqlResponsePipe(CLUSTER_NAME, pipeIdTable1.getPipeId()).collectList().block();
-      assert Objects.requireNonNull(responseListTable).size() != 0;
-      KsqlCommandV2Response pipeIdTable2 = ksqlApi().executeKsql(
-          CLUSTER_NAME,
-          new KsqlCommandV2().ksql(String.format("CREATE TABLE %s AS ", secondTable.getName())
-              + "  SELECT ROUND(GEO_DISTANCE(la, lo, 37.4133, -122.1162), -1) AS distanceInMiles, "
-              + "         COLLECT_LIST(profileId) AS riders, "
-              + "         COUNT(*) AS count "
-              + String.format("  FROM %s ", firstTable.getName())
-              + "  GROUP BY ROUND(GEO_DISTANCE(la, lo, 37.4133, -122.1162), -1);"))
-          .block();
-      assert pipeIdTable2 != null;
-      List<KsqlResponse> responseListTable2 =
-          ksqlApi().openKsqlResponsePipe(CLUSTER_NAME, pipeIdTable2.getPipeId()).collectList().block();
-      assert Objects.requireNonNull(responseListTable2).size() != 0;
-      return this;
+        KsqlCommandV2Response pipeIdTable1 = ksqlApi()
+                .executeKsql(CLUSTER_NAME, new KsqlCommandV2()
+                        .ksql(String.format("CREATE TABLE %s AS ", firstTable.getName())
+                                + "  SELECT profileId, "
+                                + "         LATEST_BY_OFFSET(latitude) AS la, "
+                                + "         LATEST_BY_OFFSET(longitude) AS lo "
+                                + String.format("  FROM %s ", firstTable.getStreamName())
+                                + "  GROUP BY profileId "
+                                + "  EMIT CHANGES;"))
+                .block();
+        assert pipeIdTable1 != null;
+        List<KsqlResponse> responseListTable = ksqlApi()
+                .openKsqlResponsePipe(CLUSTER_NAME, pipeIdTable1.getPipeId())
+                .collectList()
+                .block();
+        assert Objects.requireNonNull(responseListTable).size() != 0;
+        KsqlCommandV2Response pipeIdTable2 = ksqlApi()
+                .executeKsql(CLUSTER_NAME, new KsqlCommandV2()
+                        .ksql(String.format("CREATE TABLE %s AS ", secondTable.getName())
+                                + "  SELECT ROUND(GEO_DISTANCE(la, lo, 37.4133, -122.1162), -1) AS distanceInMiles, "
+                                + "         COLLECT_LIST(profileId) AS riders, "
+                                + "         COUNT(*) AS count "
+                                + String.format("  FROM %s ", firstTable.getName())
+                                + "  GROUP BY ROUND(GEO_DISTANCE(la, lo, 37.4133, -122.1162), -1);"))
+                .block();
+        assert pipeIdTable2 != null;
+        List<KsqlResponse> responseListTable2 = ksqlApi()
+                .openKsqlResponsePipe(CLUSTER_NAME, pipeIdTable2.getPipeId())
+                .collectList()
+                .block();
+        assert Objects.requireNonNull(responseListTable2).size() != 0;
+        return this;
     }
 
     @Step
     public ApiService insertInto(Stream stream) {
-      String streamName = stream.getName();
-      KsqlCommandV2Response pipeIdInsert = ksqlApi().executeKsql(CLUSTER_NAME, new KsqlCommandV2()
-              .ksql(
-                  "INSERT INTO " + streamName + " (profileId, latitude, longitude) VALUES ('c2309eec', 37.7877, -122.4205);"
-                      + "INSERT INTO " + streamName +
-                      " (profileId, latitude, longitude) VALUES ('18f4ea86', 37.3903, -122.0643); "
-                      + "INSERT INTO " + streamName +
-                      " (profileId, latitude, longitude) VALUES ('4ab5cbad', 37.3952, -122.0813); "
-                      + "INSERT INTO " + streamName +
-                      " (profileId, latitude, longitude) VALUES ('8b6eae59', 37.3944, -122.0813); "
-                      + "INSERT INTO " + streamName +
-                      " (profileId, latitude, longitude) VALUES ('4a7c7b41', 37.4049, -122.0822); "
-                      + "INSERT INTO " + streamName +
-                      " (profileId, latitude, longitude) VALUES ('4ddad000', 37.7857, -122.4011);"))
-          .block();
-      assert pipeIdInsert != null;
-      List<KsqlResponse> responseListInsert =
-          ksqlApi().openKsqlResponsePipe(CLUSTER_NAME, pipeIdInsert.getPipeId()).collectList().block();
-      assert Objects.requireNonNull(responseListInsert).size() != 0;
-      return this;
+        String streamName = stream.getName();
+        KsqlCommandV2Response pipeIdInsert = ksqlApi()
+                .executeKsql(CLUSTER_NAME, new KsqlCommandV2()
+                        .ksql("INSERT INTO " + streamName + " (profileId, latitude, longitude) VALUES ('c2309eec', 37.7877, -122.4205);"
+                                + "INSERT INTO " + streamName +
+                                " (profileId, latitude, longitude) VALUES ('18f4ea86', 37.3903, -122.0643); "
+                                + "INSERT INTO " + streamName +
+                                " (profileId, latitude, longitude) VALUES ('4ab5cbad', 37.3952, -122.0813); "
+                                + "INSERT INTO " + streamName +
+                                " (profileId, latitude, longitude) VALUES ('8b6eae59', 37.3944, -122.0813); "
+                                + "INSERT INTO " + streamName +
+                                " (profileId, latitude, longitude) VALUES ('4a7c7b41', 37.4049, -122.0822); "
+                                + "INSERT INTO " + streamName +
+                                " (profileId, latitude, longitude) VALUES ('4ddad000', 37.7857, -122.4011);"))
+                .block();
+        assert pipeIdInsert != null;
+        List<KsqlResponse> responseListInsert = ksqlApi()
+                .openKsqlResponsePipe(CLUSTER_NAME, pipeIdInsert.getPipeId())
+                .collectList()
+                .block();
+        assert Objects.requireNonNull(responseListInsert).size() != 0;
+        return this;
     }
 }

+ 35 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/settings/listeners/AllureListener.java

@@ -0,0 +1,35 @@
+package com.provectus.kafka.ui.settings.listeners;
+
+import com.codeborne.selenide.Screenshots;
+import io.qameta.allure.Allure;
+import io.qameta.allure.testng.AllureTestNg;
+import org.testng.ITestListener;
+import org.testng.ITestResult;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Objects;
+
+import static java.nio.file.Files.newInputStream;
+
+public class AllureListener extends AllureTestNg implements ITestListener {
+
+    private void takeScreenshot() {
+        File screenshot = Screenshots.takeScreenShotAsFile();
+        try {
+            Allure.addAttachment(Objects.requireNonNull(screenshot).getName(), newInputStream(screenshot.toPath()));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void onTestFailure(ITestResult result) {
+        takeScreenshot();
+    }
+
+    @Override
+    public void onTestSkipped(ITestResult result) {
+        takeScreenshot();
+    }
+}

+ 37 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/settings/listeners/LoggerListener.java

@@ -0,0 +1,37 @@
+package com.provectus.kafka.ui.settings.listeners;
+
+import lombok.extern.slf4j.Slf4j;
+import org.testng.ITestResult;
+import org.testng.TestListenerAdapter;
+
+@Slf4j
+public class LoggerListener extends TestListenerAdapter {
+
+    @Override
+    public void onTestStart(final ITestResult testResult) {
+        log.info(String.format("\n------------------------------------------------------------------------ " +
+                        "\nTEST STARTED: %s.%s \n------------------------------------------------------------------------ \n",
+                testResult.getInstanceName(), testResult.getName()));
+    }
+
+    @Override
+    public void onTestSuccess(final ITestResult testResult) {
+        log.info(String.format("\n------------------------------------------------------------------------ " +
+                        "\nTEST PASSED: %s.%s \n------------------------------------------------------------------------ \n",
+                testResult.getInstanceName(), testResult.getName()));
+    }
+
+    @Override
+    public void onTestFailure(final ITestResult testResult) {
+        log.info(String.format("\n------------------------------------------------------------------------ " +
+                        "\nTEST FAILED: %s.%s \n------------------------------------------------------------------------ \n",
+                testResult.getInstanceName(), testResult.getName()));
+    }
+
+    @Override
+    public void onTestSkipped(final ITestResult testResult) {
+        log.info(String.format("\n------------------------------------------------------------------------ " +
+                        "\nTEST SKIPPED: %s.%s \n------------------------------------------------------------------------ \n",
+                testResult.getInstanceName(), testResult.getName()));
+    }
+}

+ 8 - 7
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/TimeUtils.java

@@ -1,16 +1,17 @@
 package com.provectus.kafka.ui.utilities;
 
-import static com.codeborne.selenide.Selenide.sleep;
+import lombok.extern.slf4j.Slf4j;
 
 import java.time.LocalTime;
-import lombok.extern.slf4j.Slf4j;
+
+import static com.codeborne.selenide.Selenide.sleep;
 
 @Slf4j
 public class TimeUtils {
 
-  public static void waitUntilNewMinuteStarted(){
-    int secondsLeft = 60 - LocalTime.now().getSecond();
-    log.debug("\nwaitUntilNewMinuteStarted: {}s", secondsLeft);
-    sleep(secondsLeft * 1000);
-  }
+    public static void waitUntilNewMinuteStarted() {
+        int secondsLeft = 60 - LocalTime.now().getSecond();
+        log.debug("\nwaitUntilNewMinuteStarted: {}s", secondsLeft);
+        sleep(secondsLeft * 1000);
+    }
 }

+ 58 - 58
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/WebUtils.java

@@ -1,7 +1,5 @@
 package com.provectus.kafka.ui.utilities;
 
-import static com.codeborne.selenide.Selenide.executeJavaScript;
-
 import com.codeborne.selenide.Condition;
 import com.codeborne.selenide.SelenideElement;
 import com.codeborne.selenide.WebDriverRunner;
@@ -9,73 +7,75 @@ import lombok.extern.slf4j.Slf4j;
 import org.openqa.selenium.Keys;
 import org.openqa.selenium.interactions.Actions;
 
+import static com.codeborne.selenide.Selenide.executeJavaScript;
+
 @Slf4j
 public class WebUtils {
 
-  public static void clickByActions(SelenideElement element) {
-    log.debug("\nclickByActions: {}", element.getSearchCriteria());
-    element.shouldBe(Condition.enabled);
-    new Actions(WebDriverRunner.getWebDriver())
-        .moveToElement(element)
-        .click(element)
-        .perform();
-  }
+    public static void clickByActions(SelenideElement element) {
+        log.debug("\nclickByActions: {}", element.getSearchCriteria());
+        element.shouldBe(Condition.enabled);
+        new Actions(WebDriverRunner.getWebDriver())
+                .moveToElement(element)
+                .click(element)
+                .perform();
+    }
 
-  public static void clickByJavaScript(SelenideElement element) {
-    log.debug("\nclickByJavaScript: {}", element.getSearchCriteria());
-    element.shouldBe(Condition.enabled);
-    String script = "arguments[0].click();";
-    executeJavaScript(script, element);
-  }
+    public static void clickByJavaScript(SelenideElement element) {
+        log.debug("\nclickByJavaScript: {}", element.getSearchCriteria());
+        element.shouldBe(Condition.enabled);
+        String script = "arguments[0].click();";
+        executeJavaScript(script, element);
+    }
 
-  public static void clearByKeyboard(SelenideElement field) {
-    log.debug("\nclearByKeyboard: {}", field.getSearchCriteria());
-    field.shouldBe(Condition.enabled).sendKeys(Keys.END);
-    field.sendKeys(Keys.chord(Keys.CONTROL + "a"), Keys.DELETE);
-  }
+    public static void clearByKeyboard(SelenideElement field) {
+        log.debug("\nclearByKeyboard: {}", field.getSearchCriteria());
+        field.shouldBe(Condition.enabled).sendKeys(Keys.END);
+        field.sendKeys(Keys.chord(Keys.CONTROL + "a"), Keys.DELETE);
+    }
 
-  public static boolean isVisible(SelenideElement element) {
-    log.debug("\nisVisible: {}", element.getSearchCriteria());
-    boolean isVisible = false;
-    try {
-      element.shouldBe(Condition.visible);
-      isVisible = true;
-    } catch (Throwable e) {
-      log.debug("{} is not visible", element.getSearchCriteria());
+    public static boolean isVisible(SelenideElement element) {
+        log.debug("\nisVisible: {}", element.getSearchCriteria());
+        boolean isVisible = false;
+        try {
+            element.shouldBe(Condition.visible);
+            isVisible = true;
+        } catch (Throwable e) {
+            log.debug("{} is not visible", element.getSearchCriteria());
+        }
+        return isVisible;
     }
-    return isVisible;
-  }
 
-  public static boolean isEnabled(SelenideElement element) {
-    log.debug("\nisEnabled: {}", element.getSearchCriteria());
-    boolean isEnabled = false;
-    try {
-      element.shouldBe(Condition.enabled);
-      isEnabled = true;
-    } catch (Throwable e) {
-      log.debug("{} is not enabled", element.getSearchCriteria());
+    public static boolean isEnabled(SelenideElement element) {
+        log.debug("\nisEnabled: {}", element.getSearchCriteria());
+        boolean isEnabled = false;
+        try {
+            element.shouldBe(Condition.enabled);
+            isEnabled = true;
+        } catch (Throwable e) {
+            log.debug("{} is not enabled", element.getSearchCriteria());
+        }
+        return isEnabled;
     }
-    return isEnabled;
-  }
 
-  public static boolean isSelected(SelenideElement element) {
-    log.debug("\nisSelected: {}", element.getSearchCriteria());
-    boolean isSelected = false;
-    try {
-      element.shouldBe(Condition.selected);
-      isSelected = true;
-    } catch (Throwable e) {
-      log.debug("{} is not selected", element.getSearchCriteria());
+    public static boolean isSelected(SelenideElement element) {
+        log.debug("\nisSelected: {}", element.getSearchCriteria());
+        boolean isSelected = false;
+        try {
+            element.shouldBe(Condition.selected);
+            isSelected = true;
+        } catch (Throwable e) {
+            log.debug("{} is not selected", element.getSearchCriteria());
+        }
+        return isSelected;
     }
-    return isSelected;
-  }
 
-  public static boolean selectElement(SelenideElement element, boolean select){
-    if (select) {
-      if (!element.isSelected()) clickByJavaScript(element);
-    } else {
-      if (element.isSelected()) clickByJavaScript(element);
+    public static boolean selectElement(SelenideElement element, boolean select) {
+        if (select) {
+            if (!element.isSelected()) clickByJavaScript(element);
+        } else {
+            if (element.isSelected()) clickByJavaScript(element);
+        }
+        return true;
     }
-    return true;
-  }
 }

+ 0 - 33
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/DisplayNameGenerator.java

@@ -1,33 +0,0 @@
-package com.provectus.kafka.ui.utilities.qaseIoUtils;
-
-import org.junit.platform.commons.util.ClassUtils;
-import org.junit.platform.commons.util.Preconditions;
-
-import java.lang.reflect.Method;
-
-public class DisplayNameGenerator implements org.junit.jupiter.api.DisplayNameGenerator {
-  @Override
-  public String generateDisplayNameForClass(Class<?> testClass) {
-    String name = testClass.getName();
-    int lastDot = name.lastIndexOf('.');
-    return name.substring(lastDot + 1).replaceAll("([A-Z])", " $1").toLowerCase();
-  }
-
-  @Override
-  public String generateDisplayNameForNestedClass(Class<?> nestedClass) {
-    return nestedClass.getSimpleName();
-  }
-
-  @Override
-  public String generateDisplayNameForMethod(Class<?> testClass, Method testMethod) {
-    return testMethod.getName().replaceAll("([A-Z])", " $1").toLowerCase()
-        + parameterTypesAsString(testMethod);
-  }
-
-  static String parameterTypesAsString(Method method) {
-    Preconditions.notNull(method, "Method must not be null");
-    return method.getParameterTypes().length == 0
-        ? ""
-        : '(' + ClassUtils.nullSafeToString(Class::getSimpleName, method.getParameterTypes()) + ')';
-  }
-}

+ 8 - 7
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/QaseExtension.java

@@ -9,7 +9,6 @@ import io.qase.client.model.ResultCreate;
 import io.qase.client.model.ResultCreate.StatusEnum;
 import io.qase.client.model.ResultCreateSteps;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
 import org.junit.platform.engine.TestExecutionResult;
 import org.junit.platform.engine.TestSource;
 import org.junit.platform.engine.support.descriptor.MethodSource;
@@ -26,19 +25,17 @@ import java.util.concurrent.ConcurrentHashMap;
 import static io.qase.api.QaseClient.getConfig;
 import static io.qase.api.utils.IntegrationUtils.getCaseId;
 import static io.qase.api.utils.IntegrationUtils.getStacktrace;
+import static org.apache.commons.lang3.StringUtils.isEmpty;
 import static org.junit.platform.engine.TestExecutionResult.Status.SUCCESSFUL;
 
 @Slf4j
 public class QaseExtension implements TestExecutionListener {
 
-    private final ApiClient apiClient = QaseClient.getApiClient();
-    private final ResultsApi resultsApi = new ResultsApi(apiClient);
-    private final Map<TestIdentifier, Long> testStartTimes = new ConcurrentHashMap<>();
     private static final String QASE_PROJECT = "KAFKAUI";
 
     static {
         String qaseApiToken = System.getProperty("QASEIO_API_TOKEN");
-        if (StringUtils.isEmpty(qaseApiToken)) {
+        if (isEmpty(qaseApiToken)) {
             log.warn("QASEIO_API_TOKEN system property is not set. Support for Qase will be disabled.");
             System.setProperty("QASE_ENABLE", "false");
         } else {
@@ -47,12 +44,16 @@ public class QaseExtension implements TestExecutionListener {
             System.setProperty("QASE_API_TOKEN", qaseApiToken);
             System.setProperty("QASE_USE_BULK", "false");
             if ("true".equalsIgnoreCase(System.getProperty("QASEIO_CREATE_TESTRUN"))) {
-              System.setProperty("QASE_RUN_NAME", "Automation run " +
-                   new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()));
+                System.setProperty("QASE_RUN_NAME", "Automation run " +
+                        new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()));
             }
         }
     }
 
+    private final ApiClient apiClient = QaseClient.getApiClient();
+    private final ResultsApi resultsApi = new ResultsApi(apiClient);
+    private final Map<TestIdentifier, Long> testStartTimes = new ConcurrentHashMap<>();
+
     @Override
     public void executionStarted(TestIdentifier testIdentifier) {
         if (QaseClient.isEnabled() && testIdentifier.isTest()) {

+ 1 - 1
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseIoUtils/TestCaseGenerator.java

@@ -23,9 +23,9 @@ import static io.qase.api.QaseClient.getConfig;
 @Slf4j
 public class TestCaseGenerator {
 
-    public static boolean FAILED = false;
     private static final ApiClient apiClient = QaseClient.getApiClient();
     private static final CasesApi casesApi = new CasesApi(apiClient);
+    public static boolean FAILED = false;
 
     @SneakyThrows
     public static void createTestCaseIfNotExists(Method testMethod) {

+ 135 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/BaseTest.java

@@ -0,0 +1,135 @@
+package com.provectus.kafka.ui;
+
+import com.codeborne.selenide.Condition;
+import com.codeborne.selenide.Selenide;
+import com.codeborne.selenide.SelenideElement;
+import com.codeborne.selenide.WebDriverRunner;
+import com.provectus.kafka.ui.settings.listeners.AllureListener;
+import com.provectus.kafka.ui.settings.listeners.LoggerListener;
+import io.qase.api.annotation.Step;
+import lombok.extern.slf4j.Slf4j;
+import org.openqa.selenium.Dimension;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.remote.RemoteWebDriver;
+import org.testcontainers.Testcontainers;
+import org.testcontainers.containers.BrowserWebDriverContainer;
+import org.testcontainers.containers.output.Slf4jLogConsumer;
+import org.testcontainers.utility.DockerImageName;
+import org.testng.annotations.*;
+import org.testng.asserts.SoftAssert;
+
+import java.time.Duration;
+import java.util.List;
+
+import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.TOPICS;
+import static com.provectus.kafka.ui.settings.BaseSource.*;
+import static com.provectus.kafka.ui.settings.configs.Profiles.CONTAINER;
+import static com.provectus.kafka.ui.settings.configs.Profiles.LOCAL;
+import static com.provectus.kafka.ui.settings.drivers.LocalWebDriver.*;
+
+@Slf4j
+@Listeners({AllureListener.class, LoggerListener.class})
+public abstract class BaseTest extends Facade {
+
+    private static final String SELENIUM_IMAGE_NAME = "selenium/standalone-chrome:103.0";
+    private static final String SELENIARM_STANDALONE_CHROMIUM = "seleniarm/standalone-chromium:103.0";
+    protected static BrowserWebDriverContainer<?> webDriverContainer = null;
+
+    private static boolean isARM64() {
+        return System.getProperty("os.arch").equals("aarch64");
+    }
+
+    @BeforeSuite(alwaysRun = true)
+    public void beforeSuite() {
+        switch (BROWSER) {
+            case (CONTAINER) -> {
+                DockerImageName image = isARM64()
+                        ? DockerImageName.parse(SELENIARM_STANDALONE_CHROMIUM).asCompatibleSubstituteFor(SELENIUM_IMAGE_NAME)
+                        : DockerImageName.parse(SELENIUM_IMAGE_NAME);
+                log.info("Using [{}] as image name for chrome", image.getUnversionedPart());
+                webDriverContainer = new BrowserWebDriverContainer<>(image)
+                        .withEnv("JAVA_OPTS", "-Dwebdriver.chrome.whitelistedIps=")
+                        .withStartupTimeout(Duration.ofSeconds(180))
+                        .withCapabilities(new ChromeOptions()
+                                .addArguments("--disable-dev-shm-usage")
+                                .addArguments("--disable-gpu")
+                                .addArguments("--no-sandbox")
+                                .addArguments("--verbose")
+                                .addArguments("--lang=es")
+                        )
+                        .withLogConsumer(new Slf4jLogConsumer(log).withPrefix("[CHROME]: "));
+                try {
+                    Testcontainers.exposeHostPorts(8080);
+                    log.info("Starting browser container");
+                    webDriverContainer.start();
+                } catch (Throwable e) {
+                    log.error("Couldn't start a container", e);
+                }
+            }
+            case (LOCAL) -> loggerSetup();
+            default -> throw new IllegalStateException("Unexpected value: " + BROWSER);
+        }
+    }
+
+    @AfterSuite(alwaysRun = true)
+    public void afterSuite() {
+        switch (BROWSER) {
+            case (CONTAINER) -> {
+                if (webDriverContainer.isRunning()) {
+                    webDriverContainer.close();
+                    webDriverContainer.stop();
+                }
+            }
+            case (LOCAL) -> browserQuit();
+            default -> throw new IllegalStateException("Unexpected value: " + BROWSER);
+        }
+    }
+
+    @BeforeMethod(alwaysRun = true)
+    public void beforeMethod() {
+        switch (BROWSER) {
+            case (CONTAINER) -> {
+                RemoteWebDriver remoteWebDriver = webDriverContainer.getWebDriver();
+                WebDriverRunner.setWebDriver(remoteWebDriver);
+                remoteWebDriver.manage()
+                        .window().setSize(new Dimension(1440, 1024));
+                Selenide.open(BASE_CONTAINER_URL);
+            }
+            case (LOCAL) -> openUrl(BASE_LOCAL_URL);
+            default -> throw new IllegalStateException("Unexpected value: " + BROWSER);
+        }
+        naviSideBar.waitUntilScreenReady();
+    }
+
+    @AfterMethod(alwaysRun = true)
+    public void afterMethod() {
+        browserClear();
+    }
+
+    @Step
+    protected void navigateToTopics() {
+        naviSideBar
+                .openSideMenu(TOPICS);
+        topicsList
+                .waitUntilScreenReady();
+    }
+
+    @Step
+    protected void navigateToTopicsAndOpenDetails(String topicName) {
+        naviSideBar
+                .openSideMenu(TOPICS);
+        topicsList
+                .waitUntilScreenReady()
+                .openTopic(topicName);
+        topicDetails
+                .waitUntilScreenReady();
+    }
+
+    @Step
+    protected void verifyElementsCondition(List<SelenideElement> elementList, Condition expectedCondition) {
+        SoftAssert softly = new SoftAssert();
+        elementList.forEach(element -> softly.assertTrue(element.is(expectedCondition),
+                element.getSearchCriteria() + " is " + expectedCondition));
+        softly.assertAll();
+    }
+}

+ 12 - 17
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/base/Facade.java → kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/Facade.java

@@ -1,25 +1,21 @@
-package com.provectus.kafka.ui.base;
+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.brokers.BrokersConfigTab;
 import com.provectus.kafka.ui.pages.brokers.BrokersDetails;
 import com.provectus.kafka.ui.pages.brokers.BrokersList;
-import com.provectus.kafka.ui.pages.connector.ConnectorCreateForm;
-import com.provectus.kafka.ui.pages.connector.ConnectorDetails;
-import com.provectus.kafka.ui.pages.connector.KafkaConnectList;
-import com.provectus.kafka.ui.pages.consumer.ConsumersDetails;
-import com.provectus.kafka.ui.pages.consumer.ConsumersList;
-import com.provectus.kafka.ui.pages.ksqldb.KsqlDbList;
-import com.provectus.kafka.ui.pages.ksqldb.KsqlQueryForm;
-import com.provectus.kafka.ui.pages.schema.SchemaCreateForm;
-import com.provectus.kafka.ui.pages.schema.SchemaDetails;
-import com.provectus.kafka.ui.pages.schema.SchemaRegistryList;
-import com.provectus.kafka.ui.pages.topic.ProduceMessagePanel;
-import com.provectus.kafka.ui.pages.topic.TopicCreateEditForm;
-import com.provectus.kafka.ui.pages.topic.TopicDetails;
-import com.provectus.kafka.ui.pages.topic.TopicSettingsTab;
-import com.provectus.kafka.ui.pages.topic.TopicsList;
+import com.provectus.kafka.ui.pages.connectors.ConnectorCreateForm;
+import com.provectus.kafka.ui.pages.connectors.ConnectorDetails;
+import com.provectus.kafka.ui.pages.connectors.KafkaConnectList;
+import com.provectus.kafka.ui.pages.consumers.ConsumersDetails;
+import com.provectus.kafka.ui.pages.consumers.ConsumersList;
+import com.provectus.kafka.ui.pages.ksqlDb.KsqlDbList;
+import com.provectus.kafka.ui.pages.ksqlDb.KsqlQueryForm;
+import com.provectus.kafka.ui.pages.schemas.SchemaCreateForm;
+import com.provectus.kafka.ui.pages.schemas.SchemaDetails;
+import com.provectus.kafka.ui.pages.schemas.SchemaRegistryList;
+import com.provectus.kafka.ui.pages.topics.*;
 import com.provectus.kafka.ui.services.ApiService;
 
 public abstract class Facade {
@@ -44,5 +40,4 @@ public abstract class Facade {
     protected TopicSettingsTab topicSettingsTab = new TopicSettingsTab();
     protected KsqlQueryForm ksqlQueryForm = new KsqlQueryForm();
     protected KsqlDbList ksqlDbList = new KsqlDbList();
-
 }

+ 0 - 142
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/base/BaseTest.java

@@ -1,142 +0,0 @@
-package com.provectus.kafka.ui.base;
-
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.TOPICS;
-import static com.provectus.kafka.ui.settings.BaseSource.BASE_CONTAINER_URL;
-import static com.provectus.kafka.ui.settings.BaseSource.BASE_LOCAL_URL;
-import static com.provectus.kafka.ui.settings.BaseSource.BROWSER;
-import static com.provectus.kafka.ui.settings.configs.Profiles.CONTAINER;
-import static com.provectus.kafka.ui.settings.configs.Profiles.LOCAL;
-import static com.provectus.kafka.ui.settings.drivers.LocalWebDriver.browserClear;
-import static com.provectus.kafka.ui.settings.drivers.LocalWebDriver.browserQuit;
-import static com.provectus.kafka.ui.settings.drivers.LocalWebDriver.loggerSetup;
-import static com.provectus.kafka.ui.settings.drivers.LocalWebDriver.openUrl;
-
-import com.codeborne.selenide.Condition;
-import com.codeborne.selenide.Selenide;
-import com.codeborne.selenide.SelenideElement;
-import com.codeborne.selenide.WebDriverRunner;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.DisplayNameGenerator;
-import io.qase.api.annotation.Step;
-import java.time.Duration;
-import java.util.List;
-import lombok.extern.slf4j.Slf4j;
-import org.assertj.core.api.SoftAssertions;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayNameGeneration;
-import org.openqa.selenium.Dimension;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.remote.RemoteWebDriver;
-import org.testcontainers.Testcontainers;
-import org.testcontainers.containers.BrowserWebDriverContainer;
-import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.utility.DockerImageName;
-
-@Slf4j
-@DisplayNameGeneration(DisplayNameGenerator.class)
-public abstract class BaseTest extends Facade {
-
-  private static final String SELENIUM_IMAGE_NAME = "selenium/standalone-chrome:103.0";
-  private static final String SELENIARM_STANDALONE_CHROMIUM = "seleniarm/standalone-chromium:103.0";
-  protected static BrowserWebDriverContainer<?> webDriverContainer = null;
-
-  private static boolean isARM64() {
-    return System.getProperty("os.arch").equals("aarch64");
-  }
-
-  @BeforeAll
-  public static void start() {
-    switch (BROWSER) {
-      case (CONTAINER) -> {
-        DockerImageName image = isARM64()
-            ? DockerImageName.parse(SELENIARM_STANDALONE_CHROMIUM).asCompatibleSubstituteFor(SELENIUM_IMAGE_NAME)
-            : DockerImageName.parse(SELENIUM_IMAGE_NAME);
-        log.info("Using [{}] as image name for chrome", image.getUnversionedPart());
-        webDriverContainer = new BrowserWebDriverContainer<>(image)
-            .withEnv("JAVA_OPTS", "-Dwebdriver.chrome.whitelistedIps=")
-            .withStartupTimeout(Duration.ofSeconds(180))
-            .withCapabilities(new ChromeOptions()
-                .addArguments("--disable-dev-shm-usage")
-                .addArguments("--disable-gpu")
-                .addArguments("--no-sandbox")
-                .addArguments("--verbose")
-                .addArguments("--lang=es")
-            )
-            .withLogConsumer(new Slf4jLogConsumer(log).withPrefix("[CHROME]: "));
-        try {
-          Testcontainers.exposeHostPorts(8080);
-          log.info("Starting browser container");
-          webDriverContainer.start();
-        } catch (Throwable e) {
-          log.error("Couldn't start a container", e);
-        }
-      }
-      case (LOCAL) -> loggerSetup();
-      default -> throw new IllegalStateException("Unexpected value: " + BROWSER);
-    }
-  }
-
-  @AfterAll
-  public static void tearDown() {
-    switch (BROWSER) {
-      case (CONTAINER) -> {
-        if (webDriverContainer.isRunning()) {
-          webDriverContainer.close();
-          webDriverContainer.stop();
-        }
-      }
-      case (LOCAL) -> browserQuit();
-      default -> throw new IllegalStateException("Unexpected value: " + BROWSER);
-    }
-  }
-
-  @BeforeEach
-  public void beforeMethod() {
-    switch (BROWSER) {
-      case (CONTAINER) -> {
-        RemoteWebDriver remoteWebDriver = webDriverContainer.getWebDriver();
-        WebDriverRunner.setWebDriver(remoteWebDriver);
-        remoteWebDriver.manage()
-            .window().setSize(new Dimension(1440, 1024));
-        Selenide.open(BASE_CONTAINER_URL);
-      }
-      case (LOCAL) -> openUrl(BASE_LOCAL_URL);
-      default -> throw new IllegalStateException("Unexpected value: " + BROWSER);
-    }
-    naviSideBar.waitUntilScreenReady();
-  }
-
-  @AfterEach
-  public void afterMethod() {
-    browserClear();
-  }
-
-  @Step
-  protected void navigateToTopics() {
-    naviSideBar
-        .openSideMenu(TOPICS);
-    topicsList
-        .waitUntilScreenReady();
-  }
-
-  @Step
-  protected void navigateToTopicsAndOpenDetails(String topicName){
-    naviSideBar
-        .openSideMenu(TOPICS);
-    topicsList
-        .waitUntilScreenReady()
-        .openTopic(topicName);
-    topicDetails
-        .waitUntilScreenReady();
-  }
-
-  @Step
-  protected void verifyElementsCondition(List<SelenideElement> elementList, Condition expectedCondition) {
-    SoftAssertions softly = new SoftAssertions();
-    elementList.forEach(element -> softly.assertThat(element.is(expectedCondition))
-        .as(element.getSearchCriteria() + " is " + expectedCondition).isTrue());
-    softly.assertAll();
-  }
-}

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

@@ -0,0 +1,26 @@
+package com.provectus.kafka.ui.smokeSuite;
+
+import com.codeborne.selenide.Condition;
+import com.provectus.kafka.ui.BaseTest;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import io.qase.api.annotation.CaseId;
+import org.testng.annotations.Test;
+
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class SmokeTest extends BaseTest {
+
+    @Test
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(198)
+    public void checkBasePageElements() {
+        verifyElementsCondition(
+                Stream.concat(topPanel.getAllVisibleElements().stream(), naviSideBar.getAllMenuButtons().stream())
+                        .collect(Collectors.toList()), Condition.visible);
+        verifyElementsCondition(
+                Stream.concat(topPanel.getAllEnabledElements().stream(), naviSideBar.getAllMenuButtons().stream())
+                        .collect(Collectors.toList()), Condition.enabled);
+    }
+}

+ 61 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/brokers/BrokersTest.java

@@ -0,0 +1,61 @@
+package com.provectus.kafka.ui.smokeSuite.brokers;
+
+import com.codeborne.selenide.Condition;
+import com.provectus.kafka.ui.BaseTest;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import io.qameta.allure.Step;
+import io.qase.api.annotation.CaseId;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.BROKERS;
+import static com.provectus.kafka.ui.pages.brokers.BrokersDetails.DetailsTab.CONFIGS;
+
+public class BrokersTest extends BaseTest {
+
+    private static final String SUITE_TITLE = "Brokers";
+    private static final long SUITE_ID = 1;
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(1)
+    @Test
+    public void checkBrokersOverview() {
+        navigateToBrokers();
+        Assert.assertTrue(brokersList.getAllBrokers().size() > 0, "getAllBrokers()");
+        verifyElementsCondition(brokersList.getAllVisibleElements(), Condition.visible);
+        verifyElementsCondition(brokersList.getAllEnabledElements(), Condition.enabled);
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(85)
+    @Test
+    public void checkExistingBrokersInCluster() {
+        navigateToBrokers();
+        Assert.assertTrue(brokersList.getAllBrokers().size() > 0, "getAllBrokers()");
+        brokersList
+                .openBroker(1);
+        brokersDetails
+                .waitUntilScreenReady();
+        verifyElementsCondition(brokersDetails.getAllVisibleElements(), Condition.visible);
+        verifyElementsCondition(brokersDetails.getAllEnabledElements(), Condition.enabled);
+        brokersDetails
+                .openDetailsTab(CONFIGS);
+        brokersConfigTab
+                .waitUntilScreenReady();
+        verifyElementsCondition(brokersConfigTab.getColumnHeaders(), Condition.visible);
+        verifyElementsCondition(brokersConfigTab.getEditButtons(), Condition.enabled);
+        Assert.assertTrue(brokersConfigTab.isSearchByKeyVisible(), "isSearchByKeyVisible()");
+    }
+
+    @Step
+    private void navigateToBrokers() {
+        naviSideBar
+                .openSideMenu(BROKERS);
+        brokersList
+                .waitUntilScreenReady();
+    }
+}

+ 48 - 52
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/connectors/ConnectorsTests.java → kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/connectors/ConnectorsTest.java

@@ -1,11 +1,6 @@
-package com.provectus.kafka.ui.suite.connectors;
+package com.provectus.kafka.ui.smokeSuite.connectors;
 
-import static com.provectus.kafka.ui.pages.BasePage.AlertHeader.SUCCESS;
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.KAFKA_CONNECT;
-import static com.provectus.kafka.ui.utilities.FileUtils.getResourceAsString;
-import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
-
-import com.provectus.kafka.ui.base.BaseTest;
+import com.provectus.kafka.ui.BaseTest;
 import com.provectus.kafka.ui.models.Connector;
 import com.provectus.kafka.ui.models.Topic;
 import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
@@ -13,17 +8,21 @@ import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
 import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
 import io.qameta.allure.Step;
 import io.qase.api.annotation.CaseId;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
 import java.util.ArrayList;
 import java.util.List;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInstance;
 
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-public class ConnectorsTests extends BaseTest {
+import static com.provectus.kafka.ui.pages.BasePage.AlertHeader.SUCCESS;
+import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.KAFKA_CONNECT;
+import static com.provectus.kafka.ui.utilities.FileUtils.getResourceAsString;
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+
+public class ConnectorsTest extends BaseTest {
+
     private static final long SUITE_ID = 10;
     private static final String SUITE_TITLE = "Kafka Connect";
     private static final String CONNECT_NAME = "first";
@@ -47,19 +46,18 @@ public class ConnectorsTests extends BaseTest {
             .setName("sink_postgres_activities_e2e_checks_for_update-" + randomAlphabetic(5))
             .setConfig(getResourceAsString("config_for_create_connector_via_api.json"));
 
-    @BeforeAll
-    public void beforeAll() {
-      TOPIC_LIST.addAll(List.of(TOPIC_FOR_CREATE, TOPIC_FOR_DELETE, TOPIC_FOR_UPDATE));
-      TOPIC_LIST.forEach(topic -> apiService
-          .createTopic(topic.getName())
-          .sendMessage(topic)
-      );
-      CONNECTOR_LIST.addAll(List.of(CONNECTOR_FOR_DELETE, CONNECTOR_FOR_UPDATE));
-      CONNECTOR_LIST.forEach(connector -> apiService
-          .createConnector(CONNECT_NAME, connector));
+    @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())
+                .sendMessage(topic)
+        );
+        CONNECTOR_LIST.addAll(List.of(CONNECTOR_FOR_DELETE, CONNECTOR_FOR_UPDATE));
+        CONNECTOR_LIST.forEach(connector -> apiService
+                .createConnector(CONNECT_NAME, connector));
     }
 
-    @DisplayName("should create a connector")
     @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
     @AutomationStatus(status = Status.AUTOMATED)
     @CaseId(42)
@@ -69,7 +67,7 @@ public class ConnectorsTests extends BaseTest {
                 .setName("sink_postgres_activities_e2e_checks-" + randomAlphabetic(5))
                 .setConfig(getResourceAsString("config_for_create_connector.json"));
         navigateToConnectors();
-      kafkaConnectList
+        kafkaConnectList
                 .clickCreateConnectorBtn();
         connectorCreateForm
                 .waitUntilScreenReady()
@@ -78,65 +76,63 @@ public class ConnectorsTests extends BaseTest {
         connectorDetails
                 .waitUntilScreenReady();
         navigateToConnectorsAndOpenDetails(connectorForCreate.getName());
-        Assertions.assertTrue(connectorDetails.isConnectorHeaderVisible(connectorForCreate.getName()),"isConnectorTitleVisible()");
+        Assert.assertTrue(connectorDetails.isConnectorHeaderVisible(connectorForCreate.getName()), "isConnectorTitleVisible()");
         navigateToConnectors();
-        Assertions.assertTrue(kafkaConnectList.isConnectorVisible(CONNECTOR_FOR_DELETE.getName()), "isConnectorVisible()");
+        Assert.assertTrue(kafkaConnectList.isConnectorVisible(CONNECTOR_FOR_DELETE.getName()), "isConnectorVisible()");
         CONNECTOR_LIST.add(connectorForCreate);
     }
 
-    @DisplayName("should update a connector")
     @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
     @AutomationStatus(status = Status.AUTOMATED)
     @CaseId(196)
     @Test
     public void updateConnector() {
-      navigateToConnectorsAndOpenDetails(CONNECTOR_FOR_UPDATE.getName());
-      connectorDetails
+        navigateToConnectorsAndOpenDetails(CONNECTOR_FOR_UPDATE.getName());
+        connectorDetails
                 .openConfigTab()
                 .setConfig(CONNECTOR_FOR_UPDATE.getConfig())
                 .clickSubmitButton();
-        Assertions.assertTrue(connectorDetails.isAlertWithMessageVisible(SUCCESS,"Config successfully updated."),"isAlertWithMessageVisible()");
+        Assert.assertTrue(connectorDetails.isAlertWithMessageVisible(SUCCESS, "Config successfully updated."), "isAlertWithMessageVisible()");
         navigateToConnectors();
-        Assertions.assertTrue(kafkaConnectList.isConnectorVisible(CONNECTOR_FOR_UPDATE.getName()), "isConnectorVisible()");
+        Assert.assertTrue(kafkaConnectList.isConnectorVisible(CONNECTOR_FOR_UPDATE.getName()), "isConnectorVisible()");
     }
 
-    @DisplayName("should delete connector")
     @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
     @AutomationStatus(status = Status.AUTOMATED)
     @CaseId(195)
     @Test
     public void deleteConnector() {
-      navigateToConnectorsAndOpenDetails(CONNECTOR_FOR_DELETE.getName());
-      connectorDetails
+        navigateToConnectorsAndOpenDetails(CONNECTOR_FOR_DELETE.getName());
+        connectorDetails
                 .openDotMenu()
                 .clickDeleteBtn()
                 .clickConfirmBtn();
-      navigateToConnectors();
-        Assertions.assertFalse(kafkaConnectList.isConnectorVisible(CONNECTOR_FOR_DELETE.getName()), "isConnectorVisible()");
+        navigateToConnectors();
+        Assert.assertFalse(kafkaConnectList.isConnectorVisible(CONNECTOR_FOR_DELETE.getName()), "isConnectorVisible()");
         CONNECTOR_LIST.remove(CONNECTOR_FOR_DELETE);
     }
 
-    @AfterAll
-    public void afterAll() {
+    @AfterClass(alwaysRun = true)
+    public void afterClass() {
         CONNECTOR_LIST.forEach(connector ->
                 apiService.deleteConnector(CONNECT_NAME, connector.getName()));
         TOPIC_LIST.forEach(topic -> apiService.deleteTopic(topic.getName()));
     }
 
     @Step
-    private void navigateToConnectors(){
-      naviSideBar
-          .openSideMenu(KAFKA_CONNECT);
-      kafkaConnectList
-          .waitUntilScreenReady();
+    private void navigateToConnectors() {
+        naviSideBar
+                .openSideMenu(KAFKA_CONNECT);
+        kafkaConnectList
+                .waitUntilScreenReady();
     }
 
     @Step
-    private void navigateToConnectorsAndOpenDetails(String connectorName){
-      navigateToConnectors();
-      kafkaConnectList
-          .openConnector(connectorName);
-      connectorDetails
-          .waitUntilScreenReady();
+    private void navigateToConnectorsAndOpenDetails(String connectorName) {
+        navigateToConnectors();
+        kafkaConnectList
+                .openConnector(connectorName);
+        connectorDetails
+                .waitUntilScreenReady();
     }
 }

+ 58 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/ksqlDb/KsqlDbTest.java

@@ -0,0 +1,58 @@
+package com.provectus.kafka.ui.smokeSuite.ksqlDb;
+
+import com.provectus.kafka.ui.BaseTest;
+import com.provectus.kafka.ui.pages.ksqlDb.models.Stream;
+import com.provectus.kafka.ui.pages.ksqlDb.models.Table;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import io.qase.api.annotation.CaseId;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.testng.asserts.SoftAssert;
+
+import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.KSQL_DB;
+import static com.provectus.kafka.ui.pages.ksqlDb.enums.KsqlQueryConfig.SHOW_TABLES;
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+
+public class KsqlDbTest extends BaseTest {
+
+    private static final long SUITE_ID = 8;
+    private static final String SUITE_TITLE = "KSQL_DB";
+    private static final Stream STREAM_FOR_CHECKING_TABLES = new Stream()
+            .setName("STREAM_FOR_CHECKING_TABLES_" + randomAlphabetic(4).toUpperCase())
+            .setTopicName("TOPIC_FOR_STREAM_" + randomAlphabetic(4).toUpperCase());
+    private static final Table FIRST_TABLE = new Table()
+            .setName("FIRST_TABLE" + randomAlphabetic(4).toUpperCase())
+            .setStreamName(STREAM_FOR_CHECKING_TABLES.getName());
+    private static final Table SECOND_TABLE = new Table()
+            .setName("SECOND_TABLE" + randomAlphabetic(4).toUpperCase())
+            .setStreamName(STREAM_FOR_CHECKING_TABLES.getName());
+
+    @BeforeClass(alwaysRun = true)
+    public void beforeClass() {
+        apiService
+                .createStream(STREAM_FOR_CHECKING_TABLES)
+                .createTables(FIRST_TABLE, SECOND_TABLE);
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(41)
+    @Test
+    public void checkShowTablesRequestExecution() {
+        naviSideBar
+                .openSideMenu(KSQL_DB);
+        ksqlDbList
+                .waitUntilScreenReady()
+                .clickExecuteKsqlRequestBtn();
+        ksqlQueryForm
+                .waitUntilScreenReady()
+                .setQuery(SHOW_TABLES.getQuery())
+                .clickExecuteBtn();
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(ksqlQueryForm.getTableByName(FIRST_TABLE.getName()).isVisible(), "getTableName()");
+        softly.assertTrue(ksqlQueryForm.getTableByName(SECOND_TABLE.getName()).isVisible(), "getTableName()");
+        softly.assertAll();
+    }
+}

+ 229 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/schemas/SchemasTest.java

@@ -0,0 +1,229 @@
+package com.provectus.kafka.ui.smokeSuite.schemas;
+
+import com.codeborne.selenide.Condition;
+import com.provectus.kafka.ui.api.model.CompatibilityLevel;
+import com.provectus.kafka.ui.BaseTest;
+import com.provectus.kafka.ui.models.Schema;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import io.qameta.allure.Step;
+import io.qase.api.annotation.CaseId;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.testng.asserts.SoftAssert;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.SCHEMA_REGISTRY;
+import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
+
+public class SchemasTest extends BaseTest {
+
+    private static final long SUITE_ID = 11;
+    private static final String SUITE_TITLE = "Schema Registry";
+    private static final List<Schema> SCHEMA_LIST = new ArrayList<>();
+    private static final Schema AVRO_API = Schema.createSchemaAvro();
+    private static final Schema JSON_API = Schema.createSchemaJson();
+    private static final Schema PROTOBUF_API = Schema.createSchemaProtobuf();
+
+    @BeforeClass(alwaysRun = true)
+    public void beforeClass() {
+        SCHEMA_LIST.addAll(List.of(AVRO_API, JSON_API, PROTOBUF_API));
+        SCHEMA_LIST.forEach(schema -> apiService.createSchema(schema));
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(43)
+    @Test(priority = 1)
+    public void createSchemaAvro() {
+        Schema schemaAvro = Schema.createSchemaAvro();
+        navigateToSchemaRegistry();
+        schemaRegistryList
+                .clickCreateSchema();
+        schemaCreateForm
+                .setSubjectName(schemaAvro.getName())
+                .setSchemaField(fileToString(schemaAvro.getValuePath()))
+                .selectSchemaTypeFromDropdown(schemaAvro.getType())
+                .clickSubmitButton();
+        schemaDetails
+                .waitUntilScreenReady();
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(schemaDetails.isSchemaHeaderVisible(schemaAvro.getName()), "isSchemaHeaderVisible()");
+        softly.assertEquals(schemaDetails.getSchemaType(), schemaAvro.getType().getValue(), "getSchemaType()");
+        softly.assertEquals(schemaDetails.getCompatibility(), CompatibilityLevel.CompatibilityEnum.BACKWARD.getValue(),
+                "getCompatibility()");
+        softly.assertAll();
+        navigateToSchemaRegistry();
+        Assert.assertTrue(schemaRegistryList.isSchemaVisible(AVRO_API.getName()), "isSchemaVisible()");
+        SCHEMA_LIST.add(schemaAvro);
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(186)
+    @Test(priority = 2)
+    public void updateSchemaAvro() {
+        AVRO_API.setValuePath(System.getProperty("user.dir") + "/src/main/resources/testData/schema_avro_for_update.json");
+        navigateToSchemaRegistryAndOpenDetails(AVRO_API.getName());
+        schemaDetails
+                .openEditSchema();
+        schemaCreateForm
+                .waitUntilScreenReady();
+        verifyElementsCondition(schemaCreateForm.getAllDetailsPageElements(), Condition.visible);
+        SoftAssert softly = new SoftAssert();
+        softly.assertFalse(schemaCreateForm.isSubmitBtnEnabled(), "isSubmitBtnEnabled()");
+        softly.assertFalse(schemaCreateForm.isSchemaDropDownEnabled(), "isSchemaDropDownEnabled()");
+        softly.assertAll();
+        schemaCreateForm
+                .selectCompatibilityLevelFromDropdown(CompatibilityLevel.CompatibilityEnum.NONE)
+                .setNewSchemaValue(fileToString(AVRO_API.getValuePath()))
+                .clickSubmitButton();
+        schemaDetails
+                .waitUntilScreenReady();
+        Assert.assertEquals(CompatibilityLevel.CompatibilityEnum.NONE.toString(), schemaDetails.getCompatibility(), "getCompatibility()");
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(186)
+    @Test(priority = 3)
+    public void compareVersionsOperation() {
+        navigateToSchemaRegistryAndOpenDetails(AVRO_API.getName());
+        int latestVersion = schemaDetails
+                .waitUntilScreenReady()
+                .getLatestVersion();
+        schemaDetails
+                .openCompareVersionMenu();
+        int versionsNumberFromDdl = schemaCreateForm
+                .waitUntilScreenReady()
+                .openSchemaVersionDdl()
+                .getVersionsNumberFromList();
+        Assert.assertEquals(latestVersion, versionsNumberFromDdl, "Versions number is not matched");
+        schemaCreateForm
+                .selectVersionFromDropDown(1);
+        Assert.assertEquals(53, schemaCreateForm.getMarkedLinesNumber(), "getAllMarkedLines()");
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(187)
+    @Test(priority = 4)
+    public void deleteSchemaAvro() {
+        navigateToSchemaRegistryAndOpenDetails(AVRO_API.getName());
+        schemaDetails
+                .removeSchema();
+        schemaRegistryList
+                .waitUntilScreenReady();
+        Assert.assertFalse(schemaRegistryList.isSchemaVisible(AVRO_API.getName()), "isSchemaVisible()");
+        SCHEMA_LIST.remove(AVRO_API);
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(89)
+    @Test(priority = 5)
+    public void createSchemaJson() {
+        Schema schemaJson = Schema.createSchemaJson();
+        navigateToSchemaRegistry();
+        schemaRegistryList
+                .clickCreateSchema();
+        schemaCreateForm
+                .setSubjectName(schemaJson.getName())
+                .setSchemaField(fileToString(schemaJson.getValuePath()))
+                .selectSchemaTypeFromDropdown(schemaJson.getType())
+                .clickSubmitButton();
+        schemaDetails
+                .waitUntilScreenReady();
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(schemaDetails.isSchemaHeaderVisible(schemaJson.getName()), "isSchemaHeaderVisible()");
+        softly.assertEquals(schemaDetails.getSchemaType(), schemaJson.getType().getValue(), "getSchemaType()");
+        softly.assertEquals(schemaDetails.getCompatibility(), CompatibilityLevel.CompatibilityEnum.BACKWARD.getValue(),
+                "getCompatibility()");
+        softly.assertAll();
+        navigateToSchemaRegistry();
+        Assert.assertTrue(schemaRegistryList.isSchemaVisible(JSON_API.getName()), "isSchemaVisible()");
+        SCHEMA_LIST.add(schemaJson);
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(189)
+    @Test(priority = 6)
+    public void deleteSchemaJson() {
+        navigateToSchemaRegistryAndOpenDetails(JSON_API.getName());
+        schemaDetails
+                .removeSchema();
+        schemaRegistryList
+                .waitUntilScreenReady();
+        Assert.assertFalse(schemaRegistryList.isSchemaVisible(JSON_API.getName()), "isSchemaVisible()");
+        SCHEMA_LIST.remove(JSON_API);
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(91)
+    @Test(priority = 7)
+    public void createSchemaProtobuf() {
+        Schema schemaProtobuf = Schema.createSchemaProtobuf();
+        navigateToSchemaRegistry();
+        schemaRegistryList
+                .clickCreateSchema();
+        schemaCreateForm
+                .setSubjectName(schemaProtobuf.getName())
+                .setSchemaField(fileToString(schemaProtobuf.getValuePath()))
+                .selectSchemaTypeFromDropdown(schemaProtobuf.getType())
+                .clickSubmitButton();
+        schemaDetails
+                .waitUntilScreenReady();
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(schemaDetails.isSchemaHeaderVisible(schemaProtobuf.getName()), "isSchemaHeaderVisible()");
+        softly.assertEquals(schemaDetails.getSchemaType(), schemaProtobuf.getType().getValue(), "getSchemaType()");
+        softly.assertEquals(schemaDetails.getCompatibility(), CompatibilityLevel.CompatibilityEnum.BACKWARD.getValue(),
+                "getCompatibility()");
+        softly.assertAll();
+        navigateToSchemaRegistry();
+        Assert.assertTrue(schemaRegistryList.isSchemaVisible(PROTOBUF_API.getName()), "isSchemaVisible()");
+        SCHEMA_LIST.add(schemaProtobuf);
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(223)
+    @Test(priority = 8)
+    public void deleteSchemaProtobuf() {
+        navigateToSchemaRegistryAndOpenDetails(PROTOBUF_API.getName());
+        schemaDetails
+                .removeSchema();
+        schemaRegistryList
+                .waitUntilScreenReady();
+        Assert.assertFalse(schemaRegistryList.isSchemaVisible(PROTOBUF_API.getName()), "isSchemaVisible()");
+        SCHEMA_LIST.remove(PROTOBUF_API);
+    }
+
+    @AfterClass(alwaysRun = true)
+    public void afterClass() {
+        SCHEMA_LIST.forEach(schema -> apiService.deleteSchema(schema.getName()));
+    }
+
+    @Step
+    private void navigateToSchemaRegistry() {
+        naviSideBar
+                .openSideMenu(SCHEMA_REGISTRY);
+        schemaRegistryList
+                .waitUntilScreenReady();
+    }
+
+    @Step
+    private void navigateToSchemaRegistryAndOpenDetails(String schemaName) {
+        navigateToSchemaRegistry();
+        schemaRegistryList
+                .openSchema(schemaName);
+        schemaDetails
+                .waitUntilScreenReady();
+    }
+}

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

@@ -0,0 +1,292 @@
+package com.provectus.kafka.ui.smokeSuite.topics;
+
+import com.provectus.kafka.ui.BaseTest;
+import com.provectus.kafka.ui.models.Topic;
+import com.provectus.kafka.ui.pages.topics.TopicDetails;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import io.qameta.allure.Issue;
+import io.qase.api.annotation.CaseId;
+import io.qase.api.annotation.Step;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Ignore;
+import org.testng.annotations.Test;
+import org.testng.asserts.SoftAssert;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.IntStream;
+
+import static com.provectus.kafka.ui.pages.BasePage.AlertHeader.SUCCESS;
+import static com.provectus.kafka.ui.pages.topics.TopicDetails.TopicMenu.MESSAGES;
+import static com.provectus.kafka.ui.pages.topics.TopicDetails.TopicMenu.OVERVIEW;
+import static com.provectus.kafka.ui.utilities.TimeUtils.waitUntilNewMinuteStarted;
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+
+public class MessagesTest extends BaseTest {
+
+    private static final long SUITE_ID = 2;
+    private static final String SUITE_TITLE = "Topics";
+    private static final Topic TOPIC_FOR_MESSAGES = new Topic()
+            .setName("topic-with-clean-message-attribute-" + randomAlphabetic(5))
+            .setMessageKey(randomAlphabetic(5))
+            .setMessageContent(randomAlphabetic(10));
+    private static final Topic TOPIC_TO_CLEAR_AND_PURGE_MESSAGES = new Topic()
+            .setName("topic-to-clear-and-purge-messages-attribute-" + randomAlphabetic(5))
+            .setMessageKey(randomAlphabetic(5))
+            .setMessageContent(randomAlphabetic(10));
+    private static final Topic TOPIC_FOR_CHECKING_FILTERS = new Topic()
+            .setName("topic-for-checking-filters-" + randomAlphabetic(5))
+            .setMessageKey(randomAlphabetic(5))
+            .setMessageContent(randomAlphabetic(10));
+    private static final Topic TOPIC_TO_RECREATE = new Topic()
+            .setName("topic-to-recreate-attribute-" + randomAlphabetic(5))
+            .setMessageKey(randomAlphabetic(5))
+            .setMessageContent(randomAlphabetic(10));
+    private static final List<Topic> TOPIC_LIST = new ArrayList<>();
+
+    @BeforeClass(alwaysRun = true)
+    public void beforeClass() {
+        TOPIC_LIST.addAll(List.of(TOPIC_FOR_MESSAGES, TOPIC_FOR_CHECKING_FILTERS, TOPIC_TO_CLEAR_AND_PURGE_MESSAGES,
+                TOPIC_TO_RECREATE));
+        TOPIC_LIST.forEach(topic -> apiService.createTopic(topic.getName()));
+        IntStream.range(1, 3).forEach(i -> apiService.sendMessage(TOPIC_FOR_CHECKING_FILTERS));
+        waitUntilNewMinuteStarted();
+        IntStream.range(1, 3).forEach(i -> apiService.sendMessage(TOPIC_FOR_CHECKING_FILTERS));
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(222)
+    @Test(priority = 1)
+    public void produceMessage() {
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_MESSAGES.getName());
+        topicDetails
+                .openDetailsTab(MESSAGES);
+        produceMessage(TOPIC_FOR_MESSAGES);
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(topicDetails.isKeyMessageVisible((TOPIC_FOR_MESSAGES.getMessageKey())),
+                "isKeyMessageVisible()");
+        softly.assertTrue(topicDetails.isContentMessageVisible((TOPIC_FOR_MESSAGES.getMessageContent()).trim()),
+                "isContentMessageVisible()");
+        softly.assertAll();
+    }
+
+    @Ignore
+    @Issue("https://github.com/provectus/kafka-ui/issues/2778")
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(19)
+    @Test(priority = 2)
+    public void clearMessage() {
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_MESSAGES.getName());
+        topicDetails
+                .openDetailsTab(OVERVIEW);
+        int messageAmount = topicDetails.getMessageCountAmount();
+        produceMessage(TOPIC_FOR_MESSAGES);
+        Assert.assertEquals(messageAmount + 1, topicDetails.getMessageCountAmount(), "getMessageCountAmount()");
+        topicDetails
+                .openDotMenu()
+                .clickClearMessagesMenu()
+                .waitUntilScreenReady();
+        Assert.assertEquals(0, topicDetails.getMessageCountAmount(), "getMessageCountAmount()");
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(239)
+    @Test(priority = 3)
+    public void checkClearTopicMessage() {
+        navigateToTopicsAndOpenDetails(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName());
+        topicDetails
+                .openDetailsTab(OVERVIEW);
+        produceMessage(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES);
+        navigateToTopics();
+        Assert.assertEquals(topicsList.getTopicItem(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName()).getNumberOfMessages(), 1,
+                "getNumberOfMessages()");
+        topicsList
+                .openDotMenuByTopicName(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName())
+                .clickClearMessagesBtn()
+                .clickConfirmBtnMdl();
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(topicsList.isAlertWithMessageVisible(SUCCESS,
+                        String.format("%s messages have been successfully cleared!", TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName())),
+                "isAlertWithMessageVisible()");
+        softly.assertEquals(topicsList.getTopicItem(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName()).getNumberOfMessages(), 0,
+                "getNumberOfMessages()");
+        softly.assertAll();
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(10)
+    @Test(priority = 4)
+    public void checkPurgeMessagePossibility() {
+        navigateToTopics();
+        int messageAmount = topicsList.getTopicItem(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName()).getNumberOfMessages();
+        topicsList
+                .openTopic(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName());
+        topicDetails
+                .openDetailsTab(OVERVIEW);
+        produceMessage(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES);
+        navigateToTopics();
+        Assert.assertEquals(topicsList.getTopicItem(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName()).getNumberOfMessages(),
+                messageAmount + 1, "getNumberOfMessages()");
+        topicsList
+                .getTopicItem(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName())
+                .selectItem(true)
+                .clickPurgeMessagesOfSelectedTopicsBtn();
+        Assert.assertTrue(topicsList.isConfirmationMdlVisible(), "isConfirmationMdlVisible()");
+        topicsList
+                .clickCancelBtnMdl()
+                .clickPurgeMessagesOfSelectedTopicsBtn()
+                .clickConfirmBtnMdl();
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(topicsList.isAlertWithMessageVisible(SUCCESS,
+                        String.format("%s messages have been successfully cleared!", TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName())),
+                "isAlertWithMessageVisible()");
+        softly.assertEquals(topicsList.getTopicItem(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName()).getNumberOfMessages(), 0,
+                "getNumberOfMessages()");
+        softly.assertAll();
+    }
+
+    @Ignore
+    @Issue("https://github.com/provectus/kafka-ui/issues/2819")
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(21)
+    @Test(priority = 5)
+    public void copyMessageFromTopicProfile() {
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECKING_FILTERS.getName());
+        topicDetails
+                .openDetailsTab(MESSAGES)
+                .getRandomMessage()
+                .openDotMenu()
+                .clickCopyToClipBoard();
+        Assert.assertTrue(topicDetails.isAlertWithMessageVisible(SUCCESS, "Copied successfully!"),
+                "isAlertWithMessageVisible()");
+    }
+
+    @Ignore
+    @Issue("https://github.com/provectus/kafka-ui/issues/2394")
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(15)
+    @Test(priority = 6)
+    public void checkingMessageFilteringByOffset() {
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECKING_FILTERS.getName());
+        topicDetails
+                .openDetailsTab(MESSAGES);
+        TopicDetails.MessageGridItem secondMessage = topicDetails.getMessageByOffset(1);
+        topicDetails
+                .selectSeekTypeDdlMessagesTab("Offset")
+                .setSeekTypeValueFldMessagesTab(String.valueOf(secondMessage.getOffset()))
+                .clickSubmitFiltersBtnMessagesTab();
+        SoftAssert softly = new SoftAssert();
+        topicDetails.getAllMessages().forEach(message ->
+                softly.assertTrue(message.getOffset() == secondMessage.getOffset()
+                                || message.getOffset() > secondMessage.getOffset(),
+                        String.format("Expected offset is: %s, but found: %s", secondMessage.getOffset(), message.getOffset())));
+        softly.assertAll();
+    }
+
+    @Ignore
+    @Issue("https://github.com/provectus/kafka-ui/issues/3215")
+    @Issue("https://github.com/provectus/kafka-ui/issues/2345")
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(16)
+    @Test(priority = 7)
+    public void checkingMessageFilteringByTimestamp() {
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECKING_FILTERS.getName());
+        topicDetails
+                .openDetailsTab(MESSAGES);
+        LocalDateTime firstTimestamp = topicDetails.getMessageByOffset(0).getTimestamp();
+        List<TopicDetails.MessageGridItem> nextMessages = topicDetails.getAllMessages().stream()
+                .filter(message -> message.getTimestamp().getMinute() != firstTimestamp.getMinute())
+                .toList();
+        LocalDateTime nextTimestamp = Objects.requireNonNull(nextMessages.stream()
+                .findFirst().orElseThrow()).getTimestamp();
+        topicDetails
+                .selectSeekTypeDdlMessagesTab("Timestamp")
+                .openCalendarSeekType()
+                .selectDateAndTimeByCalendar(nextTimestamp)
+                .clickSubmitFiltersBtnMessagesTab();
+        SoftAssert softly = new SoftAssert();
+        topicDetails.getAllMessages().forEach(message ->
+                softly.assertTrue(message.getTimestamp().isEqual(nextTimestamp)
+                                || message.getTimestamp().isAfter(nextTimestamp),
+                        String.format("Expected timestamp is: %s, but found: %s", nextTimestamp, message.getTimestamp())));
+        softly.assertAll();
+    }
+
+    @Ignore
+    @Issue("https://github.com/provectus/kafka-ui/issues/2778")
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(246)
+    @Test(priority = 8)
+    public void checkClearTopicMessageFromOverviewTab() {
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECKING_FILTERS.getName());
+        topicDetails
+                .openDetailsTab(OVERVIEW)
+                .openDotMenu()
+                .clickClearMessagesMenu()
+                .clickConfirmBtnMdl();
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(topicDetails.isAlertWithMessageVisible(SUCCESS,
+                        String.format("%s messages have been successfully cleared!", TOPIC_FOR_CHECKING_FILTERS.getName())),
+                "isAlertWithMessageVisible()");
+        softly.assertEquals(topicDetails.getMessageCountAmount(), 0,
+                "getMessageCountAmount()= " + topicDetails.getMessageCountAmount());
+        softly.assertAll();
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(240)
+    @Test(priority = 9)
+    public void checkRecreateTopic() {
+        navigateToTopicsAndOpenDetails(TOPIC_TO_RECREATE.getName());
+        topicDetails
+                .openDetailsTab(OVERVIEW);
+        produceMessage(TOPIC_TO_RECREATE);
+        navigateToTopics();
+        Assert.assertEquals(topicsList.getTopicItem(TOPIC_TO_RECREATE.getName()).getNumberOfMessages(), 1,
+                "getNumberOfMessages()");
+        topicsList
+                .openDotMenuByTopicName(TOPIC_TO_RECREATE.getName())
+                .clickRecreateTopicBtn()
+                .clickConfirmBtnMdl();
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(topicDetails.isAlertWithMessageVisible(SUCCESS,
+                        String.format("Topic %s successfully recreated!", TOPIC_TO_RECREATE.getName())),
+                "isAlertWithMessageVisible()");
+        softly.assertEquals(topicsList.getTopicItem(TOPIC_TO_RECREATE.getName()).getNumberOfMessages(), 0,
+                "getNumberOfMessages()");
+        softly.assertAll();
+    }
+
+    @Step
+    protected void produceMessage(Topic topic) {
+        topicDetails
+                .clickProduceMessageBtn();
+        produceMessagePanel
+                .waitUntilScreenReady()
+                .setKeyField(topic.getMessageKey())
+                .setContentFiled(topic.getMessageContent())
+                .submitProduceMessage();
+        topicDetails
+                .waitUntilScreenReady();
+    }
+
+    @AfterClass(alwaysRun = true)
+    public void afterClass() {
+        TOPIC_LIST.forEach(topic -> apiService.deleteTopic(topic.getName()));
+    }
+}

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

@@ -0,0 +1,503 @@
+package com.provectus.kafka.ui.smokeSuite.topics;
+
+import com.codeborne.selenide.Condition;
+import com.provectus.kafka.ui.BaseTest;
+import com.provectus.kafka.ui.models.Topic;
+import com.provectus.kafka.ui.pages.topics.TopicDetails;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
+import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
+import io.qameta.allure.Issue;
+import io.qase.api.annotation.CaseId;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Ignore;
+import org.testng.annotations.Test;
+import org.testng.asserts.SoftAssert;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.provectus.kafka.ui.pages.BasePage.AlertHeader.SUCCESS;
+import static com.provectus.kafka.ui.pages.topics.TopicDetails.TopicMenu.MESSAGES;
+import static com.provectus.kafka.ui.pages.topics.TopicDetails.TopicMenu.SETTINGS;
+import static com.provectus.kafka.ui.pages.topics.enums.CleanupPolicyValue.COMPACT;
+import static com.provectus.kafka.ui.pages.topics.enums.CleanupPolicyValue.DELETE;
+import static com.provectus.kafka.ui.pages.topics.enums.CustomParameterType.COMPRESSION_TYPE;
+import static com.provectus.kafka.ui.pages.topics.enums.MaxSizeOnDisk.*;
+import static com.provectus.kafka.ui.pages.topics.enums.TimeToRetain.BTN_2_DAYS;
+import static com.provectus.kafka.ui.pages.topics.enums.TimeToRetain.BTN_7_DAYS;
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+import static org.apache.commons.lang3.RandomUtils.nextInt;
+
+public class TopicsTest extends BaseTest {
+
+    private static final long SUITE_ID = 2;
+    private static final String SUITE_TITLE = "Topics";
+    private static final Topic TOPIC_TO_CREATE = new Topic()
+            .setName("new-topic-" + randomAlphabetic(5))
+            .setNumberOfPartitions(1)
+            .setCustomParameterType(COMPRESSION_TYPE)
+            .setCustomParameterValue("producer")
+            .setCleanupPolicyValue(DELETE);
+    private static final Topic TOPIC_TO_UPDATE_AND_DELETE = new Topic()
+            .setName("topic-to-update-and-delete-" + randomAlphabetic(5))
+            .setNumberOfPartitions(1)
+            .setCleanupPolicyValue(DELETE)
+            .setTimeToRetain(BTN_7_DAYS)
+            .setMaxSizeOnDisk(NOT_SET)
+            .setMaxMessageBytes("1048588")
+            .setMessageKey(randomAlphabetic(5))
+            .setMessageContent(randomAlphabetic(10));
+    private static final Topic TOPIC_TO_CHECK_SETTINGS = new Topic()
+            .setName("new-topic-" + randomAlphabetic(5))
+            .setNumberOfPartitions(1)
+            .setMaxMessageBytes("1000012")
+            .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 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()));
+    }
+
+    @Suite(suiteId = 4, title = "Create new Topic")
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(199)
+    @Test(priority = 1)
+    public void createTopic() {
+        navigateToTopics();
+        topicsList
+                .clickAddTopicBtn();
+        topicCreateEditForm
+                .waitUntilScreenReady()
+                .setTopicName(TOPIC_TO_CREATE.getName())
+                .setNumberOfPartitions(TOPIC_TO_CREATE.getNumberOfPartitions())
+                .selectCleanupPolicy(TOPIC_TO_CREATE.getCleanupPolicyValue())
+                .clickCreateTopicBtn();
+        navigateToTopicsAndOpenDetails(TOPIC_TO_CREATE.getName());
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(topicDetails.isTopicHeaderVisible(TOPIC_TO_CREATE.getName()), "isTopicHeaderVisible()");
+        softly.assertEquals(topicDetails.getCleanUpPolicy(), TOPIC_TO_CREATE.getCleanupPolicyValue().toString(), "getCleanUpPolicy()");
+        softly.assertEquals(topicDetails.getPartitions(), TOPIC_TO_CREATE.getNumberOfPartitions(), "getPartitions()");
+        softly.assertAll();
+        navigateToTopics();
+        Assert.assertTrue(topicsList.isTopicVisible(TOPIC_TO_CREATE.getName()), "isTopicVisible()");
+        TOPIC_LIST.add(TOPIC_TO_CREATE);
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(7)
+    @Test(priority = 2)
+    void checkAvailableOperations() {
+        navigateToTopics();
+        topicsList
+                .getTopicItem("my_ksql_1ksql_processing_log")
+                .selectItem(true);
+        verifyElementsCondition(topicsList.getActionButtons(), Condition.enabled);
+        topicsList
+                .getTopicItem("_confluent-ksql-my_ksql_1_command_topic")
+                .selectItem(true);
+        Assert.assertFalse(topicsList.isCopySelectedTopicBtnEnabled(), "isCopySelectedTopicBtnEnabled()");
+    }
+
+    @Ignore
+    @Issue("https://github.com/provectus/kafka-ui/issues/2625")
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(197)
+    @Test(priority = 3)
+    public void updateTopic() {
+        navigateToTopicsAndOpenDetails(TOPIC_TO_UPDATE_AND_DELETE.getName());
+        topicDetails
+                .openDotMenu()
+                .clickEditSettingsMenu();
+        topicCreateEditForm
+                .waitUntilScreenReady();
+        SoftAssert softly = new SoftAssert();
+        softly.assertEquals(topicCreateEditForm.getCleanupPolicy(),
+                TOPIC_TO_UPDATE_AND_DELETE.getCleanupPolicyValue().getVisibleText(), "getCleanupPolicy()");
+        softly.assertEquals(topicCreateEditForm.getTimeToRetain(),
+                TOPIC_TO_UPDATE_AND_DELETE.getTimeToRetain().getValue(), "getTimeToRetain()");
+        softly.assertEquals(topicCreateEditForm.getMaxSizeOnDisk(),
+                TOPIC_TO_UPDATE_AND_DELETE.getMaxSizeOnDisk().getVisibleText(), "getMaxSizeOnDisk()");
+        softly.assertEquals(topicCreateEditForm.getMaxMessageBytes(),
+                TOPIC_TO_UPDATE_AND_DELETE.getMaxMessageBytes(), "getMaxMessageBytes()");
+        softly.assertAll();
+        TOPIC_TO_UPDATE_AND_DELETE
+                .setCleanupPolicyValue(COMPACT)
+                .setTimeToRetain(BTN_2_DAYS)
+                .setMaxSizeOnDisk(SIZE_50_GB).setMaxMessageBytes("1048589");
+        topicCreateEditForm
+                .selectCleanupPolicy((TOPIC_TO_UPDATE_AND_DELETE.getCleanupPolicyValue()))
+                .setTimeToRetainDataByButtons(TOPIC_TO_UPDATE_AND_DELETE.getTimeToRetain())
+                .setMaxSizeOnDiskInGB(TOPIC_TO_UPDATE_AND_DELETE.getMaxSizeOnDisk())
+                .setMaxMessageBytes(TOPIC_TO_UPDATE_AND_DELETE.getMaxMessageBytes())
+                .clickCreateTopicBtn();
+        softly.assertTrue(topicDetails.isAlertWithMessageVisible(SUCCESS, "Topic successfully updated."),
+                "isAlertWithMessageVisible()");
+        softly.assertTrue(topicDetails.isTopicHeaderVisible(TOPIC_TO_UPDATE_AND_DELETE.getName()),
+                "isTopicHeaderVisible()");
+        softly.assertAll();
+        topicDetails
+                .waitUntilScreenReady();
+        navigateToTopicsAndOpenDetails(TOPIC_TO_UPDATE_AND_DELETE.getName());
+        topicDetails
+                .openDotMenu()
+                .clickEditSettingsMenu();
+        softly.assertFalse(topicCreateEditForm.isNameFieldEnabled(), "isNameFieldEnabled()");
+        softly.assertEquals(topicCreateEditForm.getCleanupPolicy(),
+                TOPIC_TO_UPDATE_AND_DELETE.getCleanupPolicyValue().getVisibleText(), "getCleanupPolicy()");
+        softly.assertEquals(topicCreateEditForm.getTimeToRetain(),
+                TOPIC_TO_UPDATE_AND_DELETE.getTimeToRetain().getValue(), "getTimeToRetain()");
+        softly.assertEquals(topicCreateEditForm.getMaxSizeOnDisk(),
+                TOPIC_TO_UPDATE_AND_DELETE.getMaxSizeOnDisk().getVisibleText(), "getMaxSizeOnDisk()");
+        softly.assertEquals(topicCreateEditForm.getMaxMessageBytes(),
+                TOPIC_TO_UPDATE_AND_DELETE.getMaxMessageBytes(), "getMaxMessageBytes()");
+        softly.assertAll();
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(242)
+    @Test(priority = 4)
+    public void removeTopicFromTopicList() {
+        navigateToTopics();
+        topicsList
+                .openDotMenuByTopicName(TOPIC_TO_UPDATE_AND_DELETE.getName())
+                .clickRemoveTopicBtn()
+                .clickConfirmBtnMdl();
+        Assert.assertTrue(topicsList.isAlertWithMessageVisible(SUCCESS,
+                        String.format("Topic %s successfully deleted!", TOPIC_TO_UPDATE_AND_DELETE.getName())),
+                "isAlertWithMessageVisible()");
+        TOPIC_LIST.remove(TOPIC_TO_UPDATE_AND_DELETE);
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(207)
+    @Test(priority = 5)
+    public void deleteTopic() {
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_DELETE.getName());
+        topicDetails
+                .openDotMenu()
+                .clickDeleteTopicMenu()
+                .clickConfirmBtnMdl();
+        navigateToTopics();
+        Assert.assertFalse(topicsList.isTopicVisible(TOPIC_FOR_DELETE.getName()), "isTopicVisible");
+        TOPIC_LIST.remove(TOPIC_FOR_DELETE);
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(20)
+    @Test(priority = 6)
+    public void redirectToConsumerFromTopic() {
+        String topicName = "source-activities";
+        String consumerGroupId = "connect-sink_postgres_activities";
+        navigateToTopicsAndOpenDetails(topicName);
+        topicDetails
+                .openDetailsTab(TopicDetails.TopicMenu.CONSUMERS)
+                .openConsumerGroup(consumerGroupId);
+        consumersDetails
+                .waitUntilScreenReady();
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(consumersDetails.isRedirectedConsumerTitleVisible(consumerGroupId),
+                "isRedirectedConsumerTitleVisible()");
+        softly.assertTrue(consumersDetails.isTopicInConsumersDetailsVisible(topicName),
+                "isTopicInConsumersDetailsVisible()");
+        softly.assertAll();
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(4)
+    @Test(priority = 7)
+    public void checkTopicCreatePossibility() {
+        navigateToTopics();
+        topicsList
+                .clickAddTopicBtn();
+        topicCreateEditForm
+                .waitUntilScreenReady();
+        Assert.assertFalse(topicCreateEditForm.isCreateTopicButtonEnabled(), "isCreateTopicButtonEnabled()");
+        topicCreateEditForm
+                .setTopicName("testName");
+        Assert.assertFalse(topicCreateEditForm.isCreateTopicButtonEnabled(), "isCreateTopicButtonEnabled()");
+        topicCreateEditForm
+                .setTopicName(null)
+                .setNumberOfPartitions(nextInt(1, 10));
+        Assert.assertFalse(topicCreateEditForm.isCreateTopicButtonEnabled(), "isCreateTopicButtonEnabled()");
+        topicCreateEditForm
+                .setTopicName("testName");
+        Assert.assertTrue(topicCreateEditForm.isCreateTopicButtonEnabled(), "isCreateTopicButtonEnabled()");
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(266)
+    @Test(priority = 8)
+    public void checkTimeToRetainDataCustomValueWithEditingTopic() {
+        Topic topicToRetainData = new Topic()
+                .setName("topic-to-retain-data-" + randomAlphabetic(5))
+                .setTimeToRetainData("86400000");
+        navigateToTopics();
+        topicsList
+                .clickAddTopicBtn();
+        topicCreateEditForm
+                .waitUntilScreenReady()
+                .setTopicName(topicToRetainData.getName())
+                .setNumberOfPartitions(1)
+                .setTimeToRetainDataInMs("604800000");
+        Assert.assertEquals(topicCreateEditForm.getTimeToRetain(), "604800000", "getTimeToRetain()");
+        topicCreateEditForm
+                .setTimeToRetainDataInMs(topicToRetainData.getTimeToRetainData())
+                .clickCreateTopicBtn();
+        topicDetails
+                .waitUntilScreenReady()
+                .openDotMenu()
+                .clickEditSettingsMenu();
+        Assert.assertEquals(topicCreateEditForm.getTimeToRetain(), topicToRetainData.getTimeToRetainData(),
+                "getTimeToRetain()");
+        topicDetails
+                .openDetailsTab(SETTINGS);
+        Assert.assertEquals(topicDetails.getSettingsGridValueByKey("retention.ms"), topicToRetainData.getTimeToRetainData(),
+                "getSettingsGridValueByKey()");
+        TOPIC_LIST.add(topicToRetainData);
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(6)
+    @Test(priority = 9)
+    public void checkCustomParametersWithinCreateNewTopic() {
+        navigateToTopics();
+        topicsList
+                .clickAddTopicBtn();
+        topicCreateEditForm
+                .waitUntilScreenReady()
+                .setTopicName(TOPIC_TO_CREATE.getName())
+                .clickAddCustomParameterTypeButton()
+                .setCustomParameterType(TOPIC_TO_CREATE.getCustomParameterType());
+        Assert.assertTrue(topicCreateEditForm.isDeleteCustomParameterButtonEnabled(),
+                "isDeleteCustomParameterButtonEnabled()");
+        topicCreateEditForm
+                .clearCustomParameterValue();
+        Assert.assertTrue(topicCreateEditForm.isValidationMessageCustomParameterValueVisible(),
+                "isValidationMessageCustomParameterValueVisible()");
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(2)
+    @Test(priority = 10)
+    public void checkTopicListElements() {
+        navigateToTopics();
+        verifyElementsCondition(topicsList.getAllVisibleElements(), Condition.visible);
+        verifyElementsCondition(topicsList.getAllEnabledElements(), Condition.enabled);
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(12)
+    @Test(priority = 11)
+    public void addingNewFilterWithinTopic() {
+        String filterName = randomAlphabetic(5);
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECK_FILTERS.getName());
+        topicDetails
+                .openDetailsTab(MESSAGES)
+                .clickMessagesAddFiltersBtn()
+                .waitUntilAddFiltersMdlVisible();
+        verifyElementsCondition(topicDetails.getAllAddFilterModalVisibleElements(), Condition.visible);
+        verifyElementsCondition(topicDetails.getAllAddFilterModalEnabledElements(), Condition.enabled);
+        verifyElementsCondition(topicDetails.getAllAddFilterModalDisabledElements(), Condition.disabled);
+        Assert.assertFalse(topicDetails.isSaveThisFilterCheckBoxSelected(), "isSaveThisFilterCheckBoxSelected()");
+        topicDetails
+                .setFilterCodeFieldAddFilterMdl(filterName);
+        Assert.assertTrue(topicDetails.isAddFilterBtnAddFilterMdlEnabled(), "isAddFilterBtnAddFilterMdlEnabled()");
+        topicDetails.clickAddFilterBtnAndCloseMdl(true);
+        Assert.assertTrue(topicDetails.isActiveFilterVisible(filterName), "isActiveFilterVisible()");
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(13)
+    @Test(priority = 12)
+    public void checkFilterSavingWithinSavedFilters() {
+        String displayName = randomAlphabetic(5);
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECK_FILTERS.getName());
+        topicDetails
+                .openDetailsTab(MESSAGES)
+                .clickMessagesAddFiltersBtn()
+                .waitUntilAddFiltersMdlVisible()
+                .setFilterCodeFieldAddFilterMdl(randomAlphabetic(4))
+                .selectSaveThisFilterCheckboxMdl(true)
+                .setDisplayNameFldAddFilterMdl(displayName);
+        Assert.assertTrue(topicDetails.isAddFilterBtnAddFilterMdlEnabled(),
+                "isAddFilterBtnAddFilterMdlEnabled()");
+        topicDetails
+                .clickAddFilterBtnAndCloseMdl(false)
+                .openSavedFiltersListMdl();
+        Assert.assertTrue(topicDetails.isFilterVisibleAtSavedFiltersMdl(displayName),
+                "isFilterVisibleAtSavedFiltersMdl()");
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(14)
+    @Test(priority = 13)
+    public void checkApplyingSavedFilterWithinTopicMessages() {
+        String displayName = randomAlphabetic(5);
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECK_FILTERS.getName());
+        topicDetails
+                .openDetailsTab(MESSAGES)
+                .clickMessagesAddFiltersBtn()
+                .waitUntilAddFiltersMdlVisible()
+                .setFilterCodeFieldAddFilterMdl(randomAlphabetic(4))
+                .selectSaveThisFilterCheckboxMdl(true)
+                .setDisplayNameFldAddFilterMdl(displayName)
+                .clickAddFilterBtnAndCloseMdl(false)
+                .openSavedFiltersListMdl()
+                .selectFilterAtSavedFiltersMdl(displayName)
+                .clickSelectFilterBtnAtSavedFiltersMdl();
+        Assert.assertTrue(topicDetails.isActiveFilterVisible(displayName), "isActiveFilterVisible()");
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(11)
+    @Test(priority = 14)
+    public void checkShowInternalTopicsButtonFunctionality() {
+        navigateToTopics();
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(topicsList.isShowInternalRadioBtnSelected(), "isInternalRadioBtnSelected()");
+        softly.assertTrue(topicsList.getInternalTopics().size() > 0, "getInternalTopics()");
+        softly.assertTrue(topicsList.getNonInternalTopics().size() > 0, "getNonInternalTopics()");
+        softly.assertAll();
+        topicsList
+                .setShowInternalRadioButton(false);
+        softly.assertEquals(topicsList.getInternalTopics().size(), 0, "getInternalTopics()");
+        softly.assertTrue(topicsList.getNonInternalTopics().size() > 0, "getNonInternalTopics()");
+        softly.assertAll();
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(56)
+    @Test(priority = 15)
+    public void checkRetentionBytesAccordingToMaxSizeOnDisk() {
+        navigateToTopics();
+        topicsList
+                .clickAddTopicBtn();
+        topicCreateEditForm
+                .waitUntilScreenReady()
+                .setTopicName(TOPIC_TO_CHECK_SETTINGS.getName())
+                .setNumberOfPartitions(TOPIC_TO_CHECK_SETTINGS.getNumberOfPartitions())
+                .setMaxMessageBytes(TOPIC_TO_CHECK_SETTINGS.getMaxMessageBytes())
+                .clickCreateTopicBtn();
+        topicDetails
+                .waitUntilScreenReady();
+        TOPIC_LIST.add(TOPIC_TO_CHECK_SETTINGS);
+        topicDetails
+                .openDetailsTab(SETTINGS);
+        topicSettingsTab
+                .waitUntilScreenReady();
+        SoftAssert softly = new SoftAssert();
+        softly.assertEquals(topicSettingsTab.getValueByKey("retention.bytes"),
+                TOPIC_TO_CHECK_SETTINGS.getMaxSizeOnDisk().getOptionValue(), "getValueOfKey(retention.bytes)");
+        softly.assertEquals(topicSettingsTab.getValueByKey("max.message.bytes"),
+                TOPIC_TO_CHECK_SETTINGS.getMaxMessageBytes(), "getValueOfKey(max.message.bytes)");
+        softly.assertAll();
+        TOPIC_TO_CHECK_SETTINGS
+                .setMaxSizeOnDisk(SIZE_1_GB)
+                .setMaxMessageBytes("1000056");
+        topicDetails
+                .openDotMenu()
+                .clickEditSettingsMenu();
+        topicCreateEditForm
+                .waitUntilScreenReady()
+                .setMaxSizeOnDiskInGB(TOPIC_TO_CHECK_SETTINGS.getMaxSizeOnDisk())
+                .setMaxMessageBytes(TOPIC_TO_CHECK_SETTINGS.getMaxMessageBytes())
+                .clickCreateTopicBtn();
+        topicDetails
+                .waitUntilScreenReady()
+                .openDetailsTab(SETTINGS);
+        topicSettingsTab
+                .waitUntilScreenReady();
+        softly.assertEquals(topicSettingsTab.getValueByKey("retention.bytes"),
+                TOPIC_TO_CHECK_SETTINGS.getMaxSizeOnDisk().getOptionValue(), "getValueOfKey(retention.bytes)");
+        softly.assertEquals(topicSettingsTab.getValueByKey("max.message.bytes"),
+                TOPIC_TO_CHECK_SETTINGS.getMaxMessageBytes(), "getValueOfKey(max.message.bytes)");
+        softly.assertAll();
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(247)
+    @Test(priority = 16)
+    public void recreateTopicFromTopicProfile() {
+        Topic topicToRecreate = new Topic()
+                .setName("topic-to-recreate-" + randomAlphabetic(5))
+                .setNumberOfPartitions(1);
+        navigateToTopics();
+        topicsList
+                .clickAddTopicBtn();
+        topicCreateEditForm
+                .waitUntilScreenReady()
+                .setTopicName(topicToRecreate.getName())
+                .setNumberOfPartitions(topicToRecreate.getNumberOfPartitions())
+                .clickCreateTopicBtn();
+        topicDetails
+                .waitUntilScreenReady();
+        TOPIC_LIST.add(topicToRecreate);
+        topicDetails
+                .openDotMenu()
+                .clickRecreateTopicMenu();
+        Assert.assertTrue(topicDetails.isConfirmationMdlVisible(), "isConfirmationMdlVisible()");
+        topicDetails
+                .clickConfirmBtnMdl();
+        Assert.assertTrue(topicDetails.isAlertWithMessageVisible(SUCCESS,
+                        String.format("Topic %s successfully recreated!", topicToRecreate.getName())),
+                "isAlertWithMessageVisible()");
+    }
+
+    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
+    @AutomationStatus(status = Status.AUTOMATED)
+    @CaseId(8)
+    @Test(priority = 17)
+    public void checkCopyTopicPossibility() {
+        Topic topicToCopy = new Topic()
+                .setName("topic-to-copy-" + randomAlphabetic(5))
+                .setNumberOfPartitions(1);
+        navigateToTopics();
+        topicsList
+                .getTopicItem("_schemas")
+                .selectItem(true)
+                .clickCopySelectedTopicBtn();
+        topicCreateEditForm
+                .waitUntilScreenReady();
+        Assert.assertFalse(topicCreateEditForm.isCreateTopicButtonEnabled(), "isCreateTopicButtonEnabled()");
+        topicCreateEditForm
+                .setTopicName(topicToCopy.getName())
+                .setNumberOfPartitions(topicToCopy.getNumberOfPartitions())
+                .clickCreateTopicBtn();
+        topicDetails
+                .waitUntilScreenReady();
+        TOPIC_LIST.add(topicToCopy);
+        SoftAssert softly = new SoftAssert();
+        softly.assertTrue(topicDetails.isAlertWithMessageVisible(SUCCESS, "Topic successfully created."),
+                "isAlertWithMessageVisible()");
+        softly.assertTrue(topicDetails.isTopicHeaderVisible(topicToCopy.getName()), "isTopicHeaderVisible()");
+        softly.assertAll();
+    }
+
+    @AfterClass(alwaysRun = true)
+    public void afterClass() {
+        TOPIC_LIST.forEach(topic -> apiService.deleteTopic(topic.getName()));
+    }
+}

+ 0 - 23
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/SmokeTests.java

@@ -1,23 +0,0 @@
-package com.provectus.kafka.ui.suite;
-
-import com.codeborne.selenide.Condition;
-import com.provectus.kafka.ui.base.BaseTest;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
-import io.qase.api.annotation.CaseId;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import org.junit.jupiter.api.Test;
-
-public class SmokeTests extends BaseTest {
-
-    @Test
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(198)
-    public void checkBasePageElements(){
-      verifyElementsCondition(Stream.concat(topPanel.getAllVisibleElements().stream(), naviSideBar.getAllMenuButtons().stream())
-          .collect(Collectors.toList()),Condition.visible);
-      verifyElementsCondition(Stream.concat(topPanel.getAllEnabledElements().stream(), naviSideBar.getAllMenuButtons().stream())
-          .collect(Collectors.toList()),Condition.enabled);
-    }
-}

+ 0 - 63
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/brokers/BrokersTests.java

@@ -1,63 +0,0 @@
-package com.provectus.kafka.ui.suite.brokers;
-
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.BROKERS;
-import static com.provectus.kafka.ui.pages.brokers.BrokersDetails.DetailsTab.CONFIGS;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import com.codeborne.selenide.Condition;
-import com.provectus.kafka.ui.base.BaseTest;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
-import io.qameta.allure.Step;
-import io.qase.api.annotation.CaseId;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-
-public class BrokersTests extends BaseTest {
-  private static final String SUITE_TITLE = "Brokers";
-  private static final long SUITE_ID = 1;
-
-  @DisplayName("Checking the Brokers overview")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(1)
-  @Test
-  public void checkBrokersOverview(){
-    navigateToBrokers();
-    assertThat(brokersList.getAllBrokers()).as("getAllBrokers()").size().isGreaterThan(0);
-    verifyElementsCondition(brokersList.getAllVisibleElements(), Condition.visible);
-    verifyElementsCondition(brokersList.getAllEnabledElements(), Condition.enabled);
-  }
-
-  @DisplayName("Checking the existing Broker's profile in a cluster")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(85)
-  @Test
-  public void checkExistingBrokersInCluster(){
-    navigateToBrokers();
-    assertThat(brokersList.getAllBrokers()).as("getAllBrokers()").size().isGreaterThan(0);
-    brokersList
-        .openBroker(1);
-    brokersDetails
-        .waitUntilScreenReady();
-    verifyElementsCondition(brokersDetails.getAllVisibleElements(), Condition.visible);
-    verifyElementsCondition(brokersDetails.getAllEnabledElements(), Condition.enabled);
-    brokersDetails
-        .openDetailsTab(CONFIGS);
-    brokersConfigTab
-        .waitUntilScreenReady();
-    verifyElementsCondition(brokersConfigTab.getColumnHeaders(), Condition.visible);
-    verifyElementsCondition(brokersConfigTab.getEditButtons(), Condition.enabled);
-    assertThat(brokersConfigTab.isSearchByKeyVisible()).as("isSearchByKeyVisible()").isTrue();
-  }
-
-  @Step
-  private void navigateToBrokers(){
-    naviSideBar
-        .openSideMenu(BROKERS);
-    brokersList
-        .waitUntilScreenReady();
-  }
-}

+ 0 - 65
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/ksqldb/KsqlTests.java

@@ -1,65 +0,0 @@
-package com.provectus.kafka.ui.suite.ksqldb;
-
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.KSQL_DB;
-import static com.provectus.kafka.ui.pages.ksqldb.enums.KsqlQueryConfig.SHOW_TABLES;
-import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
-
-import com.provectus.kafka.ui.base.BaseTest;
-import com.provectus.kafka.ui.pages.ksqldb.models.Stream;
-import com.provectus.kafka.ui.pages.ksqldb.models.Table;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
-import io.qase.api.annotation.CaseId;
-import org.assertj.core.api.SoftAssertions;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Order;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInstance;
-
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-public class KsqlTests extends BaseTest {
-  private static final long SUITE_ID = 8;
-  private static final String SUITE_TITLE = "KSQL_DB";
-  private static final Stream STREAM_FOR_CHECKING_TABLES = new Stream()
-      .setName("STREAM_FOR_CHECKING_TABLES_" + randomAlphabetic(4).toUpperCase())
-      .setTopicName("TOPIC_FOR_STREAM_" + randomAlphabetic(4).toUpperCase());
-  private static final Table FIRST_TABLE = new Table()
-      .setName("FIRST_TABLE"+ randomAlphabetic(4).toUpperCase())
-      .setStreamName(STREAM_FOR_CHECKING_TABLES.getName());
-  private static final Table SECOND_TABLE = new Table()
-      .setName("SECOND_TABLE"+ randomAlphabetic(4).toUpperCase())
-      .setStreamName(STREAM_FOR_CHECKING_TABLES.getName());
-
-  @BeforeAll
-  public void beforeAll(){
-    apiService
-        .createStream(STREAM_FOR_CHECKING_TABLES)
-        .createTables(FIRST_TABLE, SECOND_TABLE);
-  }
-
-  @DisplayName("check KSQL request execution")
-  @Suite(suiteId = SUITE_ID,title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(41)
-  @Test
-  @Order(1)
-  public void checkingKsqlRequestExecution() {
-    naviSideBar
-        .openSideMenu(KSQL_DB);
-    ksqlDbList
-        .waitUntilScreenReady()
-        .clickExecuteKsqlRequestBtn();
-    ksqlQueryForm
-        .waitUntilScreenReady()
-        .setQuery(SHOW_TABLES.getQuery())
-        .clickExecuteBtn();
-    SoftAssertions softly = new SoftAssertions();
-    softly.assertThat(ksqlQueryForm.getTableByName(FIRST_TABLE.getName()).isVisible())
-        .as("getTableName()").isTrue();
-    softly.assertThat(ksqlQueryForm.getTableByName(SECOND_TABLE.getName()).isVisible())
-        .as("getTableName()").isTrue();
-    softly.assertAll();
-  }
-}

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

@@ -1,249 +0,0 @@
-package com.provectus.kafka.ui.suite.schemas;
-
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.SCHEMA_REGISTRY;
-import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
-
-import com.codeborne.selenide.Condition;
-import com.provectus.kafka.ui.api.model.CompatibilityLevel;
-import com.provectus.kafka.ui.base.BaseTest;
-import com.provectus.kafka.ui.models.Schema;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
-import io.qameta.allure.Step;
-import io.qase.api.annotation.CaseId;
-import java.util.ArrayList;
-import java.util.List;
-import lombok.SneakyThrows;
-import org.assertj.core.api.SoftAssertions;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.MethodOrderer;
-import org.junit.jupiter.api.Order;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInstance;
-import org.junit.jupiter.api.TestMethodOrder;
-
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
-public class SchemasTests extends BaseTest {
-    private static final long SUITE_ID = 11;
-    private static final String SUITE_TITLE = "Schema Registry";
-    private static final List<Schema> SCHEMA_LIST = new ArrayList<>();
-    private static final Schema AVRO_API = Schema.createSchemaAvro();
-    private static final Schema JSON_API = Schema.createSchemaJson();
-    private static final Schema PROTOBUF_API = Schema.createSchemaProtobuf();
-
-    @BeforeAll
-    @SneakyThrows
-    public void beforeAll() {
-        SCHEMA_LIST.addAll(List.of(AVRO_API, JSON_API, PROTOBUF_API));
-        SCHEMA_LIST.forEach(schema -> apiService.createSchema(schema));
-    }
-
-    @DisplayName("should create AVRO schema")
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(43)
-    @Test
-    @Order(1)
-    void createSchemaAvro() {
-        Schema schemaAvro = Schema.createSchemaAvro();
-        navigateToSchemaRegistry();
-        schemaRegistryList
-                .clickCreateSchema();
-        schemaCreateForm
-                .setSubjectName(schemaAvro.getName())
-                .setSchemaField(fileToString(schemaAvro.getValuePath()))
-                .selectSchemaTypeFromDropdown(schemaAvro.getType())
-                .clickSubmitButton();
-        schemaDetails
-                .waitUntilScreenReady();
-        SoftAssertions softly = new SoftAssertions();
-        softly.assertThat(schemaDetails.isSchemaHeaderVisible(schemaAvro.getName())).as("isSchemaHeaderVisible()").isTrue();
-        softly.assertThat(schemaDetails.getSchemaType()).as("getSchemaType()").isEqualTo(schemaAvro.getType().getValue());
-        softly.assertThat(schemaDetails.getCompatibility()).as("getCompatibility()").isEqualTo(CompatibilityLevel.CompatibilityEnum.BACKWARD.getValue());
-        softly.assertAll();
-        navigateToSchemaRegistry();
-        Assertions.assertTrue(schemaRegistryList.isSchemaVisible(AVRO_API.getName()),"isSchemaVisible()");
-        SCHEMA_LIST.add(schemaAvro);
-    }
-
-    @DisplayName("should update AVRO schema")
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(186)
-    @Test
-    @Order(2)
-    void updateSchemaAvro() {
-        AVRO_API.setValuePath(System.getProperty("user.dir") + "/src/main/resources/testData/schema_avro_for_update.json");
-        navigateToSchemaRegistryAndOpenDetails(AVRO_API.getName());
-        schemaDetails
-                .openEditSchema();
-        schemaCreateForm
-                .waitUntilScreenReady();
-      verifyElementsCondition(schemaCreateForm.getAllDetailsPageElements(), Condition.visible);
-      SoftAssertions softly = new SoftAssertions();
-        softly.assertThat(schemaCreateForm.isSubmitBtnEnabled()).as("isSubmitBtnEnabled()").isFalse();
-        softly.assertThat(schemaCreateForm.isSchemaDropDownEnabled()).as("isSchemaDropDownEnabled()").isFalse();
-        softly.assertAll();
-        schemaCreateForm
-                .selectCompatibilityLevelFromDropdown(CompatibilityLevel.CompatibilityEnum.NONE)
-                .setNewSchemaValue(fileToString(AVRO_API.getValuePath()))
-                .clickSubmitButton();
-        schemaDetails
-                .waitUntilScreenReady();
-        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() {
-      navigateToSchemaRegistryAndOpenDetails(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")
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(187)
-    @Test
-    @Order(4)
-    void deleteSchemaAvro() {
-      navigateToSchemaRegistryAndOpenDetails(AVRO_API.getName());
-      schemaDetails
-          .removeSchema();
-      schemaRegistryList
-          .waitUntilScreenReady();
-      Assertions.assertFalse(schemaRegistryList.isSchemaVisible(AVRO_API.getName()),"isSchemaVisible()");
-      SCHEMA_LIST.remove(AVRO_API);
-    }
-
-    @DisplayName("should create JSON schema")
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(89)
-    @Test
-    @Order(5)
-    void createSchemaJson() {
-        Schema schemaJson = Schema.createSchemaJson();
-        navigateToSchemaRegistry();
-        schemaRegistryList
-                .clickCreateSchema();
-        schemaCreateForm
-                .setSubjectName(schemaJson.getName())
-                .setSchemaField(fileToString(schemaJson.getValuePath()))
-                .selectSchemaTypeFromDropdown(schemaJson.getType())
-                .clickSubmitButton();
-        schemaDetails
-                .waitUntilScreenReady();
-        SoftAssertions softly = new SoftAssertions();
-        softly.assertThat(schemaDetails.isSchemaHeaderVisible(schemaJson.getName())).as("isSchemaHeaderVisible()").isTrue();
-        softly.assertThat(schemaDetails.getSchemaType()).as("getSchemaType()").isEqualTo(schemaJson.getType().getValue());
-        softly.assertThat(schemaDetails.getCompatibility()).as("getCompatibility()").isEqualTo(CompatibilityLevel.CompatibilityEnum.BACKWARD.getValue());
-        softly.assertAll();
-        navigateToSchemaRegistry();
-        Assertions.assertTrue(schemaRegistryList.isSchemaVisible(JSON_API.getName()),"isSchemaVisible()");
-        SCHEMA_LIST.add(schemaJson);
-    }
-
-    @DisplayName("should delete JSON schema")
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(189)
-    @Test
-    @Order(6)
-    void deleteSchemaJson() {
-      navigateToSchemaRegistryAndOpenDetails(JSON_API.getName());
-      schemaDetails
-                .removeSchema();
-        schemaRegistryList
-                .waitUntilScreenReady();
-        Assertions.assertFalse(schemaRegistryList.isSchemaVisible(JSON_API.getName()),"isSchemaVisible()");
-        SCHEMA_LIST.remove(JSON_API);
-    }
-
-    @DisplayName("should create PROTOBUF schema")
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(91)
-    @Test
-    @Order(7)
-    void createSchemaProtobuf() {
-        Schema schemaProtobuf = Schema.createSchemaProtobuf();
-        navigateToSchemaRegistry();
-        schemaRegistryList
-                .clickCreateSchema();
-        schemaCreateForm
-                .setSubjectName(schemaProtobuf.getName())
-                .setSchemaField(fileToString(schemaProtobuf.getValuePath()))
-                .selectSchemaTypeFromDropdown(schemaProtobuf.getType())
-                .clickSubmitButton();
-        schemaDetails
-                .waitUntilScreenReady();
-        SoftAssertions softly = new SoftAssertions();
-        softly.assertThat(schemaDetails.isSchemaHeaderVisible(schemaProtobuf.getName())).as("isSchemaHeaderVisible()").isTrue();
-        softly.assertThat(schemaDetails.getSchemaType()).as("getSchemaType()").isEqualTo(schemaProtobuf.getType().getValue());
-        softly.assertThat(schemaDetails.getCompatibility()).as("getCompatibility()").isEqualTo(CompatibilityLevel.CompatibilityEnum.BACKWARD.getValue());
-        softly.assertAll();
-        navigateToSchemaRegistry();
-        Assertions.assertTrue(schemaRegistryList.isSchemaVisible(PROTOBUF_API.getName()),"isSchemaVisible()");
-        SCHEMA_LIST.add(schemaProtobuf);
-    }
-
-    @DisplayName("should delete PROTOBUF schema")
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(223)
-    @Test
-    @Order(8)
-    void deleteSchemaProtobuf() {
-      navigateToSchemaRegistryAndOpenDetails(PROTOBUF_API.getName());
-      schemaDetails
-                .removeSchema();
-        schemaRegistryList
-                .waitUntilScreenReady();
-        Assertions.assertFalse(schemaRegistryList.isSchemaVisible(PROTOBUF_API.getName()),"isSchemaVisible()");
-        SCHEMA_LIST.remove(PROTOBUF_API);
-    }
-
-    @AfterAll
-    public void afterAll() {
-        SCHEMA_LIST.forEach(schema -> apiService.deleteSchema(schema.getName()));
-    }
-
-    @Step
-    private void navigateToSchemaRegistry(){
-      naviSideBar
-          .openSideMenu(SCHEMA_REGISTRY);
-      schemaRegistryList
-          .waitUntilScreenReady();
-    }
-
-    @Step
-    private void navigateToSchemaRegistryAndOpenDetails(String schemaName){
-      navigateToSchemaRegistry();
-      schemaRegistryList
-          .openSchema(schemaName);
-      schemaDetails
-          .waitUntilScreenReady();
-    }
-}

+ 0 - 316
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/topics/TopicMessagesTests.java

@@ -1,316 +0,0 @@
-package com.provectus.kafka.ui.suite.topics;
-
-import static com.provectus.kafka.ui.pages.BasePage.AlertHeader.SUCCESS;
-import static com.provectus.kafka.ui.pages.topic.TopicDetails.TopicMenu.MESSAGES;
-import static com.provectus.kafka.ui.pages.topic.TopicDetails.TopicMenu.OVERVIEW;
-import static com.provectus.kafka.ui.utilities.TimeUtils.waitUntilNewMinuteStarted;
-import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import com.provectus.kafka.ui.base.BaseTest;
-import com.provectus.kafka.ui.models.Topic;
-import com.provectus.kafka.ui.pages.topic.TopicDetails;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
-import io.qameta.allure.Issue;
-import io.qase.api.annotation.CaseId;
-import io.qase.api.annotation.Step;
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-import org.assertj.core.api.SoftAssertions;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Order;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInstance;
-
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-public class TopicMessagesTests extends BaseTest {
-  private static final long SUITE_ID = 2;
-  private static final String SUITE_TITLE = "Topics";
-  private static final Topic TOPIC_FOR_MESSAGES = new Topic()
-      .setName("topic-with-clean-message-attribute-" + randomAlphabetic(5))
-      .setMessageKey(randomAlphabetic(5))
-      .setMessageContent(randomAlphabetic(10));
-  private static final Topic TOPIC_TO_CLEAR_AND_PURGE_MESSAGES = new Topic()
-      .setName("topic-to-clear-and-purge-messages-attribute-" + randomAlphabetic(5))
-      .setMessageKey(randomAlphabetic(5))
-      .setMessageContent(randomAlphabetic(10));
-  private static final Topic TOPIC_FOR_CHECKING_FILTERS = new Topic()
-      .setName("topic-for-checking-filters-" + randomAlphabetic(5))
-      .setMessageKey(randomAlphabetic(5))
-      .setMessageContent(randomAlphabetic(10));
-  private static final Topic TOPIC_TO_RECREATE = new Topic()
-      .setName("topic-to-recreate-attribute-" + randomAlphabetic(5))
-      .setMessageKey(randomAlphabetic(5))
-      .setMessageContent(randomAlphabetic(10));
-  private static final List<Topic> TOPIC_LIST = new ArrayList<>();
-
-  @BeforeAll
-  public void beforeAll() {
-    TOPIC_LIST.addAll(List.of(TOPIC_FOR_MESSAGES, TOPIC_FOR_CHECKING_FILTERS, TOPIC_TO_CLEAR_AND_PURGE_MESSAGES,
-        TOPIC_TO_RECREATE));
-    TOPIC_LIST.forEach(topic -> apiService.createTopic(topic.getName()));
-    IntStream.range(1, 3).forEach(i -> apiService.sendMessage(TOPIC_FOR_CHECKING_FILTERS));
-    waitUntilNewMinuteStarted();
-    IntStream.range(1, 3).forEach(i -> apiService.sendMessage(TOPIC_FOR_CHECKING_FILTERS));
-  }
-
-  @DisplayName("produce message")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(222)
-  @Order(1)
-  @Test
-  void produceMessage() {
-    navigateToTopicsAndOpenDetails(TOPIC_FOR_MESSAGES.getName());
-    topicDetails
-        .openDetailsTab(MESSAGES);
-    produceMessage(TOPIC_FOR_MESSAGES);
-    SoftAssertions softly = new SoftAssertions();
-    softly.assertThat(topicDetails.isKeyMessageVisible((TOPIC_FOR_MESSAGES.getMessageKey())))
-        .withFailMessage("isKeyMessageVisible()").isTrue();
-    softly.assertThat(topicDetails.isContentMessageVisible((TOPIC_FOR_MESSAGES.getMessageContent()).trim()))
-        .withFailMessage("isContentMessageVisible()").isTrue();
-    softly.assertAll();
-  }
-
-  @Disabled
-  @Issue("https://github.com/provectus/kafka-ui/issues/2778")
-  @DisplayName("clear message")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(19)
-  @Order(2)
-  @Test
-  void clearMessage() {
-    navigateToTopicsAndOpenDetails(TOPIC_FOR_MESSAGES.getName());
-    topicDetails
-        .openDetailsTab(OVERVIEW);
-    int messageAmount = topicDetails.getMessageCountAmount();
-    produceMessage(TOPIC_FOR_MESSAGES);
-    Assertions.assertEquals(messageAmount + 1, topicDetails.getMessageCountAmount(), "getMessageCountAmount()");
-    topicDetails
-        .openDotMenu()
-        .clickClearMessagesMenu()
-        .waitUntilScreenReady();
-    Assertions.assertEquals(0, topicDetails.getMessageCountAmount(), "getMessageCountAmount()");
-  }
-
-  @DisplayName("TopicTests.clearMessageOfTopic : Clear message of topic")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(239)
-  @Order(3)
-  @Test
-  void checkClearTopicMessage() {
-    navigateToTopicsAndOpenDetails(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName());
-    topicDetails
-        .openDetailsTab(OVERVIEW);
-    produceMessage(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES);
-    navigateToTopics();
-    assertThat(topicsList.getTopicItem(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName()).getNumberOfMessages())
-        .as("getNumberOfMessages()").isEqualTo(1);
-    topicsList
-        .openDotMenuByTopicName(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName())
-        .clickClearMessagesBtn()
-        .clickConfirmBtnMdl();
-    SoftAssertions softly = new SoftAssertions();
-    softly.assertThat(topicsList.isAlertWithMessageVisible(SUCCESS,
-            String.format("%s messages have been successfully cleared!", TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName())))
-        .as("isAlertWithMessageVisible()").isTrue();
-    softly.assertThat(topicsList.getTopicItem(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName()).getNumberOfMessages())
-        .as("getNumberOfMessages()").isEqualTo(0);
-    softly.assertAll();
-  }
-
-  @DisplayName("TopicTests.purgeMessagesOfTopics : Purge messages of topics")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(10)
-  @Order(4)
-  @Test
-  void checkPurgeMessagePossibility(){
-    navigateToTopics();
-    int messageAmount = topicsList.getTopicItem(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName()).getNumberOfMessages();
-    topicsList
-        .openTopic(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName());
-    topicDetails
-        .openDetailsTab(OVERVIEW);
-    produceMessage(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES);
-    navigateToTopics();
-    assertThat(topicsList.getTopicItem(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName()).getNumberOfMessages())
-        .as("getNumberOfMessages()").isEqualTo(messageAmount +1);
-    topicsList
-        .getTopicItem(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName())
-        .selectItem(true)
-        .clickPurgeMessagesOfSelectedTopicsBtn();
-    assertThat(topicsList.isConfirmationMdlVisible()).as("isConfirmationMdlVisible()").isTrue();
-    topicsList
-        .clickCancelBtnMdl()
-        .clickPurgeMessagesOfSelectedTopicsBtn()
-        .clickConfirmBtnMdl();
-    SoftAssertions softly = new SoftAssertions();
-    softly.assertThat(topicsList.isAlertWithMessageVisible(SUCCESS,
-            String.format("%s messages have been successfully cleared!",TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName())))
-        .as("isAlertWithMessageVisible()").isTrue();
-    softly.assertThat(topicsList.getTopicItem(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName()).getNumberOfMessages())
-        .as("getNumberOfMessages()").isEqualTo(0);
-    softly.assertAll();
-  }
-
-  @Disabled
-  @Issue("https://github.com/provectus/kafka-ui/issues/2819")
-  @DisplayName("Message copy from topic profile")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(21)
-  @Order(5)
-  @Test
-  void copyMessageFromTopicProfile() {
-    navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECKING_FILTERS.getName());
-    topicDetails
-        .openDetailsTab(MESSAGES)
-        .getRandomMessage()
-        .openDotMenu()
-        .clickCopyToClipBoard();
-    Assertions.assertTrue(topicDetails.isAlertWithMessageVisible(SUCCESS, "Copied successfully!"),
-        "isAlertWithMessageVisible()");
-  }
-
-  @Disabled
-  @Issue("https://github.com/provectus/kafka-ui/issues/2394")
-  @DisplayName("Checking messages filtering by Offset within Topic/Messages")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(15)
-  @Order(6)
-  @Test
-  void checkingMessageFilteringByOffset() {
-    navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECKING_FILTERS.getName());
-    topicDetails
-        .openDetailsTab(MESSAGES);
-    TopicDetails.MessageGridItem secondMessage = topicDetails.getMessageByOffset(1);
-    topicDetails
-        .selectSeekTypeDdlMessagesTab("Offset")
-        .setSeekTypeValueFldMessagesTab(String.valueOf(secondMessage.getOffset()))
-        .clickSubmitFiltersBtnMessagesTab();
-    SoftAssertions softly = new SoftAssertions();
-    topicDetails.getAllMessages().forEach(message ->
-        softly.assertThat(message.getOffset() == secondMessage.getOffset()
-                || message.getOffset() > secondMessage.getOffset())
-            .as(String.format("Expected offset is: %s, but found: %s", secondMessage.getOffset(), message.getOffset()))
-            .isTrue());
-    softly.assertAll();
-  }
-
-  @Disabled
-  @Issue("https://github.com/provectus/kafka-ui/issues/3215")
-  @Issue("https://github.com/provectus/kafka-ui/issues/2345")
-  @DisplayName("Checking messages filtering by Timestamp within Messages/Topic")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(16)
-  @Order(7)
-  @Test
-  void checkingMessageFilteringByTimestamp() {
-    navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECKING_FILTERS.getName());
-    topicDetails
-        .openDetailsTab(MESSAGES);
-    LocalDateTime firstTimestamp = topicDetails.getMessageByOffset(0).getTimestamp();
-    List<TopicDetails.MessageGridItem> nextMessages = topicDetails.getAllMessages().stream()
-        .filter(message -> message.getTimestamp().getMinute() != firstTimestamp.getMinute())
-        .collect(Collectors.toList());
-    LocalDateTime nextTimestamp = Objects.requireNonNull(nextMessages.stream()
-        .findFirst().orElse(null)).getTimestamp();
-    topicDetails
-        .selectSeekTypeDdlMessagesTab("Timestamp")
-        .openCalendarSeekType()
-        .selectDateAndTimeByCalendar(nextTimestamp)
-        .clickSubmitFiltersBtnMessagesTab();
-    SoftAssertions softly = new SoftAssertions();
-    topicDetails.getAllMessages().forEach(message ->
-        softly.assertThat(message.getTimestamp().isEqual(nextTimestamp)
-                || message.getTimestamp().isAfter(nextTimestamp))
-            .as(String.format("Expected timestamp is: %s, but found: %s", nextTimestamp, message.getTimestamp()))
-            .isTrue());
-    softly.assertAll();
-  }
-
-  @Disabled
-  @Issue("https://github.com/provectus/kafka-ui/issues/2778")
-  @DisplayName("Clear message of topic from topic profile")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(246)
-  @Order(8)
-  @Test
-  void checkClearTopicMessageFromOverviewTab() {
-    navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECKING_FILTERS.getName());
-    topicDetails
-        .openDetailsTab(OVERVIEW)
-        .openDotMenu()
-        .clickClearMessagesMenu()
-        .clickConfirmBtnMdl();
-    SoftAssertions softly = new SoftAssertions();
-    softly.assertThat(topicDetails.isAlertWithMessageVisible(SUCCESS,
-            String.format("%s messages have been successfully cleared!", TOPIC_FOR_CHECKING_FILTERS.getName())))
-        .as("isAlertWithMessageVisible()").isTrue();
-    softly.assertThat(topicDetails.getMessageCountAmount())
-        .as("getMessageCountAmount()= " + topicDetails.getMessageCountAmount()).isEqualTo(0);
-    softly.assertAll();
-  }
-
-  @DisplayName("TopicTests.recreateTopic : Recreate topic")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(240)
-  @Order(9)
-  @Test
-  void checkRecreateTopic(){
-    navigateToTopicsAndOpenDetails(TOPIC_TO_RECREATE.getName());
-    topicDetails
-        .openDetailsTab(OVERVIEW);
-    produceMessage(TOPIC_TO_RECREATE);
-    navigateToTopics();
-    assertThat(topicsList.getTopicItem(TOPIC_TO_RECREATE.getName()).getNumberOfMessages())
-        .as("getNumberOfMessages()").isEqualTo(1);
-    topicsList
-        .openDotMenuByTopicName(TOPIC_TO_RECREATE.getName())
-        .clickRecreateTopicBtn()
-        .clickConfirmBtnMdl();
-    SoftAssertions softly = new SoftAssertions();
-    softly.assertThat(topicDetails.isAlertWithMessageVisible(SUCCESS,
-            String.format("Topic %s successfully recreated!", TOPIC_TO_RECREATE.getName())))
-        .as("isAlertWithMessageVisible()").isTrue();
-    softly.assertThat(topicsList.getTopicItem(TOPIC_TO_RECREATE.getName()).getNumberOfMessages())
-        .as("getNumberOfMessages()").isEqualTo(0);
-    softly.assertAll();
-  }
-
-  @Step
-  protected void produceMessage(Topic topic){
-    topicDetails
-        .clickProduceMessageBtn();
-    produceMessagePanel
-        .waitUntilScreenReady()
-        .setKeyField(topic.getMessageKey())
-        .setContentFiled(topic.getMessageContent())
-        .submitProduceMessage();
-    topicDetails
-        .waitUntilScreenReady();
-  }
-
-  @AfterAll
-  public void afterAll() {
-    TOPIC_LIST.forEach(topic -> apiService.deleteTopic(topic.getName()));
-  }
-}

+ 0 - 551
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/suite/topics/TopicsTests.java

@@ -1,551 +0,0 @@
-package com.provectus.kafka.ui.suite.topics;
-
-import static com.provectus.kafka.ui.pages.BasePage.AlertHeader.SUCCESS;
-import static com.provectus.kafka.ui.pages.topic.TopicDetails.TopicMenu.MESSAGES;
-import static com.provectus.kafka.ui.pages.topic.TopicDetails.TopicMenu.SETTINGS;
-import static com.provectus.kafka.ui.pages.topic.enums.CleanupPolicyValue.COMPACT;
-import static com.provectus.kafka.ui.pages.topic.enums.CleanupPolicyValue.DELETE;
-import static com.provectus.kafka.ui.pages.topic.enums.CustomParameterType.COMPRESSION_TYPE;
-import static com.provectus.kafka.ui.pages.topic.enums.MaxSizeOnDisk.NOT_SET;
-import static com.provectus.kafka.ui.pages.topic.enums.MaxSizeOnDisk.SIZE_1_GB;
-import static com.provectus.kafka.ui.pages.topic.enums.MaxSizeOnDisk.SIZE_50_GB;
-import static com.provectus.kafka.ui.pages.topic.enums.TimeToRetain.BTN_2_DAYS;
-import static com.provectus.kafka.ui.pages.topic.enums.TimeToRetain.BTN_7_DAYS;
-import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
-import static org.apache.commons.lang3.RandomUtils.nextInt;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import com.codeborne.selenide.Condition;
-import com.provectus.kafka.ui.base.BaseTest;
-import com.provectus.kafka.ui.models.Topic;
-import com.provectus.kafka.ui.pages.topic.TopicDetails;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
-import io.qameta.allure.Issue;
-import io.qase.api.annotation.CaseId;
-import java.util.ArrayList;
-import java.util.List;
-import org.assertj.core.api.SoftAssertions;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.MethodOrderer;
-import org.junit.jupiter.api.Order;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInstance;
-import org.junit.jupiter.api.TestMethodOrder;
-
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
-public class TopicsTests extends BaseTest {
-  private static final long SUITE_ID = 2;
-  private static final String SUITE_TITLE = "Topics";
-  private static final Topic TOPIC_TO_CREATE = new Topic()
-      .setName("new-topic-" + randomAlphabetic(5))
-      .setNumberOfPartitions(1)
-      .setCustomParameterType(COMPRESSION_TYPE)
-      .setCustomParameterValue("producer")
-      .setCleanupPolicyValue(DELETE);
-  private static final Topic TOPIC_TO_UPDATE_AND_DELETE = new Topic()
-      .setName("topic-to-update-and-delete-" + randomAlphabetic(5))
-      .setNumberOfPartitions(1)
-      .setCleanupPolicyValue(DELETE)
-      .setTimeToRetain(BTN_7_DAYS)
-      .setMaxSizeOnDisk(NOT_SET)
-      .setMaxMessageBytes("1048588")
-      .setMessageKey(randomAlphabetic(5))
-      .setMessageContent(randomAlphabetic(10));
-  private static final Topic TOPIC_TO_CHECK_SETTINGS = new Topic()
-      .setName("new-topic-" + randomAlphabetic(5))
-      .setNumberOfPartitions(1)
-      .setMaxMessageBytes("1000012")
-      .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 List<Topic> TOPIC_LIST = new ArrayList<>();
-
-  @BeforeAll
-  public void beforeAll() {
-    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()));
-  }
-
-  @DisplayName("should create a topic")
-  @Suite(suiteId = 4, title = "Create new Topic")
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(199)
-  @Test
-  @Order(1)
-  public void createTopic() {
-    navigateToTopics();
-    topicsList
-        .clickAddTopicBtn();
-    topicCreateEditForm
-        .waitUntilScreenReady()
-        .setTopicName(TOPIC_TO_CREATE.getName())
-        .setNumberOfPartitions(TOPIC_TO_CREATE.getNumberOfPartitions())
-        .selectCleanupPolicy(TOPIC_TO_CREATE.getCleanupPolicyValue())
-        .clickCreateTopicBtn();
-    navigateToTopicsAndOpenDetails(TOPIC_TO_CREATE.getName());
-    SoftAssertions softly = new SoftAssertions();
-    softly.assertThat(topicDetails.isTopicHeaderVisible(TOPIC_TO_CREATE.getName())).as("isTopicHeaderVisible()")
-        .isTrue();
-    softly.assertThat(topicDetails.getCleanUpPolicy()).as("getCleanUpPolicy()")
-        .isEqualTo(TOPIC_TO_CREATE.getCleanupPolicyValue().toString());
-    softly.assertThat(topicDetails.getPartitions()).as("getPartitions()")
-        .isEqualTo(TOPIC_TO_CREATE.getNumberOfPartitions());
-    softly.assertAll();
-    navigateToTopics();
-    Assertions.assertTrue(topicsList.isTopicVisible(TOPIC_TO_CREATE.getName()), "isTopicVisible");
-    TOPIC_LIST.add(TOPIC_TO_CREATE);
-  }
-
-  @DisplayName("Checking available operations for selected Topic within 'All Topics' page")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(7)
-  @Test
-  @Order(2)
-  void checkAvailableOperations() {
-    navigateToTopics();
-    topicsList
-        .getTopicItem("my_ksql_1ksql_processing_log")
-        .selectItem(true);
-    verifyElementsCondition(topicsList.getActionButtons(),Condition.enabled);
-    topicsList
-        .getTopicItem("_confluent-ksql-my_ksql_1_command_topic")
-        .selectItem(true);
-    Assertions.assertFalse(topicsList.isCopySelectedTopicBtnEnabled(), "isCopySelectedTopicBtnEnabled()");
-  }
-
-  @Disabled()
-  @Issue("https://github.com/provectus/kafka-ui/issues/2625")
-  @DisplayName("should update a topic")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(197)
-  @Test
-  @Order(3)
-  public void updateTopic() {
-    navigateToTopicsAndOpenDetails(TOPIC_TO_UPDATE_AND_DELETE.getName());
-    topicDetails
-        .openDotMenu()
-        .clickEditSettingsMenu();
-    topicCreateEditForm
-        .waitUntilScreenReady();
-    SoftAssertions softly = new SoftAssertions();
-    softly.assertThat(topicCreateEditForm.getCleanupPolicy()).as("getCleanupPolicy()")
-        .isEqualTo(TOPIC_TO_UPDATE_AND_DELETE.getCleanupPolicyValue().getVisibleText());
-    softly.assertThat(topicCreateEditForm.getTimeToRetain()).as("getTimeToRetain()")
-        .isEqualTo(TOPIC_TO_UPDATE_AND_DELETE.getTimeToRetain().getValue());
-    softly.assertThat(topicCreateEditForm.getMaxSizeOnDisk()).as("getMaxSizeOnDisk()")
-        .isEqualTo(TOPIC_TO_UPDATE_AND_DELETE.getMaxSizeOnDisk().getVisibleText());
-    softly.assertThat(topicCreateEditForm.getMaxMessageBytes()).as("getMaxMessageBytes()")
-        .isEqualTo(TOPIC_TO_UPDATE_AND_DELETE.getMaxMessageBytes());
-    softly.assertAll();
-    TOPIC_TO_UPDATE_AND_DELETE
-        .setCleanupPolicyValue(COMPACT)
-        .setTimeToRetain(BTN_2_DAYS)
-        .setMaxSizeOnDisk(SIZE_50_GB).setMaxMessageBytes("1048589");
-    topicCreateEditForm
-        .selectCleanupPolicy((TOPIC_TO_UPDATE_AND_DELETE.getCleanupPolicyValue()))
-        .setTimeToRetainDataByButtons(TOPIC_TO_UPDATE_AND_DELETE.getTimeToRetain())
-        .setMaxSizeOnDiskInGB(TOPIC_TO_UPDATE_AND_DELETE.getMaxSizeOnDisk())
-        .setMaxMessageBytes(TOPIC_TO_UPDATE_AND_DELETE.getMaxMessageBytes())
-        .clickCreateTopicBtn();
-    softly.assertThat(topicDetails.isAlertWithMessageVisible(SUCCESS, "Topic successfully updated."))
-        .as("isAlertWithMessageVisible()").isTrue();
-    softly.assertThat(topicDetails.isTopicHeaderVisible(TOPIC_TO_UPDATE_AND_DELETE.getName()))
-        .as("isTopicHeaderVisible()").isTrue();
-    softly.assertAll();
-    topicDetails
-        .waitUntilScreenReady();
-    navigateToTopicsAndOpenDetails(TOPIC_TO_UPDATE_AND_DELETE.getName());
-    topicDetails
-        .openDotMenu()
-        .clickEditSettingsMenu();
-    softly.assertThat(topicCreateEditForm.isNameFieldEnabled()).as("isNameFieldEnabled()").isFalse();
-    softly.assertThat(topicCreateEditForm.getCleanupPolicy()).as("getCleanupPolicy()")
-        .isEqualTo(TOPIC_TO_UPDATE_AND_DELETE.getCleanupPolicyValue().getVisibleText());
-    softly.assertThat(topicCreateEditForm.getTimeToRetain()).as("getTimeToRetain()")
-        .isEqualTo(TOPIC_TO_UPDATE_AND_DELETE.getTimeToRetain().getValue());
-    softly.assertThat(topicCreateEditForm.getMaxSizeOnDisk()).as("getMaxSizeOnDisk()")
-        .isEqualTo(TOPIC_TO_UPDATE_AND_DELETE.getMaxSizeOnDisk().getVisibleText());
-    softly.assertThat(topicCreateEditForm.getMaxMessageBytes()).as("getMaxMessageBytes()")
-        .isEqualTo(TOPIC_TO_UPDATE_AND_DELETE.getMaxMessageBytes());
-    softly.assertAll();
-  }
-
-  @DisplayName("TopicTests.removeTopicFromAllTopics : Remove topic from 'all topics'/'TopicList'")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(242)
-  @Test
-  @Order(4)
-  public void removeTopicFromTopicList() {
-    navigateToTopics();
-    topicsList
-        .openDotMenuByTopicName(TOPIC_TO_UPDATE_AND_DELETE.getName())
-        .clickRemoveTopicBtn()
-        .clickConfirmBtnMdl();
-    Assertions.assertTrue(topicsList.isAlertWithMessageVisible(SUCCESS,
-            String.format("Topic %s successfully deleted!", TOPIC_TO_UPDATE_AND_DELETE.getName())),
-        "isAlertWithMessageVisible()");
-    TOPIC_LIST.remove(TOPIC_TO_UPDATE_AND_DELETE);
-  }
-
-  @DisplayName("should delete topic")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(207)
-  @Test
-  @Order(5)
-  public void deleteTopic() {
-    navigateToTopicsAndOpenDetails(TOPIC_FOR_DELETE.getName());
-    topicDetails
-        .openDotMenu()
-        .clickDeleteTopicMenu()
-        .clickConfirmBtnMdl();
-    navigateToTopics();
-    Assertions.assertFalse(topicsList.isTopicVisible(TOPIC_FOR_DELETE.getName()), "isTopicVisible");
-    TOPIC_LIST.remove(TOPIC_FOR_DELETE);
-  }
-
-  @DisplayName("Redirect to consumer from topic profile")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(20)
-  @Test
-  @Order(6)
-  void redirectToConsumerFromTopic() {
-    String topicName = "source-activities";
-    String consumerGroupId = "connect-sink_postgres_activities";
-    navigateToTopicsAndOpenDetails(topicName);
-    topicDetails
-        .openDetailsTab(TopicDetails.TopicMenu.CONSUMERS)
-        .openConsumerGroup(consumerGroupId);
-    consumersDetails
-        .waitUntilScreenReady();
-    assertThat(consumersDetails.isRedirectedConsumerTitleVisible(consumerGroupId))
-        .withFailMessage("isRedirectedConsumerTitleVisible").isTrue();
-    assertThat(consumersDetails.isTopicInConsumersDetailsVisible(topicName))
-        .withFailMessage("isTopicInConsumersDetailsVisible").isTrue();
-  }
-
-  @DisplayName("Checking Topic creation possibility in case of empty Topic Name")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(4)
-  @Test
-  @Order(7)
-  void checkTopicCreatePossibility() {
-    navigateToTopics();
-    topicsList
-        .clickAddTopicBtn();
-    topicCreateEditForm
-        .waitUntilScreenReady();
-    assertThat(topicCreateEditForm.isCreateTopicButtonEnabled()).as("isCreateTopicButtonEnabled()").isFalse();
-    topicCreateEditForm
-        .setTopicName("testName");
-    assertThat(topicCreateEditForm.isCreateTopicButtonEnabled()).as("isCreateTopicButtonEnabled()").isFalse();
-    topicCreateEditForm
-        .setTopicName(null)
-        .setNumberOfPartitions(nextInt(1, 10));
-    assertThat(topicCreateEditForm.isCreateTopicButtonEnabled()).as("isCreateTopicButtonEnabled()").isFalse();
-    topicCreateEditForm
-        .setTopicName("testName");
-    assertThat(topicCreateEditForm.isCreateTopicButtonEnabled()).as("isCreateTopicButtonEnabled()").isTrue();
-  }
-
-  @DisplayName("Checking 'Time to retain data (in ms)' custom value with editing Topic's settings")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(266)
-  @Test
-  @Order(8)
-  void checkTimeToRetainDataCustomValueWithEditingTopic() {
-    Topic topicToRetainData = new Topic()
-        .setName("topic-to-retain-data-" + randomAlphabetic(5))
-        .setTimeToRetainData("86400000");
-    navigateToTopics();
-    topicsList
-        .clickAddTopicBtn();
-    topicCreateEditForm
-        .waitUntilScreenReady()
-        .setTopicName(topicToRetainData.getName())
-        .setNumberOfPartitions(1)
-        .setTimeToRetainDataInMs("604800000");
-    assertThat(topicCreateEditForm.getTimeToRetain()).as("getTimeToRetain()").isEqualTo("604800000");
-    topicCreateEditForm
-        .setTimeToRetainDataInMs(topicToRetainData.getTimeToRetainData())
-        .clickCreateTopicBtn();
-    topicDetails
-        .waitUntilScreenReady()
-        .openDotMenu()
-        .clickEditSettingsMenu();
-    assertThat(topicCreateEditForm.getTimeToRetain()).as("getTimeToRetain()")
-        .isEqualTo(topicToRetainData.getTimeToRetainData());
-    topicDetails
-        .openDetailsTab(SETTINGS);
-    assertThat(topicDetails.getSettingsGridValueByKey("retention.ms")).as("getSettingsGridValueByKey()")
-        .isEqualTo(topicToRetainData.getTimeToRetainData());
-    TOPIC_LIST.add(topicToRetainData);
-  }
-
-  @DisplayName("Checking requiredness of Custom parameters within 'Create new Topic'")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(6)
-  @Test
-  @Order(9)
-  void checkCustomParametersWithinCreateNewTopic() {
-    navigateToTopics();
-    topicsList
-        .clickAddTopicBtn();
-    topicCreateEditForm
-        .waitUntilScreenReady()
-        .setTopicName(TOPIC_TO_CREATE.getName())
-        .clickAddCustomParameterTypeButton()
-        .setCustomParameterType(TOPIC_TO_CREATE.getCustomParameterType());
-    assertThat(topicCreateEditForm.isDeleteCustomParameterButtonEnabled()).as("isDeleteCustomParameterButtonEnabled()")
-        .isTrue();
-    topicCreateEditForm
-        .clearCustomParameterValue();
-    assertThat(topicCreateEditForm.isValidationMessageCustomParameterValueVisible())
-        .as("isValidationMessageCustomParameterValueVisible()").isTrue();
-  }
-
-  @DisplayName("Checking Topics section within Kafka-ui Application")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(2)
-  @Test
-  @Order(10)
-  void checkTopicListElements() {
-    navigateToTopics();
-    verifyElementsCondition(topicsList.getAllVisibleElements(), Condition.visible);
-    verifyElementsCondition(topicsList.getAllEnabledElements(), Condition.enabled);
-  }
-
-  @DisplayName("Filter adding within Topic")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(12)
-  @Test
-  @Order(11)
-  void addingNewFilterWithinTopic() {
-    String filterName = randomAlphabetic(5);
-    navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECK_FILTERS.getName());
-    topicDetails
-        .openDetailsTab(MESSAGES)
-        .clickMessagesAddFiltersBtn()
-        .waitUntilAddFiltersMdlVisible();
-    verifyElementsCondition(topicDetails.getAllAddFilterModalVisibleElements(), Condition.visible);
-    verifyElementsCondition(topicDetails.getAllAddFilterModalEnabledElements(), Condition.enabled);
-    verifyElementsCondition(topicDetails.getAllAddFilterModalDisabledElements(), Condition.disabled);
-    assertThat(topicDetails.isSaveThisFilterCheckBoxSelected()).as("isSaveThisFilterCheckBoxSelected()")
-        .isFalse();
-    topicDetails
-        .setFilterCodeFieldAddFilterMdl(filterName);
-    assertThat(topicDetails.isAddFilterBtnAddFilterMdlEnabled()).as("isAddFilterBtnAddFilterMdlEnabled()")
-        .isTrue();
-    topicDetails.clickAddFilterBtnAndCloseMdl(true);
-    assertThat(topicDetails.isActiveFilterVisible(filterName)).as("isActiveFilterVisible()")
-        .isTrue();
-  }
-
-  @DisplayName("Checking filter saving within Messages/Topic profile/Saved Filters")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(13)
-  @Test
-  @Order(12)
-  void checkFilterSavingWithinSavedFilters() {
-    String displayName = randomAlphabetic(5);
-    navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECK_FILTERS.getName());
-    topicDetails
-        .openDetailsTab(MESSAGES)
-        .clickMessagesAddFiltersBtn()
-        .waitUntilAddFiltersMdlVisible()
-        .setFilterCodeFieldAddFilterMdl(randomAlphabetic(4))
-        .selectSaveThisFilterCheckboxMdl(true)
-        .setDisplayNameFldAddFilterMdl(displayName);
-    assertThat(topicDetails.isAddFilterBtnAddFilterMdlEnabled()).as("isAddFilterBtnAddFilterMdlEnabled()")
-        .isTrue();
-    topicDetails
-        .clickAddFilterBtnAndCloseMdl(false)
-        .openSavedFiltersListMdl();
-    assertThat(topicDetails.isFilterVisibleAtSavedFiltersMdl(displayName))
-        .as("isFilterVisibleAtSavedFiltersMdl()").isTrue();
-  }
-
-  @DisplayName("Checking applying saved filter within Topic/Messages")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(14)
-  @Test
-  @Order(13)
-  void checkingApplyingSavedFilterWithinTopicMessages() {
-    String displayName = randomAlphabetic(5);
-    navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECK_FILTERS.getName());
-    topicDetails
-        .openDetailsTab(MESSAGES)
-        .clickMessagesAddFiltersBtn()
-        .waitUntilAddFiltersMdlVisible()
-        .setFilterCodeFieldAddFilterMdl(randomAlphabetic(4))
-        .selectSaveThisFilterCheckboxMdl(true)
-        .setDisplayNameFldAddFilterMdl(displayName)
-        .clickAddFilterBtnAndCloseMdl(false)
-        .openSavedFiltersListMdl()
-        .selectFilterAtSavedFiltersMdl(displayName)
-        .clickSelectFilterBtnAtSavedFiltersMdl();
-    assertThat(topicDetails.isActiveFilterVisible(displayName))
-        .as("isActiveFilterVisible()").isTrue();
-  }
-
-  @DisplayName("Checking 'Show Internal Topics' toggle functionality within 'All Topics' page")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(11)
-  @Test
-  @Order(14)
-  void checkShowInternalTopicsButtonFunctionality(){
-    navigateToTopics();
-    SoftAssertions softly = new SoftAssertions();
-    softly.assertThat(topicsList.isShowInternalRadioBtnSelected()).as("isInternalRadioBtnSelected()").isTrue();
-    softly.assertThat(topicsList.getInternalTopics()).as("getInternalTopics()").size().isGreaterThan(0);
-    softly.assertThat(topicsList.getNonInternalTopics()).as("getNonInternalTopics()").size().isGreaterThan(0);
-    softly.assertAll();
-    topicsList
-        .setShowInternalRadioButton(false);
-    softly.assertThat(topicsList.getInternalTopics()).as("getInternalTopics()").size().isEqualTo(0);
-    softly.assertThat(topicsList.getNonInternalTopics()).as("getNonInternalTopics()").size().isGreaterThan(0);
-    softly.assertAll();
-  }
-
-  @DisplayName("Checking Topics settings to make sure retention.bytes is right according to Max size on disk in GB selected value")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(56)
-  @Test
-  @Order(15)
-  void checkRetentionBytesAccordingToMaxSizeOnDisk(){
-    navigateToTopics();
-    topicsList
-        .clickAddTopicBtn();
-    topicCreateEditForm
-        .waitUntilScreenReady()
-        .setTopicName(TOPIC_TO_CHECK_SETTINGS.getName())
-        .setNumberOfPartitions(TOPIC_TO_CHECK_SETTINGS.getNumberOfPartitions())
-        .setMaxMessageBytes(TOPIC_TO_CHECK_SETTINGS.getMaxMessageBytes())
-        .clickCreateTopicBtn();
-    topicDetails
-        .waitUntilScreenReady();
-    TOPIC_LIST.add(TOPIC_TO_CHECK_SETTINGS);
-    topicDetails
-        .openDetailsTab(SETTINGS);
-    topicSettingsTab
-        .waitUntilScreenReady();
-    SoftAssertions softly = new SoftAssertions();
-    softly.assertThat(topicSettingsTab.getValueByKey("retention.bytes"))
-        .as("getValueOfKey(retention.bytes)").isEqualTo(TOPIC_TO_CHECK_SETTINGS.getMaxSizeOnDisk().getOptionValue());
-    softly.assertThat(topicSettingsTab.getValueByKey("max.message.bytes"))
-        .as("getValueOfKey(max.message.bytes)").isEqualTo(TOPIC_TO_CHECK_SETTINGS.getMaxMessageBytes());
-    softly.assertAll();
-    TOPIC_TO_CHECK_SETTINGS
-        .setMaxSizeOnDisk(SIZE_1_GB)
-        .setMaxMessageBytes("1000056");
-    topicDetails
-        .openDotMenu()
-        .clickEditSettingsMenu();
-    topicCreateEditForm
-        .waitUntilScreenReady()
-        .setMaxSizeOnDiskInGB(TOPIC_TO_CHECK_SETTINGS.getMaxSizeOnDisk())
-        .setMaxMessageBytes(TOPIC_TO_CHECK_SETTINGS.getMaxMessageBytes())
-        .clickCreateTopicBtn();
-    topicDetails
-        .waitUntilScreenReady()
-        .openDetailsTab(SETTINGS);
-    topicSettingsTab
-        .waitUntilScreenReady();
-    softly.assertThat(topicSettingsTab.getValueByKey("retention.bytes"))
-        .as("getValueOfKey(retention.bytes)").isEqualTo(TOPIC_TO_CHECK_SETTINGS.getMaxSizeOnDisk().getOptionValue());
-    softly.assertThat(topicSettingsTab.getValueByKey("max.message.bytes"))
-        .as("getValueOfKey(max.message.bytes)").isEqualTo(TOPIC_TO_CHECK_SETTINGS.getMaxMessageBytes());
-    softly.assertAll();
-  }
-
-  @DisplayName("TopicTests.recreateTopicFromTopicProfile : Recreate topic from topic profile")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(247)
-  @Test
-  @Order(16)
-  void recreateTopicFromTopicProfile(){
-    Topic topicToRecreate = new Topic()
-        .setName("topic-to-recreate-" + randomAlphabetic(5))
-        .setNumberOfPartitions(1);
-    navigateToTopics();
-    topicsList
-        .clickAddTopicBtn();
-    topicCreateEditForm
-        .waitUntilScreenReady()
-        .setTopicName(topicToRecreate.getName())
-        .setNumberOfPartitions(topicToRecreate.getNumberOfPartitions())
-        .clickCreateTopicBtn();
-    topicDetails
-        .waitUntilScreenReady();
-    TOPIC_LIST.add(topicToRecreate);
-    topicDetails
-        .openDotMenu()
-        .clickRecreateTopicMenu();
-    assertThat(topicDetails.isConfirmationMdlVisible()).as("isConfirmationMdlVisible()").isTrue();
-    topicDetails
-        .clickConfirmBtnMdl();
-    assertThat(topicDetails.isAlertWithMessageVisible(SUCCESS,
-        String.format("Topic %s successfully recreated!", topicToRecreate.getName())))
-        .as("isAlertWithMessageVisible()").isTrue();
-  }
-
-  @DisplayName("TopicTests.copyTopic : Copy topic")
-  @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-  @AutomationStatus(status = Status.AUTOMATED)
-  @CaseId(8)
-  @Test
-  @Order(17)
-  void checkCopyTopicPossibility(){
-    Topic topicToCopy = new Topic()
-        .setName("topic-to-copy-" + randomAlphabetic(5))
-        .setNumberOfPartitions(1);
-    navigateToTopics();
-    topicsList
-        .getTopicItem("_schemas")
-        .selectItem(true)
-        .clickCopySelectedTopicBtn();
-    topicCreateEditForm
-        .waitUntilScreenReady();
-    assertThat(topicCreateEditForm.isCreateTopicButtonEnabled()).as("isCreateTopicButtonEnabled()").isFalse();
-    topicCreateEditForm
-        .setTopicName(topicToCopy.getName())
-        .setNumberOfPartitions(topicToCopy.getNumberOfPartitions())
-        .clickCreateTopicBtn();
-    topicDetails
-        .waitUntilScreenReady();
-    TOPIC_LIST.add(topicToCopy);
-    SoftAssertions softly = new SoftAssertions();
-    softly.assertThat(topicDetails.isAlertWithMessageVisible(SUCCESS, "Topic successfully created."))
-        .as("isAlertWithMessageVisible()").isTrue();
-    softly.assertThat(topicDetails.isTopicHeaderVisible(topicToCopy.getName()))
-        .as("isTopicHeaderVisible()").isTrue();
-    softly.assertAll();
-  }
-
-  @AfterAll
-  public void afterAll() {
-    TOPIC_LIST.forEach(topic -> apiService.deleteTopic(topic.getName()));
-  }
-}

+ 8 - 0
kafka-ui-e2e-checks/src/test/resources/regression.xml

@@ -0,0 +1,8 @@
+<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
+<suite name="RegressionSuite">
+    <test name="Regression" enabled="true" parallel="classes" thread-count="1">
+        <packages>
+            <package name="com.provectus.kafka.ui.regressionSuite.*"/>
+        </packages>
+    </test>
+</suite>

+ 8 - 0
kafka-ui-e2e-checks/src/test/resources/smoke.xml

@@ -0,0 +1,8 @@
+<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
+<suite name="SmokeSuite">
+    <test name="Smoke" enabled="true" parallel="classes" thread-count="1">
+        <packages>
+            <package name="com.provectus.kafka.ui.smokeSuite.*"/>
+        </packages>
+    </test>
+</suite>