فهرست منبع

Merge branch 'master' into vlad/develop

VladSenyuta 2 سال پیش
والد
کامیت
6b5f53a27a
16فایلهای تغییر یافته به همراه176 افزوده شده و 91 حذف شده
  1. 9 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/consumers/ConsumersList.java
  2. 11 0
      kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/variables/Url.java
  3. 60 2
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/BaseTest.java
  4. 18 12
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/manualSuite/suite/TopicsTest.java
  5. 31 0
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/SmokeTest.java
  6. 0 10
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/brokers/BrokersTest.java
  7. 0 19
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/connectors/ConnectorsTest.java
  8. 2 7
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/ksqlDb/KsqlDbTest.java
  9. 0 19
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/schemas/SchemasTest.java
  10. 0 15
      kafka-ui-e2e-checks/src/test/java/com/provectus/kafka/ui/smokeSuite/topics/MessagesTest.java
  11. 1 0
      kafka-ui-react-app/src/components/Topics/Topic/Messages/Filters/Filters.styled.ts
  12. 2 2
      kafka-ui-react-app/src/components/common/Alert/Alert.styled.ts
  13. 2 2
      kafka-ui-react-app/src/components/common/Alert/Alert.tsx
  14. 2 1
      kafka-ui-react-app/src/lib/errorHandling.tsx
  15. 30 1
      kafka-ui-react-app/src/lib/hooks/__tests__/useDataSaver.spec.tsx
  16. 8 1
      kafka-ui-react-app/src/lib/hooks/useDataSaver.ts

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

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

+ 11 - 0
kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/variables/Url.java

@@ -0,0 +1,11 @@
+package com.provectus.kafka.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?perPage=25";
+    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/connectors";
+    String KSQL_DB_LIST_URL = "http://%s:8080/ui/clusters/local/ksqldb/tables";
+}

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

@@ -22,7 +22,7 @@ import org.testng.asserts.SoftAssert;
 import java.time.Duration;
 import java.util.List;
 
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.TOPICS;
+import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.*;
 import static com.provectus.kafka.ui.settings.BaseSource.*;
 import static com.provectus.kafka.ui.settings.drivers.LocalWebDriver.*;
 import static com.provectus.kafka.ui.utilities.qaseUtils.QaseSetup.qaseIntegrationSetup;
