Compare commits

...
Sign in to create a new pull request.

18 commits
master ... dev

Author SHA1 Message Date
Arthur
22439f30e8
[e2e] TopicTests.recreateTopicFromTopicProfile : Recreate topic from topic profile (#3125)
* [e2e] TopicTests.recreateTopicFromTopicProfile : Recreate topic from topic profile

* [e2e] TopicTests.recreateTopicFromTopicProfile : Recreate topic from topic profile

* [e2e] Final Fix. add topicSettingsTab.waitUntilScreenReady();

* [e2e] Final Fix.

* [e2e] Final Fix 2.
2022-12-23 15:48:05 +02:00
Arthur
a9d7d6c515
[e2e] Checking Topics settings to make sure retention.bytes is right according to Max size on disk in GB selected value (#3118)
* [e2e] Checking Topics settings to make sure retention.bytes is right according to Max size on disk in GB selected value. Created new class - SettingsPanel and inner class in SettingsPanel. Add new test to Topicstests.

* First Update. Checking Topics settings to make sure retention.bytes is right according to Max size on disk in GB selected value

* Second Update. Checking Topics settings to make sure retention.bytes is right according to Max size on disk in GB selected value

* Second Update. Checking Topics settings to make sure retention.bytes is right according to Max size on disk in GB selected value

* [e2e] Final Fix. add topicSettingsTab.waitUntilScreenReady();
2022-12-22 18:05:38 +02:00
Arthur
ca3916aae0
[e2e] Update case "Checking the information of used Broker in a cluster" (#3094)
* [e2e] Update case "Checking the information of used Broker in a cluster"

* [e2e] Update case "Checking the information of used Broker in a cluster"

* [e2e] Update case "Checking the information of used Broker in a cluster"

* [e2e]First Fix Update case "Checking the information of used Broker in a cluster"

* [e2e]Second Fix Update case "Checking the information of used Broker in a cluster"

* [e2e]Third Fix Update case "Checking the information of used Broker in a cluster"

* [e2e]Third Fix Update case "Checking the information of used Broker in a cluster"

Co-authored-by: Vlad Senyuta <66071557+VladSenyuta@users.noreply.github.com>
2022-12-20 18:19:31 +02:00
Roman Zabaluev
f8417e6eaa Merge remote-tracking branch 'origin/master' into dev 2022-12-20 02:30:51 +08:00
Alexandr Nezboretskiy
de7f7db269
[e2e]Checking messages filtering by Offset within Topic/Messages (#3066)
* Checking messages filtering by Offset within Topic/Messages

* Fix test checkTimeToRetainDataCustomValueWithEditingTopic(), refactored assertions on topicCreateEditForm from "604800000" to ""

* Fix test checkTimeToRetainDataCustomValueWithEditingTopic(),added setNumberOfPartitions as mandatory field

* resolve conversations

* resolve conversations

* resolve conversations
2022-12-19 18:10:29 +02:00
Arthur
c13440b65d
[e2e] Create method with common steps inside test classes (#3045)
* [e2e] Create method with common steps inside test classes. Connectors, Schema, Brokers are done.

* [e2e] Create method with common steps inside test classes. Topics are done.

* [e2e] First Fix. Create method with common steps inside test classes.

* [e2e]TopicName in redirectToConsumerFromTopic changed.

* [e2e]TopicName in redirectToConsumerFromTopic returned.

* [e2e]Broker tests fix.

* [e2e]Topic tests fix. .setNumberOfPartitions(1) and setTimeToRetainDataInMs("604800000") added.

* [e2e]Topic tests fix. verifyVisibleElements() and verifyEnabledElements added.

* [e2e]Topic tests fix. verifyVisibleElements() and verifyEnabledElements added.

* [e2e]Fix with verifyElementsCondition()

* [e2e]Fix SmokeTests.

* [e2e]Fix2 SmokeTests.
2022-12-16 14:32:20 +02:00
Roman Zabaluev
53fb641220 Merge remote-tracking branch 'origin/master' into dev 2022-12-12 23:42:38 +08:00
Roman Zabaluev
a5449027b7 Merge remote-tracking branch 'origin/master' into dev 2022-12-09 23:13:14 +08:00
Roman Zabaluev
0a07bb4db5 Merge remote-tracking branch 'origin/master' into dev 2022-12-09 22:08:27 +08:00
Roman Zabaluev
3f77826c05 Merge remote-tracking branch 'origin/master' into dev 2022-12-08 00:10:14 +08:00
Roman Zabaluev
e5d666e91f Merge remote-tracking branch 'origin/master' into dev 2022-12-07 17:23:48 +08:00
Alexandr Nezboretskiy
b6b1b8bda5
[e2e]Checking applying saved filter within Topic/Messages (#3029)
* [e2e]Checking applying saved filter within Topic/Messages

* resolve conversations

* resolve conversation
2022-12-06 19:17:46 +02:00
Alexandr Nezboretskiy
d2d039e36c
[e2e]Checking 'Time to retain data (in ms)' custom value with editing… (#3023)
* [e2e]Checking 'Time to retain data (in ms)' custom value with editing Topic's settings

* resolve conversations

* resolve conversation and refactored test addingNewFilterWithinTopic() with randomAlphabetic()

* resolve conversation and refactored test checkFilterSavingWithinSavedFilters() with randomAlphabetic()
2022-12-06 12:13:36 +02:00
Roman Zabaluev
25d34e11e4 Merge remote-tracking branch 'origin/master' into dev 2022-12-06 12:52:29 +08:00
Arthur
0a24b2d765
[e2e]Checking the Brokers overview (#3014)
* [e2e]Checking the Brokers overview

* [e2e]FirstUpdate Checking the Brokers overview

* [e2e]SecondUpdate Checking the Brokers overview

* [e2e]FirstFix Checking the Brokers overview

* [e2e]FirstFix Checking the Brokers overview
2022-12-05 13:56:54 +02:00
Alexandr Nezboretskiy
a503c29472
[e2e]Checking filter saving within Messages/Topic profile/Saved Filters (#3003)
* [e2e]Checking filter saving within Messages/Topic profile/Saved Filters

* resolve conversation

* resolve conversation

* resolve conversation

* resolve conversation

* resolve conversation

* resolve conversation
2022-12-02 16:30:10 +02:00
Alexandr Nezboretskiy
86c72d7d85
[e2e]SchemasTests.updateSchemaAvro : Update schema avro ( REFACTORED WITH NEW ASSERTIONS) (#2992)
* Added softAssertions and few methods for assert

* Refactored softAssertions and few methods for assert
2022-11-30 16:01:09 +02:00
Arthur
27db304b1b
[e2e]Checking 'Show Internal Topics' toggle functionality within 'All Topics' page/Issue#2938 (#2983)
* [e2e] Checking 'Show Internal Topics' toggle functionality within 'All Topics' page

* [e2e] First Checking 'Show Internal Topics' toggle functionality within 'All Topics' page

* [e2e] Second Checking 'Show Internal Topics' toggle functionality within 'All Topics' page

* [e2e] selectItem locator is changed

* [e2e] assertion added

* [e2e] assertion added
2022-11-29 17:15:08 +02:00
17 changed files with 894 additions and 281 deletions

View file

@ -1,8 +1,10 @@
package com.provectus.kafka.ui.pages;
import static com.codeborne.selenide.Selenide.$$x;
import static com.codeborne.selenide.Selenide.$x;
import com.codeborne.selenide.Condition;
import com.codeborne.selenide.ElementsCollection;
import com.codeborne.selenide.SelenideElement;
import com.provectus.kafka.ui.utilities.WebUtils;
import lombok.extern.slf4j.Slf4j;
@ -16,9 +18,10 @@ public abstract class BasePage extends WebUtils {
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 ElementsCollection allGridItems = $$x("//tr[@class]");
protected String summaryCellLocator = "//div[contains(text(),'%s')]";
protected String tableElementNameLocator = "//tbody//a[contains(text(),'%s')]";
protected String columnHeaderLocator = "//table//tr/th/div[text()='%s']";
protected String columnHeaderLocator = "//table//tr/th//div[text()='%s']";
protected void waitUntilSpinnerDisappear() {
log.debug("\nwaitUntilSpinnerDisappear");

View file

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

View file

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

View file

@ -2,10 +2,15 @@ package com.provectus.kafka.ui.pages.brokers;
import static com.codeborne.selenide.Selenide.$x;
import com.codeborne.selenide.CollectionCondition;
import com.codeborne.selenide.Condition;
import com.codeborne.selenide.SelenideElement;
import com.provectus.kafka.ui.pages.BasePage;
import io.qameta.allure.Step;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class BrokersList extends BasePage {
@ -19,14 +24,100 @@ public class BrokersList extends BasePage {
}
@Step
public boolean isBrokerVisible(String brokerId) {
tableGrid.shouldBe(Condition.visible);
return isVisible(getTableElement(brokerId));
public BrokersList openBroker(int brokerId) {
getBrokerItem(brokerId).openItem();
return this;
}
private List<SelenideElement> getUptimeSummaryCells() {
return Stream.of("Broker Count", "Active Controller", "Version")
.map(name -> $x(String.format(summaryCellLocator, name)))
.collect(Collectors.toList());
}
private List<SelenideElement> getPartitionsSummaryCells() {
return Stream.of("Online", "URP", "In Sync Replicas", "Out Of Sync Replicas")
.map(name -> $x(String.format(summaryCellLocator, name)))
.collect(Collectors.toList());
}
@Step
public BrokersList openBroker(String brokerName) {
getTableElement(brokerName).shouldBe(Condition.enabled).click();
return this;
public List<SelenideElement> getAllVisibleElements() {
List<SelenideElement> visibleElements = new ArrayList<>(getUptimeSummaryCells());
visibleElements.addAll(getPartitionsSummaryCells());
return visibleElements;
}
private List<SelenideElement> getEnabledColumnHeaders() {
return Stream.of("Broker ID", "Segment Size", "Segment Count", "Port", "Host")
.map(name -> $x(String.format(columnHeaderLocator, name)))
.collect(Collectors.toList());
}
@Step
public List<SelenideElement> getAllEnabledElements() {
return getEnabledColumnHeaders();
}
private List<BrokersList.BrokerGridItem> initGridItems() {
List<BrokersList.BrokerGridItem> gridItemList = new ArrayList<>();
allGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
.forEach(item -> gridItemList.add(new BrokersList.BrokerGridItem(item)));
return gridItemList;
}
@Step
public BrokerGridItem getBrokerItem(int id){
return initGridItems().stream()
.filter(e ->e.getId() == id)
.findFirst().orElse(null);
}
@Step
public List<BrokerGridItem> getAllBrokers(){
return initGridItems();
}
public static class BrokerGridItem extends BasePage {
private final SelenideElement element;
public BrokerGridItem(SelenideElement element) {
this.element = element;
}
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();
}
}
}

View file

@ -11,6 +11,8 @@ import com.provectus.kafka.ui.api.model.SchemaType;
import com.provectus.kafka.ui.pages.BasePage;
import io.qameta.allure.Step;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class SchemaCreateForm extends BasePage {
@ -21,6 +23,7 @@ public class SchemaCreateForm extends BasePage {
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 schemaVersionDdl = $$x("//ul[@role='listbox']/li[text()='Version 2']").first();
protected List<SelenideElement> visibleMarkers = $$x("//div[@class='ace_scroller']//div[contains(@class,'codeMarker')]");
protected List<SelenideElement> elementsCompareVersionDdl = $$x("//ul[@role='listbox']/ul/li");
@ -96,14 +99,25 @@ public class SchemaCreateForm extends BasePage {
}
@Step
public boolean isSchemaDropDownDisabled(){
boolean disabled = false;
public List<SelenideElement> getAllDetailsPageElements() {
return Stream.of(compatibilityLevelList, newSchemaTextArea, latestSchemaTextArea, submitBtn, schemaTypeDdl)
.collect(Collectors.toList());
}
@Step
public boolean isSubmitBtnEnabled(){
return isEnabled(submitBtn);
}
@Step
public boolean isSchemaDropDownEnabled(){
boolean enabled = true;
try{
String attribute = schemaTypeDdl.getAttribute("disabled");
disabled = true;
enabled = false;
}
catch (Throwable ignored){
}
return disabled;
return enabled;
}
}

View file

@ -19,17 +19,21 @@ import org.openqa.selenium.By;
public class TopicDetails extends BasePage {
protected SelenideElement clearMessagesBtn = $x(("//div[contains(text(), 'Clear messages')]"));
protected SelenideElement recreateTopicBtn = $x("//div[text()='Recreate Topic']");
protected SelenideElement messageAmountCell = $x("//tbody/tr/td[5]");
protected SelenideElement overviewTab = $x("//a[contains(text(),'Overview')]");
protected SelenideElement messagesTab = $x("//a[contains(text(),'Messages')]");
protected SelenideElement seekTypeDdl = $x("//ul[@id='selectSeekType']/li");
protected SelenideElement seekTypeField = $x("//label[text()='Seek Type']//..//input");
protected SelenideElement addFiltersBtn = $x("//button[text()='Add Filters']");
protected SelenideElement savedFiltersField = $x("//div[text()='Saved Filters']");
protected SelenideElement savedFiltersLink = $x("//div[text()='Saved Filters']");
protected SelenideElement addFilterCodeModalTitle = $x("//label[text()='Filter code']");
protected SelenideElement addFilterCodeInput = $x("//div[@id='ace-editor']//textarea");
protected SelenideElement saveThisFilterCheckBoxAddFilterMdl = $x("//input[@name='saveFilter']");
protected SelenideElement displayNameInputAddFilterMdl = $x("//input[@placeholder='Enter Name']");
protected SelenideElement cancelBtnAddFilterMdl = $x("//button[text()='Cancel']");
protected SelenideElement addFilterBtnAddFilterMdl = $x("//button[text()='Add filter']");
protected SelenideElement selectFilterBtnAddFilterMdl = $x("//button[text()='Select filter']");
protected SelenideElement editSettingsMenu = $x("//li[@role][contains(text(),'Edit settings')]");
protected SelenideElement removeTopicBtn = $x("//ul[@role='menu']//div[contains(text(),'Remove Topic')]");
protected SelenideElement confirmBtn = $x("//div[@role='dialog']//button[contains(text(),'Confirm')]");
@ -37,10 +41,15 @@ public class TopicDetails extends BasePage {
protected SelenideElement contentMessageTab = $x("//html//div[@id='root']/div/main//table//p");
protected SelenideElement cleanUpPolicyField = $x("//div[contains(text(),'Clean Up Policy')]/../span/*");
protected SelenideElement partitionsField = $x("//div[contains(text(),'Partitions')]/../span");
protected SelenideElement backToCreateFiltersLink = $x("//div[text()='Back To create filters']");
protected SelenideElement confirmationMdl = $x("//div[text()= 'Confirm the action']/..");
protected ElementsCollection messageGridItems = $$x("//tbody//tr");
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 filterNameLocator = "//*[@data-testid='activeSmartFilter']";
protected String activeFilterNameLocator = "//div[@data-testid='activeSmartFilter'][contains(text(),'%s')]";
protected String settingsGridValueLocator = "//tbody/tr/td/span[text()='%s']//ancestor::tr/td[2]/span";
@Step
public TopicDetails waitUntilScreenReady() {
@ -56,6 +65,11 @@ public class TopicDetails extends BasePage {
return this;
}
@Step
public String getSettingsGridValueByKey(String key){
return $x(String.format(settingsGridValueLocator, key)).scrollTo().shouldBe(Condition.visible).getText();
}
@Step
public TopicDetails openDotMenu() {
clickByJavaScript(dotMenuBtn);
@ -73,12 +87,23 @@ public class TopicDetails extends BasePage {
return this;
}
@Step
public boolean isConfirmationMdlVisible(){
return isVisible(confirmationMdl);
}
@Step
public TopicDetails clickClearMessagesMenu() {
clearMessagesBtn.shouldBe(Condition.visible).click();
return this;
}
@Step
public TopicDetails clickRecreateTopicMenu(){
recreateTopicBtn.shouldBe(Condition.visible).click();
return this;
}
@Step
public String getCleanUpPolicy() {
return cleanUpPolicyField.getText();
@ -101,7 +126,7 @@ public class TopicDetails extends BasePage {
}
@Step
public TopicDetails clickConfirmDeleteBtn() {
public TopicDetails clickConfirmBtnMdl() {
confirmBtn.shouldBe(Condition.enabled).click();
confirmBtn.shouldBe(Condition.disappear);
return this;
@ -113,12 +138,57 @@ public class TopicDetails extends BasePage {
return this;
}
@Step
public TopicDetails selectSeekTypeDdlMessagesTab(String seekTypeName){
seekTypeDdl.shouldBe(Condition.enabled).click();
$x(String.format(seekFilterDdlLocator, seekTypeName)).shouldBe(Condition.visible).click();
return this;
}
@Step
public TopicDetails setSeekTypeValueFldMessagesTab(String seekTypeValue){
seekTypeField.shouldBe(Condition.enabled).sendKeys(seekTypeValue);
return this;
}
@Step
public TopicDetails clickSubmitFiltersBtnMessagesTab(){
clickByJavaScript(submitBtn);
waitUntilSpinnerDisappear();
return this;
}
@Step
public TopicDetails clickMessagesAddFiltersBtn() {
addFiltersBtn.shouldBe(Condition.enabled).click();
return this;
}
@Step
public TopicDetails openSavedFiltersListMdl(){
savedFiltersLink.shouldBe(Condition.enabled).click();
backToCreateFiltersLink.shouldBe(Condition.visible);
return this;
}
@Step
public boolean isFilterVisibleAtSavedFiltersMdl(String filterName){
return isVisible($x(String.format(savedFilterNameLocator,filterName)));
}
@Step
public TopicDetails selectFilterAtSavedFiltersMdl(String filterName){
$x(String.format(savedFilterNameLocator, filterName)).shouldBe(Condition.enabled).click();
return this;
}
@Step
public TopicDetails clickSelectFilterBtnAtSavedFiltersMdl(){
selectFilterBtnAddFilterMdl.shouldBe(Condition.enabled).click();
addFilterCodeModalTitle.shouldBe(Condition.disappear);
return this;
}
@Step
public TopicDetails waitUntilAddFiltersMdlVisible() {
addFilterCodeModalTitle.shouldBe(Condition.visible);
@ -126,15 +196,14 @@ public class TopicDetails extends BasePage {
}
@Step
public TopicDetails clickAddFilterBtnAddFilterMdl() {
addFilterBtnAddFilterMdl.shouldBe(Condition.enabled).click();
addFilterCodeModalTitle.shouldBe(Condition.hidden);
public TopicDetails setFilterCodeFieldAddFilterMdl(String filterCode) {
addFilterCodeInput.shouldBe(Condition.enabled).sendKeys(filterCode);
return this;
}
@Step
public TopicDetails setFilterCodeFieldAddFilterMdl(String filterCode) {
addFilterCodeInput.shouldBe(Condition.enabled).sendKeys(filterCode);
public TopicDetails selectSaveThisFilterCheckboxMdl(boolean select){
selectElement(saveThisFilterCheckBoxAddFilterMdl, select);
return this;
}
@ -143,18 +212,35 @@ public class TopicDetails extends BasePage {
return isSelected(saveThisFilterCheckBoxAddFilterMdl);
}
@Step
public TopicDetails setDisplayNameFldAddFilterMdl(String displayName) {
displayNameInputAddFilterMdl.shouldBe(Condition.enabled).sendKeys(displayName);
return this;
}
@Step
public TopicDetails clickAddFilterBtnAndCloseMdl(boolean closeModal) {
addFilterBtnAddFilterMdl.shouldBe(Condition.enabled).click();
if(closeModal){
addFilterCodeModalTitle.shouldBe(Condition.hidden);}
else{
addFilterCodeModalTitle.shouldBe(Condition.visible);
}
return this;
}
@Step
public boolean isAddFilterBtnAddFilterMdlEnabled() {
return isEnabled(addFilterBtnAddFilterMdl);
}
@Step
public String getFilterName() {
return $x(filterNameLocator).getText();
public boolean isActiveFilterVisible(String activeFilterName) {
return isVisible($x(String.format(activeFilterNameLocator, activeFilterName)));
}
public List<SelenideElement> getAllAddFilterModalVisibleElements() {
return Arrays.asList(savedFiltersField, displayNameInputAddFilterMdl, addFilterBtnAddFilterMdl, cancelBtnAddFilterMdl);
return Arrays.asList(savedFiltersLink, displayNameInputAddFilterMdl, addFilterBtnAddFilterMdl, cancelBtnAddFilterMdl);
}
public List<SelenideElement> getAllAddFilterModalEnabledElements() {
@ -188,7 +274,7 @@ public class TopicDetails extends BasePage {
private List<TopicDetails.MessageGridItem> initItems() {
List<TopicDetails.MessageGridItem> gridItemList = new ArrayList<>();
messageGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
allGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
.forEach(item -> gridItemList.add(new TopicDetails.MessageGridItem(item)));
return gridItemList;
}
@ -200,6 +286,11 @@ public class TopicDetails extends BasePage {
.findFirst().orElse(null);
}
@Step
public List<MessageGridItem> getAllMessages(){
return initItems();
}
@Step
public TopicDetails.MessageGridItem getRandomMessage() {
return getMessage(nextInt(initItems().size() - 1));

View file

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

View file

@ -2,6 +2,7 @@ package com.provectus.kafka.ui.pages.topic;
import static com.codeborne.selenide.Selenide.$x;
import com.codeborne.selenide.CollectionCondition;
import com.codeborne.selenide.Condition;
import com.codeborne.selenide.SelenideElement;
import com.provectus.kafka.ui.pages.BasePage;
@ -21,7 +22,6 @@ public class TopicsList extends BasePage {
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 String checkBoxListLocator = "//a[@title='%s']//ancestor::td/../td/input[@type='checkbox']";
@Step
public TopicsList waitUntilScreenReady() {
@ -43,18 +43,22 @@ public class TopicsList extends BasePage {
}
@Step
public TopicsList openTopic(String topicName) {
getTableElement(topicName).shouldBe(Condition.enabled).click();
return this;
public boolean isShowInternalRadioBtnSelected() {
return isSelected(showInternalRadioBtn);
}
@Step
public TopicsList selectCheckboxByName(String topicName){
SelenideElement checkBox = $x(String.format(checkBoxListLocator,topicName));
if(!checkBox.is(Condition.selected)){clickByJavaScript(checkBox);}
public TopicsList setShowInternalRadioButton(boolean select) {
selectElement(showInternalRadioBtn, select);
return this;
}
@Step
public TopicsList openTopic(String topicName) {
getTopicItem(topicName).openItem();
return this;
}
@Step
public boolean isCopySelectedTopicBtnEnabled(){
return isEnabled(copySelectedTopicBtn);
@ -92,4 +96,101 @@ public class TopicsList extends BasePage {
enabledElements.addAll(Arrays.asList(searchField, showInternalRadioBtn,addTopicBtn));
return enabledElements;
}
private List<TopicGridItem> initGridItems() {
List<TopicGridItem> gridItemList = new ArrayList<>();
allGridItems.shouldHave(CollectionCondition.sizeGreaterThan(0))
.forEach(item -> gridItemList.add(new TopicGridItem(item)));
return gridItemList;
}
@Step
public TopicGridItem getTopicItem(String name) {
return initGridItems().stream()
.filter(e -> e.getName().equals(name))
.findFirst().orElse(null);
}
@Step
public List<TopicGridItem> getNonInternalTopics() {
return initGridItems().stream()
.filter(e -> !e.isInternal())
.collect(Collectors.toList());
}
@Step
public List<TopicGridItem> getInternalTopics() {
return initGridItems().stream()
.filter(TopicGridItem::isInternal)
.collect(Collectors.toList());
}
public static class TopicGridItem extends BasePage {
private final SelenideElement element;
public TopicGridItem(SelenideElement element) {
this.element = element;
}
@Step
public void selectItem(boolean select) {
selectElement(element.$x("./td[1]/input"), select);
}
@Step
public boolean isInternal() {
boolean internal = false;
try {
element.$x("./td[2]/a/span").shouldBe(Condition.visible);
internal = true;
} catch (Throwable ignored) {
}
return internal;
}
private SelenideElement getNameElm() {
return element.$x("./td[2]");
}
@Step
public String getName() {
return getNameElm().getText().trim();
}
@Step
public void openItem() {
getNameElm().click();
}
@Step
public int getPartition() {
return Integer.parseInt(element.$x("./td[3]").getText().trim());
}
@Step
public int getOutOfSyncReplicas() {
return Integer.parseInt(element.$x("./td[4]").getText().trim());
}
@Step
public int getReplicationFactor() {
return Integer.parseInt(element.$x("./td[5]").getText().trim());
}
@Step
public int getNumberOfMessages() {
return Integer.parseInt(element.$x("./td[6]").getText().trim());
}
@Step
public int getSize() {
return Integer.parseInt(element.$x("./td[7]").getText().trim());
}
@Step
public void openDotMenu(){
element.$x("./td[8]//button").click();
}
}
}

View file

@ -69,4 +69,13 @@ public class WebUtils {
}
return isSelected;
}
public static boolean selectElement(SelenideElement element, boolean select){
if (select) {
if (!element.isSelected()) clickByJavaScript(element);
} else {
if (element.isSelected()) clickByJavaScript(element);
}
return true;
}
}

View file

@ -1,13 +1,17 @@
package com.provectus.kafka.ui.base;
import com.codeborne.selenide.Condition;
import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.SelenideElement;
import com.codeborne.selenide.WebDriverRunner;
import com.provectus.kafka.ui.utilities.qaseIoUtils.DisplayNameGenerator;
import com.provectus.kafka.ui.utilities.qaseIoUtils.TestCaseGenerator;
import io.github.cdimascio.dotenv.Dotenv;
import io.qameta.allure.Allure;
import io.qase.api.annotation.Step;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.assertj.core.api.SoftAssertions;
import org.junit.jupiter.api.*;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.OutputType;
@ -22,8 +26,10 @@ import org.testcontainers.utility.DockerImageName;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.List;
import static com.provectus.kafka.ui.base.Setup.*;
import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.TOPICS;
import static com.provectus.kafka.ui.settings.Source.BASE_WEB_URL;
@Slf4j
@ -110,4 +116,31 @@ public class BaseTest extends Facade {
((TakesScreenshot) webDriverContainer.getWebDriver()).getScreenshotAs(OutputType.BYTES)));
browserClear();
}
@Step
protected void navigateToTopics(){
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady();
}
@Step
protected void navigateToTopicsAndOpenDetails(String topicName){
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady()
.openTopic(topicName);
topicDetails
.waitUntilScreenReady();
}
@Step
protected void verifyElementsCondition(List<SelenideElement> elementList, Condition expectedCondition) {
SoftAssertions softly = new SoftAssertions();
elementList.forEach(element -> softly.assertThat(element.is(expectedCondition))
.as(element.getSearchCriteria() + " is " + expectedCondition).isTrue());
softly.assertAll();
}
}

View file

@ -3,6 +3,7 @@ package com.provectus.kafka.ui.base;
import com.provectus.kafka.ui.helpers.ApiHelper;
import com.provectus.kafka.ui.pages.NaviSideBar;
import com.provectus.kafka.ui.pages.TopPanel;
import com.provectus.kafka.ui.pages.brokers.BrokersConfigTab;
import com.provectus.kafka.ui.pages.brokers.BrokersDetails;
import com.provectus.kafka.ui.pages.brokers.BrokersList;
import com.provectus.kafka.ui.pages.connector.ConnectorCreateForm;
@ -14,6 +15,7 @@ import com.provectus.kafka.ui.pages.schema.SchemaCreateForm;
import com.provectus.kafka.ui.pages.schema.SchemaDetails;
import com.provectus.kafka.ui.pages.schema.SchemaRegistryList;
import com.provectus.kafka.ui.pages.topic.ProduceMessagePanel;
import com.provectus.kafka.ui.pages.topic.TopicSettingsTab;
import com.provectus.kafka.ui.pages.topic.TopicCreateEditForm;
import com.provectus.kafka.ui.pages.topic.TopicDetails;
import com.provectus.kafka.ui.pages.topic.TopicsList;
@ -36,4 +38,6 @@ public abstract class Facade {
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();
}

View file

@ -5,7 +5,8 @@ import com.provectus.kafka.ui.base.BaseTest;
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
import io.qase.api.annotation.CaseId;
import org.assertj.core.api.SoftAssertions;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
public class SmokeTests extends BaseTest {
@ -14,19 +15,9 @@ public class SmokeTests extends BaseTest {
@AutomationStatus(status = Status.AUTOMATED)
@CaseId(198)
public void checkBasePageElements(){
SoftAssertions softly = new SoftAssertions();
topPanel.getAllVisibleElements()
.forEach(element ->
softly.assertThat(element.is(Condition.visible))
.as(element.getSearchCriteria() + " isVisible()").isTrue());
topPanel.getAllEnabledElements()
.forEach(element ->
softly.assertThat(element.is(Condition.enabled))
.as(element.getSearchCriteria() + " isEnabled()").isTrue());
naviSideBar.getAllMenuButtons()
.forEach(element ->
softly.assertThat(element.is(Condition.enabled) && element.is(Condition.visible))
.as(element.getSearchCriteria() + " isEnabled()").isTrue());
softly.assertAll();
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);
}
}

View file

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

View file

@ -12,6 +12,7 @@ import com.provectus.kafka.ui.models.Topic;
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
import io.qameta.allure.Step;
import io.qase.api.annotation.CaseId;
import java.util.ArrayList;
import java.util.List;
@ -68,10 +69,8 @@ public class ConnectorsTests extends BaseTest {
Connector connectorForCreate = new Connector()
.setName("sink_postgres_activities_e2e_checks-" + randomAlphabetic(5))
.setConfig(getResourceAsString("config_for_create_connector.json"));
naviSideBar
.openSideMenu(KAFKA_CONNECT);
kafkaConnectList
.waitUntilScreenReady()
navigateToConnectors();
kafkaConnectList
.clickCreateConnectorBtn();
connectorCreateForm
.waitUntilScreenReady()
@ -79,18 +78,9 @@ public class ConnectorsTests extends BaseTest {
.clickSubmitButton();
connectorDetails
.waitUntilScreenReady();
naviSideBar
.openSideMenu(KAFKA_CONNECT);
kafkaConnectList
.waitUntilScreenReady()
.openConnector(connectorForCreate.getName());
connectorDetails
.waitUntilScreenReady();
navigateToConnectorsAndOpenDetails(connectorForCreate.getName());
Assertions.assertTrue(connectorDetails.isConnectorHeaderVisible(connectorForCreate.getName()),"isConnectorTitleVisible()");
naviSideBar
.openSideMenu(KAFKA_CONNECT);
kafkaConnectList
.waitUntilScreenReady();
navigateToConnectors();
Assertions.assertTrue(kafkaConnectList.isConnectorVisible(CONNECTOR_FOR_DELETE.getName()), "isConnectorVisible()");
CONNECTOR_LIST.add(connectorForCreate);
}
@ -101,21 +91,13 @@ public class ConnectorsTests extends BaseTest {
@CaseId(196)
@Test
public void updateConnector() {
naviSideBar
.openSideMenu(KAFKA_CONNECT);
kafkaConnectList
.waitUntilScreenReady()
.openConnector(CONNECTOR_FOR_UPDATE.getName());
connectorDetails
.waitUntilScreenReady()
navigateToConnectorsAndOpenDetails(CONNECTOR_FOR_UPDATE.getName());
connectorDetails
.openConfigTab()
.setConfig(CONNECTOR_FOR_UPDATE.getConfig())
.clickSubmitButton();
Assertions.assertTrue(connectorDetails.isAlertWithMessageVisible(SUCCESS,"Config successfully updated."),"isAlertWithMessageVisible()");
naviSideBar
.openSideMenu(KAFKA_CONNECT);
kafkaConnectList
.waitUntilScreenReady();
navigateToConnectors();
Assertions.assertTrue(kafkaConnectList.isConnectorVisible(CONNECTOR_FOR_UPDATE.getName()), "isConnectorVisible()");
}
@ -125,20 +107,12 @@ public class ConnectorsTests extends BaseTest {
@CaseId(195)
@Test
public void deleteConnector() {
naviSideBar
.openSideMenu(KAFKA_CONNECT);
kafkaConnectList
.waitUntilScreenReady()
.openConnector(CONNECTOR_FOR_DELETE.getName());
connectorDetails
.waitUntilScreenReady()
navigateToConnectorsAndOpenDetails(CONNECTOR_FOR_DELETE.getName());
connectorDetails
.openDotMenu()
.clickDeleteBtn()
.clickConfirmBtn();
naviSideBar
.openSideMenu(KAFKA_CONNECT);
kafkaConnectList
.waitUntilScreenReady();
navigateToConnectors();
Assertions.assertFalse(kafkaConnectList.isConnectorVisible(CONNECTOR_FOR_DELETE.getName()), "isConnectorVisible()");
CONNECTOR_LIST.remove(CONNECTOR_FOR_DELETE);
}
@ -149,4 +123,21 @@ public class ConnectorsTests extends BaseTest {
apiHelper.deleteConnector(CLUSTER_NAME, CONNECT_NAME, connector.getName()));
TOPIC_LIST.forEach(topic -> apiHelper.deleteTopic(CLUSTER_NAME, topic.getName()));
}
@Step
private void navigateToConnectors(){
naviSideBar
.openSideMenu(KAFKA_CONNECT);
kafkaConnectList
.waitUntilScreenReady();
}
@Step
private void navigateToConnectorsAndOpenDetails(String connectorName){
navigateToConnectors();
kafkaConnectList
.openConnector(connectorName);
connectorDetails
.waitUntilScreenReady();
}
}

View file

@ -4,12 +4,14 @@ import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.SCHEMA_REG
import static com.provectus.kafka.ui.settings.Source.CLUSTER_NAME;
import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
import com.codeborne.selenide.Condition;
import com.provectus.kafka.ui.api.model.CompatibilityLevel;
import com.provectus.kafka.ui.base.BaseTest;
import com.provectus.kafka.ui.models.Schema;
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.AutomationStatus;
import com.provectus.kafka.ui.utilities.qaseIoUtils.annotations.Suite;
import com.provectus.kafka.ui.utilities.qaseIoUtils.enums.Status;
import io.qameta.allure.Step;
import io.qase.api.annotation.CaseId;
import java.util.ArrayList;
import java.util.List;
@ -50,10 +52,8 @@ public class SchemasTests extends BaseTest {
@Order(1)
void createSchemaAvro() {
Schema schemaAvro = Schema.createSchemaAvro();
naviSideBar
.openSideMenu(SCHEMA_REGISTRY);
navigateToSchemaRegistry();
schemaRegistryList
.waitUntilScreenReady()
.clickCreateSchema();
schemaCreateForm
.setSubjectName(schemaAvro.getName())
@ -67,10 +67,7 @@ public class SchemasTests extends BaseTest {
softly.assertThat(schemaDetails.getSchemaType()).as("getSchemaType()").isEqualTo(schemaAvro.getType().getValue());
softly.assertThat(schemaDetails.getCompatibility()).as("getCompatibility()").isEqualTo(CompatibilityLevel.CompatibilityEnum.BACKWARD.getValue());
softly.assertAll();
naviSideBar
.openSideMenu(SCHEMA_REGISTRY);
schemaRegistryList
.waitUntilScreenReady();
navigateToSchemaRegistry();
Assertions.assertTrue(schemaRegistryList.isSchemaVisible(AVRO_API.getName()),"isSchemaVisible()");
SCHEMA_LIST.add(schemaAvro);
}
@ -83,17 +80,16 @@ public class SchemasTests extends BaseTest {
@Order(2)
void updateSchemaAvro() {
AVRO_API.setValuePath(System.getProperty("user.dir") + "/src/main/resources/testData/schema_avro_for_update.json");
naviSideBar
.openSideMenu(SCHEMA_REGISTRY);
schemaRegistryList
.waitUntilScreenReady()
.openSchema(AVRO_API.getName());
navigateToSchemaRegistryAndOpenDetails(AVRO_API.getName());
schemaDetails
.waitUntilScreenReady()
.openEditSchema();
schemaCreateForm
.waitUntilScreenReady();
Assertions.assertTrue(schemaCreateForm.isSchemaDropDownDisabled(),"isSchemaDropDownDisabled()");
verifyElementsCondition(schemaCreateForm.getAllDetailsPageElements(), Condition.visible);
SoftAssertions softly = new SoftAssertions();
softly.assertThat(schemaCreateForm.isSubmitBtnEnabled()).as("isSubmitBtnEnabled()").isFalse();
softly.assertThat(schemaCreateForm.isSchemaDropDownEnabled()).as("isSchemaDropDownEnabled()").isFalse();
softly.assertAll();
schemaCreateForm
.selectCompatibilityLevelFromDropdown(CompatibilityLevel.CompatibilityEnum.NONE)
.setNewSchemaValue(fileToString(AVRO_API.getValuePath()))
@ -110,11 +106,7 @@ public class SchemasTests extends BaseTest {
@Test
@Order(3)
void compareVersionsOperation() {
naviSideBar
.openSideMenu(SCHEMA_REGISTRY);
schemaRegistryList
.waitUntilScreenReady()
.openSchema(AVRO_API.getName());
navigateToSchemaRegistryAndOpenDetails(AVRO_API.getName());
int latestVersion = schemaDetails
.waitUntilScreenReady()
.getLatestVersion();
@ -137,13 +129,8 @@ public class SchemasTests extends BaseTest {
@Test
@Order(4)
void deleteSchemaAvro() {
naviSideBar
.openSideMenu(SCHEMA_REGISTRY);
schemaRegistryList
.waitUntilScreenReady()
.openSchema(AVRO_API.getName());
navigateToSchemaRegistryAndOpenDetails(AVRO_API.getName());
schemaDetails
.waitUntilScreenReady()
.removeSchema();
schemaRegistryList
.waitUntilScreenReady();
@ -159,10 +146,8 @@ public class SchemasTests extends BaseTest {
@Order(5)
void createSchemaJson() {
Schema schemaJson = Schema.createSchemaJson();
naviSideBar
.openSideMenu(SCHEMA_REGISTRY);
navigateToSchemaRegistry();
schemaRegistryList
.waitUntilScreenReady()
.clickCreateSchema();
schemaCreateForm
.setSubjectName(schemaJson.getName())
@ -176,10 +161,7 @@ public class SchemasTests extends BaseTest {
softly.assertThat(schemaDetails.getSchemaType()).as("getSchemaType()").isEqualTo(schemaJson.getType().getValue());
softly.assertThat(schemaDetails.getCompatibility()).as("getCompatibility()").isEqualTo(CompatibilityLevel.CompatibilityEnum.BACKWARD.getValue());
softly.assertAll();
naviSideBar
.openSideMenu(SCHEMA_REGISTRY);
schemaRegistryList
.waitUntilScreenReady();
navigateToSchemaRegistry();
Assertions.assertTrue(schemaRegistryList.isSchemaVisible(JSON_API.getName()),"isSchemaVisible()");
SCHEMA_LIST.add(schemaJson);
}
@ -191,13 +173,8 @@ public class SchemasTests extends BaseTest {
@Test
@Order(6)
void deleteSchemaJson() {
naviSideBar
.openSideMenu(SCHEMA_REGISTRY);
schemaRegistryList
.waitUntilScreenReady()
.openSchema(JSON_API.getName());
schemaDetails
.waitUntilScreenReady()
navigateToSchemaRegistryAndOpenDetails(JSON_API.getName());
schemaDetails
.removeSchema();
schemaRegistryList
.waitUntilScreenReady();
@ -213,10 +190,8 @@ public class SchemasTests extends BaseTest {
@Order(7)
void createSchemaProtobuf() {
Schema schemaProtobuf = Schema.createSchemaProtobuf();
naviSideBar
.openSideMenu(SCHEMA_REGISTRY);
navigateToSchemaRegistry();
schemaRegistryList
.waitUntilScreenReady()
.clickCreateSchema();
schemaCreateForm
.setSubjectName(schemaProtobuf.getName())
@ -230,10 +205,7 @@ public class SchemasTests extends BaseTest {
softly.assertThat(schemaDetails.getSchemaType()).as("getSchemaType()").isEqualTo(schemaProtobuf.getType().getValue());
softly.assertThat(schemaDetails.getCompatibility()).as("getCompatibility()").isEqualTo(CompatibilityLevel.CompatibilityEnum.BACKWARD.getValue());
softly.assertAll();
naviSideBar
.openSideMenu(SCHEMA_REGISTRY);
schemaRegistryList
.waitUntilScreenReady();
navigateToSchemaRegistry();
Assertions.assertTrue(schemaRegistryList.isSchemaVisible(PROTOBUF_API.getName()),"isSchemaVisible()");
SCHEMA_LIST.add(schemaProtobuf);
}
@ -245,13 +217,8 @@ public class SchemasTests extends BaseTest {
@Test
@Order(8)
void deleteSchemaProtobuf() {
naviSideBar
.openSideMenu(SCHEMA_REGISTRY);
schemaRegistryList
.waitUntilScreenReady()
.openSchema(PROTOBUF_API.getName());
schemaDetails
.waitUntilScreenReady()
navigateToSchemaRegistryAndOpenDetails(PROTOBUF_API.getName());
schemaDetails
.removeSchema();
schemaRegistryList
.waitUntilScreenReady();
@ -263,4 +230,21 @@ public class SchemasTests extends BaseTest {
public void afterAll() {
SCHEMA_LIST.forEach(schema -> apiHelper.deleteSchema(CLUSTER_NAME, schema.getName()));
}
@Step
private void navigateToSchemaRegistry(){
naviSideBar
.openSideMenu(SCHEMA_REGISTRY);
schemaRegistryList
.waitUntilScreenReady();
}
@Step
private void navigateToSchemaRegistryAndOpenDetails(String schemaName){
navigateToSchemaRegistry();
schemaRegistryList
.openSchema(schemaName);
schemaDetails
.waitUntilScreenReady();
}
}

View file

@ -1,7 +1,7 @@
package com.provectus.kafka.ui.suite.topics;
import static com.provectus.kafka.ui.pages.BasePage.AlertHeader.SUCCESS;
import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.TOPICS;
import static com.provectus.kafka.ui.pages.topic.TopicDetails.TopicMenu.MESSAGES;
import static com.provectus.kafka.ui.settings.Source.CLUSTER_NAME;
import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
@ -47,13 +47,8 @@ public class TopicMessagesTests extends BaseTest {
@CaseId(222)
@Test
void produceMessage() {
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady()
.openTopic(TOPIC_FOR_MESSAGES.getName());
navigateToTopicsAndOpenDetails(TOPIC_FOR_MESSAGES.getName());
topicDetails
.waitUntilScreenReady()
.openDetailsTab(TopicDetails.TopicMenu.MESSAGES)
.clickProduceMessageBtn();
produceMessagePanel
@ -64,8 +59,10 @@ public class TopicMessagesTests extends BaseTest {
topicDetails
.waitUntilScreenReady();
SoftAssertions softly = new SoftAssertions();
softly.assertThat(topicDetails.isKeyMessageVisible((TOPIC_FOR_MESSAGES.getMessageKey()))).withFailMessage("isKeyMessageVisible()").isTrue();
softly.assertThat(topicDetails.isContentMessageVisible((TOPIC_FOR_MESSAGES.getMessageContent()).trim())).withFailMessage("isContentMessageVisible()").isTrue();
softly.assertThat(topicDetails.isKeyMessageVisible((TOPIC_FOR_MESSAGES.getMessageKey())))
.withFailMessage("isKeyMessageVisible()").isTrue();
softly.assertThat(topicDetails.isContentMessageVisible((TOPIC_FOR_MESSAGES.getMessageContent()).trim()))
.withFailMessage("isContentMessageVisible()").isTrue();
softly.assertAll();
}
@ -77,13 +74,8 @@ public class TopicMessagesTests extends BaseTest {
@CaseId(19)
@Test
void clearMessage() {
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady()
.openTopic(TOPIC_FOR_MESSAGES.getName());
navigateToTopicsAndOpenDetails(TOPIC_FOR_MESSAGES.getName());
topicDetails
.waitUntilScreenReady()
.openDetailsTab(TopicDetails.TopicMenu.OVERVIEW)
.clickProduceMessageBtn();
int messageAmount = topicDetails.getMessageCountAmount();
@ -110,14 +102,8 @@ public class TopicMessagesTests extends BaseTest {
@CaseId(21)
@Test
void copyMessageFromTopicProfile() {
String topicName = "_schemas";
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady()
.openTopic(topicName);
navigateToTopicsAndOpenDetails("_schemas");
topicDetails
.waitUntilScreenReady()
.openDetailsTab(TopicDetails.TopicMenu.MESSAGES)
.getRandomMessage()
.openDotMenu()
@ -126,6 +112,28 @@ public class TopicMessagesTests extends BaseTest {
"isAlertWithMessageVisible()");
}
@Disabled
@Issue("https://github.com/provectus/kafka-ui/issues/2856")
@DisplayName("Checking messages filtering by Offset within Topic/Messages")
@Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
@AutomationStatus(status = Status.AUTOMATED)
@CaseId(15)
@Test
void checkingMessageFilteringByOffset() {
String offsetValue = "2";
navigateToTopicsAndOpenDetails("_schemas");
topicDetails
.openDetailsTab(MESSAGES)
.selectSeekTypeDdlMessagesTab("Offset")
.setSeekTypeValueFldMessagesTab(offsetValue)
.clickSubmitFiltersBtnMessagesTab();
SoftAssertions softly = new SoftAssertions();
topicDetails.getAllMessages()
.forEach(messages -> softly.assertThat(messages.getOffset() == Integer.parseInt(offsetValue))
.as("getAllMessages()").isTrue());
softly.assertAll();
}
@AfterAll
public void afterAll() {
TOPIC_LIST.forEach(topic -> apiHelper.deleteTopic(CLUSTER_NAME, topic.getName()));

View file

@ -1,9 +1,13 @@
package com.provectus.kafka.ui.suite.topics;
import static com.provectus.kafka.ui.pages.NaviSideBar.SideMenuOption.TOPICS;
import static com.provectus.kafka.ui.pages.BasePage.AlertHeader.SUCCESS;
import static com.provectus.kafka.ui.pages.topic.TopicDetails.TopicMenu.MESSAGES;
import static com.provectus.kafka.ui.pages.topic.TopicDetails.TopicMenu.SETTINGS;
import static com.provectus.kafka.ui.pages.topic.enums.CleanupPolicyValue.COMPACT;
import static com.provectus.kafka.ui.pages.topic.enums.CleanupPolicyValue.DELETE;
import static com.provectus.kafka.ui.pages.topic.enums.CustomParameterType.COMPRESSION_TYPE;
import static com.provectus.kafka.ui.pages.topic.enums.MaxSizeOnDisk.NOT_SET;
import static com.provectus.kafka.ui.pages.topic.enums.MaxSizeOnDisk.SIZE_1_GB;
import static com.provectus.kafka.ui.pages.topic.enums.MaxSizeOnDisk.SIZE_20_GB;
import static com.provectus.kafka.ui.settings.Source.CLUSTER_NAME;
import static com.provectus.kafka.ui.utilities.FileUtils.fileToString;
@ -45,21 +49,26 @@ public class TopicsTests extends BaseTest {
.setCustomParameterType(COMPRESSION_TYPE)
.setCustomParameterValue("producer")
.setCleanupPolicyValue(DELETE);
private static final Topic TOPIC_FOR_UPDATE = new Topic()
private static final Topic TOPIC_TO_UPDATE = new Topic()
.setName("topic-to-update-" + randomAlphabetic(5))
.setNumberOfPartitions(1)
.setCleanupPolicyValue(COMPACT)
.setTimeToRetainData("604800001")
.setMaxSizeOnDisk(SIZE_20_GB)
.setMaxMessageBytes("1000020")
.setMessageKey(fileToString(System.getProperty("user.dir") + "/src/test/resources/producedkey.txt"))
.setMessageContent(fileToString(System.getProperty("user.dir") + "/src/test/resources/testData.txt"));
private static final Topic TOPIC_TO_CHECK_SETTINGS = new Topic()
.setName("new-topic-" + randomAlphabetic(5))
.setNumberOfPartitions(1)
.setMaxMessageBytes("1000012")
.setMaxSizeOnDisk(NOT_SET);
private static final Topic TOPIC_FOR_DELETE = new Topic().setName("topic-to-delete-" + randomAlphabetic(5));
private static final List<Topic> TOPIC_LIST = new ArrayList<>();
@BeforeAll
public void beforeAll() {
TOPIC_LIST.addAll(List.of(TOPIC_FOR_UPDATE, TOPIC_FOR_DELETE));
TOPIC_LIST.addAll(List.of(TOPIC_TO_UPDATE, TOPIC_FOR_DELETE));
TOPIC_LIST.forEach(topic -> apiHelper.createTopic(CLUSTER_NAME, topic.getName()));
}
@ -70,10 +79,8 @@ public class TopicsTests extends BaseTest {
@Test
@Order(1)
public void createTopic() {
naviSideBar
.openSideMenu(TOPICS);
navigateToTopics();
topicsList
.waitUntilScreenReady()
.clickAddTopicBtn();
topicCreateEditForm
.waitUntilScreenReady()
@ -81,13 +88,7 @@ public class TopicsTests extends BaseTest {
.setNumberOfPartitions(TOPIC_TO_CREATE.getNumberOfPartitions())
.selectCleanupPolicy(TOPIC_TO_CREATE.getCleanupPolicyValue())
.clickCreateTopicBtn();
topicDetails
.waitUntilScreenReady();
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady()
.openTopic(TOPIC_TO_CREATE.getName());
navigateToTopicsAndOpenDetails(TOPIC_TO_CREATE.getName());
SoftAssertions softly = new SoftAssertions();
softly.assertThat(topicDetails.isTopicHeaderVisible(TOPIC_TO_CREATE.getName())).as("isTopicHeaderVisible()")
.isTrue();
@ -96,10 +97,7 @@ public class TopicsTests extends BaseTest {
softly.assertThat(topicDetails.getPartitions()).as("getPartitions()")
.isEqualTo(TOPIC_TO_CREATE.getNumberOfPartitions());
softly.assertAll();
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady();
navigateToTopics();
Assertions.assertTrue(topicsList.isTopicVisible(TOPIC_TO_CREATE.getName()), "isTopicVisible");
TOPIC_LIST.add(TOPIC_TO_CREATE);
}
@ -110,20 +108,16 @@ public class TopicsTests extends BaseTest {
@CaseId(7)
@Test
@Order(2)
void checkAvailableOperations(){
String processingTopic = "my_ksql_1ksql_processing_log";
String confluentTopic = "_confluent-ksql-my_ksql_1_command_topic";
naviSideBar
.openSideMenu(TOPICS);
void checkAvailableOperations() {
navigateToTopics();
topicsList
.waitUntilScreenReady()
.selectCheckboxByName(processingTopic);
topicsList.getActionButtons().
forEach(element -> assertThat(element.is(Condition.enabled))
.as(element.getSearchCriteria() + " isEnabled()").isTrue());
.getTopicItem("my_ksql_1ksql_processing_log")
.selectItem(true);
verifyElementsCondition(topicsList.getActionButtons(),Condition.enabled);
topicsList
.selectCheckboxByName(confluentTopic);
Assertions.assertFalse(topicsList.isCopySelectedTopicBtnEnabled(),"isCopySelectedTopicBtnEnabled()");
.getTopicItem("_confluent-ksql-my_ksql_1_command_topic")
.selectItem(true);
Assertions.assertFalse(topicsList.isCopySelectedTopicBtnEnabled(), "isCopySelectedTopicBtnEnabled()");
}
@Disabled()
@ -135,43 +129,33 @@ public class TopicsTests extends BaseTest {
@Test
@Order(3)
public void updateTopic() {
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady()
.openTopic(TOPIC_FOR_UPDATE.getName());
navigateToTopicsAndOpenDetails(TOPIC_TO_UPDATE.getName());
topicDetails
.waitUntilScreenReady()
.openDotMenu()
.clickEditSettingsMenu();
topicCreateEditForm
.waitUntilScreenReady()
.selectCleanupPolicy((TOPIC_FOR_UPDATE.getCleanupPolicyValue()))
.selectCleanupPolicy((TOPIC_TO_UPDATE.getCleanupPolicyValue()))
.setMinInsyncReplicas(10)
.setTimeToRetainDataInMs(TOPIC_FOR_UPDATE.getTimeToRetainData())
.setMaxSizeOnDiskInGB(TOPIC_FOR_UPDATE.getMaxSizeOnDisk())
.setMaxMessageBytes(TOPIC_FOR_UPDATE.getMaxMessageBytes())
.setTimeToRetainDataInMs(TOPIC_TO_UPDATE.getTimeToRetainData())
.setMaxSizeOnDiskInGB(TOPIC_TO_UPDATE.getMaxSizeOnDisk())
.setMaxMessageBytes(TOPIC_TO_UPDATE.getMaxMessageBytes())
.clickCreateTopicBtn();
topicDetails
.waitUntilScreenReady();
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady()
.openTopic(TOPIC_FOR_UPDATE.getName());
navigateToTopicsAndOpenDetails(TOPIC_TO_UPDATE.getName());
topicDetails
.waitUntilScreenReady()
.openDotMenu()
.clickEditSettingsMenu();
SoftAssertions softly = new SoftAssertions();
softly.assertThat(topicCreateEditForm.getCleanupPolicy()).as("getCleanupPolicy()")
.isEqualTo(TOPIC_FOR_UPDATE.getCleanupPolicyValue().getVisibleText());
.isEqualTo(TOPIC_TO_UPDATE.getCleanupPolicyValue().getVisibleText());
softly.assertThat(topicCreateEditForm.getTimeToRetain()).as("getTimeToRetain()")
.isEqualTo(TOPIC_FOR_UPDATE.getTimeToRetainData());
.isEqualTo(TOPIC_TO_UPDATE.getTimeToRetainData());
softly.assertThat(topicCreateEditForm.getMaxSizeOnDisk()).as("getMaxSizeOnDisk()")
.isEqualTo(TOPIC_FOR_UPDATE.getMaxSizeOnDisk().getVisibleText());
.isEqualTo(TOPIC_TO_UPDATE.getMaxSizeOnDisk().getVisibleText());
softly.assertThat(topicCreateEditForm.getMaxMessageBytes()).as("getMaxMessageBytes()")
.isEqualTo(TOPIC_FOR_UPDATE.getMaxMessageBytes());
.isEqualTo(TOPIC_TO_UPDATE.getMaxMessageBytes());
softly.assertAll();
}
@ -182,20 +166,12 @@ public class TopicsTests extends BaseTest {
@Test
@Order(4)
public void deleteTopic() {
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady()
.openTopic(TOPIC_FOR_DELETE.getName());
navigateToTopicsAndOpenDetails(TOPIC_FOR_DELETE.getName());
topicDetails
.waitUntilScreenReady()
.openDotMenu()
.clickDeleteTopicMenu()
.clickConfirmDeleteBtn();
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady();
.clickConfirmBtnMdl();
navigateToTopics();
Assertions.assertFalse(topicsList.isTopicVisible(TOPIC_FOR_DELETE.getName()), "isTopicVisible");
TOPIC_LIST.remove(TOPIC_FOR_DELETE);
}
@ -209,13 +185,8 @@ public class TopicsTests extends BaseTest {
void redirectToConsumerFromTopic() {
String topicName = "source-activities";
String consumerGroupId = "connect-sink_postgres_activities";
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady()
.openTopic(topicName);
navigateToTopicsAndOpenDetails(topicName);
topicDetails
.waitUntilScreenReady()
.openDetailsTab(TopicDetails.TopicMenu.CONSUMERS)
.openConsumerGroup(consumerGroupId);
consumersDetails
@ -233,10 +204,8 @@ public class TopicsTests extends BaseTest {
@Test
@Order(6)
void checkTopicCreatePossibility() {
naviSideBar
.openSideMenu(TOPICS);
navigateToTopics();
topicsList
.waitUntilScreenReady()
.clickAddTopicBtn();
topicCreateEditForm
.waitUntilScreenReady();
@ -253,15 +222,49 @@ public class TopicsTests extends BaseTest {
assertThat(topicCreateEditForm.isCreateTopicButtonEnabled()).as("isCreateTopicButtonEnabled()").isTrue();
}
@DisplayName("Checking 'Time to retain data (in ms)' custom value with editing Topic's settings")
@Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
@AutomationStatus(status = Status.AUTOMATED)
@CaseId(266)
@Test
@Order(7)
void checkTimeToRetainDataCustomValueWithEditingTopic() {
Topic topicToRetainData = new Topic()
.setName("topic-to-retain-data-" + randomAlphabetic(5))
.setTimeToRetainData("86400000");
navigateToTopics();
topicsList
.clickAddTopicBtn();
topicCreateEditForm
.waitUntilScreenReady()
.setTopicName(topicToRetainData.getName())
.setNumberOfPartitions(1)
.setTimeToRetainDataInMs("604800000");
assertThat(topicCreateEditForm.getTimeToRetain()).as("getTimeToRetain()").isEqualTo("604800000");
topicCreateEditForm
.setTimeToRetainDataInMs(topicToRetainData.getTimeToRetainData())
.clickCreateTopicBtn();
topicDetails
.waitUntilScreenReady()
.openDotMenu()
.clickEditSettingsMenu();
assertThat(topicCreateEditForm.getTimeToRetain()).as("getTimeToRetain()")
.isEqualTo(topicToRetainData.getTimeToRetainData());
topicDetails
.openDetailsTab(SETTINGS);
assertThat(topicDetails.getSettingsGridValueByKey("retention.ms")).as("getSettingsGridValueByKey()")
.isEqualTo(topicToRetainData.getTimeToRetainData());
TOPIC_LIST.add(topicToRetainData);
}
@DisplayName("Checking requiredness of Custom parameters within 'Create new Topic'")
@Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
@AutomationStatus(status = Status.AUTOMATED)
@CaseId(6)
@Test
@Order(7)
@Order(8)
void checkCustomParametersWithinCreateNewTopic() {
naviSideBar
.openSideMenu(TOPICS);
navigateToTopics();
topicsList
.waitUntilScreenReady()
.clickAddTopicBtn();
@ -283,20 +286,11 @@ public class TopicsTests extends BaseTest {
@AutomationStatus(status = Status.AUTOMATED)
@CaseId(2)
@Test
@Order(8)
@Order(9)
void checkTopicListElements() {
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady();
SoftAssertions softly = new SoftAssertions();
topicsList.getAllVisibleElements().forEach(
element -> softly.assertThat(element.is(Condition.visible)).as(element.getSearchCriteria() + " isVisible()")
.isTrue());
topicsList.getAllEnabledElements().forEach(
element -> softly.assertThat(element.is(Condition.enabled)).as(element.getSearchCriteria() + " isEnabled()")
.isTrue());
softly.assertAll();
navigateToTopics();
verifyElementsCondition(topicsList.getAllVisibleElements(), Condition.visible);
verifyElementsCondition(topicsList.getAllEnabledElements(), Condition.enabled);
}
@DisplayName("Filter adding within Topic")
@ -304,39 +298,177 @@ public class TopicsTests extends BaseTest {
@AutomationStatus(status = Status.AUTOMATED)
@CaseId(12)
@Test
@Order(9)
@Order(10)
void addingNewFilterWithinTopic() {
String topicName = "_schemas";
String filterName = "123ABC";
naviSideBar
.openSideMenu(TOPICS);
topicsList
.waitUntilScreenReady()
.openTopic(topicName);
String filterName = randomAlphabetic(5);
navigateToTopicsAndOpenDetails("_schemas");
topicDetails
.openDetailsTab(TopicDetails.TopicMenu.MESSAGES)
.openDetailsTab(MESSAGES)
.clickMessagesAddFiltersBtn()
.waitUntilAddFiltersMdlVisible();
SoftAssertions softly = new SoftAssertions();
topicDetails.getAllAddFilterModalVisibleElements().forEach(element ->
softly.assertThat(element.is(Condition.visible))
.as(element.getSearchCriteria() + " isVisible()").isTrue());
topicDetails.getAllAddFilterModalEnabledElements().forEach(element ->
softly.assertThat(element.is(Condition.enabled))
.as(element.getSearchCriteria() + " isEnabled()").isTrue());
topicDetails.getAllAddFilterModalDisabledElements().forEach(element ->
softly.assertThat(element.is(Condition.enabled))
.as(element.getSearchCriteria() + " isEnabled()").isFalse());
softly.assertThat(topicDetails.isSaveThisFilterCheckBoxSelected()).as("isSaveThisFilterCheckBoxSelected()")
verifyElementsCondition(topicDetails.getAllAddFilterModalVisibleElements(), Condition.visible);
verifyElementsCondition(topicDetails.getAllAddFilterModalEnabledElements(), Condition.enabled);
verifyElementsCondition(topicDetails.getAllAddFilterModalDisabledElements(), Condition.disabled);
assertThat(topicDetails.isSaveThisFilterCheckBoxSelected()).as("isSaveThisFilterCheckBoxSelected()")
.isFalse();
softly.assertAll();
topicDetails
.setFilterCodeFieldAddFilterMdl(filterName);
assertThat(topicDetails.isAddFilterBtnAddFilterMdlEnabled()).as("isMessagesAddFilterTabAddFilterBtnEnabled()")
assertThat(topicDetails.isAddFilterBtnAddFilterMdlEnabled()).as("isAddFilterBtnAddFilterMdlEnabled()")
.isTrue();
topicDetails.clickAddFilterBtnAddFilterMdl();
assertThat(topicDetails.getFilterName()).as("isFilterNameVisible(filterName)")
.isEqualTo(filterName);
topicDetails.clickAddFilterBtnAndCloseMdl(true);
assertThat(topicDetails.isActiveFilterVisible(filterName)).as("isActiveFilterVisible()")
.isTrue();
}
@DisplayName("Checking filter saving within Messages/Topic profile/Saved Filters")
@Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
@AutomationStatus(status = Status.AUTOMATED)
@CaseId(13)
@Test
@Order(11)
void checkFilterSavingWithinSavedFilters() {
String displayName = randomAlphabetic(5);
navigateToTopicsAndOpenDetails("my_ksql_1ksql_processing_log");
topicDetails
.openDetailsTab(MESSAGES)
.clickMessagesAddFiltersBtn()
.waitUntilAddFiltersMdlVisible()
.setFilterCodeFieldAddFilterMdl(randomAlphabetic(4))
.selectSaveThisFilterCheckboxMdl(true)
.setDisplayNameFldAddFilterMdl(displayName);
assertThat(topicDetails.isAddFilterBtnAddFilterMdlEnabled()).as("isAddFilterBtnAddFilterMdlEnabled()")
.isTrue();
topicDetails
.clickAddFilterBtnAndCloseMdl(false)
.openSavedFiltersListMdl();
assertThat(topicDetails.isFilterVisibleAtSavedFiltersMdl(displayName))
.as("isFilterVisibleAtSavedFiltersMdl()").isTrue();
}
@DisplayName("Checking applying saved filter within Topic/Messages")
@Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
@AutomationStatus(status = Status.AUTOMATED)
@CaseId(14)
@Test
@Order(12)
void checkingApplyingSavedFilterWithinTopicMessages() {
String displayName = randomAlphabetic(5);
navigateToTopicsAndOpenDetails("my_ksql_1ksql_processing_log");
topicDetails
.openDetailsTab(MESSAGES)
.clickMessagesAddFiltersBtn()
.waitUntilAddFiltersMdlVisible()
.setFilterCodeFieldAddFilterMdl(randomAlphabetic(4))
.selectSaveThisFilterCheckboxMdl(true)
.setDisplayNameFldAddFilterMdl(displayName)
.clickAddFilterBtnAndCloseMdl(false)
.openSavedFiltersListMdl()
.selectFilterAtSavedFiltersMdl(displayName)
.clickSelectFilterBtnAtSavedFiltersMdl();
assertThat(topicDetails.isActiveFilterVisible(displayName))
.as("isActiveFilterVisible()").isTrue();
}
@DisplayName("Checking 'Show Internal Topics' toggle functionality within 'All Topics' page")
@Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
@AutomationStatus(status = Status.AUTOMATED)
@CaseId(11)
@Test
@Order(13)
void checkShowInternalTopicsButtonFunctionality(){
navigateToTopics();
SoftAssertions softly = new SoftAssertions();
softly.assertThat(topicsList.isShowInternalRadioBtnSelected()).as("isInternalRadioBtnSelected()").isTrue();
softly.assertThat(topicsList.getInternalTopics()).as("getInternalTopics()").size().isGreaterThan(0);
softly.assertThat(topicsList.getNonInternalTopics()).as("getNonInternalTopics()").size().isGreaterThan(0);
softly.assertAll();
topicsList
.setShowInternalRadioButton(false);
softly.assertThat(topicsList.getInternalTopics()).as("getInternalTopics()").size().isEqualTo(0);
softly.assertThat(topicsList.getNonInternalTopics()).as("getNonInternalTopics()").size().isGreaterThan(0);
softly.assertAll();
}
@DisplayName("Checking Topics settings to make sure retention.bytes is right according to Max size on disk in GB selected value")
@Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
@AutomationStatus(status = Status.AUTOMATED)
@CaseId(56)
@Test
void checkRetentionBytesAccordingToMaxSizeOnDisk(){
navigateToTopics();
topicsList
.clickAddTopicBtn();
topicCreateEditForm
.waitUntilScreenReady()
.setTopicName(TOPIC_TO_CHECK_SETTINGS.getName())
.setNumberOfPartitions(TOPIC_TO_CHECK_SETTINGS.getNumberOfPartitions())
.setMaxMessageBytes(TOPIC_TO_CHECK_SETTINGS.getMaxMessageBytes())
.clickCreateTopicBtn();
topicDetails
.waitUntilScreenReady();
TOPIC_LIST.add(TOPIC_TO_CHECK_SETTINGS);
topicDetails
.openDetailsTab(SETTINGS);
topicSettingsTab
.waitUntilScreenReady();
SoftAssertions softly = new SoftAssertions();
softly.assertThat(topicSettingsTab.getValueByKey("retention.bytes"))
.as("getValueOfKey(retention.bytes)").isEqualTo(TOPIC_TO_CHECK_SETTINGS.getMaxSizeOnDisk().getOptionValue());
softly.assertThat(topicSettingsTab.getValueByKey("max.message.bytes"))
.as("getValueOfKey(max.message.bytes)").isEqualTo(TOPIC_TO_CHECK_SETTINGS.getMaxMessageBytes());
softly.assertAll();
TOPIC_TO_CHECK_SETTINGS
.setMaxSizeOnDisk(SIZE_1_GB)
.setMaxMessageBytes("1000056");
topicDetails
.openDotMenu()
.clickEditSettingsMenu();
topicCreateEditForm
.waitUntilScreenReady()
.setMaxSizeOnDiskInGB(TOPIC_TO_CHECK_SETTINGS.getMaxSizeOnDisk())
.setMaxMessageBytes(TOPIC_TO_CHECK_SETTINGS.getMaxMessageBytes())
.clickCreateTopicBtn();
topicDetails
.waitUntilScreenReady()
.openDetailsTab(SETTINGS);
topicSettingsTab
.waitUntilScreenReady();
softly.assertThat(topicSettingsTab.getValueByKey("retention.bytes"))
.as("getValueOfKey(retention.bytes)").isEqualTo(TOPIC_TO_CHECK_SETTINGS.getMaxSizeOnDisk().getOptionValue());
softly.assertThat(topicSettingsTab.getValueByKey("max.message.bytes"))
.as("getValueOfKey(max.message.bytes)").isEqualTo(TOPIC_TO_CHECK_SETTINGS.getMaxMessageBytes());
softly.assertAll();
}
@DisplayName("TopicTests.recreateTopicFromTopicProfile : Recreate topic from topic profile")
@Suite(suiteId = SUITE_ID, title = SUITE_TITLE)
@AutomationStatus(status = Status.AUTOMATED)
@CaseId(247)
@Test
void recreateTopicFromTopicProfile(){
Topic topicToRecreate = new Topic()
.setName("topic-to-recreate-" + randomAlphabetic(5))
.setNumberOfPartitions(1);
navigateToTopics();
topicsList
.clickAddTopicBtn();
topicCreateEditForm
.waitUntilScreenReady()
.setTopicName(topicToRecreate.getName())
.setNumberOfPartitions(topicToRecreate.getNumberOfPartitions())
.clickCreateTopicBtn();
topicDetails
.waitUntilScreenReady();
TOPIC_LIST.add(topicToRecreate);
topicDetails
.openDotMenu()
.clickRecreateTopicMenu();
assertThat(topicDetails.isConfirmationMdlVisible()).as("isConfirmationMdlVisible()").isTrue();
topicDetails
.clickConfirmBtnMdl();
assertThat(topicDetails.isAlertWithMessageVisible(SUCCESS,
String.format("Topic %s successfully recreated!", topicToRecreate.getName())))
.as("isAlertWithMessageVisible()").isTrue();
}
@AfterAll