Bläddra i källkod

[e2e] Setup qase integration (once again) (#3441)

* add checkNewBrokersTest

* add manual cases and listeners

* add manual cases and listeners

* add manual cases and listeners

* upd manual suite

* upd listeners

* add readme

* upd template

* upd naming

* upd template

* upd template

* upd template

* upd template

* fix naming

* fix MessagesTest

* upd manual cases

* upd comments
Vlad Senyuta 2 år sedan
förälder
incheckning
f193e5fed7
32 ändrade filer med 768 tillägg och 225 borttagningar
  1. 0 2
      .github/workflows/e2e-automation.yml
  2. 43 0
      .github/workflows/e2e-manual.yml
  3. 70 0
      kafka-ui-e2e-checks/QASE.md
  4. 5 0
      kafka-ui-e2e-checks/README.md
  5. 3 3
      kafka-ui-e2e-checks/pom.xml
  6. 123 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/settings/listeners/QaseCreateListener.java
  7. 102 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/settings/listeners/QaseResultListener.java
  8. 1 1
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/QaseSetup.java
  9. 15 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/annotations/Automation.java
  10. 0 12
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/annotations/AutomationStatus.java
  11. 13 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/annotations/Status.java
  12. 5 2
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/annotations/Suite.java
  13. 18 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/enums/State.java
  14. 14 1
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/enums/Status.java
  15. 0 1
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/variables/Suite.java
  16. 4 4
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/BaseTest.java
  17. 1 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/Facade.java
  18. 28 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/BaseManualTest.java
  19. 0 4
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/TestClass.java
  20. 29 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/suite/DataMaskingTest.java
  21. 53 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/suite/RbacTest.java
  22. 95 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/suite/TopicsTest.java
  23. 16 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/BaseQaseTest.java
  24. 58 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/Template.java
  25. 0 4
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/TestClass.java
  26. 2 5
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/SmokeTest.java
  27. 3 13
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/brokers/BrokersTest.java
  28. 4 15
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/connectors/ConnectorsTest.java
  29. 8 17
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/ksqlDb/KsqlDbTest.java
  30. 10 31
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/schemas/SchemasTest.java
  31. 25 49
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/MessagesTest.java
  32. 20 61
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/TopicsTest.java

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

@@ -8,8 +8,6 @@ on:
         required: true
         type: choice
         options:
-          - manual
-          - qase
           - regression
           - sanity
           - smoke

+ 43 - 0
.github/workflows/e2e-manual.yml

@@ -0,0 +1,43 @@
+name: E2E Manual suite
+on:
+  workflow_dispatch:
+    inputs:
+      test_suite:
+        description: 'Select test suite to run'
+        default: 'manual'
+        required: true
+        type: choice
+        options:
+          - manual
+          - qase
+      qase_token:
+        description: 'Set Qase token to enable integration'
+        required: true
+        type: string
+
+jobs:
+  build-and-test:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+        with:
+          ref: ${{ github.sha }}
+      - name: Set up environment
+        id: set_env_values
+        run: |
+          cat "./kafka-ui-e2e-checks/.env.ci" >> "./kafka-ui-e2e-checks/.env"
+      - name: Set up JDK
+        uses: actions/setup-java@v3
+        with:
+          java-version: '17'
+          distribution: 'zulu'
+          cache: 'maven'
+      - name: Build with Maven
+        id: build_app
+        run: |
+          ./mvnw -B -ntp versions:set -DnewVersion=${{ github.sha }}
+          ./mvnw -B -V -ntp clean install -Pprod -Dmaven.test.skip=true ${{ github.event.inputs.extraMavenOptions }}
+      - name: Run test suite
+        run: |
+          ./mvnw -B -ntp versions:set -DnewVersion=${{ github.sha }}
+          ./mvnw -B -V -ntp -DQASEIO_API_TOKEN=${{ github.event.inputs.qase_token }} -Dsurefire.suiteXmlFiles='src/test/resources/${{ github.event.inputs.test_suite }}.xml' -Dsuite=${{ github.event.inputs.test_suite }} -f 'kafka-ui-e2e-checks' test -Pprod

+ 70 - 0
kafka-ui-e2e-checks/QASE.md

@@ -0,0 +1,70 @@
+### E2E integration with Qase.io TMS (for internal users)
+
+### Table of Contents
+
+- [Intro](#intro)
+- [Set up Qase.io integration](#set-up-qase-integration)
+- [Test case creation](#test-case-creation)
+- [Test run reporting](#test-run-reporting)
+
+### Intro
+
+We're using [Qase.io](https://help.qase.io/en/) as TMS to keep test cases and accumulate test runs.
+Integration is set up through API using [qase-api](https://mvnrepository.com/artifact/io.qase/qase-api)
+and [qase-testng](https://mvnrepository.com/artifact/io.qase/qase-testng) libraries.
+
+### Set up Qase integration
+
+To set up integration locally add next VM option `-DQASEIO_API_TOKEN='%s'`
+(add your [Qase token](https://app.qase.io/user/api/token) instead of '%s') into your run configuration
+
+### Test case creation
+
+All new test cases can be added into TMS by default if they have no QaseId and QaseTitle matching already existing
+cases.
+But to handle `@Suite` and `@Automation` we added custom QaseCreateListener. To create new test case for next sync with
+Qase (see example `kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/Template.java`):
+
+1. Create new class in `kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/suit`
+2. Inherit it from `kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/BaseQaseTest.java`
+3. Create new test method with some name inside the class and annotate it with:
+
+- `@Automation` (optional - Not automated by default) - to set one of automation states: NOT_AUTOMATED, TO_BE_AUTOMATED,
+  AUTOMATED
+- `@QaseTitle` (required) - to set title for new test case and to check is there no existing cases with same title in
+  Qase.io
+- `@Status` (optional - Draft by default) - to set one of case statuses: ACTUAL, DRAFT, DEPRECATED
+- `@Suite` (optional) - to store new case in some existing package need to set its id, otherwise case will be stored in
+  the root
+- `@Test` (required) - annotation from TestNG to specify this method as test
+
+4. Create new private void step methods with some name inside the same class and annotate it with
+   @io.qase.api.annotation.Step to specify this method as step.
+5. Use defined step methods inside created test method in concrete order
+6. If there are any additional cases to create you can repeat scenario in a new class
+7. There are two ways to sync newly created cases in the framework with Qase.io:
+
+- sync can be performed locally - run new test classes with
+  already [set up Qase.io integration](#Set up Qase.io integration)
+- also you can commit and push your changes, then
+  run [E2E Manual suite](https://github.com/provectus/kafka-ui/actions/workflows/e2e-manual.yml) on your branch
+
+8. No test run in Qase.io will be created, new test case will be stored defined directory
+   in [project's repository](https://app.qase.io/project/KAFKAUI)
+9. To add expected results into created test case edit in Qase.io manually
+
+### Test run reporting
+
+To handle manual test cases with status `Skipped` we added custom QaseResultListener. To create new test run:
+
+1. All test methods should be annotated with actual `@QaseId`
+2. There are two ways to sync newly created cases in the framework with Qase.io:
+
+- run can be performed locally - run test classes (or suites) with
+  already [set up Qase.io integration](#Set up Qase.io integration), they will be labeled as `Automation CUSTOM suite`
+- also you can commit and push your changes, then
+  run [E2E Automation suite](https://github.com/provectus/kafka-ui/actions/workflows/e2e-automation.yml) on your branch
+
+3. All new test runs will be added into [project's test runs](https://app.qase.io/run/KAFKAUI) with corresponding label
+   using QaseId to identify existing cases
+4. All test cases from manual suite are set up to have `Skipped` status in test runs to perform them manually

+ 5 - 0
kafka-ui-e2e-checks/README.md

@@ -7,6 +7,7 @@ This repository is for E2E UI automation.
 - [Prerequisites](#prerequisites)
 - [How to install](#how-to-install)
 - [How to run checks](#how-to-run-checks)
+- [Qase.io integration (for internal users)](#qase-integration)
 - [Reporting](#reporting)
 - [Environments setup](#environments-setup)
 - [Test Data](#test-data)
@@ -50,6 +51,10 @@ docker-compose -f documentation/compose/e2e-tests.yaml up -d
 -Dbrowser=local
 ```
 
+### Qase integration
+
+Found instruction for Qase.io integration (for internal use only) at `kafka-ui-e2e-checks/QASE.md`
+
 ### Reporting
 
 Reports are in `allure-results` folder.

+ 3 - 3
kafka-ui-e2e-checks/pom.xml

@@ -17,10 +17,10 @@
         <testcontainers.version>1.17.6</testcontainers.version>
         <selenide.version>6.11.2</selenide.version>
         <testng.version>7.7.0</testng.version>
-        <allure.version>2.20.1</allure.version>
-        <qase.io.version>3.0.2</qase.io.version>
+        <allure.version>2.21.0</allure.version>
+        <qase.io.version>3.0.3</qase.io.version>
         <aspectj.version>1.9.9.1</aspectj.version>
-        <assertj.version>3.23.1</assertj.version>
+        <assertj.version>3.24.2</assertj.version>
         <hamcrest.version>2.2</hamcrest.version>
         <slf4j.version>1.7.36</slf4j.version>
         <dotenv.version>2.3.1</dotenv.version>

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

@@ -0,0 +1,123 @@
+package com.provectus.kafka.ui.settings.listeners;
+
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Automation;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Status;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
+import io.qase.api.QaseClient;
+import io.qase.api.StepStorage;
+import io.qase.api.annotation.QaseId;
+import io.qase.client.ApiClient;
+import io.qase.client.api.CasesApi;
+import io.qase.client.model.*;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.testng.Assert;
+import org.testng.ITestListener;
+import org.testng.ITestResult;
+import org.testng.TestListenerAdapter;
+
+import java.lang.reflect.Method;
+import java.util.*;
+
+import static io.qase.api.utils.IntegrationUtils.getCaseTitle;
+
+@Slf4j
+public class QaseCreateListener extends TestListenerAdapter implements ITestListener {
+
+    private static final CasesApi QASE_API = getQaseApi();
+
+    private static CasesApi getQaseApi() {
+        ApiClient apiClient = QaseClient.getApiClient();
+        apiClient.setApiKey(System.getProperty("QASEIO_API_TOKEN"));
+        return new CasesApi(apiClient);
+    }
+
+    private static int getStatus(Method method) {
+        if (method.isAnnotationPresent(Status.class))
+            return method.getDeclaredAnnotation(Status.class).status().getValue();
+        return 1;
+    }
+
+    private static int getAutomation(Method method) {
+        if (method.isAnnotationPresent(Automation.class))
+            return method.getDeclaredAnnotation(Automation.class).state().getValue();
+        return 0;
+    }
+
+    @SneakyThrows
+    private static HashMap<Long, String> getCaseTitlesAndIdsFromQase() {
+        HashMap<Long, String> cases = new HashMap<>();
+        boolean getCases = true;
+        int offSet = 0;
+        while (getCases) {
+            getCases = false;
+            TestCaseListResponse response = QASE_API.getCases(System.getProperty("QASE_PROJECT_CODE"),
+                    new GetCasesFiltersParameter().status(GetCasesFiltersParameter.SERIALIZED_NAME_STATUS), 100, offSet);
+            TestCaseListResponseAllOfResult result = response.getResult();
+            Assert.assertNotNull(result);
+            List<TestCase> entities = result.getEntities();
+            Assert.assertNotNull(entities);
+            if (entities.size() > 0) {
+                for (TestCase testCase : entities) {
+                    cases.put(testCase.getId(), testCase.getTitle());
+                }
+                offSet = offSet + 100;
+                getCases = true;
+            }
+        }
+        return cases;
+    }
+
+    private static boolean isCaseWithTitleExistInQase(Method method) {
+        HashMap<Long, String> cases = getCaseTitlesAndIdsFromQase();
+        String title = getCaseTitle(method);
+        if (cases.containsValue(title)) {
+            for (Map.Entry<Long, String> map : cases.entrySet()) {
+                if (map.getValue().matches(title)) {
+                    long id = map.getKey();
+                    log.warn(String.format("Test case with @QaseTitle='%s' already exists with @QaseId=%d. " +
+                            "Please verify @QaseTitle annotation", title, id));
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    @SneakyThrows
+    public void onTestSuccess(final ITestResult testResult) {
+        Method method = testResult.getMethod()
+                .getConstructorOrMethod()
+                .getMethod();
+        String title = getCaseTitle(method);
+        if (!method.isAnnotationPresent(QaseId.class)) {
+            if (title != null) {
+                if (!isCaseWithTitleExistInQase(method)) {
+                    LinkedList<ResultCreateStepsInner> resultSteps = StepStorage.stopSteps();
+                    LinkedList<TestCaseCreateStepsInner> createSteps = new LinkedList<>();
+                    resultSteps.forEach(step -> {
+                        TestCaseCreateStepsInner caseStep = new TestCaseCreateStepsInner();
+                        caseStep.setAction(step.getAction());
+                        caseStep.setExpectedResult(step.getExpectedResult());
+                        createSteps.add(caseStep);
+                    });
+                    TestCaseCreate newCase = new TestCaseCreate();
+                    newCase.setTitle(title);
+                    newCase.setStatus(getStatus(method));
+                    newCase.setAutomation(getAutomation(method));
+                    newCase.setSteps(createSteps);
+                    if (method.isAnnotationPresent(Suite.class)) {
+                        long suiteId = method.getDeclaredAnnotation(Suite.class).id();
+                        newCase.suiteId(suiteId);
+                    }
+                    Long id = Objects.requireNonNull(QASE_API.createCase(System.getProperty("QASE_PROJECT_CODE"),
+                            newCase).getResult()).getId();
+                    log.info(String.format("New test case '%s' was created with @QaseId=%d", title, id));
+                }
+            } else
+                log.warn("To create new test case in Qase.io please add @QaseTitle annotation");
+        } else
+            log.warn("To create new test case in Qase.io please remove @QaseId annotation");
+    }
+}

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

@@ -0,0 +1,102 @@
+package com.provectus.kafka.ui.settings.listeners;
+
+import io.qase.api.StepStorage;
+import io.qase.api.config.QaseConfig;
+import io.qase.api.services.QaseTestCaseListener;
+import io.qase.client.model.ResultCreate;
+import io.qase.client.model.ResultCreateCase;
+import io.qase.client.model.ResultCreateStepsInner;
+import io.qase.testng.guice.module.TestNgModule;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.testng.ITestContext;
+import org.testng.ITestListener;
+import org.testng.ITestResult;
+import org.testng.TestListenerAdapter;
+
+import java.lang.reflect.Method;
+import java.util.LinkedList;
+import java.util.Optional;
+
+import static io.qase.api.utils.IntegrationUtils.*;
+import static io.qase.client.model.ResultCreate.StatusEnum.*;
+
+@Slf4j
+public class QaseResultListener extends TestListenerAdapter implements ITestListener {
+
+    private static final String REPORTER_NAME = "TestNG";
+
+    static {
+        System.setProperty(QaseConfig.QASE_CLIENT_REPORTER_NAME_KEY, REPORTER_NAME);
+    }
+
+    @Getter(lazy = true, value = AccessLevel.PRIVATE)
+    private final QaseTestCaseListener qaseTestCaseListener = createQaseListener();
+
+    private static QaseTestCaseListener createQaseListener() {
+        return TestNgModule.getInjector().getInstance(QaseTestCaseListener.class);
+    }
+
+    @Override
+    public void onTestStart(ITestResult result) {
+        getQaseTestCaseListener().onTestCaseStarted();
+        super.onTestStart(result);
+    }
+
+    @Override
+    public void onTestSuccess(ITestResult tr) {
+        getQaseTestCaseListener()
+                .onTestCaseFinished(resultCreate -> setupResultItem(resultCreate, tr, PASSED));
+        super.onTestSuccess(tr);
+    }
+
+    @Override
+    public void onTestSkipped(ITestResult tr) {
+        getQaseTestCaseListener()
+                .onTestCaseFinished(resultCreate -> setupResultItem(resultCreate, tr, SKIPPED));
+        super.onTestSuccess(tr);
+    }
+
+    @Override
+    public void onTestFailure(ITestResult tr) {
+        getQaseTestCaseListener()
+                .onTestCaseFinished(resultCreate -> setupResultItem(resultCreate, tr, FAILED));
+        super.onTestFailure(tr);
+    }
+
+    @Override
+    public void onFinish(ITestContext testContext) {
+        getQaseTestCaseListener().onTestCasesSetFinished();
+        super.onFinish(testContext);
+    }
+
+    private void setupResultItem(ResultCreate resultCreate, ITestResult result, ResultCreate.StatusEnum status) {
+        Optional<Throwable> resultThrowable = Optional.ofNullable(result.getThrowable());
+        String comment = resultThrowable
+                .flatMap(throwable -> Optional.of(throwable.toString())).orElse(null);
+        Boolean isDefect = resultThrowable
+                .flatMap(throwable -> Optional.of(throwable instanceof AssertionError))
+                .orElse(false);
+        String stacktrace = resultThrowable
+                .flatMap(throwable -> Optional.of(getStacktrace(throwable)))
+                .orElse(null);
+        Method method = result.getMethod()
+                .getConstructorOrMethod()
+                .getMethod();
+        Long caseId = getCaseId(method);
+        String caseTitle = null;
+        if (caseId == null) {
+            caseTitle = getCaseTitle(method);
+        }
+        LinkedList<ResultCreateStepsInner> steps = StepStorage.stopSteps();
+        resultCreate
+                ._case(caseTitle == null ? null : new ResultCreateCase().title(caseTitle))
+                .caseId(caseId)
+                .status(status)
+                .comment(comment)
+                .stacktrace(stacktrace)
+                .steps(steps.isEmpty() ? null : steps)
+                .defect(isDefect);
+    }
+}

+ 1 - 1
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/QaseSetup.java

@@ -15,7 +15,7 @@ import static org.apache.commons.lang3.StringUtils.isEmpty;
 @Slf4j
 public class QaseSetup {
 
-    public static void testRunSetup() {
+    public static void qaseIntegrationSetup() {
         String qaseApiToken = System.getProperty("QASEIO_API_TOKEN");
         if (isEmpty(qaseApiToken)) {
             log.warn("Integration with Qase is disabled due to run config or token wasn't defined.");

+ 15 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/annotations/Automation.java

@@ -0,0 +1,15 @@
+package com.provectus.kafka.ui.utilities.qaseUtils.annotations;
+
+import com.provectus.kafka.ui.utilities.qaseUtils.enums.State;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Automation {
+
+    State state();
+}

+ 0 - 12
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/annotations/AutomationStatus.java

@@ -1,12 +0,0 @@
-package com.provectus.kafka.ui.utilities.qaseUtils.annotations;
-
-import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-@Retention(RetentionPolicy.RUNTIME)
-public @interface AutomationStatus {
-
-    Status status();
-}

+ 13 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/annotations/Status.java

@@ -0,0 +1,13 @@
+package com.provectus.kafka.ui.utilities.qaseUtils.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Status {
+
+    com.provectus.kafka.ui.utilities.qaseUtils.enums.Status status();
+}

+ 5 - 2
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/annotations/Suite.java

@@ -1,10 +1,13 @@
 package com.provectus.kafka.ui.utilities.qaseUtils.annotations;
 
+import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
+@Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Suite {
-    long suiteId();
-    String title();
+
+    long id();
 }

+ 18 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/enums/State.java

@@ -0,0 +1,18 @@
+package com.provectus.kafka.ui.utilities.qaseUtils.enums;
+
+public enum State {
+
+    NOT_AUTOMATED(0),
+    TO_BE_AUTOMATED(1),
+    AUTOMATED(2);
+
+    private final int value;
+
+    State(int value) {
+        this.value = value;
+    }
+
+    public int getValue() {
+        return value;
+    }
+}

+ 14 - 1
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/utilities/qaseUtils/enums/Status.java

@@ -1,5 +1,18 @@
 package com.provectus.kafka.ui.utilities.qaseUtils.enums;
 
 public enum Status {
-    AUTOMATED, TO_BE_AUTOMATED, MANUAL
+
+    ACTUAL(0),
+    DRAFT(1),
+    DEPRECATED(2);
+
+    private final int value;
+
+    Status(int value) {
+        this.value = value;
+    }
+
+    public int getValue() {
+        return value;
+    }
 }

+ 0 - 1
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/variables/Suite.java

@@ -4,7 +4,6 @@ public interface Suite {
 
     String CUSTOM = "custom";
     String MANUAL = "manual";
-    String QASE = "qase";
     String REGRESSION = "regression";
     String SANITY = "sanity";
     String SMOKE = "smoke";

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

@@ -6,8 +6,8 @@ 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 com.provectus.kafka.ui.settings.listeners.QaseResultListener;
 import io.qameta.allure.Step;
-import io.qase.testng.QaseListener;
 import lombok.extern.slf4j.Slf4j;
 import org.openqa.selenium.Dimension;
 import org.openqa.selenium.chrome.ChromeOptions;
@@ -25,12 +25,12 @@ 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.drivers.LocalWebDriver.*;
-import static com.provectus.kafka.ui.utilities.qaseUtils.QaseSetup.testRunSetup;
+import static com.provectus.kafka.ui.utilities.qaseUtils.QaseSetup.qaseIntegrationSetup;
 import static com.provectus.kafka.ui.variables.Browser.CONTAINER;
 import static com.provectus.kafka.ui.variables.Browser.LOCAL;
 
 @Slf4j
-@Listeners({AllureListener.class, LoggerListener.class, QaseListener.class})
+@Listeners({AllureListener.class, LoggerListener.class, QaseResultListener.class})
 public abstract class BaseTest extends Facade {
 
     private static final String SELENIUM_IMAGE_NAME = "selenium/standalone-chrome:103.0";
@@ -43,7 +43,7 @@ public abstract class BaseTest extends Facade {
 
     @BeforeSuite(alwaysRun = true)
     public void beforeSuite() {
-        testRunSetup();
+        qaseIntegrationSetup();
         switch (BROWSER) {
             case (CONTAINER) -> {
                 DockerImageName image = isARM64()

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

@@ -19,6 +19,7 @@ import com.provectus.kafka.ui.pages.topics.*;
 import com.provectus.kafka.ui.services.ApiService;
 
 public abstract class Facade {
+
     protected ApiService apiService = new ApiService();
     protected ConnectorCreateForm connectorCreateForm = new ConnectorCreateForm();
     protected KafkaConnectList kafkaConnectList = new KafkaConnectList();

+ 28 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/BaseManualTest.java

@@ -0,0 +1,28 @@
+package com.provectus.kafka.ui.manualSuite;
+
+import com.provectus.kafka.ui.settings.listeners.QaseResultListener;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Automation;
+import org.testng.SkipException;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.Listeners;
+
+import java.lang.reflect.Method;
+
+import static com.provectus.kafka.ui.utilities.qaseUtils.QaseSetup.qaseIntegrationSetup;
+import static com.provectus.kafka.ui.utilities.qaseUtils.enums.State.NOT_AUTOMATED;
+
+@Listeners(QaseResultListener.class)
+public abstract class BaseManualTest {
+
+    @BeforeSuite
+    public void beforeSuite() {
+        qaseIntegrationSetup();
+    }
+
+    @BeforeMethod
+    public void beforeMethod(Method method) {
+        if (method.getAnnotation(Automation.class).state().equals(NOT_AUTOMATED))
+            throw new SkipException("Skip test exception");
+    }
+}

+ 0 - 4
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/TestClass.java

@@ -1,4 +0,0 @@
-package com.provectus.kafka.ui.manualSuite;
-
-public class TestClass {
-}

+ 29 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/suite/DataMaskingTest.java

@@ -0,0 +1,29 @@
+package com.provectus.kafka.ui.manualSuite.suite;
+
+import com.provectus.kafka.ui.manualSuite.BaseManualTest;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Automation;
+import io.qase.api.annotation.QaseId;
+import org.testng.annotations.Test;
+
+import static com.provectus.kafka.ui.utilities.qaseUtils.enums.State.NOT_AUTOMATED;
+
+public class DataMaskingTest extends BaseManualTest {
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(262)
+    @Test
+    public void testCaseA() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(264)
+    @Test
+    public void testCaseB() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(265)
+    @Test
+    public void testCaseC() {
+    }
+}

+ 53 - 0
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/suite/RbacTest.java

@@ -0,0 +1,53 @@
+package com.provectus.kafka.ui.manualSuite.suite;
+
+import com.provectus.kafka.ui.manualSuite.BaseManualTest;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Automation;
+import io.qase.api.annotation.QaseId;
+import org.testng.annotations.Test;
+
+import static com.provectus.kafka.ui.utilities.qaseUtils.enums.State.NOT_AUTOMATED;
+
+public class RbacTest extends BaseManualTest {
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(249)
+    @Test
+    public void testCaseA() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(251)
+    @Test
+    public void testCaseB() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(257)
+    @Test
+    public void testCaseC() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(258)
+    @Test
+    public void testCaseD() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(259)
+    @Test
+    public void testCaseE() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(260)
+    @Test
+    public void testCaseF() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(261)
+    @Test
+    public void testCaseG() {
+    }
+}

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

@@ -0,0 +1,95 @@
+package com.provectus.kafka.ui.manualSuite.suite;
+
+import com.provectus.kafka.ui.manualSuite.BaseManualTest;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Automation;
+import io.qase.api.annotation.QaseId;
+import org.testng.annotations.Test;
+
+import static com.provectus.kafka.ui.utilities.qaseUtils.enums.State.NOT_AUTOMATED;
+
+public class TopicsTest extends BaseManualTest {
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(17)
+    @Test
+    public void testCaseA() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(18)
+    @Test
+    public void testCaseB() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(22)
+    @Test
+    public void testCaseC() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(46)
+    @Test
+    public void testCaseD() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(47)
+    @Test
+    public void testCaseE() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(48)
+    @Test
+    public void testCaseF() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(49)
+    @Test
+    public void testCaseG() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(50)
+    @Test
+    public void testCaseH() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(57)
+    @Test
+    public void testCaseI() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(58)
+    @Test
+    public void testCaseJ() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(269)
+    @Test
+    public void testCaseK() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(270)
+    @Test
+    public void testCaseL() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(271)
+    @Test
+    public void testCaseM() {
+    }
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseId(272)
+    @Test
+    public void testCaseN() {
+    }
+}

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

@@ -0,0 +1,16 @@
+package com.provectus.kafka.ui.qaseSuite;
+
+import com.provectus.kafka.ui.settings.listeners.QaseCreateListener;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.Listeners;
+
+import static com.provectus.kafka.ui.utilities.qaseUtils.QaseSetup.qaseIntegrationSetup;
+
+@Listeners(QaseCreateListener.class)
+public abstract class BaseQaseTest {
+
+    @BeforeSuite
+    public void beforeSuite() {
+        qaseIntegrationSetup();
+    }
+}

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

@@ -0,0 +1,58 @@
+package com.provectus.kafka.ui.qaseSuite;
+
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Automation;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Status;
+import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
+import io.qase.api.annotation.QaseTitle;
+import io.qase.api.annotation.Step;
+
+import static com.provectus.kafka.ui.utilities.qaseUtils.enums.State.NOT_AUTOMATED;
+import static com.provectus.kafka.ui.utilities.qaseUtils.enums.Status.DRAFT;
+
+public class Template extends BaseQaseTest {
+
+    /**
+     * this class is a kind of placeholder or example, use is as template to create new one
+     * copy class into kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/suite
+     * place it into regarding folder and rename according to test case summary from Qase.io
+     * uncomment @Test and set all annotations according to kafka-ui-e2e-checks/QASE.md
+     */
+
+    @Automation(state = NOT_AUTOMATED)
+    @QaseTitle("testCaseA title")
+    @Status(status = DRAFT)
+    @Suite(id = 0)
+//    @org.testng.annotations.Test
+    public void testCaseA() {
+        stepA();
+        stepB();
+        stepC();
+        stepD();
+        stepE();
+        stepF();
+    }
+
+    @Step("stepA action")
+    private void stepA() {
+    }
+
+    @Step("stepB action")
+    private void stepB() {
+    }
+
+    @Step("stepC action")
+    private void stepC() {
+    }
+
+    @Step("stepD action")
+    private void stepD() {
+    }
+
+    @Step("stepE action")
+    private void stepE() {
+    }
+
+    @Step("stepF action")
+    private void stepF() {
+    }
+}

+ 0 - 4
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/qaseSuite/TestClass.java

@@ -1,4 +0,0 @@
-package com.provectus.kafka.ui.qaseSuite;
-
-public class TestClass {
-}

+ 2 - 5
kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/SmokeTest.java

@@ -2,9 +2,7 @@ package com.provectus.kafka.ui.smokeSuite;
 
 import com.codeborne.selenide.Condition;
 import com.provectus.kafka.ui.BaseTest;
-import com.provectus.kafka.ui.utilities.qaseUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
-import io.qase.api.annotation.CaseId;
+import io.qase.api.annotation.QaseId;
 import org.testng.annotations.Test;
 
 import java.util.stream.Collectors;
@@ -12,9 +10,8 @@ import java.util.stream.Stream;
 
 public class SmokeTest extends BaseTest {
 
+    @QaseId(198)
     @Test
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(198)
     public void checkBasePageElements() {
         verifyElementsCondition(
                 Stream.concat(topPanel.getAllVisibleElements().stream(), naviSideBar.getAllMenuButtons().stream())

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

@@ -2,11 +2,8 @@ package com.provectus.kafka.ui.smokeSuite.brokers;
 
 import com.codeborne.selenide.Condition;
 import com.provectus.kafka.ui.BaseTest;
-import com.provectus.kafka.ui.utilities.qaseUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 import io.qameta.allure.Step;
-import io.qase.api.annotation.CaseId;
+import io.qase.api.annotation.QaseId;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -15,12 +12,7 @@ import static com.provectus.kafka.ui.pages.brokers.BrokersDetails.DetailsTab.CON
 
 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)
+    @QaseId(1)
     @Test
     public void checkBrokersOverview() {
         navigateToBrokers();
@@ -29,9 +21,7 @@ public class BrokersTest extends BaseTest {
         verifyElementsCondition(brokersList.getAllEnabledElements(), Condition.enabled);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(85)
+    @QaseId(85)
     @Test
     public void checkExistingBrokersInCluster() {
         navigateToBrokers();

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

@@ -3,11 +3,8 @@ package com.provectus.kafka.ui.smokeSuite.connectors;
 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.qaseUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 import io.qameta.allure.Step;
-import io.qase.api.annotation.CaseId;
+import io.qase.api.annotation.QaseId;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -23,8 +20,6 @@ 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";
     private static final List<Topic> TOPIC_LIST = new ArrayList<>();
     private static final List<Connector> CONNECTOR_LIST = new ArrayList<>();
@@ -58,9 +53,7 @@ public class ConnectorsTest extends BaseTest {
                 .createConnector(CONNECT_NAME, connector));
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(42)
+    @QaseId(42)
     @Test
     public void createConnector() {
         Connector connectorForCreate = new Connector()
@@ -82,9 +75,7 @@ public class ConnectorsTest extends BaseTest {
         CONNECTOR_LIST.add(connectorForCreate);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(196)
+    @QaseId(196)
     @Test
     public void updateConnector() {
         navigateToConnectorsAndOpenDetails(CONNECTOR_FOR_UPDATE.getName());
@@ -97,9 +88,7 @@ public class ConnectorsTest extends BaseTest {
         Assert.assertTrue(kafkaConnectList.isConnectorVisible(CONNECTOR_FOR_UPDATE.getName()), "isConnectorVisible()");
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(195)
+    @QaseId(195)
     @Test
     public void deleteConnector() {
         navigateToConnectorsAndOpenDetails(CONNECTOR_FOR_DELETE.getName());

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

@@ -3,10 +3,7 @@ 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.qaseUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
-import io.qase.api.annotation.CaseId;
+import io.qase.api.annotation.QaseId;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 import org.testng.asserts.SoftAssert;
@@ -17,28 +14,24 @@ 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())
+    private static final Stream STREAM_FOR_CHECK_TABLES = new Stream()
+            .setName("STREAM_FOR_CHECK_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());
+            .setStreamName(STREAM_FOR_CHECK_TABLES.getName());
     private static final Table SECOND_TABLE = new Table()
             .setName("SECOND_TABLE" + randomAlphabetic(4).toUpperCase())
-            .setStreamName(STREAM_FOR_CHECKING_TABLES.getName());
+            .setStreamName(STREAM_FOR_CHECK_TABLES.getName());
 
     @BeforeClass(alwaysRun = true)
     public void beforeClass() {
         apiService
-                .createStream(STREAM_FOR_CHECKING_TABLES)
+                .createStream(STREAM_FOR_CHECK_TABLES)
                 .createTables(FIRST_TABLE, SECOND_TABLE);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(41)
+    @QaseId(41)
     @Test(priority = 1)
     public void checkShowTablesRequestExecution() {
         naviSideBar
@@ -57,9 +50,7 @@ public class KsqlDbTest extends BaseTest {
         softly.assertAll();
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(86)
+    @QaseId(86)
     @Test(priority = 2)
     public void clearResultsForExecutedRequest() {
         naviSideBar

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

@@ -1,14 +1,11 @@
 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.api.model.CompatibilityLevel;
 import com.provectus.kafka.ui.models.Schema;
-import com.provectus.kafka.ui.utilities.qaseUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 import io.qameta.allure.Step;
-import io.qase.api.annotation.CaseId;
+import io.qase.api.annotation.QaseId;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -23,8 +20,6 @@ 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();
@@ -36,9 +31,7 @@ public class SchemasTest extends BaseTest {
         SCHEMA_LIST.forEach(schema -> apiService.createSchema(schema));
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(43)
+    @QaseId(43)
     @Test(priority = 1)
     public void createSchemaAvro() {
         Schema schemaAvro = Schema.createSchemaAvro();
@@ -63,9 +56,7 @@ public class SchemasTest extends BaseTest {
         SCHEMA_LIST.add(schemaAvro);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(186)
+    @QaseId(186)
     @Test(priority = 2)
     public void updateSchemaAvro() {
         AVRO_API.setValuePath(System.getProperty("user.dir") + "/src/main/resources/testData/schema_avro_for_update.json");
@@ -88,9 +79,7 @@ public class SchemasTest extends BaseTest {
         Assert.assertEquals(CompatibilityLevel.CompatibilityEnum.NONE.toString(), schemaDetails.getCompatibility(), "getCompatibility()");
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(186)
+    @QaseId(186)
     @Test(priority = 3)
     public void compareVersionsOperation() {
         navigateToSchemaRegistryAndOpenDetails(AVRO_API.getName());
@@ -109,9 +98,7 @@ public class SchemasTest extends BaseTest {
         Assert.assertEquals(53, schemaCreateForm.getMarkedLinesNumber(), "getAllMarkedLines()");
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(187)
+    @QaseId(187)
     @Test(priority = 4)
     public void deleteSchemaAvro() {
         navigateToSchemaRegistryAndOpenDetails(AVRO_API.getName());
@@ -123,9 +110,7 @@ public class SchemasTest extends BaseTest {
         SCHEMA_LIST.remove(AVRO_API);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(89)
+    @QaseId(89)
     @Test(priority = 5)
     public void createSchemaJson() {
         Schema schemaJson = Schema.createSchemaJson();
@@ -150,9 +135,7 @@ public class SchemasTest extends BaseTest {
         SCHEMA_LIST.add(schemaJson);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(189)
+    @QaseId(189)
     @Test(priority = 6)
     public void deleteSchemaJson() {
         navigateToSchemaRegistryAndOpenDetails(JSON_API.getName());
@@ -164,9 +147,7 @@ public class SchemasTest extends BaseTest {
         SCHEMA_LIST.remove(JSON_API);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(91)
+    @QaseId(91)
     @Test(priority = 7)
     public void createSchemaProtobuf() {
         Schema schemaProtobuf = Schema.createSchemaProtobuf();
@@ -191,9 +172,7 @@ public class SchemasTest extends BaseTest {
         SCHEMA_LIST.add(schemaProtobuf);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(223)
+    @QaseId(223)
     @Test(priority = 8)
     public void deleteSchemaProtobuf() {
         navigateToSchemaRegistryAndOpenDetails(PROTOBUF_API.getName());

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

@@ -3,12 +3,8 @@ 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.qaseUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 import io.qameta.allure.Issue;
 import io.qameta.allure.Step;
-import io.qase.api.annotation.CaseId;
 import io.qase.api.annotation.QaseId;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
@@ -31,8 +27,6 @@ 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))
@@ -41,8 +35,8 @@ public class MessagesTest extends BaseTest {
             .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))
+    private static final Topic TOPIC_FOR_CHECK_FILTERS = new Topic()
+            .setName("topic-for-check-filters-" + randomAlphabetic(5))
             .setMessageKey(randomAlphabetic(5))
             .setMessageContent(randomAlphabetic(10));
     private static final Topic TOPIC_TO_RECREATE = new Topic()
@@ -50,25 +44,23 @@ public class MessagesTest extends BaseTest {
             .setMessageKey(randomAlphabetic(5))
             .setMessageContent(randomAlphabetic(10));
     private static final Topic TOPIC_FOR_CHECK_MESSAGES_COUNT = new Topic()
-             .setName("topic-for-check-messages-count" + randomAlphabetic(5))
-             .setMessageKey(randomAlphabetic(5))
-             .setMessageContent(randomAlphabetic(10));
+            .setName("topic-for-check-messages-count" + 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_LIST.addAll(List.of(TOPIC_FOR_MESSAGES, TOPIC_FOR_CHECK_FILTERS, TOPIC_TO_CLEAR_AND_PURGE_MESSAGES,
                 TOPIC_TO_RECREATE, TOPIC_FOR_CHECK_MESSAGES_COUNT));
         TOPIC_LIST.forEach(topic -> apiService.createTopic(topic.getName()));
-        IntStream.range(1, 3).forEach(i -> apiService.sendMessage(TOPIC_FOR_CHECKING_FILTERS));
+        IntStream.range(1, 3).forEach(i -> apiService.sendMessage(TOPIC_FOR_CHECK_FILTERS));
         waitUntilNewMinuteStarted();
-        IntStream.range(1, 3).forEach(i -> apiService.sendMessage(TOPIC_FOR_CHECKING_FILTERS));
+        IntStream.range(1, 3).forEach(i -> apiService.sendMessage(TOPIC_FOR_CHECK_FILTERS));
         IntStream.range(1, 110).forEach(i -> apiService.sendMessage(TOPIC_FOR_CHECK_MESSAGES_COUNT));
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(222)
+    @QaseId(222)
     @Test(priority = 1)
     public void produceMessage() {
         navigateToTopicsAndOpenDetails(TOPIC_FOR_MESSAGES.getName());
@@ -85,9 +77,7 @@ public class MessagesTest extends BaseTest {
 
     @Ignore
     @Issue("https://github.com/provectus/kafka-ui/issues/2778")
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(19)
+    @QaseId(19)
     @Test(priority = 2)
     public void clearMessage() {
         navigateToTopicsAndOpenDetails(TOPIC_FOR_MESSAGES.getName());
@@ -103,9 +93,7 @@ public class MessagesTest extends BaseTest {
         Assert.assertEquals(0, topicDetails.getMessageCountAmount(), "getMessageCountAmount()");
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(239)
+    @QaseId(239)
     @Test(priority = 3)
     public void checkClearTopicMessage() {
         navigateToTopicsAndOpenDetails(TOPIC_TO_CLEAR_AND_PURGE_MESSAGES.getName());
@@ -128,9 +116,7 @@ public class MessagesTest extends BaseTest {
         softly.assertAll();
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(10)
+    @QaseId(10)
     @Test(priority = 4)
     public void checkPurgeMessagePossibility() {
         navigateToTopics();
@@ -163,12 +149,10 @@ public class MessagesTest extends BaseTest {
 
     @Ignore
     @Issue("https://github.com/provectus/kafka-ui/issues/2819")
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(21)
+    @QaseId(21)
     @Test(priority = 5)
     public void copyMessageFromTopicProfile() {
-        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECKING_FILTERS.getName());
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECK_FILTERS.getName());
         topicDetails
                 .openDetailsTab(MESSAGES)
                 .getRandomMessage()
@@ -180,12 +164,10 @@ public class MessagesTest extends BaseTest {
 
     @Ignore
     @Issue("https://github.com/provectus/kafka-ui/issues/2394")
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(15)
+    @QaseId(15)
     @Test(priority = 6)
-    public void checkingMessageFilteringByOffset() {
-        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECKING_FILTERS.getName());
+    public void checkMessageFilteringByOffset() {
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECK_FILTERS.getName());
         topicDetails
                 .openDetailsTab(MESSAGES);
         TopicDetails.MessageGridItem secondMessage = topicDetails.getMessageByOffset(1);
@@ -204,12 +186,10 @@ public class MessagesTest extends BaseTest {
     @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)
+    @QaseId(16)
     @Test(priority = 7)
-    public void checkingMessageFilteringByTimestamp() {
-        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECKING_FILTERS.getName());
+    public void checkMessageFilteringByTimestamp() {
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECK_FILTERS.getName());
         topicDetails
                 .openDetailsTab(MESSAGES);
         LocalDateTime firstTimestamp = topicDetails.getMessageByOffset(0).getTimestamp();
@@ -233,12 +213,10 @@ public class MessagesTest extends BaseTest {
 
     @Ignore
     @Issue("https://github.com/provectus/kafka-ui/issues/2778")
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(246)
+    @QaseId(246)
     @Test(priority = 8)
     public void checkClearTopicMessageFromOverviewTab() {
-        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECKING_FILTERS.getName());
+        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECK_FILTERS.getName());
         topicDetails
                 .openDetailsTab(OVERVIEW)
                 .openDotMenu()
@@ -246,16 +224,14 @@ public class MessagesTest extends BaseTest {
                 .clickConfirmBtnMdl();
         SoftAssert softly = new SoftAssert();
         softly.assertTrue(topicDetails.isAlertWithMessageVisible(SUCCESS,
-                        String.format("%s messages have been successfully cleared!", TOPIC_FOR_CHECKING_FILTERS.getName())),
+                        String.format("%s messages have been successfully cleared!", TOPIC_FOR_CHECK_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)
+    @QaseId(240)
     @Test(priority = 9)
     public void checkRecreateTopic() {
         navigateToTopicsAndOpenDetails(TOPIC_TO_RECREATE.getName());
@@ -293,7 +269,7 @@ public class MessagesTest extends BaseTest {
         softly.assertTrue(topicDetails.isNextButtonEnabled(), "isNextButtonEnabled()");
         softly.assertAll();
         int lastOffsetOnPage = topicDetails.getAllMessages()
-                        .get(messagesPerPage -1).getOffset();
+                .get(messagesPerPage - 1).getOffset();
         topicDetails
                 .clickNextButton();
         softly.assertEquals(topicDetails.getAllMessages().stream().findFirst().orElseThrow().getOffset(),

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

@@ -4,11 +4,8 @@ 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.qaseUtils.annotations.AutomationStatus;
-import com.provectus.kafka.ui.utilities.qaseUtils.annotations.Suite;
-import com.provectus.kafka.ui.utilities.qaseUtils.enums.Status;
 import io.qameta.allure.Issue;
-import io.qase.api.annotation.CaseId;
+import io.qase.api.annotation.QaseId;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -33,8 +30,6 @@ 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)
@@ -66,9 +61,7 @@ public class TopicsTest extends BaseTest {
         TOPIC_LIST.forEach(topic -> apiService.createTopic(topic.getName()));
     }
 
-    @Suite(suiteId = 4, title = "Create new Topic")
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(199)
+    @QaseId(199)
     @Test(priority = 1)
     public void createTopic() {
         navigateToTopics();
@@ -91,9 +84,7 @@ public class TopicsTest extends BaseTest {
         TOPIC_LIST.add(TOPIC_TO_CREATE);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(7)
+    @QaseId(7)
     @Test(priority = 2)
     void checkAvailableOperations() {
         navigateToTopics();
@@ -109,9 +100,7 @@ public class TopicsTest extends BaseTest {
 
     @Ignore
     @Issue("https://github.com/provectus/kafka-ui/issues/3071")
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(268)
+    @QaseId(268)
     @Test(priority = 3)
     public void checkCustomParametersWithinEditExistingTopic() {
         navigateToTopicsAndOpenDetails(TOPIC_TO_UPDATE_AND_DELETE.getName());
@@ -130,9 +119,7 @@ public class TopicsTest extends BaseTest {
         softly.assertAll();
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(197)
+    @QaseId(197)
     @Test(priority = 4)
     public void updateTopic() {
         navigateToTopicsAndOpenDetails(TOPIC_TO_UPDATE_AND_DELETE.getName());
@@ -184,9 +171,7 @@ public class TopicsTest extends BaseTest {
         softly.assertAll();
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(242)
+    @QaseId(242)
     @Test(priority = 5)
     public void removeTopicFromTopicList() {
         navigateToTopics();
@@ -200,9 +185,7 @@ public class TopicsTest extends BaseTest {
         TOPIC_LIST.remove(TOPIC_TO_UPDATE_AND_DELETE);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(207)
+    @QaseId(207)
     @Test(priority = 6)
     public void deleteTopic() {
         navigateToTopicsAndOpenDetails(TOPIC_FOR_DELETE.getName());
@@ -215,9 +198,7 @@ public class TopicsTest extends BaseTest {
         TOPIC_LIST.remove(TOPIC_FOR_DELETE);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(20)
+    @QaseId(20)
     @Test(priority = 7)
     public void redirectToConsumerFromTopic() {
         String topicName = "source-activities";
@@ -236,9 +217,7 @@ public class TopicsTest extends BaseTest {
         softly.assertAll();
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(4)
+    @QaseId(4)
     @Test(priority = 8)
     public void checkTopicCreatePossibility() {
         navigateToTopics();
@@ -259,9 +238,7 @@ public class TopicsTest extends BaseTest {
         Assert.assertTrue(topicCreateEditForm.isCreateTopicButtonEnabled(), "isCreateTopicButtonEnabled()");
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(266)
+    @QaseId(266)
     @Test(priority = 9)
     public void checkTimeToRetainDataCustomValueWithEditingTopic() {
         Topic topicToRetainData = new Topic()
@@ -292,9 +269,7 @@ public class TopicsTest extends BaseTest {
         TOPIC_LIST.add(topicToRetainData);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(6)
+    @QaseId(6)
     @Test(priority = 10)
     public void checkCustomParametersWithinCreateNewTopic() {
         navigateToTopics();
@@ -313,9 +288,7 @@ public class TopicsTest extends BaseTest {
                 "isValidationMessageCustomParameterValueVisible()");
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(2)
+    @QaseId(2)
     @Test(priority = 11)
     public void checkTopicListElements() {
         navigateToTopics();
@@ -323,11 +296,9 @@ public class TopicsTest extends BaseTest {
         verifyElementsCondition(topicsList.getAllEnabledElements(), Condition.enabled);
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(12)
+    @QaseId(12)
     @Test(priority = 12)
-    public void addingNewFilterWithinTopic() {
+    public void addNewFilterWithinTopic() {
         String filterName = randomAlphabetic(5);
         navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECK_FILTERS.getName());
         topicDetails
@@ -345,9 +316,7 @@ public class TopicsTest extends BaseTest {
         Assert.assertTrue(topicDetails.isActiveFilterVisible(filterName), "isActiveFilterVisible()");
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(13)
+    @QaseId(13)
     @Test(priority = 13)
     public void checkFilterSavingWithinSavedFilters() {
         String displayName = randomAlphabetic(5);
@@ -368,9 +337,7 @@ public class TopicsTest extends BaseTest {
                 "isFilterVisibleAtSavedFiltersMdl()");
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(14)
+    @QaseId(14)
     @Test(priority = 14)
     public void checkApplyingSavedFilterWithinTopicMessages() {
         String displayName = randomAlphabetic(5);
@@ -389,9 +356,7 @@ public class TopicsTest extends BaseTest {
         Assert.assertTrue(topicDetails.isActiveFilterVisible(displayName), "isActiveFilterVisible()");
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(11)
+    @QaseId(11)
     @Test(priority = 15)
     public void checkShowInternalTopicsButtonFunctionality() {
         navigateToTopics();
@@ -407,9 +372,7 @@ public class TopicsTest extends BaseTest {
         softly.assertAll();
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(56)
+    @QaseId(56)
     @Test(priority = 16)
     public void checkRetentionBytesAccordingToMaxSizeOnDisk() {
         navigateToTopics();
@@ -457,9 +420,7 @@ public class TopicsTest extends BaseTest {
         softly.assertAll();
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(247)
+    @QaseId(247)
     @Test(priority = 17)
     public void recreateTopicFromTopicProfile() {
         Topic topicToRecreate = new Topic()
@@ -487,9 +448,7 @@ public class TopicsTest extends BaseTest {
                 "isAlertWithMessageVisible()");
     }
 
-    @Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
-    @AutomationStatus(status = Status.AUTOMATED)
-    @CaseId(8)
+    @QaseId(8)
     @Test(priority = 18)
     public void checkCopyTopicPossibility() {
         Topic topicToCopy = new Topic()