@@ -108,6 +108,14 @@ public abstract class BaseTest extends Facade {
     public void afterMethod() {
         browserClear();
     }
+    
+    @Step
+    protected void navigateToBrokers() {
+        naviSideBar
+                .openSideMenu(BROKERS);
+        brokersList
+                .waitUntilScreenReady();
+    }
 
     @Step
     protected void navigateToTopics() {
@@ -127,7 +135,57 @@ public abstract class BaseTest extends Facade {
         topicDetails
                 .waitUntilScreenReady();
     }
-
+    
+    @Step
+    protected void navigateToConsumers() {
+        naviSideBar
+                .openSideMenu(CONSUMERS);
+        consumersList
+                .waitUntilScreenReady();
+    }
+    
+    @Step
+    protected void navigateToSchemaRegistry() {
+        naviSideBar
+                .openSideMenu(SCHEMA_REGISTRY);
+        schemaRegistryList
+                .waitUntilScreenReady();
+    }
+    
+    @Step
+    protected void navigateToSchemaRegistryAndOpenDetails(String schemaName) {
+        navigateToSchemaRegistry();
+        schemaRegistryList
+                .openSchema(schemaName);
+        schemaDetails
+                .waitUntilScreenReady();
+    }
+    
+    @Step
+    protected void navigateToConnectors() {
+        naviSideBar
+                .openSideMenu(KAFKA_CONNECT);
+        kafkaConnectList
+                .waitUntilScreenReady();
+    }
+    
+    @Step
+    protected void navigateToConnectorsAndOpenDetails(String connectorName) {
+        navigateToConnectors();
+        kafkaConnectList
+                .openConnector(connectorName);
+        connectorDetails
+                .waitUntilScreenReady();
+    }
+    
+    @Step
+    protected void navigateToKsqlDb() {
+        naviSideBar
+                .openSideMenu(KSQL_DB);
+        ksqlDbList
+                .waitUntilScreenReady();
+    }
+    
     @Step
     protected void verifyElementsCondition(List<SelenideElement> elementList, Condition expectedCondition) {
         SoftAssert softly = new SoftAssert();

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

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

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

@@ -1,13 +1,20 @@
 package com.provectus.kafka.ui.smokeSuite;
 
 import com.codeborne.selenide.Condition;
+import com.codeborne.selenide.WebDriverRunner;
 import com.provectus.kafka.ui.BaseTest;
+import io.qameta.allure.Step;
 import io.qase.api.annotation.QaseId;
+import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static com.provectus.kafka.ui.settings.BaseSource.BROWSER;
+import static com.provectus.kafka.ui.variables.Browser.LOCAL;
+import static com.provectus.kafka.ui.variables.Url.*;
+
 public class SmokeTest extends BaseTest {
 
     @QaseId(198)
@@ -20,4 +27,28 @@ public class SmokeTest extends BaseTest {
                 Stream.concat(topPanel.getAllEnabledElements().stream(), naviSideBar.getAllMenuButtons().stream())
                         .collect(Collectors.toList()), Condition.enabled);
     }
+
+    @QaseId(45)
+    @Test
+    public void checkUrlWhileNavigating() {
+        navigateToBrokers();
+        verifyCurrentUrl(BROKERS_LIST_URL);
+        navigateToTopics();
+        verifyCurrentUrl(TOPICS_LIST_URL);
+        navigateToConsumers();
+        verifyCurrentUrl(CONSUMERS_LIST_URL);
+        navigateToSchemaRegistry();
+        verifyCurrentUrl(SCHEMA_REGISTRY_LIST_URL);
+        navigateToConnectors();
+        verifyCurrentUrl(KAFKA_CONNECT_LIST_URL);
+        navigateToKsqlDb();
+        verifyCurrentUrl(KSQL_DB_LIST_URL);
+    }
+
+    @Step
+    private void verifyCurrentUrl(String expectedUrl) {
+        String host = BROWSER.equals(LOCAL) ? "localhost" : "host.testcontainers.internal";
+        Assert.assertEquals(WebDriverRunner.getWebDriver().getCurrentUrl(),
+                String.format(expectedUrl, host), "getCurrentUrl()");
+    }
 }

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

@@ -2,12 +2,10 @@ package com.provectus.kafka.ui.smokeSuite.brokers;
 
 import com.codeborne.selenide.Condition;
 import com.provectus.kafka.ui.BaseTest;
-import io.qameta.allure.Step;
 import io.qase.api.annotation.QaseId;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.BROKERS;
 import static com.provectus.kafka.ui.pages.brokers.BrokersDetails.DetailsTab.CONFIGS;
 
 public class BrokersTest extends BaseTest {
@@ -40,12 +38,4 @@ public class BrokersTest extends BaseTest {
         verifyElementsCondition(brokersConfigTab.getEditButtons(), Condition.enabled);
         Assert.assertTrue(brokersConfigTab.isSearchByKeyVisible(), "isSearchByKeyVisible()");
     }
-
-    @Step
-    private void navigateToBrokers() {
-        naviSideBar
-                .openSideMenu(BROKERS);
-        brokersList
-                .waitUntilScreenReady();
-    }
 }

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

@@ -3,7 +3,6 @@ package com.provectus.kafka.ui.smokeSuite.connectors;
 import com.provectus.kafka.ui.BaseTest;
 import com.provectus.kafka.ui.models.Connector;
 import com.provectus.kafka.ui.models.Topic;
-import io.qameta.allure.Step;
 import io.qase.api.annotation.QaseId;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
@@ -14,7 +13,6 @@ import java.util.ArrayList;
 import java.util.List;
 
 import static com.provectus.kafka.ui.pages.BasePage.AlertHeader.SUCCESS;
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.KAFKA_CONNECT;
 import static com.provectus.kafka.ui.utilities.FileUtils.getResourceAsString;
 import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
 
@@ -107,21 +105,4 @@ public class ConnectorsTest extends BaseTest {
                 apiService.deleteConnector(CONNECT_NAME, connector.getName()));
         TOPIC_LIST.forEach(topic -> apiService.deleteTopic(topic.getName()));
     }
-
-    @Step
-    private void navigateToConnectors() {
-        naviSideBar
-                .openSideMenu(KAFKA_CONNECT);
-        kafkaConnectList
-                .waitUntilScreenReady();
-    }
-
-    @Step
-    private void navigateToConnectorsAndOpenDetails(String connectorName) {
-        navigateToConnectors();
-        kafkaConnectList
-                .openConnector(connectorName);
-        connectorDetails
-                .waitUntilScreenReady();
-    }
 }

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

