From 05e27d24f1cf811c91104f750b83b1c87a436525 Mon Sep 17 00:00:00 2001 From: German Osin Date: Mon, 22 Sep 2025 20:46:08 +0200 Subject: [PATCH] E2E: Removed selenium --- .github/CODEOWNERS | 2 +- .github/workflows/e2e-manual.yml | 26 - .github/workflows/e2e-playwright-run.yml | 5 +- .github/workflows/e2e-pr.yml | 28 - .github/workflows/e2e-run.yml | 176 ------ .github/workflows/e2e-weekly.yml | 17 - .../ui/service/ConsumerGroupServiceTest.java | 2 +- e2e-tests/.gitignore | 3 - e2e-tests/README.md | 75 --- e2e-tests/build.gradle | 61 --- e2e-tests/selenoid/config/browsers-ci.json | 15 - e2e-tests/selenoid/selenoid-ci.yaml | 37 -- .../java/io/kafbat/ui/models/Connector.java | 19 - .../main/java/io/kafbat/ui/models/Schema.java | 36 -- .../main/java/io/kafbat/ui/models/Topic.java | 30 - .../java/io/kafbat/ui/screens/BasePage.java | 164 ------ .../ui/screens/brokers/BrokersConfigTab.java | 171 ------ .../ui/screens/brokers/BrokersDetails.java | 84 --- .../ui/screens/brokers/BrokersList.java | 123 ----- .../connectors/ConnectorCreateForm.java | 49 -- .../screens/connectors/ConnectorDetails.java | 85 --- .../screens/connectors/KafkaConnectList.java | 53 -- .../screens/consumers/ConsumersDetails.java | 32 -- .../ui/screens/consumers/ConsumersList.java | 17 - .../kafbat/ui/screens/ksqldb/KsqlDbList.java | 170 ------ .../ui/screens/ksqldb/KsqlQueryForm.java | 180 ------ .../ui/screens/ksqldb/enums/KsqlMenuTabs.java | 16 - .../screens/ksqldb/enums/KsqlQueryConfig.java | 17 - .../ui/screens/ksqldb/models/Stream.java | 11 - .../ui/screens/ksqldb/models/Table.java | 11 - .../kafbat/ui/screens/panels/NaviSideBar.java | 65 --- .../io/kafbat/ui/screens/panels/TopPanel.java | 25 - .../ui/screens/panels/enums/MenuItem.java | 23 - .../ui/screens/schemas/SchemaCreateForm.java | 144 ----- .../ui/screens/schemas/SchemaDetails.java | 70 --- .../screens/schemas/SchemaRegistryList.java | 43 -- .../screens/topics/ProduceMessagePanel.java | 57 -- .../screens/topics/TopicCreateEditForm.java | 292 ---------- .../ui/screens/topics/TopicDetails.java | 511 ------------------ .../ui/screens/topics/TopicSettingsTab.java | 86 --- .../kafbat/ui/screens/topics/TopicsList.java | 295 ---------- .../topics/enums/CleanupPolicyValue.java | 19 - .../topics/enums/CustomParameterType.java | 36 -- .../screens/topics/enums/MaxSizeOnDisk.java | 21 - .../ui/screens/topics/enums/SeekType.java | 21 - .../ui/screens/topics/enums/TimeToRetain.java | 24 - .../io/kafbat/ui/services/ApiService.java | 284 ---------- .../io/kafbat/ui/settings/BaseSource.java | 18 - .../kafbat/ui/settings/drivers/WebDriver.java | 106 ---- .../ui/settings/listeners/AllureListener.java | 40 -- .../ui/settings/listeners/ResultsLogger.java | 93 ---- .../io/kafbat/ui/utilities/BooleanUtil.java | 28 - .../java/io/kafbat/ui/utilities/FileUtil.java | 26 - .../java/io/kafbat/ui/utilities/IntUtil.java | 22 - .../io/kafbat/ui/utilities/StringUtil.java | 44 -- .../java/io/kafbat/ui/utilities/TimeUtil.java | 15 - .../java/io/kafbat/ui/utilities/WebUtil.java | 115 ---- .../java/io/kafbat/ui/variables/Browser.java | 7 - .../java/io/kafbat/ui/variables/Common.java | 19 - .../main/java/io/kafbat/ui/variables/Url.java | 11 - .../testdata/connectors/create_config.json | 18 - .../connectors/create_config_api.json | 7 - .../testdata/connectors/delete_config.json | 18 - .../testdata/connectors/update_config.json | 18 - .../testdata/schemas/schema_avro_update.json | 17 - .../testdata/schemas/schema_avro_value.json | 15 - .../testdata/schemas/schema_json_value.json | 7 - .../schemas/schema_protobuf_value.txt | 5 - .../testdata/topics/create_topic_content.json | 24 - .../src/test/java/io/kafbat/ui/BaseTest.java | 140 ----- .../src/test/java/io/kafbat/ui/Facade.java | 48 -- .../io/kafbat/ui/sanitysuite/TopicsTest.java | 61 --- .../io/kafbat/ui/smokesuite/SmokeTest.java | 100 ---- .../ui/smokesuite/brokers/BrokersTest.java | 180 ------ .../smokesuite/connectors/ConnectorsTest.java | 98 ---- .../ui/smokesuite/ksqldb/KsqlDbTest.java | 139 ----- .../ui/smokesuite/schemas/SchemasTest.java | 195 ------- .../ui/smokesuite/topics/MessagesTest.java | 243 --------- .../ui/smokesuite/topics/TopicsTest.java | 492 ----------------- e2e-tests/src/test/resources/regression.xml | 9 - e2e-tests/src/test/resources/sanity.xml | 8 - e2e-tests/src/test/resources/smoke.xml | 8 - gradle/libs.versions.toml | 22 +- .../java/io/kafbat/ui/serde/api/Serde.java | 1 + settings.gradle | 1 - 85 files changed, 5 insertions(+), 6144 deletions(-) delete mode 100644 .github/workflows/e2e-manual.yml delete mode 100644 .github/workflows/e2e-pr.yml delete mode 100644 .github/workflows/e2e-run.yml delete mode 100644 .github/workflows/e2e-weekly.yml delete mode 100644 e2e-tests/.gitignore delete mode 100644 e2e-tests/README.md delete mode 100644 e2e-tests/build.gradle delete mode 100644 e2e-tests/selenoid/config/browsers-ci.json delete mode 100644 e2e-tests/selenoid/selenoid-ci.yaml delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/models/Connector.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/models/Schema.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/models/Topic.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/BasePage.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/brokers/BrokersConfigTab.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/brokers/BrokersDetails.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/brokers/BrokersList.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/connectors/ConnectorCreateForm.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/connectors/ConnectorDetails.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/connectors/KafkaConnectList.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/consumers/ConsumersDetails.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/consumers/ConsumersList.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/KsqlDbList.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/KsqlQueryForm.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/enums/KsqlMenuTabs.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/enums/KsqlQueryConfig.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/models/Stream.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/models/Table.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/panels/NaviSideBar.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/panels/TopPanel.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/panels/enums/MenuItem.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/schemas/SchemaCreateForm.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/schemas/SchemaDetails.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/schemas/SchemaRegistryList.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/topics/ProduceMessagePanel.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicCreateEditForm.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicDetails.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicSettingsTab.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicsList.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/CleanupPolicyValue.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/CustomParameterType.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/MaxSizeOnDisk.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/SeekType.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/TimeToRetain.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/services/ApiService.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/settings/BaseSource.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/settings/drivers/WebDriver.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/settings/listeners/AllureListener.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/settings/listeners/ResultsLogger.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/utilities/BooleanUtil.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/utilities/FileUtil.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/utilities/IntUtil.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/utilities/StringUtil.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/utilities/TimeUtil.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/utilities/WebUtil.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/variables/Browser.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/variables/Common.java delete mode 100644 e2e-tests/src/main/java/io/kafbat/ui/variables/Url.java delete mode 100644 e2e-tests/src/main/resources/testdata/connectors/create_config.json delete mode 100644 e2e-tests/src/main/resources/testdata/connectors/create_config_api.json delete mode 100644 e2e-tests/src/main/resources/testdata/connectors/delete_config.json delete mode 100644 e2e-tests/src/main/resources/testdata/connectors/update_config.json delete mode 100644 e2e-tests/src/main/resources/testdata/schemas/schema_avro_update.json delete mode 100644 e2e-tests/src/main/resources/testdata/schemas/schema_avro_value.json delete mode 100644 e2e-tests/src/main/resources/testdata/schemas/schema_json_value.json delete mode 100644 e2e-tests/src/main/resources/testdata/schemas/schema_protobuf_value.txt delete mode 100644 e2e-tests/src/main/resources/testdata/topics/create_topic_content.json delete mode 100644 e2e-tests/src/test/java/io/kafbat/ui/BaseTest.java delete mode 100644 e2e-tests/src/test/java/io/kafbat/ui/Facade.java delete mode 100644 e2e-tests/src/test/java/io/kafbat/ui/sanitysuite/TopicsTest.java delete mode 100644 e2e-tests/src/test/java/io/kafbat/ui/smokesuite/SmokeTest.java delete mode 100644 e2e-tests/src/test/java/io/kafbat/ui/smokesuite/brokers/BrokersTest.java delete mode 100644 e2e-tests/src/test/java/io/kafbat/ui/smokesuite/connectors/ConnectorsTest.java delete mode 100644 e2e-tests/src/test/java/io/kafbat/ui/smokesuite/ksqldb/KsqlDbTest.java delete mode 100644 e2e-tests/src/test/java/io/kafbat/ui/smokesuite/schemas/SchemasTest.java delete mode 100644 e2e-tests/src/test/java/io/kafbat/ui/smokesuite/topics/MessagesTest.java delete mode 100644 e2e-tests/src/test/java/io/kafbat/ui/smokesuite/topics/TopicsTest.java delete mode 100644 e2e-tests/src/test/resources/regression.xml delete mode 100644 e2e-tests/src/test/resources/sanity.xml delete mode 100644 e2e-tests/src/test/resources/smoke.xml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1b4dfe73d..1daa33fcb 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -16,7 +16,7 @@ gradle/libs.versions.toml @kafbat/backend /frontend/ @kafbat/frontend # TESTS -/e2e-tests/ @kafbat/qa +/e2e-playwright/ @kafbat/qa # INFRA /.github/workflows/ @kafbat/devops diff --git a/.github/workflows/e2e-manual.yml b/.github/workflows/e2e-manual.yml deleted file mode 100644 index 0919a5905..000000000 --- a/.github/workflows/e2e-manual.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: "E2E: Manual run" -on: - workflow_dispatch: - inputs: - test_suite: - description: 'Select test suite to run' - default: 'regression' - required: true - type: choice - options: - - regression - - sanity - - smoke - -permissions: - contents: read - checks: write - statuses: write - -jobs: - build-and-test: - uses: ./.github/workflows/e2e-run.yml - secrets: inherit - with: - suite_name: ${{ github.event.inputs.test_suite }} - sha: ${{ github.sha }} diff --git a/.github/workflows/e2e-playwright-run.yml b/.github/workflows/e2e-playwright-run.yml index 111cbb769..bc94fefce 100644 --- a/.github/workflows/e2e-playwright-run.yml +++ b/.github/workflows/e2e-playwright-run.yml @@ -58,10 +58,7 @@ jobs: - name: Build with Gradle id: build_app run: | - ./gradlew build \ - -x :e2e-tests:check \ - -x :e2e-tests:build \ - -x test \ + ./gradlew build -x test \ -Pbuild-docker-images=true \ -Pinclude-frontend=true \ -Pversion=latest diff --git a/.github/workflows/e2e-pr.yml b/.github/workflows/e2e-pr.yml deleted file mode 100644 index 8a74915e0..000000000 --- a/.github/workflows/e2e-pr.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: "E2E: PR smoke tests" -on: - pull_request: - types: [ "opened", "reopened", "synchronize" ] - paths: - - "build.gradle" - - "gradle.properties" - - "settings.gradle" - - "gradle/libs.versions.toml" - - - "contract/**" - - "api/**" - - "serde-api/**" - - "frontend/**" - - "e2e-tests/**" - -permissions: - contents: read - checks: write - statuses: write - -jobs: - build-and-test: - uses: ./.github/workflows/e2e-run.yml - secrets: inherit - with: - suite_name: "smoke" - sha: ${{ github.event.pull_request.head.sha }} diff --git a/.github/workflows/e2e-run.yml b/.github/workflows/e2e-run.yml deleted file mode 100644 index 954ae62c3..000000000 --- a/.github/workflows/e2e-run.yml +++ /dev/null @@ -1,176 +0,0 @@ -name: "E2E: Run tests" - -on: - workflow_call: - inputs: - suite_name: - description: 'Test suite name to run' - default: 'regression' - required: true - type: string - sha: - required: true - type: string - -permissions: - contents: read - checks: write - statuses: write - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@1e31de5234b9f8995739874a8ce0492dc87873e2 # infered from @v4 - with: - token: ${{ github.token }} - ref: ${{ inputs.sha }} - - - name: Set up JDK - uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # infered from @v4 - with: - java-version: '21' - distribution: 'zulu' - cache: 'gradle' - - - name: Build with Gradle - id: build_app - run: | - ./gradlew clean build \ - -x test \ - -Pbuild-docker-images=true \ - -Pinclude-frontend=true \ - -Pversion=latest - - - name: Upload build artifacts - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # infered from @v4 - with: - name: artifacts - path: | - api/build/libs - api/build/classes - api/build/resources - retention-days: 7 - - - name: Dump docker image - run: | - docker image save ghcr.io/kafbat/kafka-ui:latest > /tmp/image.tar - - - name: Upload docker image - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # infered from @v4 - with: - name: image - path: /tmp/image.tar - retention-days: 7 - - tests: - runs-on: ubuntu-latest - needs: build - steps: - - - name: Checkout - uses: actions/checkout@1e31de5234b9f8995739874a8ce0492dc87873e2 # infered from @v4 - with: - token: ${{ github.token }} - ref: ${{ inputs.sha }} - - - name: Set up JDK - uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # infered from @v4 - with: - java-version: '21' - distribution: 'zulu' - cache: 'gradle' - - - name: Download build artifacts - uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # infered from @v4 - with: - name: artifacts - path: api/build - - - name: Download docker image - uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # infered from @v4 - with: - name: image - path: /tmp - - - name: Load Docker image - run: | - docker load --input /tmp/image.tar - - - name: Cache Docker images. - uses: ScribeMD/docker-cache@fb28c93772363301b8d0a6072ce850224b73f74e # infered from @v0.5.0 - with: - key: docker-${{ runner.os }}-${{ hashFiles('./e2e-tests/selenoid/selenoid-ci.yaml', './documentation/compose/e2e-tests.yaml') }} - - - name: Compose up - id: compose_app - # use the following command until #819 will be fixed # TODO recheck 819 - run: | - mkdir -p /tmp/build/selenoid-results/{video,logs} - docker compose -f ./e2e-tests/selenoid/selenoid-ci.yaml up -d - docker compose -f ./documentation/compose/e2e-tests.yaml up -d - - - name: Dump Docker logs on failure - if: failure() - uses: jwalton/gh-docker-logs@2741064ab9d7af54b0b1ffb6076cf64c16f0220e # infered from @v2.2.2 - - - name: Run test suite - run: | - ./gradlew :e2e-tests:test -Prun-e2e=true -Psuite_name=${{ inputs.suite_name }} - - - name: Upload allure reports artifact - if: '!cancelled()' - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # infered from @v4 - with: - name: reports - path: ./e2e-tests/build/allure-results - retention-days: 7 - - - name: Upload selenide results artifact - if: failure() - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # infered from @v4 - with: - name: selenide-results - path: ./e2e-tests/build/selenide-results - retention-days: 3 - - reports: - runs-on: ubuntu-latest - needs: tests - if: ${{ !cancelled() && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} - steps: - - name: Download allure reports artifact - uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # infered from @v4 - with: - name: reports - path: ./e2e-tests/build/allure-results - - - name: Generate Allure report - uses: simple-elf/allure-report-action@58e6590adf6d8f196a0d771bf8a00e6921086a62 # infered from @v1.9 - id: allure-report - with: - allure_results: ./e2e-tests/build/allure-results - gh_pages: allure-results - allure_report: allure-report - subfolder: allure-results - report_url: "https://reports.kafbat.dev" - - - name: Upload allure report to R2 - uses: ryand56/r2-upload-action@b801a390acbdeb034c5e684ff5e1361c06639e7c # infered from @latest - with: - source-dir: allure-history/allure-results - destination-dir: . - r2-bucket: "reports" - r2-account-id: ${{ secrets.R2_ACCOUNT_ID }} - r2-access-key-id: ${{ secrets.R2_ACCESS_KEY_ID }} - r2-secret-access-key: ${{ secrets.R2_ACCESS_SECRET_KEY }} - - - name: Add allure link status check - uses: Sibz/github-status-action@650dd1a882a76dbbbc4576fb5974b8d22f29847f # infered from @v1.1.6 - with: - authToken: ${{secrets.GITHUB_TOKEN}} - context: "E2E allure report / Click to view the report" - state: "success" - sha: ${{ inputs.sha }} - target_url: https://reports.kafbat.dev/${{ github.run_number }}/index.html diff --git a/.github/workflows/e2e-weekly.yml b/.github/workflows/e2e-weekly.yml deleted file mode 100644 index 6b25c4679..000000000 --- a/.github/workflows/e2e-weekly.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: "E2E: Weekly suite" -on: - schedule: - - cron: '0 1 * * 1' - -permissions: - contents: read - checks: write - statuses: write - -jobs: - build-and-test: - uses: ./.github/workflows/e2e-run.yml - secrets: inherit - with: - suite_name: "sanity" - sha: ${{ github.sha }} diff --git a/api/src/test/java/io/kafbat/ui/service/ConsumerGroupServiceTest.java b/api/src/test/java/io/kafbat/ui/service/ConsumerGroupServiceTest.java index f81ed0d93..ac633f908 100644 --- a/api/src/test/java/io/kafbat/ui/service/ConsumerGroupServiceTest.java +++ b/api/src/test/java/io/kafbat/ui/service/ConsumerGroupServiceTest.java @@ -127,7 +127,7 @@ void getConsumerGroupsForTopicConsumerGroups() { Mockito.when(client.listConsumerGroupOffsets(Mockito.any(), Mockito.any())).thenAnswer( a -> { - List groupIds = (List) a.getArgument(0); + List groupIds = a.getArgument(0); var table = ImmutableTable.builder(); for (String groupId : groupIds) { ScrapedClusterState.ConsumerGroupState state = consumerGroupStates.get(groupId); diff --git a/e2e-tests/.gitignore b/e2e-tests/.gitignore deleted file mode 100644 index c52b34a36..000000000 --- a/e2e-tests/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.env -build/ -target/ diff --git a/e2e-tests/README.md b/e2e-tests/README.md deleted file mode 100644 index 94d720225..000000000 --- a/e2e-tests/README.md +++ /dev/null @@ -1,75 +0,0 @@ -### E2E UI automation for Kafbat UI - -This repository is for E2E UI automation. - -### Table of Contents - -- [Prerequisites](#prerequisites) -- [How to install](#how-to-install) -- [How to run checks](#how-to-run-checks) -- [Reporting](#reporting) -- [Test Data](#test-data) -- [Actions](#actions) -- [Checks](#checks) -- [Parallelization](#parallelization) -- [How to develop](#how-to-develop) - -### Prerequisites - -- Docker & Docker-compose -- Java (install arch64 jdk if you have M1/arm chip) - -### How to install - -``` -git clone https://github.com/kafbat/kafka-ui.git -cd e2e-tests -docker pull selenoid/vnc_chrome:117.0 -``` - -### How to run checks - -1. Run `kafbat-ui`: - -``` -cd kafbat-ui -docker-compose -f e2e-tests/selenoid/selenoid-ci.yaml up -d -docker-compose -f documentation/compose/e2e-tests.yaml up -d -``` - -2. To run test suite select its name (options: `regression`, `sanity`, `smoke`) and put it instead %s into command below - -``` -./gradlew :e2e-tests:test -Prun-e2e=true -Psuite_name=%s -``` - -### Reporting - -Screenshots are stored in `target/selenide-results/reports` folder. - -Reports are stored in `target/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 -``` - -### Test Data - -> ⚠️ todo - -### Actions - -> ⚠️ todo - -### Checks - -> ⚠️ todo - -### Parallelization - -> ⚠️ todo - -### How to develop - -> ⚠️ todo diff --git a/e2e-tests/build.gradle b/e2e-tests/build.gradle deleted file mode 100644 index ec9379b71..000000000 --- a/e2e-tests/build.gradle +++ /dev/null @@ -1,61 +0,0 @@ -import java.nio.file.Files - -plugins { - id 'java' - id 'checkstyle' - alias(libs.plugins.allure) -} - -dependencies { - implementation project(":contract") - implementation libs.apache.kafka - implementation libs.apache.commons.io - implementation libs.aspectj - implementation libs.testng - implementation libs.codeborne.selenide - implementation libs.allure.testng - implementation libs.allure.selenide - implementation libs.bonigarcia.webdrivermanager - implementation libs.spring.starter.webflux - implementation libs.netty.resolver.dns.native - - implementation libs.lombok - - annotationProcessor libs.lombok - testAnnotationProcessor libs.lombok -} - -checkstyle { - toolVersion = libs.versions.checkstyle.get() - configFile = rootProject.file('etc/checkstyle/checkstyle-e2e.xml') - ignoreFailures = false - maxWarnings = 0 - maxErrors = 0 -} - -test { - doFirst { // exec only when ran - def suiteName = findProperty("suite_name") - if (!suiteName) { - throw new GradleException("Suite name property 'suite_name' is missing") - } - - useTestNG() { - useDefaultListeners = true - - def suitePath = project.layout.projectDirectory.dir("src/test/resources/" + suiteName + ".xml").asFile.toPath() - if (!Files.exists(suitePath)) { - throw new GradleException("Suite [" + suitePath.toAbsolutePath() + "] doesn't exist") - } - suiteXmlFiles = [suitePath.toFile()] - } - - systemProperty "allure.results.directory", - project.layout.buildDirectory.dir("allure-results").get().getAsFile().getAbsolutePath() - } -} - -tasks.named('test') { - enabled = runE2e -} - diff --git a/e2e-tests/selenoid/config/browsers-ci.json b/e2e-tests/selenoid/config/browsers-ci.json deleted file mode 100644 index 5636c9a39..000000000 --- a/e2e-tests/selenoid/config/browsers-ci.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "chrome": { - "default": "133.0", - "versions": { - "133.0": { - "image": "selenium/standalone-chromium:133.0", - "hosts": [ - "host.docker.internal:172.17.0.1" - ], - "port": "4444", - "path": "/" - } - } - } -} diff --git a/e2e-tests/selenoid/selenoid-ci.yaml b/e2e-tests/selenoid/selenoid-ci.yaml deleted file mode 100644 index b3c919a7f..000000000 --- a/e2e-tests/selenoid/selenoid-ci.yaml +++ /dev/null @@ -1,37 +0,0 @@ -services: - - # https://github.com/aerokube/selenoid/releases - selenoid: - network_mode: bridge - image: aerokube/selenoid:1.11.2 - volumes: - - "../selenoid/config:/etc/selenoid" - - "/var/run/docker.sock:/var/run/docker.sock" - - "/tmp/build/selenoid-results/video:/opt/selenoid/video" - - "/tmp/build/selenoid-results/logs:/opt/selenoid/logs" - environment: - - OVERRIDE_VIDEO_OUTPUT_DIR=../docker/selenoid/video - ports: - - "4444:4444" - command: [ "-limit", "5", "-conf", "/etc/selenoid/browsers-ci.json", - "-video-output-dir", "/opt/selenoid/video", "-log-output-dir", "/opt/selenoid/logs" ] - - # https://github.com/aerokube/selenoid-ui/releases - selenoid-ui: - network_mode: bridge - image: aerokube/selenoid-ui:1.10.11 - links: - - selenoid - ports: - - "8081:8080" - command: [ "--selenoid-uri", "http://selenoid:4444" ] - - # https://aerokube.com/images/latest - selenoid-chrome: - image: selenium/standalone-chromium:133.0 - shm_size: 2gb - extra_hosts: - - "host.docker.internal:host-gateway" - links: - - selenoid - - selenoid-ui diff --git a/e2e-tests/src/main/java/io/kafbat/ui/models/Connector.java b/e2e-tests/src/main/java/io/kafbat/ui/models/Connector.java deleted file mode 100644 index 3f1826ac4..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/models/Connector.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.kafbat.ui.models; - -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; - -import lombok.Data; -import lombok.experimental.Accessors; - -@Data -@Accessors(chain = true) -public class Connector { - - private String name, config; - - public static Connector createConnector(String config) { - return new Connector() - .setName("aqa_connector_" + randomAlphabetic(5)) - .setConfig(config); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/models/Schema.java b/e2e-tests/src/main/java/io/kafbat/ui/models/Schema.java deleted file mode 100644 index 9e89f5613..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/models/Schema.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.kafbat.ui.models; - -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; - -import io.kafbat.ui.api.model.SchemaType; -import lombok.Data; -import lombok.experimental.Accessors; - -@Data -@Accessors(chain = true) -public class Schema { - - private static final String USER_DIR = "user.dir"; - - private String name, valuePath; - private SchemaType type; - - public static Schema createSchemaAvro() { - return new Schema().setName("schema_avro-" + randomAlphabetic(5)) - .setType(SchemaType.AVRO) - .setValuePath(System.getProperty(USER_DIR) + "/src/main/resources/testdata/schemas/schema_avro_value.json"); - } - - public static Schema createSchemaJson() { - return new Schema().setName("schema_json-" + randomAlphabetic(5)) - .setType(SchemaType.JSON) - .setValuePath(System.getProperty(USER_DIR) + "/src/main/resources/testdata/schemas/schema_json_value.json"); - } - - public static Schema createSchemaProtobuf() { - return new Schema().setName("schema_protobuf-" + randomAlphabetic(5)) - .setType(SchemaType.PROTOBUF) - .setValuePath( - System.getProperty(USER_DIR) + "/src/main/resources/testdata/schemas/schema_protobuf_value.txt"); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/models/Topic.java b/e2e-tests/src/main/java/io/kafbat/ui/models/Topic.java deleted file mode 100644 index 660e16339..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/models/Topic.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.kafbat.ui.models; - -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; - -import io.kafbat.ui.screens.topics.enums.CleanupPolicyValue; -import io.kafbat.ui.screens.topics.enums.CustomParameterType; -import io.kafbat.ui.screens.topics.enums.MaxSizeOnDisk; -import io.kafbat.ui.screens.topics.enums.TimeToRetain; -import lombok.Data; -import lombok.experimental.Accessors; - -@Data -@Accessors(chain = true) -public class Topic { - - private String name, timeToRetainData, maxMessageBytes, messageKey, messageValue, customParameterValue; - private int numberOfPartitions; - private CustomParameterType customParameterType; - private CleanupPolicyValue cleanupPolicyValue; - private MaxSizeOnDisk maxSizeOnDisk; - private TimeToRetain timeToRetain; - - public static Topic createTopic() { - return new Topic() - .setName("aqa_topic_" + randomAlphabetic(5)) - .setNumberOfPartitions(1) - .setMessageKey(randomAlphabetic(5)) - .setMessageValue(randomAlphabetic(10)); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/BasePage.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/BasePage.java deleted file mode 100644 index 4d649070c..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/BasePage.java +++ /dev/null @@ -1,164 +0,0 @@ -package io.kafbat.ui.screens; - -import static com.codeborne.selenide.Selenide.$$x; -import static com.codeborne.selenide.Selenide.$x; -import static io.kafbat.ui.variables.Common.LOG_RESULT; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; -import com.codeborne.selenide.WebDriverRunner; -import io.kafbat.ui.screens.panels.enums.MenuItem; -import io.kafbat.ui.utilities.WebUtil; -import java.time.Duration; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import org.openqa.selenium.Keys; -import org.openqa.selenium.interactions.Actions; - -@Slf4j -public abstract class BasePage extends WebUtil { - - protected SelenideElement loadingSpinner = $x("//div[@role='progressbar']"); - protected SelenideElement submitBtn = $x("//button[@type='submit']"); - protected SelenideElement tableGrid = $x("//table"); - protected SelenideElement searchFld = $x("//input[@type='text'][contains(@id, ':r')]"); - 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 SelenideElement backBtn = $x("//button[contains(text(),'Back')]"); - protected SelenideElement previousBtn = $x("//button[contains(text(),'Previous')]"); - protected SelenideElement nextBtn = $x("//button[contains(text(),'Next')]"); - protected ElementsCollection ddlOptions = $$x("//li[@value]"); - protected ElementsCollection gridItems = $$x("//tr[@class]"); - protected String summaryCellLocator = "//div[contains(text(),'%s')]"; - protected String tableElementNameLocator = "//a[normalize-space(text())='%s']"; - protected String columnHeaderLocator = "//table//tr/th//div[text()='%s']"; - protected String pageTitleFromHeader = "//h1[text()='%s']"; - protected String pagePathFromHeader = "//a[text()='%s']/../h1"; - - protected boolean isSpinnerVisible(int... timeoutInSeconds) { - return isVisible(loadingSpinner, timeoutInSeconds); - } - - protected void waitUntilSpinnerDisappear(int... timeoutInSeconds) { - log.debug("\nwaitUntilSpinnerDisappear"); - if (isSpinnerVisible(timeoutInSeconds)) { - loadingSpinner.shouldBe(Condition.disappear, Duration.ofSeconds(60)); - } - } - - protected void clickClearSearchFieldButton() { - clickByActions(searchFld.$x("./../span[@role='button']/*")); - waitUntilSpinnerDisappear(1); - } - - protected void searchItem(String tag) { - log.debug("\nsearchItem: {}", tag); - clickClearSearchFieldButton(); - sendKeysAfterClear(searchFld, tag); - searchFld.pressEnter().shouldHave(Condition.value(tag)); - waitUntilSpinnerDisappear(1); - } - - protected SelenideElement getPageTitleFromHeader(MenuItem menuItem) { - return $x(String.format(pageTitleFromHeader, menuItem.getPageTitle())); - } - - protected SelenideElement getPagePathFromHeader(MenuItem menuItem) { - return $x(String.format(pagePathFromHeader, menuItem.getPageTitle())); - } - - protected void clickSubmitBtn() { - clickByJavaScript(submitBtn); - } - - protected void clickNextBtn() { - clickByJavaScript(nextBtn); - } - - protected void clickBackBtn() { - clickByJavaScript(backBtn); - } - - protected void clickPreviousBtn() { - clickByJavaScript(previousBtn); - } - - protected void setJsonInputValue(SelenideElement jsonInput, String jsonConfig) { - sendKeysByActions(jsonInput, jsonConfig.replace(" ", "")); - new Actions(WebDriverRunner.getWebDriver()) - .keyDown(Keys.SHIFT) - .sendKeys(Keys.PAGE_DOWN) - .keyUp(Keys.SHIFT) - .sendKeys(Keys.DELETE) - .perform(); - } - - protected SelenideElement getTableElement(String elementName) { - log.debug("\ngetTableElement: {}", elementName); - return $x(String.format(tableElementNameLocator, elementName)); - } - - protected ElementsCollection getDdlOptions() { - return ddlOptions; - } - - protected String getAlertHeader() { - log.debug("\ngetAlertHeader"); - String result = alertHeader.shouldBe(Condition.visible).getText(); - log.debug(LOG_RESULT, result); - return result; - } - - protected String getAlertMessage() { - log.debug("\ngetAlertMessage"); - String result = alertMessage.shouldBe(Condition.visible).getText(); - log.debug(LOG_RESULT, result); - return result; - } - - protected boolean isAlertVisible(AlertHeader header) { - log.debug("\nisAlertVisible: {}", header.getValue()); - boolean result = getAlertHeader().equals(header.getValue()); - log.debug(LOG_RESULT, result); - return result; - } - - protected boolean isAlertVisible(AlertHeader header, String message) { - log.debug("\nisAlertVisible: {} {}", header, message); - boolean result = isAlertVisible(header) && getAlertMessage().equals(message); - log.debug(LOG_RESULT, 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); - } - - @Getter - public enum AlertHeader { - SUCCESS("Success"), - VALIDATION_ERROR("Validation Error"), - BAD_REQUEST("400 Bad Request"); - - private final String value; - - AlertHeader(String value) { - this.value = value; - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/brokers/BrokersConfigTab.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/brokers/BrokersConfigTab.java deleted file mode 100644 index f2801cae9..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/brokers/BrokersConfigTab.java +++ /dev/null @@ -1,171 +0,0 @@ -package io.kafbat.ui.screens.brokers; - -import static com.codeborne.selenide.Selenide.$$x; -import static com.codeborne.selenide.Selenide.$x; - -import com.codeborne.selenide.CollectionCondition; -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class BrokersConfigTab extends BasePage { - - protected SelenideElement searchByKeyField = $x("//input[@placeholder='Search by Key or Value']"); - protected SelenideElement sourceInfoIcon = $x("//div[text()='Source']/..//div/div[@class]"); - protected SelenideElement sourceInfoTooltip = $x("//div[text()='Source']/..//div/div[@style]"); - protected ElementsCollection editBtns = $$x("//button[@aria-label='editAction']"); - - @Step - public BrokersConfigTab waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - searchFld.shouldBe(Condition.visible); - return this; - } - - @Step - public BrokersConfigTab hoverOnSourceInfoIcon() { - sourceInfoIcon.shouldBe(Condition.visible).hover(); - return this; - } - - @Step - public String getSourceInfoTooltipText() { - return sourceInfoTooltip.shouldBe(Condition.visible).getText().trim(); - } - - @Step - public boolean isSearchByKeyVisible() { - return WebUtil.isVisible(searchFld); - } - - @Step - public BrokersConfigTab searchConfig(String key) { - searchItem(key); - return this; - } - - public List getColumnHeaders() { - return Stream.of("Key", "Value", "Source") - .map(name -> $x(String.format(columnHeaderLocator, name))) - .collect(Collectors.toList()); - } - - public List getEditButtons() { - return editBtns.asFixedIterable().stream() - .collect(Collectors.toList()); - } - - @Step - public BrokersConfigTab clickNextButton() { - clickNextBtn(); - waitUntilSpinnerDisappear(1); - return this; - } - - @Step - public BrokersConfigTab clickPreviousButton() { - clickPreviousBtn(); - waitUntilSpinnerDisappear(1); - return this; - } - - private List initGridItems() { - List gridItemList = new ArrayList<>(); - gridItems.shouldHave(CollectionCondition.sizeGreaterThan(0)) - .forEach(item -> gridItemList.add(new BrokersConfigTab.BrokersConfigItem(item))); - return gridItemList; - } - - @Step - public BrokersConfigTab.BrokersConfigItem getConfig(String key) { - return initGridItems().stream() - .filter(e -> e.getKey().equals(key)) - .findFirst().orElseThrow(); - } - - @Step - public List getAllConfigs() { - return initGridItems(); - } - - public static class BrokersConfigItem extends BasePage { - - private final SelenideElement element; - - public BrokersConfigItem(SelenideElement element) { - this.element = element; - } - - @Step - public String getKey() { - return element.$x("./td[1]").getText().trim(); - } - - @Step - public String getValue() { - return element.$x("./td[2]//span").getText().trim(); - } - - @Step - public BrokersConfigItem setValue(String value) { - WebUtil.sendKeysAfterClear(getValueFld(), value); - return this; - } - - @Step - public SelenideElement getValueFld() { - return element.$x("./td[2]//input"); - } - - @Step - public SelenideElement getSaveBtn() { - return element.$x("./td[2]//button[@aria-label='confirmAction']"); - } - - @Step - public SelenideElement getCancelBtn() { - return element.$x("./td[2]//button[@aria-label='cancelAction']"); - } - - @Step - public SelenideElement getEditBtn() { - return element.$x("./td[2]//button[@aria-label='editAction']"); - } - - @Step - public BrokersConfigItem clickSaveBtn() { - getSaveBtn().shouldBe(Condition.enabled).click(); - return this; - } - - @Step - public BrokersConfigItem clickCancelBtn() { - getCancelBtn().shouldBe(Condition.enabled).click(); - return this; - } - - @Step - public BrokersConfigItem clickEditBtn() { - getEditBtn().shouldBe(Condition.enabled).click(); - return this; - } - - @Step - public String getSource() { - return element.$x("./td[3]").getText().trim(); - } - - @Step - public BrokersConfigItem clickConfirm() { - clickConfirmButton(); - return this; - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/brokers/BrokersDetails.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/brokers/BrokersDetails.java deleted file mode 100644 index 19ccc4292..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/brokers/BrokersDetails.java +++ /dev/null @@ -1,84 +0,0 @@ -package io.kafbat.ui.screens.brokers; - -import static com.codeborne.selenide.Selenide.$x; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.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 lombok.Getter; - -public class BrokersDetails extends BasePage { - - protected String brokersTabLocator = "//a[text()='%s']"; - - @Step - public BrokersDetails waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - $x(String.format(brokersTabLocator, DetailsTab.LOG_DIRECTORIES.getValue())).shouldBe(Condition.visible); - return this; - } - - @Step - public BrokersDetails openDetailsTab(DetailsTab menu) { - $x(String.format(brokersTabLocator, menu.getValue())).shouldBe(Condition.enabled).click(); - waitUntilSpinnerDisappear(); - return this; - } - - private List getVisibleColumnHeaders() { - return Stream.of("Name", "Topics", "Error", "Partitions") - .map(name -> $x(String.format(columnHeaderLocator, name))) - .collect(Collectors.toList()); - } - - private List getEnabledColumnHeaders() { - return Stream.of("Name", "Error") - .map(name -> $x(String.format(columnHeaderLocator, name))) - .collect(Collectors.toList()); - } - - private List getVisibleSummaryCells() { - return Stream.of("Segment Size", "Segment Count", "Port", "Host") - .map(name -> $x(String.format(summaryCellLocator, name))) - .collect(Collectors.toList()); - } - - private List getDetailsTabs() { - return Stream.of(DetailsTab.values()) - .map(tab -> $x(String.format(brokersTabLocator, tab.getValue()))) - .collect(Collectors.toList()); - } - - @Step - public List getAllEnabledElements() { - List enabledElements = new ArrayList<>(getEnabledColumnHeaders()); - enabledElements.addAll(getDetailsTabs()); - return enabledElements; - } - - @Step - public List getAllVisibleElements() { - List visibleElements = new ArrayList<>(getVisibleSummaryCells()); - visibleElements.addAll(getVisibleColumnHeaders()); - visibleElements.addAll(getDetailsTabs()); - return visibleElements; - } - - @Getter - public enum DetailsTab { - LOG_DIRECTORIES("Log directories"), - CONFIGS("Configs"), - METRICS("Metrics"); - - private final String value; - - DetailsTab(String value) { - this.value = value; - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/brokers/BrokersList.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/brokers/BrokersList.java deleted file mode 100644 index 254aa7fc7..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/brokers/BrokersList.java +++ /dev/null @@ -1,123 +0,0 @@ -package io.kafbat.ui.screens.brokers; - -import static com.codeborne.selenide.Selenide.$x; -import static io.kafbat.ui.screens.panels.enums.MenuItem.BROKERS; - -import com.codeborne.selenide.CollectionCondition; -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.qameta.allure.Step; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class BrokersList extends BasePage { - - @Step - public BrokersList waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - getPageTitleFromHeader(BROKERS).shouldBe(Condition.visible); - return this; - } - - @Step - public BrokersList openBroker(int brokerId) { - getBroker(brokerId).openItem(); - return this; - } - - private List getUptimeSummaryCells() { - return Stream.of("Broker Count", "Active Controller", "Version") - .map(name -> $x(String.format(summaryCellLocator, name))) - .collect(Collectors.toList()); - } - - private List 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 getAllVisibleElements() { - List visibleElements = new ArrayList<>(getUptimeSummaryCells()); - visibleElements.addAll(getPartitionsSummaryCells()); - return visibleElements; - } - - private List getEnabledColumnHeaders() { - return Stream.of("Broker ID", "Disk usage", "In Sync Replicas", "Replicas", "Replicas skew", - "Leaders", "Leaders skew", "Port", "Host") - .map(name -> $x(String.format(columnHeaderLocator, name))) - .collect(Collectors.toList()); - } - - @Step - public List getAllEnabledElements() { - return getEnabledColumnHeaders(); - } - - private List initGridItems() { - List gridItemList = new ArrayList<>(); - gridItems.shouldHave(CollectionCondition.sizeGreaterThan(0)) - .forEach(item -> gridItemList.add(new BrokersGridItem(item))); - return gridItemList; - } - - @Step - public BrokersGridItem getBroker(int id) { - return initGridItems().stream() - .filter(e -> e.getId() == id) - .findFirst().orElseThrow(); - } - - @Step - public List getAllBrokers() { - return initGridItems(); - } - - public static class BrokersGridItem extends BasePage { - - private final SelenideElement element; - - public BrokersGridItem(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(); - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/connectors/ConnectorCreateForm.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/connectors/ConnectorCreateForm.java deleted file mode 100644 index 0fe7f67c7..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/connectors/ConnectorCreateForm.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.kafbat.ui.screens.connectors; - -import static com.codeborne.selenide.Selenide.$x; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.qameta.allure.Step; - -public class ConnectorCreateForm extends BasePage { - - protected SelenideElement nameField = $x("//input[@name='name']"); - protected SelenideElement contentTextArea = $x("//textarea[@class='ace_text-input']"); - protected SelenideElement configField = $x("//div[@id='config']"); - - @Step - public ConnectorCreateForm waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - nameField.shouldBe(Condition.visible); - return this; - } - - @Step - public ConnectorCreateForm setName(String connectName) { - nameField.shouldBe(Condition.enabled).setValue(connectName); - return this; - } - - @Step - public ConnectorCreateForm setConfig(String configJson) { - configField.shouldBe(Condition.enabled).click(); - setJsonInputValue(contentTextArea, configJson); - return this; - } - - @Step - public ConnectorCreateForm setConnectorDetails(String connectName, String configJson) { - setName(connectName); - setConfig(configJson); - return this; - } - - @Step - public ConnectorCreateForm clickSubmitButton() { - clickSubmitBtn(); - waitUntilSpinnerDisappear(); - return this; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/connectors/ConnectorDetails.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/connectors/ConnectorDetails.java deleted file mode 100644 index bfc850635..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/connectors/ConnectorDetails.java +++ /dev/null @@ -1,85 +0,0 @@ -package io.kafbat.ui.screens.connectors; - -import static com.codeborne.selenide.Selenide.$x; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; - -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')]"; - - @Step - public ConnectorDetails waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - taskTab.shouldBe(Condition.visible); - return this; - } - - @Step - public ConnectorDetails openConfigTab() { - WebUtil.clickByJavaScript(configTab); - return this; - } - - @Step - public ConnectorDetails setConfig(String configJson) { - configField.shouldBe(Condition.enabled).click(); - WebUtil.clearByKeyboard(contentTextArea); - contentTextArea.setValue(configJson); - configField.shouldBe(Condition.enabled).click(); - return this; - } - - @Step - public ConnectorDetails clickSubmitButton() { - clickSubmitBtn(); - return this; - } - - @Step - public ConnectorDetails openDotMenu() { - WebUtil.clickByActions(dotMenuBtn); - return this; - } - - @Step - public ConnectorDetails clickDeleteBtn() { - WebUtil.clickByJavaScript(deleteBtn); - return this; - } - - @Step - public ConnectorDetails clickConfirmBtn() { - confirmBtnMdl.shouldBe(Condition.enabled).click(); - confirmBtnMdl.shouldBe(Condition.disappear); - return this; - } - - @Step - public ConnectorDetails deleteConnector() { - openDotMenu(); - clickDeleteBtn(); - clickConfirmBtn(); - return this; - } - - @Step - public boolean isConnectorHeaderVisible(String connectorName) { - return WebUtil.isVisible($x(String.format(connectorHeaderLocator, connectorName))); - } - - @Step - public boolean isAlertWithMessageVisible(AlertHeader header, String message) { - return isAlertVisible(header, message); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/connectors/KafkaConnectList.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/connectors/KafkaConnectList.java deleted file mode 100644 index 6dddae78b..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/connectors/KafkaConnectList.java +++ /dev/null @@ -1,53 +0,0 @@ -package io.kafbat.ui.screens.connectors; - -import static com.codeborne.selenide.Selenide.$x; -import static io.kafbat.ui.screens.panels.enums.MenuItem.KAFKA_CONNECT; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; - - -public class KafkaConnectList extends BasePage { - - protected SelenideElement createConnectorBtn = $x("//button[contains(text(),'Create Connector')]"); - protected SelenideElement connectorsTab = $x("//a[contains(text(),'Connectors')]"); - - public KafkaConnectList() { - tableElementNameLocator = "//tbody//td[contains(text(),'%s')]"; - } - - @Step - public KafkaConnectList clickConnectorsTab() { - WebUtil.clickByJavaScript(connectorsTab); - return this; - } - - @Step - public KafkaConnectList waitUntilScreenReady() { - clickConnectorsTab(); - waitUntilSpinnerDisappear(); - getPageTitleFromHeader(KAFKA_CONNECT).shouldBe(Condition.visible); - return this; - } - - @Step - public KafkaConnectList clickCreateConnectorBtn() { - WebUtil.clickByJavaScript(createConnectorBtn); - return this; - } - - @Step - public KafkaConnectList openConnector(String connectorName) { - getTableElement(connectorName).shouldBe(Condition.enabled).click(); - return this; - } - - @Step - public boolean isConnectorVisible(String connectorName) { - tableGrid.shouldBe(Condition.visible); - return WebUtil.isVisible(getTableElement(connectorName)); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/consumers/ConsumersDetails.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/consumers/ConsumersDetails.java deleted file mode 100644 index 1312eb83e..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/consumers/ConsumersDetails.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.kafbat.ui.screens.consumers; - -import static com.codeborne.selenide.Selenide.$x; - -import com.codeborne.selenide.Condition; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; - -public class ConsumersDetails extends BasePage { - - protected String consumerIdHeaderLocator = "//h1[contains(text(),'%s')]"; - protected String topicElementLocator = "//tbody//td//a[text()='%s']"; - - @Step - public ConsumersDetails waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - tableGrid.shouldBe(Condition.visible); - return this; - } - - @Step - public boolean isRedirectedConsumerTitleVisible(String consumerGroupId) { - return WebUtil.isVisible($x(String.format(consumerIdHeaderLocator, consumerGroupId))); - } - - @Step - public boolean isTopicInConsumersDetailsVisible(String topicName) { - tableGrid.shouldBe(Condition.visible); - return WebUtil.isVisible($x(String.format(topicElementLocator, topicName))); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/consumers/ConsumersList.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/consumers/ConsumersList.java deleted file mode 100644 index 554b080a4..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/consumers/ConsumersList.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.kafbat.ui.screens.consumers; - -import static io.kafbat.ui.screens.panels.enums.MenuItem.CONSUMERS; - -import com.codeborne.selenide.Condition; -import io.kafbat.ui.screens.BasePage; -import io.qameta.allure.Step; - -public class ConsumersList extends BasePage { - - @Step - public ConsumersList waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - getPageTitleFromHeader(CONSUMERS).shouldBe(Condition.visible); - return this; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/KsqlDbList.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/KsqlDbList.java deleted file mode 100644 index 95617e771..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/KsqlDbList.java +++ /dev/null @@ -1,170 +0,0 @@ -package io.kafbat.ui.screens.ksqldb; - -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$x; -import static io.kafbat.ui.screens.panels.enums.MenuItem.KSQL_DB; - -import com.codeborne.selenide.CollectionCondition; -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.screens.ksqldb.enums.KsqlMenuTabs; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; -import org.openqa.selenium.By; - -public class KsqlDbList extends BasePage { - protected SelenideElement executeKsqlBtn = $x("//button[text()='Execute KSQL Request']"); - protected SelenideElement tablesTab = $x("//nav[@role='navigation']/a[text()='Tables']"); - protected SelenideElement streamsTab = $x("//nav[@role='navigation']/a[text()='Streams']"); - - @Step - public KsqlDbList waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - getPageTitleFromHeader(KSQL_DB).shouldBe(Condition.visible); - return this; - } - - @Step - public KsqlDbList clickExecuteKsqlRequestBtn() { - WebUtil.clickByJavaScript(executeKsqlBtn); - return this; - } - - @Step - public KsqlDbList openDetailsTab(KsqlMenuTabs menu) { - $(By.linkText(menu.getValue())).shouldBe(Condition.visible).click(); - waitUntilSpinnerDisappear(); - return this; - } - - private List initTablesItems() { - List gridItemList = new ArrayList<>(); - gridItems.shouldHave(CollectionCondition.sizeGreaterThan(0)) - .forEach(item -> gridItemList.add(new KsqlDbList.KsqlTablesGridItem(item))); - return gridItemList; - } - - @Step - public KsqlDbList.KsqlTablesGridItem getTableByName(String tableName) { - return initTablesItems().stream() - .filter(e -> e.getTableName().equals(tableName)) - .findFirst().orElseThrow(); - } - - private List initStreamsItems() { - List gridItemList = new ArrayList<>(); - gridItems.shouldHave(CollectionCondition.sizeGreaterThan(0)) - .forEach(item -> gridItemList.add(new KsqlDbList.KsqlStreamsGridItem(item))); - return gridItemList; - } - - @Step - public KsqlDbList.KsqlStreamsGridItem getStreamByName(String streamName) { - return initStreamsItems().stream() - .filter(e -> e.getStreamName().equals(streamName)) - .findFirst().orElseThrow(); - } - - public static class KsqlTablesGridItem extends BasePage { - - private final SelenideElement element; - - public KsqlTablesGridItem(SelenideElement element) { - this.element = element; - } - - private SelenideElement getNameElm() { - return element.$x("./td[1]"); - } - - @Step - public String getTableName() { - return getNameElm().getText().trim(); - } - - @Step - public boolean isVisible() { - boolean isVisible = false; - try { - getNameElm().shouldBe(visible, Duration.ofMillis(500)); - isVisible = true; - } catch (Throwable ignored) { - } - return isVisible; - } - - @Step - public String getTopicName() { - return element.$x("./td[2]").getText().trim(); - } - - @Step - public String getKeyFormat() { - return element.$x("./td[3]").getText().trim(); - } - - @Step - public String getValueFormat() { - return element.$x("./td[4]").getText().trim(); - } - - @Step - public String getIsWindowed() { - return element.$x("./td[5]").getText().trim(); - } - } - - public static class KsqlStreamsGridItem extends BasePage { - - private final SelenideElement element; - - public KsqlStreamsGridItem(SelenideElement element) { - this.element = element; - } - - private SelenideElement getNameElm() { - return element.$x("./td[1]"); - } - - @Step - public String getStreamName() { - return getNameElm().getText().trim(); - } - - @Step - public boolean isVisible() { - boolean isVisible = false; - try { - getNameElm().shouldBe(visible, Duration.ofMillis(500)); - isVisible = true; - } catch (Throwable ignored) { - } - return isVisible; - } - - @Step - public String getTopicName() { - return element.$x("./td[2]").getText().trim(); - } - - @Step - public String getKeyFormat() { - return element.$x("./td[3]").getText().trim(); - } - - @Step - public String getValueFormat() { - return element.$x("./td[4]").getText().trim(); - } - - @Step - public String getIsWindowed() { - return element.$x("./td[5]").getText().trim(); - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/KsqlQueryForm.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/KsqlQueryForm.java deleted file mode 100644 index 1ef49cbb4..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/KsqlQueryForm.java +++ /dev/null @@ -1,180 +0,0 @@ -package io.kafbat.ui.screens.ksqldb; - -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$$x; -import static com.codeborne.selenide.Selenide.$x; -import static com.codeborne.selenide.Selenide.sleep; - -import com.codeborne.selenide.CollectionCondition; -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; - -public class KsqlQueryForm extends BasePage { - protected SelenideElement clearBtn = $x("//div/button[text()='Clear']"); - protected SelenideElement executeBtn = $x("//div/button[text()='Execute']"); - protected SelenideElement clearResultsBtn = $x("//div/button[text()='Clear results']"); - protected SelenideElement addStreamPropertyBtn = $x("//button[text()='Add Stream Property']"); - protected SelenideElement queryAreaValue = $x("//div[@class='ace_content']"); - protected SelenideElement queryArea = $x("//div[@id='ksql']/textarea[@class='ace_text-input']"); - protected SelenideElement abortButton = $x("//div[@role='status']/div[text()='Abort']"); - protected SelenideElement cancelledAlert = $x("//div[@role='status'][text()='Cancelled']"); - protected ElementsCollection ksqlGridItems = $$x("//tbody//tr"); - protected ElementsCollection keyField = $$x("//input[@aria-label='key']"); - protected ElementsCollection valueField = $$x("//input[@aria-label='value']"); - - @Step - public KsqlQueryForm waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - executeBtn.shouldBe(Condition.visible); - return this; - } - - @Step - public KsqlQueryForm clickClearBtn() { - WebUtil.clickByJavaScript(clearBtn); - sleep(500); - return this; - } - - @Step - public String getEnteredQuery() { - return queryAreaValue.getText().trim(); - } - - @Step - public KsqlQueryForm clickExecuteBtn(String query) { - WebUtil.clickByActions(executeBtn); - if (query.contains("EMIT CHANGES")) { - abortButton.shouldBe(Condition.visible); - } else { - waitUntilSpinnerDisappear(); - } - return this; - } - - @Step - public boolean isAbortBtnVisible() { - return WebUtil.isVisible(abortButton); - } - - @Step - public KsqlQueryForm clickAbortBtn() { - WebUtil.clickByActions(abortButton); - return this; - } - - @Step - public boolean isCancelledAlertVisible() { - return WebUtil.isVisible(cancelledAlert); - } - - @Step - public boolean isClearResultsBtnEnabled() { - return WebUtil.isEnabled(clearResultsBtn); - } - - @Step - public KsqlQueryForm clickClearResultsBtn() { - WebUtil.clickByActions(clearResultsBtn); - waitUntilSpinnerDisappear(); - return this; - } - - @Step - public KsqlQueryForm clickAddStreamProperty() { - WebUtil.clickByActions(addStreamPropertyBtn); - return this; - } - - @Step - public KsqlQueryForm setQuery(String query) { - queryAreaValue.shouldBe(Condition.visible).click(); - WebUtil.sendKeysByActions(queryArea, query); - return this; - } - - @Step - public KsqlQueryForm.KsqlResponseGridItem getItemByName(String name) { - return initItems().stream() - .filter(e -> e.getName().equalsIgnoreCase(name)) - .findFirst().orElseThrow(); - } - - @Step - public boolean areResultsVisible() { - boolean visible = false; - try { - visible = !initItems().isEmpty(); - } catch (Throwable ignored) { - } - return visible; - } - - private List initItems() { - List gridItemList = new ArrayList<>(); - ksqlGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0)) - .forEach(item -> gridItemList.add(new KsqlQueryForm.KsqlResponseGridItem(item))); - return gridItemList; - } - - public static class KsqlResponseGridItem extends BasePage { - - private final SelenideElement element; - - private KsqlResponseGridItem(SelenideElement element) { - this.element = element; - } - - @Step - public String getType() { - return element.$x("./td[1]").getText().trim(); - } - - private SelenideElement getNameElm() { - return element.$x("./td[2]"); - } - - @Step - public String getName() { - return getNameElm().scrollTo().getText().trim(); - } - - @Step - public boolean isVisible() { - boolean isVisible = false; - try { - getNameElm().shouldBe(visible, Duration.ofMillis(500)); - isVisible = true; - } catch (Throwable ignored) { - } - return isVisible; - } - - @Step - public String getTopic() { - return element.$x("./td[3]").getText().trim(); - } - - @Step - public String getKeyFormat() { - return element.$x("./td[4]").getText().trim(); - } - - @Step - public String getValueFormat() { - return element.$x("./td[5]").getText().trim(); - } - - @Step - public String getIsWindowed() { - return element.$x("./td[6]").getText().trim(); - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/enums/KsqlMenuTabs.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/enums/KsqlMenuTabs.java deleted file mode 100644 index 628b1959d..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/enums/KsqlMenuTabs.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.kafbat.ui.screens.ksqldb.enums; - -import lombok.Getter; - -@Getter -public enum KsqlMenuTabs { - - TABLES("Table"), - STREAMS("Streams"); - - private final String value; - - KsqlMenuTabs(String value) { - this.value = value; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/enums/KsqlQueryConfig.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/enums/KsqlQueryConfig.java deleted file mode 100644 index 83be9aee3..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/enums/KsqlQueryConfig.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.kafbat.ui.screens.ksqldb.enums; - -import lombok.Getter; - -@Getter -public enum KsqlQueryConfig { - - SHOW_TABLES("show tables;"), - SHOW_STREAMS("show streams;"), - SELECT_ALL_FROM("SELECT * FROM %s\n" + "EMIT CHANGES;"); - - private final String query; - - KsqlQueryConfig(String query) { - this.query = query; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/models/Stream.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/models/Stream.java deleted file mode 100644 index d31ed708a..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/models/Stream.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.kafbat.ui.screens.ksqldb.models; - -import lombok.Data; -import lombok.experimental.Accessors; - -@Data -@Accessors(chain = true) -public class Stream { - - private String name, topicName, valueFormat, partitions; -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/models/Table.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/models/Table.java deleted file mode 100644 index 127deeee0..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/ksqldb/models/Table.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.kafbat.ui.screens.ksqldb.models; - -import lombok.Data; -import lombok.experimental.Accessors; - -@Data -@Accessors(chain = true) -public class Table { - - private String name, streamName; -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/panels/NaviSideBar.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/panels/NaviSideBar.java deleted file mode 100644 index b5dc2be8d..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/panels/NaviSideBar.java +++ /dev/null @@ -1,65 +0,0 @@ -package io.kafbat.ui.screens.panels; - -import static com.codeborne.selenide.Selenide.$x; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.screens.panels.enums.MenuItem; -import io.kafbat.ui.settings.BaseSource; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; -import java.time.Duration; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.openqa.selenium.By; - -public class NaviSideBar extends BasePage { - - protected SelenideElement dashboardMenuItem = $x("//a[@title='Dashboard']"); - protected String sideMenuOptionElementLocator = ".//ul/a[@title='%s']"; - protected String clusterElementLocator = "//aside/ul/li[contains(.,'%s')]"; - - private SelenideElement expandCluster(String clusterName) { - SelenideElement clusterElement = $x(String.format(clusterElementLocator, clusterName)).shouldBe(Condition.visible); - if (clusterElement.parent().$$x(".//ul").isEmpty()) { - WebUtil.clickByActions(clusterElement); - } - return clusterElement; - } - - @Step - public NaviSideBar waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - dashboardMenuItem.shouldBe(Condition.visible, Duration.ofSeconds(30)); - return this; - } - - @Step - public String getPagePath(MenuItem menuItem) { - return getPagePathFromHeader(menuItem) - .shouldBe(Condition.visible) - .getText().trim(); - } - - @Step - public NaviSideBar openSideMenu(String clusterName, MenuItem menuItem) { - WebUtil.clickByActions(expandCluster(clusterName).parent() - .find(By.linkText(menuItem.getNaviTitle()))); - return this; - } - - @Step - public NaviSideBar openSideMenu(MenuItem menuItem) { - openSideMenu(BaseSource.CLUSTER_NAME, menuItem); - return this; - } - - public List getAllMenuButtons() { - expandCluster(BaseSource.CLUSTER_NAME); - return Stream.of(MenuItem.values()) - .map(menuItem -> $x(String.format(sideMenuOptionElementLocator, menuItem.getNaviTitle()))) - .collect(Collectors.toList()); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/panels/TopPanel.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/panels/TopPanel.java deleted file mode 100644 index 92937260b..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/panels/TopPanel.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.kafbat.ui.screens.panels; - -import static com.codeborne.selenide.Selenide.$x; - -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import java.util.Arrays; -import java.util.List; - -public class TopPanel extends BasePage { - - protected SelenideElement kafkaLogo = $x("//a[contains(text(), 'kafbat UI')]"); - protected SelenideElement kafkaVersion = $x("//a[@title='Current commit']"); - protected SelenideElement logOutBtn = $x("//button[contains(text(),'Log out')]"); - protected SelenideElement gitBtn = $x("//a[@href='https://github.com/kafbat/kafka-ui']"); - protected SelenideElement discordBtn = $x("//a[contains(@href,'https://discord.com/invite')]"); - - public List getAllVisibleElements() { - return Arrays.asList(kafkaLogo, kafkaVersion, gitBtn, discordBtn); - } - - public List getAllEnabledElements() { - return Arrays.asList(gitBtn, discordBtn, kafkaLogo); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/panels/enums/MenuItem.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/panels/enums/MenuItem.java deleted file mode 100644 index caa6025eb..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/panels/enums/MenuItem.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.kafbat.ui.screens.panels.enums; - -import lombok.Getter; - -@Getter -public enum MenuItem { - - DASHBOARD("Dashboard", "Dashboard"), - BROKERS("Brokers", "Brokers"), - TOPICS("Topics", "Topics"), - CONSUMERS("Consumers", "Consumers"), - SCHEMA_REGISTRY("Schema Registry", "Schema Registry"), - KAFKA_CONNECT("Kafka Connect", "Kafka Connect"), - KSQL_DB("KSQL DB", "KSQL DB"); - - private final String naviTitle; - private final String pageTitle; - - MenuItem(String naviTitle, String pageTitle) { - this.naviTitle = naviTitle; - this.pageTitle = pageTitle; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/schemas/SchemaCreateForm.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/schemas/SchemaCreateForm.java deleted file mode 100644 index 8e3388cbe..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/schemas/SchemaCreateForm.java +++ /dev/null @@ -1,144 +0,0 @@ -package io.kafbat.ui.screens.schemas; - -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$x; -import static com.codeborne.selenide.Selenide.$x; -import static org.openqa.selenium.By.id; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; -import com.codeborne.selenide.WebDriverRunner; -import io.kafbat.ui.api.model.CompatibilityLevel; -import io.kafbat.ui.api.model.SchemaType; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.openqa.selenium.Keys; -import org.openqa.selenium.interactions.Actions; - -public class SchemaCreateForm extends BasePage { - - protected SelenideElement schemaNameField = $x("//input[@name='subject']"); - protected SelenideElement pageTitle = $x("//h1['Edit']"); - protected SelenideElement schemaTextArea = $x("//textarea[@name='schema']"); - protected SelenideElement newSchemaInput = $("#newSchema [wrap]"); - protected SelenideElement schemaTypeDdl = $x("//ul[@name='schemaType']"); - protected SelenideElement compatibilityLevelList = $x("//ul[@name='compatibilityLevel']"); - protected SelenideElement newSchemaTextArea = $x("//div[@id='newSchema']"); - protected SelenideElement latestSchemaTextArea = $x("//div[@id='latestSchema']"); - protected SelenideElement leftVersionDdl = $(id("left-select")); - protected SelenideElement rightVersionDdl = $(id("right-select")); - protected ElementsCollection visibleMarkers = $$x("//div[contains(@class,'codeMarker ace_start')]"); - protected ElementsCollection elementsCompareVersionDdl = $$x("//ul[@role='listbox']/ul/li"); - protected String versionDdlElementLocator = "//ul/li[text()='Version %s']"; - protected String ddlElementLocator = "//li[@value='%s']"; - - @Step - public SchemaCreateForm waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - pageTitle.shouldBe(Condition.visible); - return this; - } - - @Step - public SchemaCreateForm setSubjectName(String name) { - schemaNameField.setValue(name); - return this; - } - - @Step - public SchemaCreateForm setSchemaField(String text) { - schemaTextArea.setValue(text); - return this; - } - - @Step - public SchemaCreateForm selectSchemaTypeFromDropdown(SchemaType schemaType) { - schemaTypeDdl.shouldBe(Condition.enabled).click(); - $x(String.format(ddlElementLocator, schemaType.getValue())).shouldBe(Condition.visible).click(); - return this; - } - - @Step - public SchemaCreateForm clickSubmitButton() { - clickSubmitBtn(); - return this; - } - - @Step - public SchemaCreateForm selectCompatibilityLevelFromDropdown(CompatibilityLevel.CompatibilityEnum level) { - compatibilityLevelList.shouldBe(Condition.enabled).click(); - $x(String.format(ddlElementLocator, level.getValue())).shouldBe(Condition.visible).click(); - return this; - } - - @Step - public SchemaCreateForm openLeftVersionDdl() { - leftVersionDdl.shouldBe(Condition.enabled).click(); - return this; - } - - @Step - public SchemaCreateForm openRightVersionDdl() { - rightVersionDdl.shouldBe(Condition.enabled).click(); - return this; - } - - @Step - public int getVersionsNumberFromList() { - return elementsCompareVersionDdl.size(); - } - - @Step - public SchemaCreateForm selectVersionFromDropDown(int versionNumberDd) { - $x(String.format(versionDdlElementLocator, versionNumberDd)).shouldBe(Condition.visible).click(); - waitUntilSpinnerDisappear(1); - return this; - } - - @Step - public int getMarkedLinesNumber() { - return Math.toIntExact(visibleMarkers.asDynamicIterable().stream().count()); - } - - @Step - public SchemaCreateForm setNewSchemaValue(String configJson) { - newSchemaTextArea.shouldBe(Condition.visible).click(); - newSchemaInput.shouldBe(Condition.enabled); - new Actions(WebDriverRunner.getWebDriver()) - .sendKeys(Keys.PAGE_UP) - .keyDown(Keys.SHIFT) - .sendKeys(Keys.PAGE_DOWN) - .keyUp(Keys.SHIFT) - .sendKeys(Keys.DELETE) - .perform(); - setJsonInputValue(newSchemaInput, configJson); - return this; - } - - @Step - public List getAllDetailsPageElements() { - return Stream.of(compatibilityLevelList, newSchemaTextArea, latestSchemaTextArea, submitBtn, schemaTypeDdl) - .collect(Collectors.toList()); - } - - @Step - public boolean isSubmitBtnEnabled() { - return WebUtil.isEnabled(submitBtn); - } - - @Step - public boolean isSchemaDropDownEnabled() { - boolean enabled = true; - try { - String attribute = schemaTypeDdl.getAttribute("disabled"); - enabled = false; - } catch (Throwable ignored) { - } - return enabled; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/schemas/SchemaDetails.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/schemas/SchemaDetails.java deleted file mode 100644 index 22ec0d6e2..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/schemas/SchemaDetails.java +++ /dev/null @@ -1,70 +0,0 @@ -package io.kafbat.ui.screens.schemas; - -import static com.codeborne.selenide.Selenide.$x; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; - -public class SchemaDetails extends BasePage { - - protected SelenideElement actualVersionTextArea = $x("//div[@id='schema']"); - protected SelenideElement compatibilityField = $x("//h4[contains(text(),'Compatibility')]/../p"); - protected SelenideElement editSchemaBtn = $x("//button[contains(text(),'Edit Schema')]"); - protected SelenideElement removeBtn = $x("//*[contains(text(),'Remove')]"); - protected SelenideElement schemaConfirmBtn = $x("//div[@role='dialog']//button[contains(text(),'Confirm')]"); - protected SelenideElement schemaTypeField = $x("//h4[contains(text(),'Type')]/../p"); - protected SelenideElement latestVersionField = $x("//h4[contains(text(),'Latest version')]/../p"); - protected SelenideElement compareVersionBtn = $x("//button[text()='Compare Versions']"); - protected String schemaHeaderLocator = "//h1[contains(text(),'%s')]"; - - @Step - public SchemaDetails waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - actualVersionTextArea.shouldBe(Condition.visible); - return this; - } - - @Step - public String getCompatibility() { - return compatibilityField.getText(); - } - - @Step - public boolean isSchemaHeaderVisible(String schemaName) { - return WebUtil.isVisible($x(String.format(schemaHeaderLocator, schemaName))); - } - - @Step - public int getLatestVersion() { - return Integer.parseInt(latestVersionField.getText()); - } - - @Step - public String getSchemaType() { - return schemaTypeField.getText(); - } - - @Step - public SchemaDetails openEditSchema() { - editSchemaBtn.shouldBe(Condition.visible).click(); - return this; - } - - @Step - public SchemaDetails openCompareVersionMenu() { - compareVersionBtn.shouldBe(Condition.enabled).click(); - return this; - } - - @Step - public SchemaDetails removeSchema() { - WebUtil.clickByActions(dotMenuBtn); - removeBtn.shouldBe(Condition.enabled).click(); - schemaConfirmBtn.shouldBe(Condition.visible).click(); - schemaConfirmBtn.shouldBe(Condition.disappear); - return this; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/schemas/SchemaRegistryList.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/schemas/SchemaRegistryList.java deleted file mode 100644 index 6061a70c5..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/schemas/SchemaRegistryList.java +++ /dev/null @@ -1,43 +0,0 @@ -package io.kafbat.ui.screens.schemas; - -import static com.codeborne.selenide.Selenide.$x; -import static io.kafbat.ui.screens.panels.enums.MenuItem.SCHEMA_REGISTRY; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; - -public class SchemaRegistryList extends BasePage { - - protected SelenideElement createSchemaBtn = $x("//button[contains(text(),'Create Schema')]"); - - @Step - public SchemaRegistryList waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - getPageTitleFromHeader(SCHEMA_REGISTRY).shouldBe(Condition.visible); - return this; - } - - @Step - public SchemaRegistryList clickCreateSchema() { - WebUtil.clickByJavaScript(createSchemaBtn); - return this; - } - - @Step - public SchemaRegistryList openSchema(String schemaName) { - getTableElement(schemaName) - .shouldBe(Condition.enabled).click(); - return this; - } - - @Step - public boolean isSchemaVisible(String schemaName) { - tableGrid.shouldBe(Condition.visible); - return WebUtil.isVisible(getTableElement(schemaName)); - } -} - - diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/ProduceMessagePanel.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/ProduceMessagePanel.java deleted file mode 100644 index 678cdfa70..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/ProduceMessagePanel.java +++ /dev/null @@ -1,57 +0,0 @@ -package io.kafbat.ui.screens.topics; - -import static com.codeborne.selenide.Selenide.$x; -import static com.codeborne.selenide.Selenide.refresh; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; -import java.util.Arrays; - -public class ProduceMessagePanel extends BasePage { - - protected SelenideElement keyTextArea = $x("//div[@id='key']/textarea"); - protected SelenideElement valueTextArea = $x("//div[@id='content']/textarea"); - protected SelenideElement headersTextArea = $x("//div[@id='headers']/textarea"); - protected SelenideElement submitProduceMessageBtn = headersTextArea.$x("../../../..//button[@type='submit']"); - protected SelenideElement partitionDdl = $x("//ul[@name='partition']"); - protected SelenideElement keySerdeDdl = $x("//ul[@name='keySerde']"); - protected SelenideElement contentSerdeDdl = $x("//ul[@name='valueSerde']"); - - @Step - public ProduceMessagePanel waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - Arrays.asList(partitionDdl, keySerdeDdl, contentSerdeDdl).forEach(element -> element.shouldBe(Condition.visible)); - return this; - } - - @Step - public ProduceMessagePanel setKeyField(String value) { - WebUtil.clearByKeyboard(keyTextArea); - keyTextArea.setValue(value); - return this; - } - - @Step - public ProduceMessagePanel setValueFiled(String value) { - WebUtil.clearByKeyboard(valueTextArea); - valueTextArea.setValue(value); - return this; - } - - @Step - public ProduceMessagePanel setHeadersFld(String value) { - headersTextArea.setValue(value); - return this; - } - - @Step - public ProduceMessagePanel submitProduceMessage() { - WebUtil.clickByActions(submitProduceMessageBtn); - submitProduceMessageBtn.shouldBe(Condition.disappear); - refresh(); - return this; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicCreateEditForm.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicCreateEditForm.java deleted file mode 100644 index 45aa9c41a..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicCreateEditForm.java +++ /dev/null @@ -1,292 +0,0 @@ -package io.kafbat.ui.screens.topics; - -import static com.codeborne.selenide.Condition.enabled; -import static com.codeborne.selenide.Selenide.$; -import static com.codeborne.selenide.Selenide.$$; -import static com.codeborne.selenide.Selenide.$x; -import static org.openqa.selenium.By.id; - -import com.codeborne.selenide.ClickOptions; -import com.codeborne.selenide.CollectionCondition; -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.screens.topics.enums.CleanupPolicyValue; -import io.kafbat.ui.screens.topics.enums.CustomParameterType; -import io.kafbat.ui.screens.topics.enums.MaxSizeOnDisk; -import io.kafbat.ui.screens.topics.enums.TimeToRetain; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; -import org.openqa.selenium.Keys; - -public class TopicCreateEditForm extends BasePage { - - private static final String RETENTION_BYTES = "retentionBytes"; - - protected SelenideElement timeToRetainField = $x("//input[@id='timeToRetain']"); - protected SelenideElement partitionsField = $x("//input[@name='partitions']"); - protected SelenideElement nameField = $(id("topicFormName")); - 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("//input[contains(@name, 'customParams')][@role='listitem']"); - protected SelenideElement deleteCustomParameterBtn = $x("//span[contains(@title, 'Delete customParam')]"); - protected SelenideElement addCustomParameterTypeBtn = $x("//button[contains(text(), 'Add Custom Parameter')]"); - protected SelenideElement customParameterValueField = $x("//label[text()='Value *']/..//input"); - protected SelenideElement validationCustomParameterValueMsg = $x("//p[contains(text(), 'Value is required')]"); - protected String ddlElementLocator = "//li[@value='%s']"; - protected String btnTimeToRetainLocator = "//button[@class][text()='%s']"; - protected String customParamsElmCss = "ul[role=listbox][name^=customParams][name$=name]"; - - - @Step - public TopicCreateEditForm waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - nameField.shouldBe(Condition.visible); - return this; - } - - public boolean isCreateTopicButtonEnabled() { - return WebUtil.isEnabled(submitBtn); - } - - public boolean isDeleteCustomParameterButtonEnabled() { - return WebUtil.isEnabled(deleteCustomParameterBtn); - } - - public boolean isNameFieldEnabled() { - return WebUtil.isEnabled(nameField); - } - - @Step - public TopicCreateEditForm setTopicName(String topicName) { - WebUtil.sendKeysAfterClear(nameField, 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 openCustomParameterTypeDdl() { - customParameterDdl.shouldBe(Condition.visible).click(); - ddlOptions.shouldHave(CollectionCondition.sizeGreaterThan(0)); - return this; - } - - @Step - public ElementsCollection getAllDdlOptions() { - return getDdlOptions(); - } - - @Step - public TopicCreateEditForm setCustomParameterType(CustomParameterType customParameterType) { - openCustomParameterTypeDdl(); - $x(String.format(ddlElementLocator, customParameterType.getOptionValue())).shouldBe(Condition.visible).click(); - return this; - } - - @Step - public TopicCreateEditForm clearCustomParameterValue() { - customParameterValueField.shouldBe(enabled).sendKeys(Keys.END); - String value = customParameterValueField.getValue(); - int valueLength = value != null - ? value.length() - : 0; - for (int i = 0; i < valueLength; i++) { - customParameterValueField.sendKeys(Keys.BACK_SPACE); - } - return this; - } - - @Step - public TopicCreateEditForm setNumberOfPartitions(int partitions) { - partitionsField.shouldBe(enabled).clear(); - partitionsField.sendKeys(String.valueOf(partitions)); - return this; - } - - @Step - public TopicCreateEditForm setTimeToRetainDataByButtons(TimeToRetain timeToRetain) { - $x(String.format(btnTimeToRetainLocator, timeToRetain.getButton())).shouldBe(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(RETENTION_BYTES, visibleValue); - } - - @Step - public TopicCreateEditForm selectRetentionBytes(Long optionValue) { - return selectFromDropDownByOptionValue(RETENTION_BYTES, optionValue.toString()); - } - - @Step - public TopicCreateEditForm clickSaveTopicBtn() { - clickSubmitBtn(); - return this; - } - - @Step - public TopicCreateEditForm addCustomParameter(String customParameterName, - String customParameterValue) { - ElementsCollection customParametersElements = $$(customParamsElmCss); - 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 = $$(customParamsElmCss); - 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 = $$(customParamsElmCss) - .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(RETENTION_BYTES).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 WebUtil.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(); - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicDetails.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicDetails.java deleted file mode 100644 index fb4674aed..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicDetails.java +++ /dev/null @@ -1,511 +0,0 @@ -package io.kafbat.ui.screens.topics; - -import static com.codeborne.selenide.Condition.enabled; -import static com.codeborne.selenide.Selenide.$$x; -import static com.codeborne.selenide.Selenide.$x; -import static com.codeborne.selenide.Selenide.sleep; -import static io.kafbat.ui.screens.topics.TopicDetails.TopicMenu.OVERVIEW; -import static org.apache.commons.lang3.RandomUtils.nextInt; - -import com.codeborne.selenide.CollectionCondition; -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.ElementsCollection; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.screens.topics.enums.SeekType; -import io.kafbat.ui.utilities.WebUtil; -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.Collections; -import java.util.List; -import java.util.Locale; -import java.util.Objects; -import lombok.Getter; - -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("//ul[@id='selectSeekType']/../..//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 addFilterCodeEditor = $x("//div[@id='ace-editor']"); - protected SelenideElement addFilterCodeTextarea = $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 saveFilterBtnEditFilterMdl = $x("//button[text()='Edit Filter']"); - protected SelenideElement addFiltersBtnMessages = $x("//button[text()='Add Filters']"); - 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 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 detailsTabLtr = "//nav//a[contains(text(),'%s')]"; - 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']/div[1][contains(text(),'%s')]"; - protected String editActiveFilterBtnLocator = "//div[text()='%s']/../button[1]"; - protected String settingsGridValueLocator = "//tbody/tr/td/span[text()='%s']//ancestor::tr/td[2]/span"; - - @Step - public TopicDetails waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - $x(String.format(detailsTabLtr, OVERVIEW.getValue())).shouldBe(Condition.visible); - return this; - } - - @Step - public TopicDetails openDetailsTab(TopicMenu menu) { - $x(String.format(detailsTabLtr, menu.getValue())).shouldBe(enabled).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() { - WebUtil.clickByActions(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 boolean isClearMessagesMenuEnabled() { - return !Objects.requireNonNull(clearMessagesBtn.shouldBe(Condition.visible) - .$x("./..").getAttribute("class")) - .contains("disabled"); - } - - @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 WebUtil.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() { - WebUtil.clickByJavaScript(produceMessageBtn); - return this; - } - - @Step - public TopicDetails selectSeekTypeDdlMessagesTab(SeekType seekType) { - seekTypeDdl.shouldBe(enabled).click(); - $x(String.format(seekFilterDdlLocator, seekType.getValue())).shouldBe(Condition.visible).click(); - return this; - } - - @Step - public TopicDetails setSeekTypeValueFldMessagesTab(String seekTypeValue) { - seekTypeField.shouldBe(enabled).sendKeys(seekTypeValue); - return this; - } - - @Step - public TopicDetails clickSubmitFiltersBtnMessagesTab() { - WebUtil.clickByJavaScript(submitBtn); - waitUntilSpinnerDisappear(); - return this; - } - - @Step - public TopicDetails clickMessagesAddFiltersBtn() { - addFiltersBtn.shouldBe(enabled).click(); - return this; - } - - @Step - public TopicDetails clickEditActiveFilterBtn(String filterName) { - $x(String.format(editActiveFilterBtnLocator, filterName)) - .shouldBe(enabled).click(); - return this; - } - - @Step - public TopicDetails clickNextButton() { - clickNextBtn(); - waitUntilSpinnerDisappear(); - return this; - } - - @Step - public boolean isFilterVisibleAtSavedFiltersMdl(String filterName) { - return WebUtil.isVisible($x(String.format(savedFilterNameLocator, filterName))); - } - - @Step - public TopicDetails selectFilterAtSavedFiltersMdl(String filterName) { - $x(String.format(savedFilterNameLocator, filterName)).shouldBe(enabled).click(); - return this; - } - - @Step - public TopicDetails waitUntilAddFiltersMdlVisible() { - addFilterCodeModalTitle.shouldBe(Condition.visible); - return this; - } - - @Step - public TopicDetails setFilterCodeFldAddFilterMdl(String filterCode) { - addFilterCodeTextarea.shouldBe(enabled).clear(); - addFilterCodeTextarea.sendKeys(filterCode); - return this; - } - - - - @Step - public String getFilterCodeValue() { - addFilterCodeEditor.shouldBe(enabled).click(); - String value = addFilterCodeTextarea.getValue(); - if (value == null) { - return null; - } else { - return value.substring(0, value.length() - 2); - } - } - - - - @Step - public String getFilterNameValue() { - return displayNameInputAddFilterMdl.shouldBe(enabled).getValue(); - } - - @Step - public TopicDetails selectSaveThisFilterCheckboxMdl(boolean select) { - WebUtil.selectElement(saveThisFilterCheckBoxAddFilterMdl, select); - return this; - } - - @Step - public boolean isSaveThisFilterCheckBoxSelected() { - return WebUtil.isSelected(saveThisFilterCheckBoxAddFilterMdl); - } - - @Step - public TopicDetails setDisplayNameFldAddFilterMdl(String displayName) { - displayNameInputAddFilterMdl.shouldBe(enabled).setValue(displayName); - return this; - } - - @Step - public TopicDetails clickAddFilterBtnAndCloseMdl(boolean closeModal) { - addFilterBtnAddFilterMdl.shouldBe(enabled).click(); - if (closeModal) { - addFilterCodeModalTitle.shouldBe(Condition.hidden); - } else { - addFilterCodeModalTitle.shouldBe(Condition.visible); - } - return this; - } - - @Step - public TopicDetails clickSaveFilterBtnAndCloseMdl(boolean closeModal) { - saveFilterBtnEditFilterMdl.shouldBe(enabled).click(); - if (closeModal) { - addFilterCodeModalTitle.shouldBe(Condition.hidden); - } else { - addFilterCodeModalTitle.shouldBe(Condition.visible); - } - return this; - } - - @Step - public boolean isAddFilterBtnAddFilterMdlEnabled() { - return WebUtil.isEnabled(addFilterBtnAddFilterMdl); - } - - @Step - public boolean isBackButtonEnabled() { - return WebUtil.isEnabled(backBtn); - } - - @Step - public boolean isNextButtonEnabled() { - return WebUtil.isEnabled(nextBtn); - } - - @Step - public boolean isActiveFilterVisible(String filterName) { - return WebUtil.isVisible($x(String.format(activeFilterNameLocator, filterName))); - } - - @Step - public String getSearchFieldValue() { - return searchFld.shouldBe(Condition.visible).getValue(); - } - - public List getAllAddFilterModalVisibleElements() { - return Arrays.asList(savedFiltersLink, displayNameInputAddFilterMdl, addFilterBtnAddFilterMdl, - cancelBtnAddFilterMdl); - } - - public List getAllAddFilterModalEnabledElements() { - return Arrays.asList(displayNameInputAddFilterMdl, cancelBtnAddFilterMdl); - } - - public List getAllAddFilterModalDisabledElements() { - return Collections.singletonList(addFilterBtnAddFilterMdl); - } - - @Step - public TopicDetails openConsumerGroup(String consumerId) { - $x(String.format(consumerIdLocator, consumerId)).click(); - return this; - } - - private void selectYear(int expectedYear) { - while (getActualCalendarDate().getYear() > expectedYear) { - WebUtil.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) { - WebUtil.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)).asFixedIterable().stream() - .filter(day -> !Objects.requireNonNull(day.getAttribute("class")).contains("outside-month")) - .findFirst().orElseThrow()).shouldBe(enabled).click(); - } - - private void setTime(LocalDateTime dateTime) { - calendarTimeFld.shouldBe(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(enabled).click(); - actualCalendarDate.shouldBe(Condition.visible); - return this; - } - - @Step - public int getMessageCountAmount() { - return Integer.parseInt(messageAmountCell.getText().trim()); - } - - private List initItems() { - List gridItemList = new ArrayList<>(); - gridItems.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 TopicDetails.MessageGridItem getMessageByKey(String key) { - return initItems().stream() - .filter(e -> e.getKey().equals(key)) - .findFirst().orElseThrow(); - } - - @Step - public List getAllMessages() { - return initItems(); - } - - @Step - public TopicDetails.MessageGridItem getRandomMessage() { - return getMessageByOffset(nextInt(0, initItems().size() - 1)); - } - - @Getter - public enum TopicMenu { - OVERVIEW("Overview"), - MESSAGES("Messages"), - CONSUMERS("Consumers"), - SETTINGS("Settings"); - - private final String value; - - TopicMenu(String value) { - this.value = value; - } - } - - public static class MessageGridItem extends BasePage { - - private final SelenideElement element; - - private MessageGridItem(SelenideElement element) { - this.element = element; - } - - @Step - public MessageGridItem clickExpand() { - WebUtil.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]").getAttribute("title"); - } - - @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() { - WebUtil.clickByJavaScript(element.$x("./td[7]//li[text() = 'Copy to clipboard']") - .shouldBe(Condition.visible)); - return this; - } - - @Step - public MessageGridItem clickSaveAsFile() { - WebUtil.clickByJavaScript(element.$x("./td[7]//li[text() = 'Save as a file']") - .shouldBe(Condition.visible)); - return this; - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicSettingsTab.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicSettingsTab.java deleted file mode 100644 index 75e3fe8e7..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicSettingsTab.java +++ /dev/null @@ -1,86 +0,0 @@ -package io.kafbat.ui.screens.topics; - -import static com.codeborne.selenide.Selenide.$x; - -import com.codeborne.selenide.CollectionCondition; -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.qameta.allure.Step; -import java.util.ArrayList; -import java.util.List; -import java.util.NoSuchElementException; - -public class TopicSettingsTab extends BasePage { - - protected SelenideElement defaultValueColumnHeaderLocator = $x("//div[text() = 'Default Value']"); - protected SelenideElement nextButton = $x("//button[contains(text(), 'Next')]"); - protected SelenideElement previousButton = $x("//button[contains(text(), 'Previous')]"); - - @Step - public TopicSettingsTab waitUntilScreenReady() { - waitUntilSpinnerDisappear(); - defaultValueColumnHeaderLocator.shouldBe(Condition.visible); - return this; - } - - private List initGridItems() { - List gridItemList = new ArrayList<>(); - gridItems.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) { - while (true) { - try { - String value = getItemByKey(key).getValue(); - resetPageNavigation(); - return value; - } catch (NoSuchElementException e) { - if (nextButton.isEnabled()) { - nextButton.click(); - } else { - throw e; - } - } - } - } - - private void resetPageNavigation() { - while (previousButton.isEnabled()) { - previousButton.click(); - } - } - - 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(); - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicsList.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicsList.java deleted file mode 100644 index 46334a6b2..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/TopicsList.java +++ /dev/null @@ -1,295 +0,0 @@ -package io.kafbat.ui.screens.topics; - -import static com.codeborne.selenide.Condition.visible; -import static com.codeborne.selenide.Selenide.$x; -import static io.kafbat.ui.screens.panels.enums.MenuItem.TOPICS; - -import com.codeborne.selenide.CollectionCondition; -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.SelenideElement; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.utilities.WebUtil; -import io.qameta.allure.Step; -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 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(); - getPageTitleFromHeader(TOPICS).shouldBe(visible); - return this; - } - - @Step - public TopicsList clickAddTopicBtn() { - WebUtil.clickByJavaScript(addTopicBtn); - return this; - } - - @Step - public boolean isTopicVisible(String topicName) { - tableGrid.shouldBe(visible); - return WebUtil.isVisible(getTableElement(topicName)); - } - - @Step - public boolean isShowInternalRadioBtnSelected() { - return WebUtil.isSelected(showInternalRadioBtn); - } - - @Step - public TopicsList setShowInternalRadioButton(boolean select) { - if (select) { - if (!showInternalRadioBtn.isSelected()) { - WebUtil.clickByJavaScript(showInternalRadioBtn); - waitUntilSpinnerDisappear(1); - } - } else { - if (showInternalRadioBtn.isSelected()) { - WebUtil.clickByJavaScript(showInternalRadioBtn); - waitUntilSpinnerDisappear(1); - } - } - return this; - } - - @Step - public TopicsList goToLastPage() { - if (nextBtn.exists()) { - while (nextBtn.isEnabled()) { - clickNextBtn(); - waitUntilSpinnerDisappear(1); - } - } - 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 WebUtil.isEnabled(copySelectedTopicBtn); - } - - @Step - public List 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() { - WebUtil.clickByJavaScript(clearMessagesBtn.shouldBe(visible)); - return this; - } - - @Step - public TopicsList clickRecreateTopicBtn() { - WebUtil.clickByJavaScript(recreateTopicBtn.shouldBe(visible)); - return this; - } - - @Step - public TopicsList clickRemoveTopicBtn() { - WebUtil.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 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 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 getAllVisibleElements() { - List visibleElements = new ArrayList<>(getVisibleColumnHeaders()); - visibleElements.addAll(Arrays.asList(searchField, addTopicBtn, tableGrid)); - visibleElements.addAll(getActionButtons()); - return visibleElements; - } - - @Step - public List getAllEnabledElements() { - List enabledElements = new ArrayList<>(getEnabledColumnHeaders()); - enabledElements.addAll(Arrays.asList(searchField, showInternalRadioBtn, addTopicBtn)); - return enabledElements; - } - - private List initGridItems() { - List gridItemList = new ArrayList<>(); - gridItems.shouldHave(CollectionCondition.sizeGreaterThan(0)) - .forEach(item -> gridItemList.add(new TopicGridItem(item))); - return gridItemList; - } - - @Step - public TopicGridItem getTopicItem(String name) { - TopicGridItem topicGridItem = initGridItems().stream() - .filter(e -> e.getName().equals(name)) - .findFirst().orElse(null); - if (topicGridItem == null) { - searchItem(name); - topicGridItem = initGridItems().stream() - .filter(e -> e.getName().equals(name)) - .findFirst().orElseThrow(); - } - return topicGridItem; - } - - @Step - public TopicGridItem getAnyNonInternalTopic() { - return getNonInternalTopics().stream() - .findAny().orElseThrow(); - } - - @Step - public List getNonInternalTopics() { - return initGridItems().stream() - .filter(e -> !e.isInternal()) - .collect(Collectors.toList()); - } - - @Step - public List 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) { - WebUtil.selectElement(element.$x("./td[1]/input"), select); - return new TopicsList(); - } - - private SelenideElement getNameElm() { - return element.$x("./td[2]"); - } - - @Step - public boolean isInternal() { - boolean internal = false; - try { - internal = getNameElm().$x("./a/span").isDisplayed(); - } catch (Throwable ignored) { - } - return internal; - } - - @Step - public String getName() { - return getNameElm().$x("./a").getAttribute("title"); - } - - @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(); - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/CleanupPolicyValue.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/CleanupPolicyValue.java deleted file mode 100644 index eaa887157..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/CleanupPolicyValue.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.kafbat.ui.screens.topics.enums; - -import lombok.Getter; - -@Getter -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; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/CustomParameterType.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/CustomParameterType.java deleted file mode 100644 index 2e6e7e0f8..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/CustomParameterType.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.kafbat.ui.screens.topics.enums; - -import lombok.Getter; - -@Getter -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; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/MaxSizeOnDisk.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/MaxSizeOnDisk.java deleted file mode 100644 index 415f071be..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/MaxSizeOnDisk.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.kafbat.ui.screens.topics.enums; - -import lombok.Getter; - -@Getter -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; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/SeekType.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/SeekType.java deleted file mode 100644 index d731ea266..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/SeekType.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.kafbat.ui.screens.topics.enums; - -import lombok.Getter; - -@Getter -public enum SeekType { - - OLDEST("Oldest"), - NEWEST("Newest"), - LIVE("Live"), - FROM_OFFSET("From offset"), - TO_OFFSET("To offset"), - SINCE_TIME("Since time"), - TO_TIME("To time"); - - private final String value; - - SeekType(String value) { - this.value = value; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/TimeToRetain.java b/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/TimeToRetain.java deleted file mode 100644 index 86ac4ae29..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/screens/topics/enums/TimeToRetain.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.kafbat.ui.screens.topics.enums; - -import lombok.Getter; - -@Getter -public enum TimeToRetain { - - BTN_1_HOUR("1 hour", "3600000"), - BTN_3_HOURS("3 hours", "10800000"), - BTN_6_HOURS("6 hours", "21600000"), - 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; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/services/ApiService.java b/e2e-tests/src/main/java/io/kafbat/ui/services/ApiService.java deleted file mode 100644 index 231f79cd7..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/services/ApiService.java +++ /dev/null @@ -1,284 +0,0 @@ -package io.kafbat.ui.services; - -import static com.codeborne.selenide.Selenide.sleep; -import static io.kafbat.ui.utilities.FileUtil.fileToString; - -import com.fasterxml.jackson.databind.ObjectMapper; -import io.kafbat.ui.api.ApiClient; -import io.kafbat.ui.api.api.KafkaConnectApi; -import io.kafbat.ui.api.api.KsqlApi; -import io.kafbat.ui.api.api.MessagesApi; -import io.kafbat.ui.api.api.SchemasApi; -import io.kafbat.ui.api.api.TopicsApi; -import io.kafbat.ui.api.model.CreateTopicMessage; -import io.kafbat.ui.api.model.KsqlCommandV2; -import io.kafbat.ui.api.model.KsqlCommandV2Response; -import io.kafbat.ui.api.model.KsqlResponse; -import io.kafbat.ui.api.model.NewConnector; -import io.kafbat.ui.api.model.NewSchemaSubject; -import io.kafbat.ui.api.model.TopicCreation; -import io.kafbat.ui.models.Connector; -import io.kafbat.ui.models.Schema; -import io.kafbat.ui.models.Topic; -import io.kafbat.ui.screens.ksqldb.models.Stream; -import io.kafbat.ui.screens.ksqldb.models.Table; -import io.kafbat.ui.settings.BaseSource; -import io.qameta.allure.Step; -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; - - -@Slf4j -public class ApiService extends BaseSource { - - private final ApiClient apiClient = new ApiClient().setBasePath(BASE_API_URL); - - @SneakyThrows - private TopicsApi topicApi() { - return new TopicsApi(apiClient); - } - - @SneakyThrows - private SchemasApi schemaApi() { - return new SchemasApi(apiClient); - } - - @SneakyThrows - private KafkaConnectApi connectorApi() { - return new KafkaConnectApi(apiClient); - } - - @SneakyThrows - private MessagesApi messageApi() { - return new MessagesApi(apiClient); - } - - @SneakyThrows - private KsqlApi ksqlApi() { - return new KsqlApi(apiClient); - } - - @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(); - } - } - - @Step - public ApiService createTopic(Topic topic) { - createTopic(CLUSTER_NAME, topic.getName()); - return this; - } - - @SneakyThrows - private void deleteTopic(String clusterName, String topicName) { - try { - topicApi().deleteTopic(clusterName, topicName).block(); - } catch (WebClientResponseException ignored) { - } - } - - @Step - public ApiService deleteTopic(String topicName) { - deleteTopic(CLUSTER_NAME, topicName); - return this; - } - - @SneakyThrows - private void createSchema(String clusterName, Schema schema) { - NewSchemaSubject schemaSubject = new NewSchemaSubject(); - schemaSubject.setSubject(schema.getName()); - schemaSubject.setSchema(fileToString(schema.getValuePath())); - schemaSubject.setSchemaType(schema.getType()); - try { - schemaApi().createNewSchema(clusterName, schemaSubject).block(); - } catch (WebClientResponseException ex) { - ex.printStackTrace(); - } - } - - @Step - public ApiService createSchema(Schema schema) { - createSchema(CLUSTER_NAME, schema); - return this; - } - - @SneakyThrows - private void deleteSchema(String clusterName, String schemaName) { - try { - schemaApi().deleteSchema(clusterName, schemaName).block(); - } catch (WebClientResponseException ignored) { - } - } - - @Step - public ApiService deleteSchema(String schemaName) { - deleteSchema(CLUSTER_NAME, schemaName); - return this; - } - - @SneakyThrows - private void deleteConnector(String clusterName, String connectName, String connectorName) { - try { - connectorApi().deleteConnector(clusterName, connectName, connectorName).block(); - } catch (WebClientResponseException ignored) { - } - } - - @Step - public ApiService deleteConnector(String connectName, String connectorName) { - deleteConnector(CLUSTER_NAME, connectName, connectorName); - return this; - } - - @Step - public ApiService deleteConnector(String connectorName) { - deleteConnector(CLUSTER_NAME, CONNECT_NAME, connectorName); - return this; - } - - @SneakyThrows - private void createConnector(String clusterName, String connectName, Connector connector) { - NewConnector connectorProperties = new NewConnector(); - connectorProperties.setName(connector.getName()); - Map configMap = new ObjectMapper().readValue(connector.getConfig(), HashMap.class); - connectorProperties.setConfig(configMap); - try { - connectorApi().deleteConnector(clusterName, connectName, connector.getName()).block(); - } catch (WebClientResponseException ignored) { - } - connectorApi().createConnector(clusterName, connectName, connectorProperties).block(); - } - - @Step - public ApiService createConnector(String connectName, Connector connector) { - createConnector(CLUSTER_NAME, connectName, connector); - return this; - } - - @Step - public ApiService createConnector(Connector connector) { - createConnector(CLUSTER_NAME, CONNECT_NAME, connector); - return this; - } - - @Step - public String getFirstConnectName(String clusterName) { - return Objects.requireNonNull(connectorApi().getConnects(clusterName, false).blockFirst()).getName(); - } - - @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.setValue(topic.getMessageValue()); - 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; - } - - @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 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 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 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 responseListInsert = ksqlApi() - .openKsqlResponsePipe(CLUSTER_NAME, pipeIdInsert.getPipeId()) - .collectList() - .block(); - assert Objects.requireNonNull(responseListInsert).size() != 0; - return this; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/settings/BaseSource.java b/e2e-tests/src/main/java/io/kafbat/ui/settings/BaseSource.java deleted file mode 100644 index 12063750a..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/settings/BaseSource.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.kafbat.ui.settings; - -import static io.kafbat.ui.utilities.BooleanUtil.parseBoolean; -import static io.kafbat.ui.utilities.StringUtil.getOptionalString; -import static org.apache.commons.lang3.BooleanUtils.TRUE; - -public abstract class BaseSource { - - public static final boolean HEADLESS = parseBoolean(getOptionalString(TRUE, System.getProperty("headless"))); - public static final boolean SELENOID = parseBoolean(getOptionalString(TRUE, System.getProperty("selenoid"))); - public static final String CLUSTER_NAME = "local"; - public static final String CONNECT_NAME = "first"; - private static final String LOCAL_HOST = "localhost"; - public static final String REMOTE_URL = String.format("http://%s:4444/wd/hub", LOCAL_HOST); - public static final String BASE_API_URL = String.format("http://%s:8080", LOCAL_HOST); - public static final String BASE_HOST = SELENOID ? "host.docker.internal" : LOCAL_HOST; - public static final String BASE_UI_URL = String.format("http://%s:8080", BASE_HOST); -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/settings/drivers/WebDriver.java b/e2e-tests/src/main/java/io/kafbat/ui/settings/drivers/WebDriver.java deleted file mode 100644 index 50efa30fa..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/settings/drivers/WebDriver.java +++ /dev/null @@ -1,106 +0,0 @@ -package io.kafbat.ui.settings.drivers; - -import static com.codeborne.selenide.Selenide.clearBrowserCookies; -import static com.codeborne.selenide.Selenide.clearBrowserLocalStorage; -import static com.codeborne.selenide.Selenide.refresh; - -import com.codeborne.selenide.Configuration; -import com.codeborne.selenide.Selenide; -import com.codeborne.selenide.WebDriverRunner; -import com.codeborne.selenide.logevents.SelenideLogger; -import io.kafbat.ui.settings.BaseSource; -import io.qameta.allure.Step; -import io.qameta.allure.selenide.AllureSelenide; -import io.qameta.allure.selenide.LogType; -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; -import lombok.extern.slf4j.Slf4j; -import org.openqa.selenium.chrome.ChromeOptions; - -@Slf4j -public abstract class WebDriver { - - private static final String SELENIDE_RESULTS_PATH = "build/selenide-results"; - - @Step - public static void browserSetup() { - Configuration.headless = BaseSource.HEADLESS; - Configuration.browser = "chrome"; - Configuration.browserSize = "1920x1080"; - Configuration.pageLoadTimeout = 180000; - Configuration.savePageSource = true; - Configuration.screenshots = true; - Configuration.downloadsFolder = String.format("%s/downloads", SELENIDE_RESULTS_PATH); - Configuration.reportsFolder = String.format("%s/reports", SELENIDE_RESULTS_PATH); - ChromeOptions chromeOptions = new ChromeOptions() - //.addArguments("--remote-allow-origins=*") - .addArguments("--disable-dev-shm-usage") - .addArguments("--disable-extensions") - .addArguments("--disable-gpu") - .addArguments("--no-sandbox") - .addArguments("--lang=en_US"); - if (BaseSource.SELENOID) { - Configuration.remote = BaseSource.REMOTE_URL; - Configuration.remoteConnectionTimeout = 180000; - Configuration.remoteReadTimeout = 180000; - Map selenoidOptions = new HashMap<>(); - selenoidOptions.put("enableVNC", true); - selenoidOptions.put("enableLog", true); - selenoidOptions.put("enableVideo", false); - selenoidOptions.put("sessionTimeout", "30m"); - chromeOptions.setCapability("selenoid:options", selenoidOptions); - } - Configuration.browserCapabilities = chromeOptions; - } - - private static org.openqa.selenium.WebDriver getWebDriver() { - try { - return WebDriverRunner.getWebDriver(); - } catch (IllegalStateException ex) { - browserSetup(); - Selenide.open(); - return WebDriverRunner.getWebDriver(); - } - } - - @Step - public static void openUrl(String url) { - org.openqa.selenium.WebDriver driver = getWebDriver(); - if (!url.equals(driver.getCurrentUrl())) { - driver.get(url); - } - } - - @Step - public static void browserClear() { - getWebDriver(); - try { - clearBrowserCookies(); - clearBrowserLocalStorage(); - } catch (Throwable ignored) { - } - refresh(); - } - - @Step - public static void browserQuit() { - org.openqa.selenium.WebDriver driver = null; - try { - driver = WebDriverRunner.getWebDriver(); - } catch (Throwable ignored) { - } - if (driver != null) { - driver.quit(); - } - } - - @Step - public static void selenideLoggerSetup() { - SelenideLogger.addListener("AllureSelenide", new AllureSelenide() - .savePageSource(true) - .screenshots(true) - .enableLogs(LogType.BROWSER, Level.ALL) - ); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/settings/listeners/AllureListener.java b/e2e-tests/src/main/java/io/kafbat/ui/settings/listeners/AllureListener.java deleted file mode 100644 index 6bab8f9f9..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/settings/listeners/AllureListener.java +++ /dev/null @@ -1,40 +0,0 @@ -package io.kafbat.ui.settings.listeners; - -import static java.nio.file.Files.newInputStream; -import static org.apache.commons.lang3.ObjectUtils.isEmpty; - -import com.codeborne.selenide.Screenshots; -import io.qameta.allure.Allure; -import io.qameta.allure.AllureLifecycle; -import io.qameta.allure.testng.AllureTestNg; -import java.io.File; -import java.io.IOException; -import org.slf4j.LoggerFactory; -import org.testng.ITestListener; -import org.testng.ITestResult; - -public class AllureListener extends AllureTestNg implements ITestListener { - - private void takeScreenshot() { - File screenshot = Screenshots.takeScreenShotAsFile(); - try { - if (!isEmpty(screenshot)) { - Allure.addAttachment(screenshot.getName(), newInputStream(screenshot.toPath())); - } else { - LoggerFactory.getLogger(AllureLifecycle.class).error("Could not take screenshot"); - } - } catch (IOException exception) { - throw new RuntimeException(exception); - } - } - - @Override - public void onTestFailure(ITestResult result) { - takeScreenshot(); - } - - @Override - public void onTestSkipped(ITestResult result) { - takeScreenshot(); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/settings/listeners/ResultsLogger.java b/e2e-tests/src/main/java/io/kafbat/ui/settings/listeners/ResultsLogger.java deleted file mode 100644 index a6291eee0..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/settings/listeners/ResultsLogger.java +++ /dev/null @@ -1,93 +0,0 @@ -package io.kafbat.ui.settings.listeners; - -import static io.kafbat.ui.utilities.StringUtil.getDuplicates; - -import java.text.DecimalFormat; -import java.util.Set; -import lombok.extern.slf4j.Slf4j; -import org.testng.ITestContext; -import org.testng.ITestResult; -import org.testng.TestListenerAdapter; - -@Slf4j -public class ResultsLogger extends TestListenerAdapter { - - private static final String PREFIX = "[INFO] "; - private static final String PASSED_STATUS = "PASSED"; - private static final String FAILED_STATUS = "FAILED"; - private static final String SKIPPED_STATUS = "SKIPPED"; - - private static void logTestStatus(String status, ITestResult result) { - String testStatus = String.format("\n[INFO] TEST %s: %s", - status, result.getMethod().getQualifiedName()); - int dashCount = testStatus.length() - PREFIX.length(); - String separator = String.format("\n%s%s", PREFIX, - getDuplicates("-", dashCount - 1)); - log.info("{}{}{}", separator, testStatus, separator); - } - - private static String alignTitleToLength(String title, int target) { - int indentDiff = (title.length() - target) / 2; - String result = title.substring(indentDiff, title.length() - indentDiff); - if (result.length() > target) { - result = result.substring(1); - } - return result; - } - - private static int appendResults(StringBuilder suiteResults, Set testResults, String testStatus) { - if (testResults.isEmpty()) { - return 0; - } - StringBuilder subResults = new StringBuilder(); - subResults.append(String.format("\n%s\n%s%s TESTS: %d", PREFIX, PREFIX, testStatus, testResults.size())); - if (!testStatus.equals(PASSED_STATUS)) { - testResults.forEach(result -> - subResults.append(String.format("\n%s%s", PREFIX, result.getMethod().getQualifiedName()))); - } - suiteResults.append(subResults); - return testResults.size(); - } - - @Override - public void onTestStart(final ITestResult testResult) { - logTestStatus("STARTED", testResult); - } - - @Override - public void onTestSuccess(final ITestResult testResult) { - logTestStatus(PASSED_STATUS, testResult); - } - - @Override - public void onTestFailure(final ITestResult testResult) { - logTestStatus(FAILED_STATUS, testResult); - } - - @Override - public void onTestSkipped(final ITestResult testResult) { - logTestStatus(SKIPPED_STATUS, testResult); - } - - @Override - public void onFinish(ITestContext context) { - String separator = getDuplicates("=", 72); - String titleIndent = getDuplicates("-", separator.length() / 2); - String header = String.format("%s< %s >%s", titleIndent, context.getName(), titleIndent); - header = alignTitleToLength(header, separator.length()); - String logHeader = String.format("\n%s%s\n%s%s", PREFIX, separator, PREFIX, header); - StringBuilder suiteResults = new StringBuilder(); - suiteResults.append(logHeader); - int testCount = 0; - Set passedResults = context.getPassedTests().getAllResults(); - testCount += appendResults(suiteResults, passedResults, PASSED_STATUS); - testCount += appendResults(suiteResults, context.getFailedTests().getAllResults(), FAILED_STATUS); - testCount += appendResults(suiteResults, context.getSkippedTests().getAllResults(), SKIPPED_STATUS); - String total = new DecimalFormat("##0.00%").format((double) passedResults.size() / testCount); - String footer = String.format("%s[ %s ]%s", titleIndent, total, titleIndent); - footer = alignTitleToLength(footer, separator.length()); - String logFooter = String.format("\n%s\n%s%s\n%s%s", PREFIX, PREFIX, footer, PREFIX, separator); - suiteResults.append(logFooter); - log.info(suiteResults.toString()); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/utilities/BooleanUtil.java b/e2e-tests/src/main/java/io/kafbat/ui/utilities/BooleanUtil.java deleted file mode 100644 index 38b4179b5..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/utilities/BooleanUtil.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.kafbat.ui.utilities; - -import static io.kafbat.ui.utilities.StringUtil.clearString; -import static org.apache.commons.lang3.BooleanUtils.FALSE; -import static org.apache.commons.lang3.BooleanUtils.TRUE; -import static org.apache.commons.lang3.ObjectUtils.isEmpty; - -import org.apache.commons.lang3.StringUtils; - -public class BooleanUtil { - - public static boolean getOptionalBoolean(boolean defaultValue, boolean... customValue) { - return !isEmpty(customValue) ? customValue[0] : defaultValue; - } - - public static boolean parseBoolean(String original) { - String cleanStr = clearString(original); - if (StringUtils.isEmpty(cleanStr)) { - throw new IllegalStateException("Unexpected value: " + original); - } else if (cleanStr.equalsIgnoreCase(TRUE)) { - return true; - } else if (cleanStr.equalsIgnoreCase(FALSE)) { - return false; - } else { - throw new IllegalStateException("Unexpected value: " + original); - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/utilities/FileUtil.java b/e2e-tests/src/main/java/io/kafbat/ui/utilities/FileUtil.java deleted file mode 100644 index 85c277158..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/utilities/FileUtil.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.kafbat.ui.utilities; - -import static org.apache.kafka.common.utils.Utils.readFileAsString; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import org.apache.commons.io.IOUtils; - -public class FileUtil { - - public static String resourceToString(String resourcePath) { - try { - return IOUtils.resourceToString("/" + resourcePath, StandardCharsets.UTF_8); - } catch (IOException exception) { - throw new RuntimeException(exception); - } - } - - public static String fileToString(String filePath) { - try { - return readFileAsString(filePath); - } catch (IOException exception) { - throw new RuntimeException(exception); - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/utilities/IntUtil.java b/e2e-tests/src/main/java/io/kafbat/ui/utilities/IntUtil.java deleted file mode 100644 index d2d8c3064..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/utilities/IntUtil.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.kafbat.ui.utilities; - -import static org.apache.commons.lang3.ObjectUtils.isEmpty; - -import java.util.Objects; - -public class IntUtil { - - public static int getIntegerFromString(String original, boolean validate) { - String cleanStr = isEmpty(original) ? null - : original.replaceAll("(\\D+)", ""); - int result = 0; - try { - result = Integer.parseInt(Objects.requireNonNull(cleanStr)); - } catch (Throwable throwable) { - if (validate) { - throw new IllegalArgumentException(String.format("Unable to parse string '%s'", original)); - } - } - return result; - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/utilities/StringUtil.java b/e2e-tests/src/main/java/io/kafbat/ui/utilities/StringUtil.java deleted file mode 100644 index 487832494..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/utilities/StringUtil.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.kafbat.ui.utilities; - -import static org.apache.commons.lang3.ObjectUtils.isEmpty; - -import java.util.stream.IntStream; - -public class StringUtil { - - public static String getOptionalString(String defaultValue, String... customValue) { - return !isEmpty(customValue) && !isEmpty(customValue[0]) ? customValue[0] : defaultValue; - } - - public static String clearString(String original) { - if (original != null) { - String cleanStr = original - .replaceAll("\n", " ") - .replaceAll("\r", " ") - .replaceAll("\t", " ") - .trim(); - while (cleanStr.contains(" ")) { - cleanStr = cleanStr.replace(" ", " "); - } - return cleanStr; - } else { - return null; - } - } - - public static String getMixedCase(String original) { - return IntStream.range(0, original.length()) - .mapToObj(i -> i % 2 == 0 ? Character.toUpperCase(original.charAt(i)) : original.charAt(i)) - .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) - .toString(); - } - - public static String getDuplicates(String toDuplicate, int count) { - StringBuilder result = new StringBuilder(); - while (count > 0) { - result.append(toDuplicate); - count--; - } - return result.toString(); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/utilities/TimeUtil.java b/e2e-tests/src/main/java/io/kafbat/ui/utilities/TimeUtil.java deleted file mode 100644 index 99d03404e..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/utilities/TimeUtil.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.kafbat.ui.utilities; - -import com.codeborne.selenide.Selenide; -import java.time.LocalTime; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class TimeUtil { - - public static void waitUntilNewMinuteStarted() { - int secondsLeft = 60 - LocalTime.now().getSecond(); - log.debug("\nwaitUntilNewMinuteStarted: {}s", secondsLeft); - Selenide.sleep(secondsLeft * 1000); - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/utilities/WebUtil.java b/e2e-tests/src/main/java/io/kafbat/ui/utilities/WebUtil.java deleted file mode 100644 index 55921f40d..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/utilities/WebUtil.java +++ /dev/null @@ -1,115 +0,0 @@ -package io.kafbat.ui.utilities; - -import static com.codeborne.selenide.Condition.enabled; -import static io.kafbat.ui.variables.Common.LOG_RESULT; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.Selenide; -import com.codeborne.selenide.SelenideElement; -import java.time.Duration; -import lombok.extern.slf4j.Slf4j; -import org.openqa.selenium.Keys; - -@Slf4j -public class WebUtil { - - private static int getTimeout(int... timeoutInSeconds) { - return (timeoutInSeconds != null && timeoutInSeconds.length > 0) ? timeoutInSeconds[0] : 4; - } - - public static void sendKeysAfterClear(SelenideElement element, String keys) { - log.debug("\nsendKeysAfterClear: {{}} \nsend keys '{}'", element.getSearchCriteria(), keys); - element.shouldBe(Condition.enabled).clear(); - if (keys != null) { - element.sendKeys(keys); - } - } - - public static void clickByActions(SelenideElement element) { - log.debug("\nclickByActions: {{}}", element.getSearchCriteria()); - element.shouldBe(Condition.enabled); - Selenide.actions() - .moveToElement(element) - .click(element) - .perform(); - } - - public static void sendKeysByActions(SelenideElement element, String keys) { - log.debug("\nsendKeysByActions: {{}} \nsend keys '{}'", element.getSearchCriteria(), keys); - element.shouldBe(Condition.enabled); - Selenide.actions() - .moveToElement(element) - .sendKeys(element, keys) - .perform(); - } - - public static void clickByJavaScript(SelenideElement element) { - log.debug("\nclickByJavaScript: {{}}", element.getSearchCriteria()); - element.shouldBe(Condition.enabled); - String script = "arguments[0].click();"; - Selenide.executeJavaScript(script, element); - } - - public static void clearByKeyboard(SelenideElement field) { - log.debug("\nclearByKeyboard: {{}}", field.getSearchCriteria()); - field.shouldBe(enabled).sendKeys(Keys.PAGE_DOWN); - Selenide.actions() - .keyDown(Keys.SHIFT) - .sendKeys(Keys.PAGE_UP) - .keyUp(Keys.SHIFT) - .sendKeys(Keys.DELETE) - .perform(); - } - - public static boolean isVisible(SelenideElement element, int... timeoutInSeconds) { - log.debug("\nisVisible: {{}}", element.getSearchCriteria()); - boolean isVisible = false; - try { - element.shouldBe(Condition.visible, - Duration.ofSeconds(getTimeout(timeoutInSeconds))); - isVisible = true; - } catch (Throwable ignored) { - } - log.debug(LOG_RESULT, isVisible); - return isVisible; - } - - public static boolean isEnabled(SelenideElement element, int... timeoutInSeconds) { - log.debug("\nisEnabled: {{}}", element.getSearchCriteria()); - boolean isEnabled = false; - try { - element.shouldBe(Condition.enabled, - Duration.ofSeconds(getTimeout(timeoutInSeconds))); - isEnabled = true; - } catch (Throwable ignored) { - } - log.debug(LOG_RESULT, isEnabled); - return isEnabled; - } - - public static boolean isSelected(SelenideElement element, int... timeoutInSeconds) { - log.debug("\nisSelected: {{}}", element.getSearchCriteria()); - boolean isSelected = false; - try { - element.shouldBe(Condition.selected, - Duration.ofSeconds(getTimeout(timeoutInSeconds))); - isSelected = true; - } catch (Throwable ignored) { - } - log.debug(LOG_RESULT, isSelected); - return isSelected; - } - - public static void selectElement(SelenideElement element, boolean select) { - log.debug("\nselectElement: {{}} \nselect '{}'", element.getSearchCriteria(), select); - if (select) { - if (!element.isSelected()) { - clickByJavaScript(element); - } - } else { - if (element.isSelected()) { - clickByJavaScript(element); - } - } - } -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/variables/Browser.java b/e2e-tests/src/main/java/io/kafbat/ui/variables/Browser.java deleted file mode 100644 index b8c11a828..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/variables/Browser.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.kafbat.ui.variables; - -public interface Browser { - - String CONTAINER = "container"; - String LOCAL = "local"; -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/variables/Common.java b/e2e-tests/src/main/java/io/kafbat/ui/variables/Common.java deleted file mode 100644 index 33517d7dc..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/variables/Common.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.kafbat.ui.variables; - -public interface Common { - - String LOG_RESULT = "-> {}"; - String BROKER_SOURCE_INFO_TOOLTIP = - """ - Dynamic topic config = dynamic topic config that is configured for a specific topic - Dynamic broker logger config = dynamic broker logger config that is configured for a specific broker - Dynamic broker config = dynamic broker config that is configured for a specific broker - Dynamic default broker config = dynamic broker config that is configured as default \ - for all brokers in the cluster - Static broker config = static broker config provided as broker properties at start up \ - (e.g. server.properties file) - Default config = built-in default configuration for configs that have a default value - Unknown = source unknown e.g. in the ConfigEntry used for alter requests where source is not set"""; - String FILTER_CODE_STRING = "has(record.keyAsText) && record.keyAsText.matches(\".*[Gg]roovy.*\")"; - String FILTER_CODE_JSON = "has(record.key.name.first) && record.key.name.first == 'user1'"; -} diff --git a/e2e-tests/src/main/java/io/kafbat/ui/variables/Url.java b/e2e-tests/src/main/java/io/kafbat/ui/variables/Url.java deleted file mode 100644 index 29591b882..000000000 --- a/e2e-tests/src/main/java/io/kafbat/ui/variables/Url.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.kafbat.ui.variables; - -public interface Url { - - String BROKERS_LIST_URL = "http://%s:8080/ui/clusters/local/brokers"; - String TOPICS_LIST_URL = "http://%s:8080/ui/clusters/local/all-topics"; - String CONSUMERS_LIST_URL = "http://%s:8080/ui/clusters/local/consumer-groups"; - String SCHEMA_REGISTRY_LIST_URL = "http://%s:8080/ui/clusters/local/schemas"; - String KAFKA_CONNECT_LIST_URL = "http://%s:8080/ui/clusters/local/kafka-connect/connectors"; - String KSQL_DB_LIST_URL = "http://%s:8080/ui/clusters/local/ksqldb/tables"; -} diff --git a/e2e-tests/src/main/resources/testdata/connectors/create_config.json b/e2e-tests/src/main/resources/testdata/connectors/create_config.json deleted file mode 100644 index 096d4191e..000000000 --- a/e2e-tests/src/main/resources/testdata/connectors/create_config.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector", - "connection.url": "jdbc:postgresql://postgres-db:5432/test", - "connection.user": "dev_user", - "connection.password": "12345", - "topics": "topic_for_connector", - "table.name.format": "sink_activities_e2e_test_connector_creating", - "key.converter": "org.apache.kafka.connect.storage.StringConverter", - "key.converter.schema.registry.url": "http://schemaregistry0:8085", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "value.converter.schema.registry.url": "http://schemaregistry0:8085", - "auto.create": "true", - "pk.mode": "record_value", - "pk.fields": "id", - "insert.mode": "upsert", - "errors.log.enable": "true", - "errors.log.include.messages": "true" -} diff --git a/e2e-tests/src/main/resources/testdata/connectors/create_config_api.json b/e2e-tests/src/main/resources/testdata/connectors/create_config_api.json deleted file mode 100644 index dffd66cae..000000000 --- a/e2e-tests/src/main/resources/testdata/connectors/create_config_api.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector", - "connection.url": "jdbc:postgresql://postgres-db:5432/test", - "connection.user": "dev_user", - "connection.password": "12345", - "topics": "topic_for_connector" -} diff --git a/e2e-tests/src/main/resources/testdata/connectors/delete_config.json b/e2e-tests/src/main/resources/testdata/connectors/delete_config.json deleted file mode 100644 index 121613fc1..000000000 --- a/e2e-tests/src/main/resources/testdata/connectors/delete_config.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector", - "connection.url": "jdbc:postgresql://postgres-db:5432/test", - "connection.user": "dev_user", - "connection.password": "12345", - "topics": "topic_for_delete_connector", - "table.name.format": "sink_activities_e2e_test_connector_deleting", - "key.converter": "org.apache.kafka.connect.storage.StringConverter", - "key.converter.schema.registry.url": "http://schemaregistry0:8085", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "value.converter.schema.registry.url": "http://schemaregistry0:8085", - "auto.create": "false", - "pk.mode": "record_value", - "pk.fields": "id", - "insert.mode": "upsert", - "errors.log.enable": "true", - "errors.log.include.messages": "true" -} diff --git a/e2e-tests/src/main/resources/testdata/connectors/update_config.json b/e2e-tests/src/main/resources/testdata/connectors/update_config.json deleted file mode 100644 index 141b24b3d..000000000 --- a/e2e-tests/src/main/resources/testdata/connectors/update_config.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector", - "connection.url": "jdbc:postgresql://postgres-db:5432/test", - "connection.user": "dev_user", - "connection.password": "12345", - "topics": "topic_for_update_connector", - "table.name.format": "sink_activities_e2e_test_connector_updating", - "key.converter": "org.apache.kafka.connect.storage.StringConverter", - "key.converter.schema.registry.url": "http://schemaregistry0:8085", - "value.converter": "org.apache.kafka.connect.json.JsonConverter", - "value.converter.schema.registry.url": "http://schemaregistry0:8085", - "auto.create": "true", - "pk.mode": "record_value", - "pk.fields": "id", - "insert.mode": "upsert", - "errors.log.enable": "true", - "errors.log.include.messages": "true" -} diff --git a/e2e-tests/src/main/resources/testdata/schemas/schema_avro_update.json b/e2e-tests/src/main/resources/testdata/schemas/schema_avro_update.json deleted file mode 100644 index 93a49af17..000000000 --- a/e2e-tests/src/main/resources/testdata/schemas/schema_avro_update.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "record", - "name": "Message", - "namespace": "io.kafbat.ui", - "fields": [ - { - "name": "text", - "type": "string", - "default": null - }, - { - "name": "value", - "type": "string", - "default": null - } - ] -} diff --git a/e2e-tests/src/main/resources/testdata/schemas/schema_avro_value.json b/e2e-tests/src/main/resources/testdata/schemas/schema_avro_value.json deleted file mode 100644 index d84caf2ea..000000000 --- a/e2e-tests/src/main/resources/testdata/schemas/schema_avro_value.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "record", - "name": "Student", - "namespace": "DataFlair", - "fields": [ - { - "name": "Name", - "type": "string" - }, - { - "name": "Age", - "type": "int" - } - ] -} diff --git a/e2e-tests/src/main/resources/testdata/schemas/schema_json_value.json b/e2e-tests/src/main/resources/testdata/schemas/schema_json_value.json deleted file mode 100644 index dffd66cae..000000000 --- a/e2e-tests/src/main/resources/testdata/schemas/schema_json_value.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector", - "connection.url": "jdbc:postgresql://postgres-db:5432/test", - "connection.user": "dev_user", - "connection.password": "12345", - "topics": "topic_for_connector" -} diff --git a/e2e-tests/src/main/resources/testdata/schemas/schema_protobuf_value.txt b/e2e-tests/src/main/resources/testdata/schemas/schema_protobuf_value.txt deleted file mode 100644 index ec0000121..000000000 --- a/e2e-tests/src/main/resources/testdata/schemas/schema_protobuf_value.txt +++ /dev/null @@ -1,5 +0,0 @@ -enum SchemaType { - AVRO = 0; - JSON = 1; - PROTOBUF = 2; - } \ No newline at end of file diff --git a/e2e-tests/src/main/resources/testdata/topics/create_topic_content.json b/e2e-tests/src/main/resources/testdata/topics/create_topic_content.json deleted file mode 100644 index a4c0d940f..000000000 --- a/e2e-tests/src/main/resources/testdata/topics/create_topic_content.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "schema": - { - "type":"struct", - "fields": [ - { - "type":"string", - "optional":false, - "field":"id" - },{ - "type":"string", - "optional":false, - "field":"value" - } - ], - "optional":false, - "name":"test" - }, - "payload": - { - "id":"1", - "value":"kafka" - } -} diff --git a/e2e-tests/src/test/java/io/kafbat/ui/BaseTest.java b/e2e-tests/src/test/java/io/kafbat/ui/BaseTest.java deleted file mode 100644 index 15e7a84ec..000000000 --- a/e2e-tests/src/test/java/io/kafbat/ui/BaseTest.java +++ /dev/null @@ -1,140 +0,0 @@ -package io.kafbat.ui; - -import com.codeborne.selenide.SelenideElement; -import com.codeborne.selenide.WebElementCondition; -import io.github.bonigarcia.wdm.WebDriverManager; -import io.kafbat.ui.screens.panels.enums.MenuItem; -import io.kafbat.ui.settings.BaseSource; -import io.kafbat.ui.settings.drivers.WebDriver; -import io.kafbat.ui.settings.listeners.AllureListener; -import io.kafbat.ui.settings.listeners.ResultsLogger; -import io.qameta.allure.Step; -import java.util.List; -import lombok.extern.slf4j.Slf4j; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.AfterSuite; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.BeforeSuite; -import org.testng.annotations.Listeners; -import org.testng.asserts.SoftAssert; - -@Slf4j -@Listeners({AllureListener.class, ResultsLogger.class}) -public abstract class BaseTest extends Facade { - - @BeforeSuite(alwaysRun = true) - public void beforeSuite() { - WebDriverManager.chromedriver().setup(); - WebDriver.selenideLoggerSetup(); - WebDriver.browserSetup(); - } - - @AfterSuite(alwaysRun = true) - public void afterSuite() { - WebDriver.browserQuit(); - } - - @BeforeMethod(alwaysRun = true) - public void beforeMethod() { - WebDriver.openUrl(BaseSource.BASE_UI_URL); - naviSideBar.waitUntilScreenReady(); - } - - @AfterMethod(alwaysRun = true) - public void afterMethod() { - WebDriver.browserClear(); - } - - @Step - protected void navigateToBrokers() { - naviSideBar - .openSideMenu(MenuItem.BROKERS); - brokersList - .waitUntilScreenReady(); - } - - @Step - protected void navigateToBrokersAndOpenDetails(int brokerId) { - navigateToBrokers(); - brokersList - .openBroker(brokerId); - brokersDetails - .waitUntilScreenReady(); - } - - @Step - protected void navigateToTopics() { - naviSideBar - .openSideMenu(MenuItem.TOPICS); - topicsList - .waitUntilScreenReady() - .setShowInternalRadioButton(false); - } - - @Step - protected void navigateToTopicsAndOpenDetails(String topicName) { - navigateToTopics(); - topicsList - .openTopic(topicName); - topicDetails - .waitUntilScreenReady(); - } - - @Step - protected void navigateToConsumers() { - naviSideBar - .openSideMenu(MenuItem.CONSUMERS); - consumersList - .waitUntilScreenReady(); - } - - @Step - protected void navigateToSchemaRegistry() { - naviSideBar - .openSideMenu(MenuItem.SCHEMA_REGISTRY); - schemaRegistryList - .waitUntilScreenReady(); - } - - @Step - protected void navigateToSchemaRegistryAndOpenDetails(String schemaName) { - navigateToSchemaRegistry(); - schemaRegistryList - .openSchema(schemaName); - schemaDetails - .waitUntilScreenReady(); - } - - @Step - protected void navigateToConnectors() { - naviSideBar - .openSideMenu(MenuItem.KAFKA_CONNECT); - kafkaConnectList - .waitUntilScreenReady(); - } - - @Step - protected void navigateToConnectorsAndOpenDetails(String connectorName) { - navigateToConnectors(); - kafkaConnectList - .openConnector(connectorName); - connectorDetails - .waitUntilScreenReady(); - } - - @Step - protected void navigateToKsqlDb() { - naviSideBar - .openSideMenu(MenuItem.KSQL_DB); - ksqlDbList - .waitUntilScreenReady(); - } - - @Step - protected void verifyElementsCondition(List elementList, WebElementCondition expectedCondition) { - SoftAssert softly = new SoftAssert(); - elementList.forEach(element -> softly.assertTrue(element.is(expectedCondition), - element.getSearchCriteria() + " is " + expectedCondition)); - softly.assertAll(); - } -} diff --git a/e2e-tests/src/test/java/io/kafbat/ui/Facade.java b/e2e-tests/src/test/java/io/kafbat/ui/Facade.java deleted file mode 100644 index e740753e5..000000000 --- a/e2e-tests/src/test/java/io/kafbat/ui/Facade.java +++ /dev/null @@ -1,48 +0,0 @@ -package io.kafbat.ui; - -import io.kafbat.ui.screens.brokers.BrokersConfigTab; -import io.kafbat.ui.screens.brokers.BrokersDetails; -import io.kafbat.ui.screens.brokers.BrokersList; -import io.kafbat.ui.screens.connectors.ConnectorCreateForm; -import io.kafbat.ui.screens.connectors.ConnectorDetails; -import io.kafbat.ui.screens.connectors.KafkaConnectList; -import io.kafbat.ui.screens.consumers.ConsumersDetails; -import io.kafbat.ui.screens.consumers.ConsumersList; -import io.kafbat.ui.screens.ksqldb.KsqlDbList; -import io.kafbat.ui.screens.ksqldb.KsqlQueryForm; -import io.kafbat.ui.screens.panels.NaviSideBar; -import io.kafbat.ui.screens.panels.TopPanel; -import io.kafbat.ui.screens.schemas.SchemaCreateForm; -import io.kafbat.ui.screens.schemas.SchemaDetails; -import io.kafbat.ui.screens.schemas.SchemaRegistryList; -import io.kafbat.ui.screens.topics.ProduceMessagePanel; -import io.kafbat.ui.screens.topics.TopicCreateEditForm; -import io.kafbat.ui.screens.topics.TopicDetails; -import io.kafbat.ui.screens.topics.TopicSettingsTab; -import io.kafbat.ui.screens.topics.TopicsList; -import io.kafbat.ui.services.ApiService; - -public abstract class Facade { - - protected ApiService apiService = new ApiService(); - protected ConnectorCreateForm connectorCreateForm = new ConnectorCreateForm(); - protected KafkaConnectList kafkaConnectList = new KafkaConnectList(); - protected ConnectorDetails connectorDetails = new ConnectorDetails(); - protected SchemaCreateForm schemaCreateForm = new SchemaCreateForm(); - protected SchemaDetails schemaDetails = new SchemaDetails(); - protected SchemaRegistryList schemaRegistryList = new SchemaRegistryList(); - protected ProduceMessagePanel produceMessagePanel = new ProduceMessagePanel(); - protected TopicCreateEditForm topicCreateEditForm = new TopicCreateEditForm(); - protected TopicsList topicsList = new TopicsList(); - protected TopicDetails topicDetails = new TopicDetails(); - protected ConsumersDetails consumersDetails = new ConsumersDetails(); - protected ConsumersList consumersList = new ConsumersList(); - protected NaviSideBar naviSideBar = new NaviSideBar(); - protected TopPanel topPanel = new TopPanel(); - protected BrokersList brokersList = new BrokersList(); - protected BrokersDetails brokersDetails = new BrokersDetails(); - protected BrokersConfigTab brokersConfigTab = new BrokersConfigTab(); - protected TopicSettingsTab topicSettingsTab = new TopicSettingsTab(); - protected KsqlQueryForm ksqlQueryForm = new KsqlQueryForm(); - protected KsqlDbList ksqlDbList = new KsqlDbList(); -} diff --git a/e2e-tests/src/test/java/io/kafbat/ui/sanitysuite/TopicsTest.java b/e2e-tests/src/test/java/io/kafbat/ui/sanitysuite/TopicsTest.java deleted file mode 100644 index 96ca8a90d..000000000 --- a/e2e-tests/src/test/java/io/kafbat/ui/sanitysuite/TopicsTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package io.kafbat.ui.sanitysuite; - -import io.kafbat.ui.BaseTest; -import io.kafbat.ui.models.Topic; -import io.kafbat.ui.screens.topics.enums.CleanupPolicyValue; -import io.qameta.allure.Step; -import java.util.ArrayList; -import java.util.List; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.Test; - -public class TopicsTest extends BaseTest { - - private static final List TOPIC_LIST = new ArrayList<>(); - - @Test() - public void verifyClearMessagesMenuStateAfterTopicUpdate() { - Topic topic = Topic.createTopic() - .setCleanupPolicyValue(CleanupPolicyValue.DELETE); - navigateToTopics(); - topicsList - .clickAddTopicBtn(); - topicCreateEditForm - .waitUntilScreenReady() - .setTopicName(topic.getName()) - .setNumberOfPartitions(topic.getNumberOfPartitions()) - .selectCleanupPolicy(topic.getCleanupPolicyValue()) - .clickSaveTopicBtn(); - topicDetails - .waitUntilScreenReady(); - TOPIC_LIST.add(topic); - topicDetails - .openDotMenu(); - Assert.assertTrue(topicDetails.isClearMessagesMenuEnabled(), "isClearMessagesMenuEnabled()"); - topic.setCleanupPolicyValue(CleanupPolicyValue.COMPACT); - editCleanUpPolicyAndOpenDotMenu(topic); - Assert.assertFalse(topicDetails.isClearMessagesMenuEnabled(), "isClearMessagesMenuEnabled()"); - topic.setCleanupPolicyValue(CleanupPolicyValue.DELETE); - editCleanUpPolicyAndOpenDotMenu(topic); - Assert.assertTrue(topicDetails.isClearMessagesMenuEnabled(), "isClearMessagesMenuEnabled()"); - } - - @Step - private void editCleanUpPolicyAndOpenDotMenu(Topic topic) { - topicDetails - .clickEditSettingsMenu(); - topicCreateEditForm - .waitUntilScreenReady() - .selectCleanupPolicy(topic.getCleanupPolicyValue()) - .clickSaveTopicBtn(); - topicDetails - .waitUntilScreenReady() - .openDotMenu(); - } - - @AfterClass(alwaysRun = true) - public void afterClass() { - TOPIC_LIST.forEach(topic -> apiService.deleteTopic(topic.getName())); - } -} diff --git a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/SmokeTest.java b/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/SmokeTest.java deleted file mode 100644 index 2864d4dc5..000000000 --- a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/SmokeTest.java +++ /dev/null @@ -1,100 +0,0 @@ -package io.kafbat.ui.smokesuite; - -import static io.kafbat.ui.utilities.FileUtil.resourceToString; - -import com.codeborne.selenide.Condition; -import com.codeborne.selenide.WebDriverRunner; -import io.kafbat.ui.BaseTest; -import io.kafbat.ui.models.Connector; -import io.kafbat.ui.models.Schema; -import io.kafbat.ui.models.Topic; -import io.kafbat.ui.screens.panels.enums.MenuItem; -import io.kafbat.ui.settings.BaseSource; -import io.kafbat.ui.variables.Url; -import io.qameta.allure.Step; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Ignore; -import org.testng.annotations.Test; - -public class SmokeTest extends BaseTest { - - private static final int BROKER_ID = 1; - private static final Schema TEST_SCHEMA = Schema.createSchemaAvro(); - private static final Topic TEST_TOPIC = Topic.createTopic(); - private static final Connector TEST_CONNECTOR = - Connector.createConnector(resourceToString("testdata/connectors/create_config_api.json")); - - @BeforeClass(alwaysRun = true) - public void beforeClass() { - apiService - .createTopic(TEST_TOPIC) - .createSchema(TEST_SCHEMA) - .createConnector(TEST_CONNECTOR); - } - - @Test - public void basePageElementsCheck() { - 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); - } - - @Test - public void urlWhileNavigationCheck() { - navigateToBrokers(); - verifyCurrentUrl(Url.BROKERS_LIST_URL); - navigateToTopics(); - verifyCurrentUrl(Url.TOPICS_LIST_URL); - navigateToConsumers(); - verifyCurrentUrl(Url.CONSUMERS_LIST_URL); - navigateToSchemaRegistry(); - verifyCurrentUrl(Url.SCHEMA_REGISTRY_LIST_URL); - navigateToConnectors(); - verifyCurrentUrl(Url.KAFKA_CONNECT_LIST_URL); - navigateToKsqlDb(); - verifyCurrentUrl(Url.KSQL_DB_LIST_URL); - } - - @Ignore - @Test - public void pathWhileNavigationCheck() { - navigateToBrokersAndOpenDetails(BROKER_ID); - verifyComponentsPath(MenuItem.BROKERS, String.format("Broker %d", BROKER_ID)); - navigateToTopicsAndOpenDetails(TEST_TOPIC.getName()); - verifyComponentsPath(MenuItem.TOPICS, TEST_TOPIC.getName()); - navigateToSchemaRegistryAndOpenDetails(TEST_SCHEMA.getName()); - verifyComponentsPath(MenuItem.SCHEMA_REGISTRY, TEST_SCHEMA.getName()); - navigateToConnectorsAndOpenDetails(TEST_CONNECTOR.getName()); - verifyComponentsPath(MenuItem.KAFKA_CONNECT, TEST_CONNECTOR.getName()); - } - - @Step - private void verifyCurrentUrl(String expectedUrl) { - String urlWithoutParameters = WebDriverRunner.getWebDriver().getCurrentUrl(); - if (urlWithoutParameters.contains("?")) { - urlWithoutParameters = urlWithoutParameters.substring(0, urlWithoutParameters.indexOf("?")); - } - Assert.assertEquals(urlWithoutParameters, String.format(expectedUrl, BaseSource.BASE_HOST), "getCurrentUrl()"); - } - - @Step - private void verifyComponentsPath(MenuItem menuItem, String expectedPath) { - Assert.assertEquals(naviSideBar.getPagePath(menuItem), expectedPath, - String.format("getPagePath()[%s]", menuItem.getPageTitle().toUpperCase())); - } - - @AfterClass(alwaysRun = true) - public void afterClass() { - apiService - .deleteTopic(TEST_TOPIC.getName()) - .deleteSchema(TEST_SCHEMA.getName()) - .deleteConnector(TEST_CONNECTOR.getName()); - } -} diff --git a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/brokers/BrokersTest.java b/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/brokers/BrokersTest.java deleted file mode 100644 index ae5867bfc..000000000 --- a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/brokers/BrokersTest.java +++ /dev/null @@ -1,180 +0,0 @@ -package io.kafbat.ui.smokesuite.brokers; - -import static io.kafbat.ui.utilities.IntUtil.getIntegerFromString; - -import com.codeborne.selenide.Condition; -import io.kafbat.ui.BaseTest; -import io.kafbat.ui.screens.brokers.BrokersConfigTab; -import io.kafbat.ui.screens.brokers.BrokersDetails; -import io.kafbat.ui.utilities.StringUtil; -import io.kafbat.ui.variables.Common; -import io.qameta.allure.Issue; -import java.util.List; -import org.testng.Assert; -import org.testng.annotations.Ignore; -import org.testng.annotations.Test; -import org.testng.asserts.SoftAssert; - -public class BrokersTest extends BaseTest { - - public static final int DEFAULT_BROKER_ID = 1; - - @Test - public void brokersOverviewCheck() { - navigateToBrokers(); - Assert.assertFalse(brokersList.getAllBrokers().isEmpty(), "getAllBrokers()"); - verifyElementsCondition(brokersList.getAllVisibleElements(), Condition.visible); - verifyElementsCondition(brokersList.getAllEnabledElements(), Condition.enabled); - } - - @Test - public void existingBrokersInClusterCheck() { - navigateToBrokers(); - Assert.assertFalse(brokersList.getAllBrokers().isEmpty(), "getAllBrokers().isEmpty()"); - brokersList - .openBroker(DEFAULT_BROKER_ID); - brokersDetails - .waitUntilScreenReady(); - verifyElementsCondition(brokersDetails.getAllVisibleElements(), Condition.visible); - verifyElementsCondition(brokersDetails.getAllEnabledElements(), Condition.enabled); - brokersDetails - .openDetailsTab(BrokersDetails.DetailsTab.CONFIGS); - brokersConfigTab - .waitUntilScreenReady(); - verifyElementsCondition(brokersConfigTab.getColumnHeaders(), Condition.visible); - Assert.assertTrue(brokersConfigTab.isSearchByKeyVisible(), "isSearchByKeyVisible()"); - } - - @Ignore - @Issue("https://github.com/kafbat/kafka-ui/issues/209") - @Test - public void brokersConfigFirstPageSearchCheck() { - navigateToBrokersAndOpenDetails(DEFAULT_BROKER_ID); - brokersDetails - .openDetailsTab(BrokersDetails.DetailsTab.CONFIGS); - String anyConfigKeyFirstPage = brokersConfigTab - .getAllConfigs().stream() - .findAny().orElseThrow() - .getKey(); - brokersConfigTab - .clickNextButton(); - Assert.assertFalse(brokersConfigTab.getAllConfigs().stream() - .map(BrokersConfigTab.BrokersConfigItem::getKey) - .toList().contains(anyConfigKeyFirstPage), - String.format("getAllConfigs().contains()[%s]", anyConfigKeyFirstPage)); - brokersConfigTab - .searchConfig(anyConfigKeyFirstPage); - Assert.assertTrue(brokersConfigTab.getAllConfigs().stream() - .map(BrokersConfigTab.BrokersConfigItem::getKey) - .toList().contains(anyConfigKeyFirstPage), - String.format("getAllConfigs().contains()[%s]", anyConfigKeyFirstPage)); - } - - @Ignore - @Issue("https://github.com/kafbat/kafka-ui/issues/209") - @Test - public void brokersConfigSecondPageSearchCheck() { - navigateToBrokersAndOpenDetails(DEFAULT_BROKER_ID); - brokersDetails - .openDetailsTab(BrokersDetails.DetailsTab.CONFIGS); - brokersConfigTab - .clickNextButton(); - String anyConfigKeySecondPage = brokersConfigTab - .getAllConfigs().stream() - .findAny().orElseThrow() - .getKey(); - brokersConfigTab - .clickPreviousButton(); - Assert.assertFalse(brokersConfigTab.getAllConfigs().stream() - .map(BrokersConfigTab.BrokersConfigItem::getKey) - .toList().contains(anyConfigKeySecondPage), - String.format("getAllConfigs().contains()[%s]", anyConfigKeySecondPage)); - brokersConfigTab - .searchConfig(anyConfigKeySecondPage); - Assert.assertTrue(brokersConfigTab.getAllConfigs().stream() - .map(BrokersConfigTab.BrokersConfigItem::getKey) - .toList().contains(anyConfigKeySecondPage), - String.format("getAllConfigs().contains()[%s]", anyConfigKeySecondPage)); - } - - @Ignore - @Issue("https://github.com/kafbat/kafka-ui/issues/209") - @Test - public void brokersConfigCaseInsensitiveSearchCheck() { - navigateToBrokersAndOpenDetails(DEFAULT_BROKER_ID); - brokersDetails - .openDetailsTab(BrokersDetails.DetailsTab.CONFIGS); - String anyConfigKeyFirstPage = brokersConfigTab - .getAllConfigs().stream() - .findAny().orElseThrow() - .getKey(); - brokersConfigTab - .clickNextButton(); - Assert.assertFalse(brokersConfigTab.getAllConfigs().stream() - .map(BrokersConfigTab.BrokersConfigItem::getKey) - .toList().contains(anyConfigKeyFirstPage), - String.format("getAllConfigs().contains()[%s]", anyConfigKeyFirstPage)); - SoftAssert softly = new SoftAssert(); - List.of(anyConfigKeyFirstPage.toLowerCase(), anyConfigKeyFirstPage.toUpperCase(), - StringUtil.getMixedCase(anyConfigKeyFirstPage)) - .forEach(configCase -> { - brokersConfigTab - .searchConfig(configCase); - softly.assertTrue(brokersConfigTab.getAllConfigs().stream() - .map(BrokersConfigTab.BrokersConfigItem::getKey) - .toList().contains(anyConfigKeyFirstPage), - String.format("getAllConfigs().contains()[%s]", configCase)); - }); - softly.assertAll(); - } - - @Test - public void brokersSourceInfoCheck() { - navigateToBrokersAndOpenDetails(DEFAULT_BROKER_ID); - brokersDetails - .openDetailsTab(BrokersDetails.DetailsTab.CONFIGS); - String sourceInfoTooltip = brokersConfigTab - .hoverOnSourceInfoIcon() - .getSourceInfoTooltipText(); - Assert.assertEquals(sourceInfoTooltip, Common.BROKER_SOURCE_INFO_TOOLTIP, "getSourceInfoTooltipText()"); - } - - @Test(enabled = false) // flaky, TODO issues/322 - public void brokersConfigEditCheck() { - navigateToBrokersAndOpenDetails(DEFAULT_BROKER_ID); - brokersDetails - .openDetailsTab(BrokersDetails.DetailsTab.CONFIGS); - String configKey = "log.cleaner.min.compaction.lag.ms"; - BrokersConfigTab.BrokersConfigItem configItem = brokersConfigTab - .searchConfig(configKey) - .getConfig(configKey); - int defaultValue = getIntegerFromString(configItem.getValue(), false); - configItem - .clickEditBtn(); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(configItem.getSaveBtn().isDisplayed(), "getSaveBtn().isDisplayed()"); - softly.assertTrue(configItem.getCancelBtn().isDisplayed(), "getCancelBtn().isDisplayed()"); - softly.assertTrue(configItem.getValueFld().isEnabled(), "getValueFld().isEnabled()"); - softly.assertAll(); - int newValue = defaultValue + 1; - configItem - .setValue(String.valueOf(newValue)) - .clickCancelBtn(); - Assert.assertEquals(getIntegerFromString(configItem.getValue(), true), defaultValue, - "configItem.getValue()"); - configItem - .clickEditBtn() - .setValue(String.valueOf(newValue)) - .clickSaveBtn() - .clickConfirm(); - configItem = brokersConfigTab - .searchConfig(configKey) - .getConfig(configKey); - softly.assertFalse(configItem.getSaveBtn().isDisplayed(), "getSaveBtn().isDisplayed()"); - softly.assertFalse(configItem.getCancelBtn().isDisplayed(), "getCancelBtn().isDisplayed()"); - softly.assertTrue(configItem.getEditBtn().isDisplayed(), "getEditBtn().isDisplayed()"); - softly.assertEquals(getIntegerFromString(configItem.getValue(), true), newValue, - "configItem.getValue()"); - softly.assertAll(); - } -} diff --git a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/connectors/ConnectorsTest.java b/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/connectors/ConnectorsTest.java deleted file mode 100644 index a69125b4f..000000000 --- a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/connectors/ConnectorsTest.java +++ /dev/null @@ -1,98 +0,0 @@ -package io.kafbat.ui.smokesuite.connectors; - -import static io.kafbat.ui.models.Topic.createTopic; -import static io.kafbat.ui.screens.BasePage.AlertHeader.SUCCESS; -import static io.kafbat.ui.utilities.FileUtil.resourceToString; - -import io.kafbat.ui.BaseTest; -import io.kafbat.ui.models.Connector; -import io.kafbat.ui.models.Topic; -import java.util.ArrayList; -import java.util.List; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Ignore; -import org.testng.annotations.Test; - -public class ConnectorsTest extends BaseTest { - - private static final String MESSAGE_CONTENT = resourceToString("testdata/topics/create_topic_content.json"); - private static final Topic CREATE_TOPIC = createTopic().setMessageValue(MESSAGE_CONTENT); - private static final Topic DELETE_TOPIC = createTopic().setMessageValue(MESSAGE_CONTENT); - private static final Topic UPDATE_TOPIC = createTopic().setMessageValue(MESSAGE_CONTENT); - private static final Connector DELETE_CONNECTOR = - Connector.createConnector(resourceToString("testdata/connectors/delete_config.json")); - private static final Connector UPDATE_CONNECTOR = - Connector.createConnector(resourceToString("testdata/connectors/create_config_api.json")); - private static final List TOPIC_LIST = new ArrayList<>(); - private static final List CONNECTOR_LIST = new ArrayList<>(); - - @BeforeClass(alwaysRun = true) - public void beforeClass() { - TOPIC_LIST.addAll(List.of(CREATE_TOPIC, DELETE_TOPIC, UPDATE_TOPIC)); - TOPIC_LIST.forEach(topic -> apiService - .createTopic(topic) - .sendMessage(topic)); - CONNECTOR_LIST.addAll(List.of(DELETE_CONNECTOR, UPDATE_CONNECTOR)); - CONNECTOR_LIST.forEach(connector -> apiService.createConnector(connector)); - } - - @Ignore - @Test - public void createConnectorCheck() { - Connector createConnector = - Connector.createConnector(resourceToString("testdata/connectors/create_config.json")); - navigateToConnectors(); - kafkaConnectList - .clickCreateConnectorBtn(); - connectorCreateForm - .waitUntilScreenReady() - .setConnectorDetails(createConnector.getName(), createConnector.getConfig()) - .clickSubmitButton(); - connectorDetails - .waitUntilScreenReady(); - navigateToConnectorsAndOpenDetails(createConnector.getName()); - Assert.assertTrue(connectorDetails.isConnectorHeaderVisible(createConnector.getName()), - String.format("isConnectorHeaderVisible()[%s]", createConnector.getName())); - navigateToConnectors(); - Assert.assertTrue(kafkaConnectList.isConnectorVisible(DELETE_CONNECTOR.getName()), - String.format("isConnectorVisible()[%s]", DELETE_CONNECTOR.getName())); - CONNECTOR_LIST.add(createConnector); - } - - @Ignore - @Test - public void updateConnectorCheck() { - navigateToConnectorsAndOpenDetails(UPDATE_CONNECTOR.getName()); - connectorDetails - .openConfigTab() - .setConfig(UPDATE_CONNECTOR.getConfig()) - .clickSubmitButton(); - Assert.assertTrue(connectorDetails.isAlertWithMessageVisible(SUCCESS, "Config successfully updated."), - "isAlertWithMessageVisible()"); - navigateToConnectors(); - Assert.assertTrue(kafkaConnectList.isConnectorVisible(UPDATE_CONNECTOR.getName()), - String.format("isConnectorVisible()[%s]", UPDATE_CONNECTOR.getName())); - } - - @Ignore - @Test - public void deleteConnectorCheck() { - navigateToConnectorsAndOpenDetails(DELETE_CONNECTOR.getName()); - connectorDetails - .openDotMenu() - .clickDeleteBtn() - .clickConfirmBtn(); - navigateToConnectors(); - Assert.assertFalse(kafkaConnectList.isConnectorVisible(DELETE_CONNECTOR.getName()), - String.format("isConnectorVisible()[%s]", DELETE_CONNECTOR.getName())); - } - - @AfterClass(alwaysRun = true) - public void afterClass() { - CONNECTOR_LIST.forEach(connector -> - apiService.deleteConnector(connector.getName())); - TOPIC_LIST.forEach(topic -> apiService.deleteTopic(topic.getName())); - } -} diff --git a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/ksqldb/KsqlDbTest.java b/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/ksqldb/KsqlDbTest.java deleted file mode 100644 index 59277603f..000000000 --- a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/ksqldb/KsqlDbTest.java +++ /dev/null @@ -1,139 +0,0 @@ -package io.kafbat.ui.smokesuite.ksqldb; - -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; - -import io.kafbat.ui.BaseTest; -import io.kafbat.ui.screens.ksqldb.enums.KsqlMenuTabs; -import io.kafbat.ui.screens.ksqldb.enums.KsqlQueryConfig; -import io.kafbat.ui.screens.ksqldb.models.Stream; -import io.kafbat.ui.screens.ksqldb.models.Table; -import io.qameta.allure.Step; -import java.util.ArrayList; -import java.util.List; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; -import org.testng.asserts.SoftAssert; - -public class KsqlDbTest extends BaseTest { - - private static final Stream DEFAULT_STREAM = new Stream() - .setName("DEFAULT_STREAM_" + randomAlphabetic(5).toUpperCase()) - .setTopicName("DEFAULT_TOPIC_" + randomAlphabetic(5).toUpperCase()); - private static final Table FIRST_TABLE = new Table() - .setName("FIRST_TABLE_" + randomAlphabetic(5).toUpperCase()) - .setStreamName(DEFAULT_STREAM.getName()); - private static final Table SECOND_TABLE = new Table() - .setName("SECOND_TABLE_" + randomAlphabetic(5).toUpperCase()) - .setStreamName(DEFAULT_STREAM.getName()); - private static final List TOPIC_NAME_LIST = new ArrayList<>(); - - @BeforeClass(alwaysRun = true) - public void beforeClass() { - apiService - .createStream(DEFAULT_STREAM) - .createTables(FIRST_TABLE, SECOND_TABLE); - TOPIC_NAME_LIST.addAll(List.of(DEFAULT_STREAM.getTopicName(), - FIRST_TABLE.getName(), SECOND_TABLE.getName())); - } - - @Test(priority = 1) - public void streamsAndTablesVisibilityCheck() { - navigateToKsqlDb(); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(ksqlDbList.getTableByName(FIRST_TABLE.getName()).isVisible(), - String.format("getTableByName().isVisible()[%s]", FIRST_TABLE.getName())); - softly.assertTrue(ksqlDbList.getTableByName(SECOND_TABLE.getName()).isVisible(), - String.format("getTableByName().isVisible()[%s]", SECOND_TABLE.getName())); - softly.assertAll(); - ksqlDbList - .openDetailsTab(KsqlMenuTabs.STREAMS) - .waitUntilScreenReady(); - Assert.assertTrue(ksqlDbList.getStreamByName(DEFAULT_STREAM.getName()).isVisible(), - String.format("getStreamByName().isVisible()[%s]", DEFAULT_STREAM.getName())); - } - - @Test(priority = 2) - public void clearEnteredQueryCheck() { - navigateToKsqlDbAndExecuteRequest(KsqlQueryConfig.SHOW_TABLES.getQuery()); - Assert.assertFalse(ksqlQueryForm.getEnteredQuery().isEmpty(), "getEnteredQuery().isEmpty()"); - ksqlQueryForm - .clickClearBtn(); - Assert.assertTrue(ksqlQueryForm.getEnteredQuery().isEmpty(), "getEnteredQuery().isEmpty()"); - } - - @Test(priority = 3) - public void clearResultsButtonCheck() { - String notValidQuery = "some not valid request"; - navigateToKsqlDb(); - ksqlDbList - .clickExecuteKsqlRequestBtn(); - ksqlQueryForm - .waitUntilScreenReady() - .setQuery(notValidQuery); - Assert.assertFalse(ksqlQueryForm.isClearResultsBtnEnabled(), "isClearResultsBtnEnabled()"); - ksqlQueryForm - .clickExecuteBtn(notValidQuery); - Assert.assertFalse(ksqlQueryForm.isClearResultsBtnEnabled(), "isClearResultsBtnEnabled()"); - } - - @Test(priority = 4) - public void showTablesRequestExecutionCheck() { - navigateToKsqlDbAndExecuteRequest(KsqlQueryConfig.SHOW_TABLES.getQuery()); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(ksqlQueryForm.areResultsVisible(), "areResultsVisible()"); - softly.assertTrue(ksqlQueryForm.getItemByName(FIRST_TABLE.getName()).isVisible(), - String.format("getItemByName().isVisible()[%s]", FIRST_TABLE.getName())); - softly.assertTrue(ksqlQueryForm.getItemByName(SECOND_TABLE.getName()).isVisible(), - String.format("getItemByName().isVisible()[%s]", SECOND_TABLE.getName())); - softly.assertAll(); - } - - @Test(priority = 5) - public void showStreamsRequestExecutionCheck() { - navigateToKsqlDbAndExecuteRequest(KsqlQueryConfig.SHOW_STREAMS.getQuery()); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(ksqlQueryForm.areResultsVisible(), "areResultsVisible()"); - softly.assertTrue(ksqlQueryForm.getItemByName(DEFAULT_STREAM.getName()).isVisible(), - String.format("getItemByName().isVisible()[%s]", FIRST_TABLE.getName())); - softly.assertAll(); - } - - @Test(priority = 6) - public void clearResultsOfExecutedRequestCheck() { - navigateToKsqlDbAndExecuteRequest(KsqlQueryConfig.SHOW_TABLES.getQuery()); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(ksqlQueryForm.areResultsVisible(), "areResultsVisible()"); - softly.assertAll(); - ksqlQueryForm - .clickClearResultsBtn(); - softly.assertFalse(ksqlQueryForm.areResultsVisible(), "areResultsVisible()"); - softly.assertAll(); - } - - @Test(priority = 7) - public void stopQueryFunctionalCheck() { - navigateToKsqlDbAndExecuteRequest(String.format(KsqlQueryConfig.SELECT_ALL_FROM.getQuery(), FIRST_TABLE.getName())); - Assert.assertTrue(ksqlQueryForm.isAbortBtnVisible(), "isAbortBtnVisible()"); - ksqlQueryForm - .clickAbortBtn(); - Assert.assertTrue(ksqlQueryForm.isCancelledAlertVisible(), "isCancelledAlertVisible()"); - } - - @AfterClass(alwaysRun = true) - public void afterClass() { - TOPIC_NAME_LIST.forEach(topicName -> apiService.deleteTopic(topicName)); - } - - @Step - private void navigateToKsqlDbAndExecuteRequest(String query) { - navigateToKsqlDb(); - ksqlDbList - .clickExecuteKsqlRequestBtn(); - ksqlQueryForm - .waitUntilScreenReady() - .setQuery(query) - .clickExecuteBtn(query); - } -} diff --git a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/schemas/SchemasTest.java b/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/schemas/SchemasTest.java deleted file mode 100644 index bc185e29f..000000000 --- a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/schemas/SchemasTest.java +++ /dev/null @@ -1,195 +0,0 @@ -package io.kafbat.ui.smokesuite.schemas; - -import com.codeborne.selenide.Condition; -import io.kafbat.ui.BaseTest; -import io.kafbat.ui.api.model.CompatibilityLevel; -import io.kafbat.ui.models.Schema; -import io.kafbat.ui.utilities.FileUtil; -import java.util.ArrayList; -import java.util.List; -import org.testng.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; -import org.testng.asserts.SoftAssert; - -public class SchemasTest extends BaseTest { - - private static final Schema AVRO_SCHEMA = Schema.createSchemaAvro(); - private static final Schema JSON_SCHEMA = Schema.createSchemaJson(); - private static final Schema PROTOBUF_SCHEMA = Schema.createSchemaProtobuf(); - private static final List SCHEMA_LIST = new ArrayList<>(); - - @BeforeClass(alwaysRun = true) - public void beforeClass() { - SCHEMA_LIST.addAll(List.of(AVRO_SCHEMA, JSON_SCHEMA, PROTOBUF_SCHEMA)); - SCHEMA_LIST.forEach(schema -> apiService.createSchema(schema)); - } - - @Test(priority = 1) - public void createSchemaAvroCheck() { - Schema schemaAvro = Schema.createSchemaAvro(); - navigateToSchemaRegistry(); - schemaRegistryList - .clickCreateSchema(); - schemaCreateForm - .setSubjectName(schemaAvro.getName()) - .setSchemaField(FileUtil.fileToString(schemaAvro.getValuePath())) - .selectSchemaTypeFromDropdown(schemaAvro.getType()) - .clickSubmitButton(); - schemaDetails - .waitUntilScreenReady(); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(schemaDetails.isSchemaHeaderVisible(schemaAvro.getName()), - String.format("isSchemaHeaderVisible()[%s]", schemaAvro.getName())); - 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_SCHEMA.getName()), - String.format("isSchemaVisible()[%s]", AVRO_SCHEMA.getName())); - SCHEMA_LIST.add(schemaAvro); - } - - @Test(priority = 2) - public void updateSchemaAvroCheck() { - AVRO_SCHEMA.setValuePath( - System.getProperty("user.dir") + "/src/main/resources/testdata/schemas/schema_avro_update.json"); - navigateToSchemaRegistryAndOpenDetails(AVRO_SCHEMA.getName()); - int latestVersion = schemaDetails - .getLatestVersion(); - 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(FileUtil.fileToString(AVRO_SCHEMA.getValuePath())) - .clickSubmitButton(); - schemaDetails - .waitUntilScreenReady(); - softly.assertEquals(schemaDetails.getLatestVersion(), latestVersion + 1, "getLatestVersion()"); - softly.assertEquals(schemaDetails.getCompatibility(), CompatibilityLevel.CompatibilityEnum.NONE.toString(), - "getCompatibility()"); - softly.assertAll(); - } - - @Test(priority = 3) - public void compareVersionsCheck() { - navigateToSchemaRegistryAndOpenDetails(AVRO_SCHEMA.getName()); - int latestVersion = schemaDetails - .waitUntilScreenReady() - .getLatestVersion(); - schemaDetails - .openCompareVersionMenu(); - int versionsNumberFromDdl = schemaCreateForm - .waitUntilScreenReady() - .openLeftVersionDdl() - .getVersionsNumberFromList(); - Assert.assertEquals(versionsNumberFromDdl, latestVersion, "Versions number is not matched"); - schemaCreateForm - .selectVersionFromDropDown(latestVersion) - .openRightVersionDdl() - .selectVersionFromDropDown(latestVersion - 1); - Assert.assertEquals(schemaCreateForm.getMarkedLinesNumber(), 20, "getMarkedLinesNumber()"); - } - - @Test(priority = 4) - public void deleteSchemaAvroCheck() { - navigateToSchemaRegistryAndOpenDetails(AVRO_SCHEMA.getName()); - schemaDetails - .removeSchema(); - schemaRegistryList - .waitUntilScreenReady(); - Assert.assertFalse(schemaRegistryList.isSchemaVisible(AVRO_SCHEMA.getName()), - String.format("isSchemaVisible()[%s]", AVRO_SCHEMA.getName())); - SCHEMA_LIST.remove(AVRO_SCHEMA); - } - - @Test(priority = 5) - public void createSchemaJsonCheck() { - Schema schemaJson = Schema.createSchemaJson(); - navigateToSchemaRegistry(); - schemaRegistryList - .clickCreateSchema(); - schemaCreateForm - .setSubjectName(schemaJson.getName()) - .setSchemaField(FileUtil.fileToString(schemaJson.getValuePath())) - .selectSchemaTypeFromDropdown(schemaJson.getType()) - .clickSubmitButton(); - schemaDetails - .waitUntilScreenReady(); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(schemaDetails.isSchemaHeaderVisible(schemaJson.getName()), - String.format("isSchemaHeaderVisible()[%s]", schemaJson.getName())); - 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_SCHEMA.getName()), - String.format("isSchemaVisible()[%s]", JSON_SCHEMA.getName())); - SCHEMA_LIST.add(schemaJson); - } - - @Test(priority = 6) - public void deleteSchemaJsonCheck() { - navigateToSchemaRegistryAndOpenDetails(JSON_SCHEMA.getName()); - schemaDetails - .removeSchema(); - schemaRegistryList - .waitUntilScreenReady(); - Assert.assertFalse(schemaRegistryList.isSchemaVisible(JSON_SCHEMA.getName()), - String.format("isSchemaVisible()[%s]", JSON_SCHEMA.getName())); - SCHEMA_LIST.remove(JSON_SCHEMA); - } - - @Test(priority = 7) - public void createSchemaProtobufCheck() { - Schema schemaProtobuf = Schema.createSchemaProtobuf(); - navigateToSchemaRegistry(); - schemaRegistryList - .clickCreateSchema(); - schemaCreateForm - .setSubjectName(schemaProtobuf.getName()) - .setSchemaField(FileUtil.fileToString(schemaProtobuf.getValuePath())) - .selectSchemaTypeFromDropdown(schemaProtobuf.getType()) - .clickSubmitButton(); - schemaDetails - .waitUntilScreenReady(); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(schemaDetails.isSchemaHeaderVisible(schemaProtobuf.getName()), - String.format("isSchemaHeaderVisible()[%s]", schemaProtobuf.getName())); - 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_SCHEMA.getName()), - String.format("isSchemaVisible()[%s]", PROTOBUF_SCHEMA.getName())); - SCHEMA_LIST.add(schemaProtobuf); - } - - @Test(priority = 8) - public void deleteSchemaProtobufCheck() { - navigateToSchemaRegistryAndOpenDetails(PROTOBUF_SCHEMA.getName()); - schemaDetails - .removeSchema(); - schemaRegistryList - .waitUntilScreenReady(); - Assert.assertFalse(schemaRegistryList.isSchemaVisible(PROTOBUF_SCHEMA.getName()), - String.format("isSchemaVisible()[%s]", PROTOBUF_SCHEMA.getName())); - SCHEMA_LIST.remove(PROTOBUF_SCHEMA); - } - - @AfterClass(alwaysRun = true) - public void afterClass() { - SCHEMA_LIST.forEach(schema -> apiService.deleteSchema(schema.getName())); - } -} diff --git a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/topics/MessagesTest.java b/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/topics/MessagesTest.java deleted file mode 100644 index 9622d9ef4..000000000 --- a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/topics/MessagesTest.java +++ /dev/null @@ -1,243 +0,0 @@ -package io.kafbat.ui.smokesuite.topics; - -import static io.kafbat.ui.models.Topic.createTopic; - -import io.kafbat.ui.BaseTest; -import io.kafbat.ui.models.Topic; -import io.kafbat.ui.screens.BasePage; -import io.kafbat.ui.screens.topics.TopicDetails; -import io.kafbat.ui.screens.topics.enums.SeekType; -import io.kafbat.ui.utilities.TimeUtil; -import io.qameta.allure.Issue; -import io.qameta.allure.Step; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.IntStream; -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; - -public class MessagesTest extends BaseTest { - - private static final Topic PRODUCE_MESSAGE_TOPIC = createTopic(); - private static final Topic CLEAR_MESSAGE_TOPIC = createTopic(); - private static final Topic CHECK_FILTERS_TOPIC = createTopic(); - private static final Topic RECREATE_TOPIC = createTopic(); - private static final Topic MESSAGES_COUNT_TOPIC = createTopic(); - private static final List TOPIC_LIST = new ArrayList<>(); - - @BeforeClass(alwaysRun = true) - public void beforeClass() { - TOPIC_LIST.addAll(List.of(PRODUCE_MESSAGE_TOPIC, CHECK_FILTERS_TOPIC, CLEAR_MESSAGE_TOPIC, - RECREATE_TOPIC, MESSAGES_COUNT_TOPIC)); - TOPIC_LIST.forEach(topic -> apiService.createTopic(topic)); - IntStream.range(1, 3).forEach(i -> apiService.sendMessage(CHECK_FILTERS_TOPIC)); - TimeUtil.waitUntilNewMinuteStarted(); - IntStream.range(1, 3).forEach(i -> apiService.sendMessage(CHECK_FILTERS_TOPIC)); - IntStream.range(1, 110).forEach(i -> apiService.sendMessage(MESSAGES_COUNT_TOPIC)); - } - - @Test(priority = 1) - public void produceMessageCheck() { - navigateToTopicsAndOpenDetails(PRODUCE_MESSAGE_TOPIC.getName()); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.MESSAGES); - produceMessage(PRODUCE_MESSAGE_TOPIC); - Assert.assertEquals(topicDetails.getMessageByKey(PRODUCE_MESSAGE_TOPIC.getMessageKey()).getValue(), - PRODUCE_MESSAGE_TOPIC.getMessageValue(), "message.getValue()"); - } - - @Test(priority = 2) - public void clearMessageCheck() { - navigateToTopicsAndOpenDetails(PRODUCE_MESSAGE_TOPIC.getName()); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.OVERVIEW); - int messageAmount = topicDetails.getMessageCountAmount(); - produceMessage(PRODUCE_MESSAGE_TOPIC); - Assert.assertEquals(topicDetails.getMessageCountAmount(), messageAmount + 1, "getMessageCountAmount()"); - topicDetails - .openDotMenu() - .clickClearMessagesMenu() - .clickConfirmBtnMdl() - .waitUntilScreenReady(); - Assert.assertEquals(topicDetails.getMessageCountAmount(), 0, "getMessageCountAmount()"); - } - - @Test(priority = 3) - public void clearTopicMessageCheck() { - navigateToTopicsAndOpenDetails(CLEAR_MESSAGE_TOPIC.getName()); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.OVERVIEW); - produceMessage(CLEAR_MESSAGE_TOPIC); - navigateToTopics(); - Assert.assertEquals(topicsList.getTopicItem(CLEAR_MESSAGE_TOPIC.getName()).getNumberOfMessages(), 1, - "getNumberOfMessages()"); - topicsList - .openDotMenuByTopicName(CLEAR_MESSAGE_TOPIC.getName()) - .clickClearMessagesBtn() - .clickConfirmBtnMdl(); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(topicsList.isAlertWithMessageVisible(BasePage.AlertHeader.SUCCESS, - String.format("%s messages have been successfully cleared!", CLEAR_MESSAGE_TOPIC.getName())), - "isAlertWithMessageVisible()"); - softly.assertEquals(topicsList.getTopicItem(CLEAR_MESSAGE_TOPIC.getName()).getNumberOfMessages(), 0, - "getNumberOfMessages()"); - softly.assertAll(); - } - - @Test(priority = 4) - public void purgeMessagePossibilityCheck() { - navigateToTopics(); - int messageAmount = topicsList.getTopicItem(CLEAR_MESSAGE_TOPIC.getName()).getNumberOfMessages(); - topicsList - .openTopic(CLEAR_MESSAGE_TOPIC.getName()); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.OVERVIEW); - produceMessage(CLEAR_MESSAGE_TOPIC); - navigateToTopics(); - Assert.assertEquals(topicsList.getTopicItem(CLEAR_MESSAGE_TOPIC.getName()).getNumberOfMessages(), - messageAmount + 1, "getNumberOfMessages()"); - topicsList - .getTopicItem(CLEAR_MESSAGE_TOPIC.getName()) - .selectItem(true) - .clickPurgeMessagesOfSelectedTopicsBtn(); - Assert.assertTrue(topicsList.isConfirmationMdlVisible(), "isConfirmationMdlVisible()"); - topicsList - .clickCancelBtnMdl() - .clickPurgeMessagesOfSelectedTopicsBtn() - .clickConfirmBtnMdl(); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(topicsList.isAlertWithMessageVisible(BasePage.AlertHeader.SUCCESS, - String.format("%s messages have been successfully cleared!", CLEAR_MESSAGE_TOPIC.getName())), - "isAlertWithMessageVisible()"); - softly.assertEquals(topicsList.getTopicItem(CLEAR_MESSAGE_TOPIC.getName()).getNumberOfMessages(), 0, - "getNumberOfMessages()"); - softly.assertAll(); - } - - @Test(priority = 6) - public void messageFilteringByOffsetCheck() { - navigateToTopicsAndOpenDetails(CHECK_FILTERS_TOPIC.getName()); - int nextOffset = topicDetails - .openDetailsTab(TopicDetails.TopicMenu.MESSAGES) - .selectSeekTypeDdlMessagesTab(SeekType.FROM_OFFSET) - .getAllMessages().stream() - .findFirst().orElseThrow().getOffset() + 1; - topicDetails - .setSeekTypeValueFldMessagesTab(String.valueOf(nextOffset)) - .clickSubmitFiltersBtnMessagesTab(); - SoftAssert softly = new SoftAssert(); - topicDetails.getAllMessages().forEach(message -> - softly.assertTrue(message.getOffset() >= nextOffset, - String.format("Expected offset not less: %s, but found: %s", nextOffset, message.getOffset()))); - softly.assertAll(); - } - - @Ignore - @Issue("https://github.com/kafbat/kafka-ui/issues/281") - @Issue("https://github.com/kafbat/kafka-ui/issues/282") - @Test(priority = 7) - public void messageFilteringByTimestampCheck() { - navigateToTopicsAndOpenDetails(CHECK_FILTERS_TOPIC.getName()); - LocalDateTime firstTimestamp = topicDetails - .openDetailsTab(TopicDetails.TopicMenu.MESSAGES) - .getMessageByOffset(0).getTimestamp(); - LocalDateTime nextTimestamp = topicDetails.getAllMessages().stream() - .filter(message -> message.getTimestamp().getMinute() != firstTimestamp.getMinute()) - .findFirst().orElseThrow().getTimestamp(); - topicDetails - .selectSeekTypeDdlMessagesTab(SeekType.SINCE_TIME) - .openCalendarSeekType() - .selectDateAndTimeByCalendar(nextTimestamp) - .clickSubmitFiltersBtnMessagesTab(); - SoftAssert softly = new SoftAssert(); - topicDetails.getAllMessages().forEach(message -> - softly.assertFalse(message.getTimestamp().isBefore(nextTimestamp), - String.format("Expected that %s is not before %s.", message.getTimestamp(), nextTimestamp))); - softly.assertAll(); - } - - @Test(priority = 8) - public void clearTopicMessageFromOverviewTabCheck() { - navigateToTopicsAndOpenDetails(CHECK_FILTERS_TOPIC.getName()); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.OVERVIEW) - .openDotMenu() - .clickClearMessagesMenu() - .clickConfirmBtnMdl(); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(topicDetails.isAlertWithMessageVisible(BasePage.AlertHeader.SUCCESS, - String.format("%s messages have been successfully cleared!", CHECK_FILTERS_TOPIC.getName())), - "isAlertWithMessageVisible()"); - softly.assertEquals(topicDetails.getMessageCountAmount(), 0, "getMessageCountAmount()"); - softly.assertAll(); - } - - @Test(priority = 9) - public void recreateTopicCheck() { - navigateToTopicsAndOpenDetails(RECREATE_TOPIC.getName()); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.OVERVIEW); - produceMessage(RECREATE_TOPIC); - navigateToTopics(); - Assert.assertEquals(topicsList.getTopicItem(RECREATE_TOPIC.getName()).getNumberOfMessages(), 1, - "getNumberOfMessages()"); - topicsList - .openDotMenuByTopicName(RECREATE_TOPIC.getName()) - .clickRecreateTopicBtn() - .clickConfirmBtnMdl(); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(topicDetails.isAlertWithMessageVisible(BasePage.AlertHeader.SUCCESS, - String.format("Topic %s successfully recreated!", RECREATE_TOPIC.getName())), - "isAlertWithMessageVisible()"); - softly.assertEquals(topicsList.getTopicItem(RECREATE_TOPIC.getName()).getNumberOfMessages(), 0, - "getNumberOfMessages()"); - softly.assertAll(); - } - - @Ignore - @Issue("https://github.com/kafbat/kafka-ui/issues/270") - @Test(priority = 10) - public void messagesCountPerPageCheck() { - navigateToTopicsAndOpenDetails(MESSAGES_COUNT_TOPIC.getName()); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.MESSAGES); - int messagesPerPage = topicDetails.getAllMessages().size(); - SoftAssert softly = new SoftAssert(); - softly.assertEquals(messagesPerPage, 100, "getAllMessages()"); - softly.assertFalse(topicDetails.isBackButtonEnabled(), "isBackButtonEnabled()"); - softly.assertTrue(topicDetails.isNextButtonEnabled(), "isNextButtonEnabled()"); - softly.assertAll(); - int lastOffsetOnPage = topicDetails.getAllMessages() - .get(messagesPerPage - 1).getOffset(); - topicDetails - .clickNextButton(); - softly.assertEquals(topicDetails.getAllMessages().stream().findFirst().orElseThrow().getOffset(), - lastOffsetOnPage - 1, "getAllMessages().findFirst().getOffset()"); - softly.assertTrue(topicDetails.isBackButtonEnabled(), "isBackButtonEnabled()"); - softly.assertFalse(topicDetails.isNextButtonEnabled(), "isNextButtonEnabled()"); - softly.assertAll(); - } - - @Step - private void produceMessage(Topic topic) { - topicDetails - .clickProduceMessageBtn(); - produceMessagePanel - .waitUntilScreenReady() - .setKeyField(topic.getMessageKey()) - .setValueFiled(topic.getMessageValue()) - .submitProduceMessage(); - topicDetails - .waitUntilScreenReady(); - } - - @AfterClass(alwaysRun = true) - public void afterClass() { - TOPIC_LIST.forEach(topic -> apiService.deleteTopic(topic.getName())); - } -} diff --git a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/topics/TopicsTest.java b/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/topics/TopicsTest.java deleted file mode 100644 index 7b606bdd9..000000000 --- a/e2e-tests/src/test/java/io/kafbat/ui/smokesuite/topics/TopicsTest.java +++ /dev/null @@ -1,492 +0,0 @@ -package io.kafbat.ui.smokesuite.topics; - -import static io.kafbat.ui.screens.BasePage.AlertHeader.SUCCESS; -import static io.kafbat.ui.variables.Common.FILTER_CODE_JSON; -import static io.kafbat.ui.variables.Common.FILTER_CODE_STRING; -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; -import static org.apache.commons.lang3.RandomUtils.nextInt; - -import com.codeborne.selenide.Condition; -import io.kafbat.ui.BaseTest; -import io.kafbat.ui.models.Topic; -import io.kafbat.ui.screens.topics.TopicDetails; -import io.kafbat.ui.screens.topics.enums.CleanupPolicyValue; -import io.kafbat.ui.screens.topics.enums.CustomParameterType; -import io.kafbat.ui.screens.topics.enums.MaxSizeOnDisk; -import io.kafbat.ui.screens.topics.enums.TimeToRetain; -import io.qameta.allure.Issue; -import java.util.ArrayList; -import java.util.List; -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; - -public class TopicsTest extends BaseTest { - - private static final Topic CREATE_TOPIC = Topic.createTopic() - .setCustomParameterType(CustomParameterType.COMPRESSION_TYPE) - .setCustomParameterValue("producer") - .setCleanupPolicyValue(CleanupPolicyValue.DELETE); - private static final Topic UPDATE_TOPIC = Topic.createTopic() - .setCleanupPolicyValue(CleanupPolicyValue.DELETE) - .setTimeToRetain(TimeToRetain.BTN_7_DAYS) - .setMaxSizeOnDisk(MaxSizeOnDisk.NOT_SET) - .setMaxMessageBytes("1048588") - .setMessageKey(randomAlphabetic(5)) - .setMessageValue(randomAlphabetic(10)); - private static final Topic DELETE_TOPIC = Topic.createTopic(); - private static final Topic SETTINGS_TOPIC = Topic.createTopic() - .setMaxMessageBytes("1000012") - .setMaxSizeOnDisk(MaxSizeOnDisk.NOT_SET); - private static final Topic FILTERS_TOPIC = Topic.createTopic(); - private static final List TOPIC_LIST = new ArrayList<>(); - - @BeforeClass(alwaysRun = true) - public void beforeClass() { - TOPIC_LIST.addAll(List.of(UPDATE_TOPIC, DELETE_TOPIC, FILTERS_TOPIC)); - TOPIC_LIST.forEach(topic -> apiService.createTopic(topic)); - } - - @Test(priority = 1) - public void createTopicCheck() { - navigateToTopics(); - topicsList - .clickAddTopicBtn(); - topicCreateEditForm - .waitUntilScreenReady() - .setTopicName(CREATE_TOPIC.getName()) - .setNumberOfPartitions(CREATE_TOPIC.getNumberOfPartitions()) - .selectCleanupPolicy(CREATE_TOPIC.getCleanupPolicyValue()) - .clickSaveTopicBtn(); - navigateToTopicsAndOpenDetails(CREATE_TOPIC.getName()); - SoftAssert softly = new SoftAssert(); - softly.assertTrue(topicDetails.isTopicHeaderVisible(CREATE_TOPIC.getName()), - String.format("isTopicHeaderVisible()[%s]", CREATE_TOPIC.getName())); - softly.assertEquals(topicDetails.getCleanUpPolicy(), CREATE_TOPIC.getCleanupPolicyValue().toString(), - "getCleanUpPolicy()"); - softly.assertEquals(topicDetails.getPartitions(), CREATE_TOPIC.getNumberOfPartitions(), "getPartitions()"); - softly.assertAll(); - navigateToTopics(); - Assert.assertTrue(topicsList.isTopicVisible(CREATE_TOPIC.getName()), - String.format("isTopicVisible()[%s]", CREATE_TOPIC.getName())); - TOPIC_LIST.add(CREATE_TOPIC); - } - - @Test(priority = 2) - void availableOperationsCheck() { - navigateToTopics(); - topicsList - .getTopicItem(UPDATE_TOPIC.getName()) - .selectItem(true); - verifyElementsCondition(topicsList.getActionButtons(), Condition.enabled); - topicsList - .getTopicItem(FILTERS_TOPIC.getName()) - .selectItem(true); - Assert.assertFalse(topicsList.isCopySelectedTopicBtnEnabled(), "isCopySelectedTopicBtnEnabled()"); - } - - @Ignore - @Issue("https://github.com/kafbat/kafka-ui/issues/279") - @Test(priority = 3) - public void customParametersWithinEditExistingTopicCheck() { - navigateToTopicsAndOpenDetails(UPDATE_TOPIC.getName()); - topicDetails - .openDotMenu() - .clickEditSettingsMenu(); - SoftAssert softly = new SoftAssert(); - topicCreateEditForm - .waitUntilScreenReady() - .clickAddCustomParameterTypeButton() - .openCustomParameterTypeDdl() - .getAllDdlOptions() - .asFixedIterable() - .forEach(option -> - softly.assertTrue(!option.is(Condition.attribute("disabled")), - option.getText() + " is enabled:")); - softly.assertAll(); - } - - @Test(priority = 4) - public void updateTopicCheck() { - navigateToTopicsAndOpenDetails(UPDATE_TOPIC.getName()); - topicDetails - .openDotMenu() - .clickEditSettingsMenu(); - topicCreateEditForm - .waitUntilScreenReady(); - SoftAssert softly = new SoftAssert(); - softly.assertEquals(topicCreateEditForm.getCleanupPolicy(), - UPDATE_TOPIC.getCleanupPolicyValue().getVisibleText(), "getCleanupPolicy()"); - softly.assertEquals(topicCreateEditForm.getTimeToRetain(), - UPDATE_TOPIC.getTimeToRetain().getValue(), "getTimeToRetain()"); - softly.assertEquals(topicCreateEditForm.getMaxSizeOnDisk(), - UPDATE_TOPIC.getMaxSizeOnDisk().getVisibleText(), "getMaxSizeOnDisk()"); - softly.assertEquals(topicCreateEditForm.getMaxMessageBytes(), - UPDATE_TOPIC.getMaxMessageBytes(), "getMaxMessageBytes()"); - softly.assertAll(); - UPDATE_TOPIC - .setCleanupPolicyValue(CleanupPolicyValue.COMPACT) - .setTimeToRetain(TimeToRetain.BTN_2_DAYS) - .setMaxSizeOnDisk(MaxSizeOnDisk.SIZE_50_GB).setMaxMessageBytes("1048589"); - topicCreateEditForm - .selectCleanupPolicy((UPDATE_TOPIC.getCleanupPolicyValue())) - .setTimeToRetainDataByButtons(UPDATE_TOPIC.getTimeToRetain()) - .setMaxSizeOnDiskInGB(UPDATE_TOPIC.getMaxSizeOnDisk()) - .setMaxMessageBytes(UPDATE_TOPIC.getMaxMessageBytes()) - .clickSaveTopicBtn(); - softly.assertTrue(topicDetails.isAlertWithMessageVisible(SUCCESS, "Topic successfully updated."), - "isAlertWithMessageVisible()"); - softly.assertTrue(topicDetails.isTopicHeaderVisible(UPDATE_TOPIC.getName()), - String.format("isTopicHeaderVisible()[%s]", UPDATE_TOPIC.getName())); - softly.assertAll(); - topicDetails - .waitUntilScreenReady(); - navigateToTopicsAndOpenDetails(UPDATE_TOPIC.getName()); - topicDetails - .openDotMenu() - .clickEditSettingsMenu(); - softly.assertFalse(topicCreateEditForm.isNameFieldEnabled(), "isNameFieldEnabled()"); - softly.assertEquals(topicCreateEditForm.getCleanupPolicy(), - UPDATE_TOPIC.getCleanupPolicyValue().getVisibleText(), "getCleanupPolicy()"); - softly.assertEquals(topicCreateEditForm.getTimeToRetain(), - UPDATE_TOPIC.getTimeToRetain().getValue(), "getTimeToRetain()"); - softly.assertEquals(topicCreateEditForm.getMaxSizeOnDisk(), - UPDATE_TOPIC.getMaxSizeOnDisk().getVisibleText(), "getMaxSizeOnDisk()"); - softly.assertEquals(topicCreateEditForm.getMaxMessageBytes(), - UPDATE_TOPIC.getMaxMessageBytes(), "getMaxMessageBytes()"); - softly.assertAll(); - } - - @Test(priority = 5) - public void removeTopicFromListCheck() { - navigateToTopics(); - topicsList - .openDotMenuByTopicName(UPDATE_TOPIC.getName()) - .clickRemoveTopicBtn() - .clickConfirmBtnMdl(); - Assert.assertTrue(topicsList.isAlertWithMessageVisible(SUCCESS, - String.format("Topic %s successfully deleted!", UPDATE_TOPIC.getName())), - "isAlertWithMessageVisible()"); - TOPIC_LIST.remove(UPDATE_TOPIC); - } - - @Test(priority = 6) - public void deleteTopicCheck() { - navigateToTopicsAndOpenDetails(DELETE_TOPIC.getName()); - topicDetails - .openDotMenu() - .clickDeleteTopicMenu() - .clickConfirmBtnMdl(); - navigateToTopics(); - Assert.assertFalse(topicsList.isTopicVisible(DELETE_TOPIC.getName()), - String.format("isTopicVisible()[%s]", DELETE_TOPIC.getName())); - TOPIC_LIST.remove(DELETE_TOPIC); - } - - @Test(priority = 7) - public void redirectToConsumerFromTopicCheck() { - 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(); - } - - @Test(priority = 8) - public void createTopicPossibilityCheck() { - navigateToTopics(); - topicsList - .clickAddTopicBtn(); - topicCreateEditForm - .waitUntilScreenReady(); - Assert.assertFalse(topicCreateEditForm.isCreateTopicButtonEnabled(), "isCreateTopicButtonEnabled()"); - topicCreateEditForm - .setTopicName("testName"); - Assert.assertTrue(topicCreateEditForm.isCreateTopicButtonEnabled(), "isCreateTopicButtonEnabled()"); - topicCreateEditForm - .setTopicName(null) - .setNumberOfPartitions(nextInt(1, 10)); - Assert.assertFalse(topicCreateEditForm.isCreateTopicButtonEnabled(), "isCreateTopicButtonEnabled()"); - topicCreateEditForm - .setTopicName("testName"); - Assert.assertTrue(topicCreateEditForm.isCreateTopicButtonEnabled(), "isCreateTopicButtonEnabled()"); - } - - @Test(priority = 9) - public void timeToRetainDataCustomValueWithEditingTopicCheck() { - Topic retainDataTopic = Topic.createTopic() - .setTimeToRetainData("86400000"); - navigateToTopics(); - topicsList - .clickAddTopicBtn(); - topicCreateEditForm - .waitUntilScreenReady() - .setTopicName(retainDataTopic.getName()) - .setNumberOfPartitions(1) - .setTimeToRetainDataInMs("604800000"); - Assert.assertEquals(topicCreateEditForm.getTimeToRetain(), "604800000", "getTimeToRetain()"); - topicCreateEditForm - .setTimeToRetainDataInMs(retainDataTopic.getTimeToRetainData()) - .clickSaveTopicBtn(); - topicDetails - .waitUntilScreenReady() - .openDotMenu() - .clickEditSettingsMenu(); - Assert.assertEquals(topicCreateEditForm.getTimeToRetain(), retainDataTopic.getTimeToRetainData(), - "getTimeToRetain()"); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.SETTINGS); - Assert.assertEquals(topicDetails.getSettingsGridValueByKey("retention.ms"), retainDataTopic.getTimeToRetainData(), - "getTimeToRetainData()"); - TOPIC_LIST.add(retainDataTopic); - } - - @Test(priority = 10) - public void customParametersWithinCreateNewTopicCheck() { - navigateToTopics(); - topicsList - .clickAddTopicBtn(); - topicCreateEditForm - .waitUntilScreenReady() - .setTopicName(CREATE_TOPIC.getName()) - .clickAddCustomParameterTypeButton() - .setCustomParameterType(CREATE_TOPIC.getCustomParameterType()); - Assert.assertTrue(topicCreateEditForm.isDeleteCustomParameterButtonEnabled(), - "isDeleteCustomParameterButtonEnabled()"); - topicCreateEditForm - .clearCustomParameterValue(); - Assert.assertTrue(topicCreateEditForm.isValidationMessageCustomParameterValueVisible(), - "isValidationMessageCustomParameterValueVisible()"); - } - - @Test(priority = 11) - public void topicListElementsCheck() { - navigateToTopics(); - verifyElementsCondition(topicsList.getAllVisibleElements(), Condition.visible); - verifyElementsCondition(topicsList.getAllEnabledElements(), Condition.enabled); - } - - @Test(priority = 12) - public void addNewFilterWithinTopicCheck() { - String filterName = randomAlphabetic(5); - navigateToTopicsAndOpenDetails(FILTERS_TOPIC.getName()); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.MESSAGES) - .clickMessagesAddFiltersBtn() - .waitUntilAddFiltersMdlVisible(); - verifyElementsCondition(topicDetails.getAllAddFilterModalVisibleElements(), Condition.visible); - verifyElementsCondition(topicDetails.getAllAddFilterModalEnabledElements(), Condition.enabled); - verifyElementsCondition(topicDetails.getAllAddFilterModalDisabledElements(), Condition.disabled); - Assert.assertFalse(topicDetails.isSaveThisFilterCheckBoxSelected(), "isSaveThisFilterCheckBoxSelected()"); - topicDetails - .setFilterCodeFldAddFilterMdl(FILTER_CODE_STRING) - .setDisplayNameFldAddFilterMdl(filterName); - Assert.assertTrue(topicDetails.isAddFilterBtnAddFilterMdlEnabled(), "isAddFilterBtnAddFilterMdlEnabled()"); - topicDetails.clickAddFilterBtnAndCloseMdl(true); - Assert.assertTrue(topicDetails.isActiveFilterVisible(filterName), - String.format("isActiveFilterVisible()[%s]", filterName)); - } - - @Test(priority = 13) - public void editActiveSmartFilterCheck() { - String filterCode = FILTER_CODE_STRING; - String filterName = randomAlphabetic(5); - navigateToTopicsAndOpenDetails(FILTERS_TOPIC.getName()); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.MESSAGES) - .clickMessagesAddFiltersBtn() - .waitUntilAddFiltersMdlVisible() - .setFilterCodeFldAddFilterMdl(filterCode) - .setDisplayNameFldAddFilterMdl(filterName) - .clickAddFilterBtnAndCloseMdl(true) - .clickEditActiveFilterBtn(filterName) - .waitUntilAddFiltersMdlVisible(); - SoftAssert softly = new SoftAssert(); - softly.assertEquals(topicDetails.getFilterCodeValue(), filterCode, "getFilterCodeValue()"); - softly.assertEquals(topicDetails.getFilterNameValue(), filterName, "getFilterNameValue()"); - softly.assertAll(); - String newFilterName = randomAlphabetic(5); - topicDetails - .setFilterCodeFldAddFilterMdl(FILTER_CODE_JSON) - .setDisplayNameFldAddFilterMdl(newFilterName) - .clickSaveFilterBtnAndCloseMdl(true); - Assert.assertTrue(topicDetails.isActiveFilterVisible(newFilterName), - String.format("isActiveFilterVisible()[%s]", newFilterName)); - } - - @Test(priority = 14) - public void saveSmartFilterCheck() { - String filterName = randomAlphabetic(5); - navigateToTopicsAndOpenDetails(FILTERS_TOPIC.getName()); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.MESSAGES) - .clickMessagesAddFiltersBtn() - .waitUntilAddFiltersMdlVisible() - .setFilterCodeFldAddFilterMdl(FILTER_CODE_JSON) - .selectSaveThisFilterCheckboxMdl(true) - .setDisplayNameFldAddFilterMdl(filterName); - Assert.assertTrue(topicDetails.isAddFilterBtnAddFilterMdlEnabled(), - "isAddFilterBtnAddFilterMdlEnabled()"); - topicDetails - .clickAddFilterBtnAndCloseMdl(false); - Assert.assertTrue(topicDetails.isFilterVisibleAtSavedFiltersMdl(filterName), - String.format("isFilterVisibleAtSavedFiltersMdl()[%s]", filterName)); - } - - @Test(priority = 15) - public void applySavedFilterWithinTopicMessagesCheck() { - String filterName = randomAlphabetic(5); - navigateToTopicsAndOpenDetails(FILTERS_TOPIC.getName()); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.MESSAGES) - .clickMessagesAddFiltersBtn() - .waitUntilAddFiltersMdlVisible() - .setFilterCodeFldAddFilterMdl(FILTER_CODE_JSON) - .selectSaveThisFilterCheckboxMdl(true) - .setDisplayNameFldAddFilterMdl(filterName) - .clickAddFilterBtnAndCloseMdl(false) - .selectFilterAtSavedFiltersMdl(filterName); - Assert.assertTrue(topicDetails.isActiveFilterVisible(filterName), - String.format("isActiveFilterVisible()[%s]", filterName)); - } - - @Test(priority = 16) - public void showInternalTopicsButtonCheck() { - navigateToTopics(); - topicsList - .setShowInternalRadioButton(true); - Assert.assertFalse(topicsList.getInternalTopics().isEmpty(), "getInternalTopics().isEmpty()"); - topicsList - .goToLastPage(); - Assert.assertFalse(topicsList.getNonInternalTopics().isEmpty(), "getNonInternalTopics().isEmpty()"); - topicsList - .setShowInternalRadioButton(false); - SoftAssert softly = new SoftAssert(); - softly.assertEquals(topicsList.getInternalTopics().size(), 0, "getInternalTopics().size()"); - softly.assertTrue(!topicsList.getNonInternalTopics().isEmpty(), "getNonInternalTopics().isEmpty()"); - softly.assertAll(); - } - - @Test(priority = 17) - public void internalTopicsNamingCheck() { - navigateToTopics(); - SoftAssert softly = new SoftAssert(); - topicsList - .setShowInternalRadioButton(true) - .getInternalTopics() - .forEach(topic -> softly.assertTrue(topic.getName().startsWith("_"), - String.format("'%s' starts with '_'", topic.getName()))); - softly.assertAll(); - } - - @Test(priority = 18) - public void retentionBytesAccordingToMaxSizeOnDiskCheck() { - navigateToTopics(); - topicsList - .clickAddTopicBtn(); - topicCreateEditForm - .waitUntilScreenReady() - .setTopicName(SETTINGS_TOPIC.getName()) - .setNumberOfPartitions(SETTINGS_TOPIC.getNumberOfPartitions()) - .setMaxMessageBytes(SETTINGS_TOPIC.getMaxMessageBytes()) - .clickSaveTopicBtn(); - topicDetails - .waitUntilScreenReady(); - TOPIC_LIST.add(SETTINGS_TOPIC); - topicDetails - .openDetailsTab(TopicDetails.TopicMenu.SETTINGS); - topicSettingsTab - .waitUntilScreenReady(); - SoftAssert softly = new SoftAssert(); - softly.assertEquals(topicSettingsTab.getValueByKey("retention.bytes"), - SETTINGS_TOPIC.getMaxSizeOnDisk().getOptionValue(), "getValueOfKey(retention.bytes)"); - softly.assertEquals(topicSettingsTab.getValueByKey("max.message.bytes"), - SETTINGS_TOPIC.getMaxMessageBytes(), "getValueOfKey(max.message.bytes)"); - softly.assertAll(); - SETTINGS_TOPIC - .setMaxSizeOnDisk(MaxSizeOnDisk.SIZE_1_GB) - .setMaxMessageBytes("1000056"); - topicDetails - .openDotMenu() - .clickEditSettingsMenu(); - topicCreateEditForm - .waitUntilScreenReady() - .setMaxSizeOnDiskInGB(SETTINGS_TOPIC.getMaxSizeOnDisk()) - .setMaxMessageBytes(SETTINGS_TOPIC.getMaxMessageBytes()) - .clickSaveTopicBtn(); - topicDetails - .waitUntilScreenReady() - .openDetailsTab(TopicDetails.TopicMenu.SETTINGS); - topicSettingsTab - .waitUntilScreenReady(); - softly.assertEquals(topicSettingsTab.getValueByKey("retention.bytes"), - SETTINGS_TOPIC.getMaxSizeOnDisk().getOptionValue(), "getMaxSizeOnDisk()"); - softly.assertEquals(topicSettingsTab.getValueByKey("max.message.bytes"), - SETTINGS_TOPIC.getMaxMessageBytes(), "getMaxMessageBytes()"); - softly.assertAll(); - } - - @Test(priority = 19) - public void recreateTopicFromTopicProfileCheck() { - Topic recreateTopic = Topic.createTopic(); - navigateToTopics(); - topicsList - .clickAddTopicBtn(); - topicCreateEditForm - .waitUntilScreenReady() - .setTopicName(recreateTopic.getName()) - .setNumberOfPartitions(recreateTopic.getNumberOfPartitions()) - .clickSaveTopicBtn(); - topicDetails - .waitUntilScreenReady(); - TOPIC_LIST.add(recreateTopic); - topicDetails - .openDotMenu() - .clickRecreateTopicMenu(); - Assert.assertTrue(topicDetails.isConfirmationMdlVisible(), "isConfirmationMdlVisible()"); - topicDetails - .clickConfirmBtnMdl(); - Assert.assertTrue(topicDetails.isAlertWithMessageVisible(SUCCESS, - String.format("Topic %s successfully recreated!", recreateTopic.getName())), - "isAlertWithMessageVisible()"); - } - - @Test(priority = 20) - public void copyTopicPossibilityCheck() { - Topic copyTopic = Topic.createTopic(); - navigateToTopics(); - topicsList - .getAnyNonInternalTopic() - .selectItem(true) - .clickCopySelectedTopicBtn(); - topicCreateEditForm - .waitUntilScreenReady(); - Assert.assertFalse(topicCreateEditForm.isCreateTopicButtonEnabled(), "isCreateTopicButtonEnabled()"); - topicCreateEditForm - .setTopicName(copyTopic.getName()) - .setNumberOfPartitions(copyTopic.getNumberOfPartitions()) - .clickSaveTopicBtn(); - topicDetails - .waitUntilScreenReady(); - TOPIC_LIST.add(copyTopic); - Assert.assertTrue(topicDetails.isTopicHeaderVisible(copyTopic.getName()), - String.format("isTopicHeaderVisible()[%s]", copyTopic.getName())); - } - - @AfterClass(alwaysRun = true) - public void afterClass() { - TOPIC_LIST.forEach(topic -> apiService.deleteTopic(topic.getName())); - } -} diff --git a/e2e-tests/src/test/resources/regression.xml b/e2e-tests/src/test/resources/regression.xml deleted file mode 100644 index 65977da9f..000000000 --- a/e2e-tests/src/test/resources/regression.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/e2e-tests/src/test/resources/sanity.xml b/e2e-tests/src/test/resources/sanity.xml deleted file mode 100644 index c4c4ac5a2..000000000 --- a/e2e-tests/src/test/resources/sanity.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/e2e-tests/src/test/resources/smoke.xml b/e2e-tests/src/test/resources/smoke.xml deleted file mode 100644 index 0916aa18d..000000000 --- a/e2e-tests/src/test/resources/smoke.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d94f6310d..d40fdcbd8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,6 @@ azure-identity = '1.15.4' apache-commons-lang3 = '3.18.0' apache-commons-text = '1.13.1' -apache-commons-io = '2.18.0' apache-commons-pool2 = '2.12.1' apache-datasketches = '3.1.0' apache-commons-compress = '1.26.0' @@ -36,11 +35,6 @@ antlr = '4.13.2' json-schema-validator = '2.2.14' checkstyle = '10.24.0' -allure = '2.29.1' -selenide = '7.2.3' -testng = '7.10.0' -bonigarcia-webdrivermanager = '6.1.1' -aspectj = '1.9.21' prometheus = '1.3.6' lucene = '10.2.2' @@ -50,10 +44,8 @@ spring-dependency-management = { id = 'io.spring.dependency-management', version git-properties = { id = 'com.gorylenko.gradle-git-properties', version = '2.4.2' } openapi-validator = {id = "org.openapitools.openapistylevalidator", version = "1.10" } openapi-generator = { id = 'org.openapi.generator', version = '7.13.0' } -allure = { id = 'io.qameta.allure', version = '2.10.0' } nexus-publish-plugin = { id = 'io.github.gradle-nexus.publish-plugin', version = '1.1.0' } node-gradle = { id = 'com.github.node-gradle.node', version = '7.1.0' } -#jib = { id = 'com.google.cloud.tools.jib', version = '3.4.4' } docker-remote-api = { id = 'com.bmuschko.docker-remote-api', version = '9.4.0' } sonarqube = { id = "org.sonarqube", version = "6.0.1.5171" } @@ -86,11 +78,9 @@ kafka-clients = { module = 'org.apache.kafka:kafka-clients', version.ref = 'conf apache-commons = { module = 'org.apache.commons:commons-lang3', version.ref = 'apache-commons-lang3' } apache-commons-text = { module = 'org.apache.commons:commons-text', version.ref = 'apache-commons-text' } apache-commons-compress = { module = 'org.apache.commons:commons-compress', version.ref = 'apache-commons-compress' } -apache-commons-io = { module = 'commons-io:commons-io', version.ref = 'apache-commons-io' } apache-commons-pool2 = { module = 'org.apache.commons:commons-pool2', version.ref = 'apache-commons-pool2' } apache-datasketches = { module = 'org.apache.datasketches:datasketches-java', version.ref = 'apache-datasketches' } apache-avro = { module = 'org.apache.avro:avro', version.ref = 'avro' } -apache-kafka = { module = 'org.apache.kafka:kafka_2.13', version.ref = 'confluent-ccs' } confluent-schema-registry-client = { module = 'io.confluent:kafka-schema-registry-client', version.ref = 'confluent' } confluent-avro-serializer = { module = 'io.confluent:kafka-avro-serializer', version.ref = 'confluent' } @@ -126,15 +116,6 @@ bytebuddy = { module = 'net.bytebuddy:byte-buddy', version.ref = 'byte-buddy' } assertj = { module = 'org.assertj:assertj-core', version.ref = 'assertj' } jsonschemavalidator = { module = 'com.github.java-json-tools:json-schema-validator', version.ref = 'json-schema-validator' } -allure-testng = { module = 'io.qameta.allure:allure-testng', version.ref = 'allure' } -allure-selenide = { module = 'io.qameta.allure:allure-selenide', version.ref = 'allure' } - -codeborne-selenide = { module = 'com.codeborne:selenide', version.ref = 'selenide' } -testng = { module = 'org.testng:testng', version.ref = 'testng' } -aspectj = { module = 'org.aspectj:aspectjweaver', version.ref = 'aspectj' } -bonigarcia-webdrivermanager = { module = 'io.github.bonigarcia:webdrivermanager', version.ref = 'bonigarcia-webdrivermanager' } -netty-resolver-dns-native = { module = 'io.netty:netty-resolver-dns-native-macos' } - # test scope bouncycastle-bcpkix = { module = 'org.bouncycastle:bcpkix-jdk18on', version = '1.80' } @@ -151,7 +132,6 @@ prometheus-metrics-exporter-pushgateway = { module = 'io.prometheus:prometheus- snappy = {module = 'org.xerial.snappy:snappy-java', version = '1.1.10.7'} - lucene = {module = 'org.apache.lucene:lucene-core', version.ref = 'lucene'} lucene-queryparser = {module = 'org.apache.lucene:lucene-queryparser', version.ref = 'lucene'} -lucene-analysis-common = {module = 'org.apache.lucene:lucene-analysis-common', version.ref = 'lucene'} \ No newline at end of file +lucene-analysis-common = {module = 'org.apache.lucene:lucene-analysis-common', version.ref = 'lucene'} diff --git a/serde-api/src/main/java/io/kafbat/ui/serde/api/Serde.java b/serde-api/src/main/java/io/kafbat/ui/serde/api/Serde.java index 5dc1057a2..32ea45048 100644 --- a/serde-api/src/main/java/io/kafbat/ui/serde/api/Serde.java +++ b/serde-api/src/main/java/io/kafbat/ui/serde/api/Serde.java @@ -126,6 +126,7 @@ interface Serializer { /** * Serializes input string to bytes. Uses provided headers for additional information. * @param input string entered by user into UI text field.
Note: this input is not formatted in any way. + * @param headers headers entered by user into UI text field.
Note: this input is not formatted in any way. * @return serialized bytes. Can be null if input is null or empty string. */ default byte[] serialize(String input, Headers headers) { diff --git a/settings.gradle b/settings.gradle index fa0dcb978..59cb04ca6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,5 +11,4 @@ include "contract-typespec" include "serde-api" include "api" include "frontend" -include "e2e-tests"