@@ -8,7 +8,6 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 import org.testng.asserts.SoftAssert;
 
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.KSQL_DB;
 import static com.provectus.kafka.ui.pages.ksqlDb.enums.KsqlQueryConfig.SHOW_TABLES;
 import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
 
@@ -34,10 +33,8 @@ public class KsqlDbTest extends BaseTest {
     @QaseId(41)
     @Test(priority = 1)
     public void checkShowTablesRequestExecution() {
-        naviSideBar
-                .openSideMenu(KSQL_DB);
+        navigateToKsqlDb();
         ksqlDbList
-                .waitUntilScreenReady()
                 .clickExecuteKsqlRequestBtn();
         ksqlQueryForm
                 .waitUntilScreenReady()
@@ -53,10 +50,8 @@ public class KsqlDbTest extends BaseTest {
     @QaseId(86)
     @Test(priority = 2)
     public void clearResultsForExecutedRequest() {
-        naviSideBar
-                .openSideMenu(KSQL_DB);
+        navigateToKsqlDb();
         ksqlDbList
-                .waitUntilScreenReady()
                 .clickExecuteKsqlRequestBtn();
         ksqlQueryForm
                 .waitUntilScreenReady()

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

@@ -4,7 +4,6 @@ import com.codeborne.selenide.Condition;
 import com.provectus.kafka.ui.BaseTest;
 import com.provectus.kafka.ui.api.model.CompatibilityLevel;
 import com.provectus.kafka.ui.models.Schema;
-import io.qameta.allure.Step;
 import io.qase.api.annotation.QaseId;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
@@ -15,7 +14,6 @@ import org.testng.asserts.SoftAssert;
 import java.util.ArrayList;
 import java.util.List;
 
-import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.SCHEMA_REGISTRY;
 import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
 
 public class SchemasTest extends BaseTest {
@@ -188,21 +186,4 @@ public class SchemasTest extends BaseTest {
     public void afterClass() {
         SCHEMA_LIST.forEach(schema -> apiService.deleteSchema(schema.getName()));
     }
-
-    @Step
-    private void navigateToSchemaRegistry() {
-        naviSideBar
-                .openSideMenu(SCHEMA_REGISTRY);
-        schemaRegistryList
-                .waitUntilScreenReady();
-    }
-
-    @Step
-    private void navigateToSchemaRegistryAndOpenDetails(String schemaName) {
-        navigateToSchemaRegistry();
-        schemaRegistryList
-                .openSchema(schemaName);
-        schemaDetails
-                .waitUntilScreenReady();
-    }
 }

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

@@ -147,21 +147,6 @@ public class MessagesTest extends BaseTest {
         softly.assertAll();
     }
 
-    @Ignore
-    @Issue("https://github.com/provectus/kafka-ui/issues/2819")
-    @QaseId(21)
-    @Test(priority = 5)
-    public void copyMessageFromTopicProfile() {
-        navigateToTopicsAndOpenDetails(TOPIC_FOR_CHECK_FILTERS.getName());
-        topicDetails
-                .openDetailsTab(MESSAGES)
-                .getRandomMessage()
-                .openDotMenu()
-                .clickCopyToClipBoard();
-        Assert.assertTrue(topicDetails.isAlertWithMessageVisible(SUCCESS, "Copied successfully!"),
-                "isAlertWithMessageVisible()");
-    }
-
     @Ignore
     @Issue("https://github.com/provectus/kafka-ui/issues/2394")
     @QaseId(15)

+ 1 - 0
kafka-ui-react-app/src/components/Topics/Topic/Messages/Filters/Filters.styled.ts

@@ -33,6 +33,7 @@ export const FilterInputs = styled.div`
   gap: 8px;
   align-items: flex-end;
   width: 90%;
+  flex-wrap: wrap;
 `;
 
 export const SeekTypeSelectorWrapper = styled.div`

+ 2 - 2
kafka-ui-react-app/src/components/common/Alert/Alert.styled.ts

@@ -1,7 +1,7 @@
-import { ToastType } from 'react-hot-toast';
 import styled from 'styled-components';
+import { ToastTypes } from 'lib/errorHandling';
 
-export const Alert = styled.div<{ $type: ToastType }>`
+export const Alert = styled.div<{ $type: ToastTypes }>`
   background-color: ${({ $type, theme }) => theme.alert.color[$type]};
   width: 500px;
   min-height: 64px;

+ 2 - 2
kafka-ui-react-app/src/components/common/Alert/Alert.tsx

@@ -1,13 +1,13 @@
 import React from 'react';
 import CloseIcon from 'components/common/Icons/CloseIcon';
 import IconButtonWrapper from 'components/common/Icons/IconButtonWrapper';
-import { ToastType } from 'react-hot-toast';
+import { ToastTypes } from 'lib/errorHandling';
 
 import * as S from './Alert.styled';
 
 export interface AlertProps {
   title: string;
-  type: ToastType;
+  type: ToastTypes;
   message: React.ReactNode;
   onDissmiss(): void;
 }

+ 2 - 1
kafka-ui-react-app/src/lib/errorHandling.tsx

@@ -9,6 +9,7 @@ interface ServerResponse {
   url?: string;
   message?: ErrorResponse['message'];
 }
+export type ToastTypes = ToastType | 'warning';
 
 export const getResponse = async (
   response: Response
@@ -34,7 +35,7 @@ interface AlertOptions {
 }
 
 export const showAlert = (
-  type: ToastType,
+  type: ToastTypes,
   { title, message, id }: AlertOptions
 ) => {
   toast.custom(

+ 30 - 1
kafka-ui-react-app/src/lib/hooks/__tests__/useDataSaver.spec.tsx

@@ -1,7 +1,12 @@
 import React, { useEffect } from 'react';
 import useDataSaver from 'lib/hooks/useDataSaver';
 import { render } from '@testing-library/react';
+import { showAlert } from 'lib/errorHandling';
 
+jest.mock('lib/errorHandling', () => ({
+  ...jest.requireActual('lib/errorHandling'),
+  showAlert: jest.fn(),
+}));
 describe('useDataSaver hook', () => {
   const content = {
     title: 'title',
@@ -38,7 +43,6 @@ describe('useDataSaver hook', () => {
       mockCreate.mockRestore();
     });
   });
-
   describe('copies the data to the clipboard', () => {
     Object.assign(navigator, {
       clipboard: {
@@ -74,4 +78,29 @@ describe('useDataSaver hook', () => {
       );
     });
   });
+  describe('navigator clipboard is undefined', () => {
+    it('calls showAlert with the correct parameters when clipboard API is unavailable', () => {
+      Object.assign(navigator, {
+        clipboard: undefined,
+      });
+
+      const HookWrapper: React.FC = () => {
+        const { copyToClipboard } = useDataSaver('topic', content);
+        useEffect(() => {
+          copyToClipboard();
+        }, [copyToClipboard]);
+        return null;
+      };
+
+      render(<HookWrapper />);
+
+      expect(showAlert).toHaveBeenCalledTimes(1);
+      expect(showAlert).toHaveBeenCalledWith('warning', {
+        id: 'topic',
+        title: 'Warning',
+        message:
+          'Copying to clipboard is unavailable due to unsecured (non-HTTPS) connection',
+      });
+    });
+  });
 });

+ 8 - 1
kafka-ui-react-app/src/lib/hooks/useDataSaver.ts

@@ -1,4 +1,4 @@
-import { showSuccessAlert } from 'lib/errorHandling';
+import { showAlert, showSuccessAlert } from 'lib/errorHandling';
 
 const useDataSaver = (
   subject: string,
@@ -14,6 +14,13 @@ const useDataSaver = (
         title: '',
         message: 'Copied successfully!',
       });
+    } else {
+      showAlert('warning', {
+        id: subject,
+        title: 'Warning',
+        message:
+          'Copying to clipboard is unavailable due to unsecured (non-HTTPS) connection',
+      });
     }
   };
   const saveFile = () => {