diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/StaticSite.java b/jdi-light-angular-tests/src/main/java/io/github/com/StaticSite.java index 0c329d4132..318639d81f 100644 --- a/jdi-light-angular-tests/src/main/java/io/github/com/StaticSite.java +++ b/jdi-light-angular-tests/src/main/java/io/github/com/StaticSite.java @@ -13,6 +13,7 @@ import io.github.com.pages.ProgressBarPage; import io.github.com.pages.ProgressSpinnerPage; import io.github.com.pages.RadioButtonPage; +import io.github.com.pages.SideNavPage; import io.github.com.pages.SlideTogglePage; @JSite("https://jdi-testing.github.io/jdi-light/angular-page/#/") @@ -39,6 +40,9 @@ public class StaticSite { @Url("buttons_toggle") public static ButtonTogglePage buttonTogglePage; + @Url("sidenav") + public static SideNavPage sideNavPage; + @Url("divider") public static DividerPage dividerPage; diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/enums/ConfigurableMode.java b/jdi-light-angular-tests/src/main/java/io/github/com/enums/ConfigurableMode.java new file mode 100644 index 0000000000..cccc50d11f --- /dev/null +++ b/jdi-light-angular-tests/src/main/java/io/github/com/enums/ConfigurableMode.java @@ -0,0 +1,18 @@ +package io.github.com.enums; + +public enum ConfigurableMode { + + OVER("over"), + SIDE("side"), + PUSH("push"); + + private final String mode; + + ConfigurableMode(String mode) { + this.mode = mode; + } + + public String getMode() { + return mode; + } +} diff --git a/jdi-light-angular-tests/src/main/java/io/github/com/pages/SideNavPage.java b/jdi-light-angular-tests/src/main/java/io/github/com/pages/SideNavPage.java new file mode 100644 index 0000000000..78ff05e19f --- /dev/null +++ b/jdi-light-angular-tests/src/main/java/io/github/com/pages/SideNavPage.java @@ -0,0 +1,94 @@ +package io.github.com.pages; + +import com.epam.jdi.light.angular.elements.common.Button; +import com.epam.jdi.light.angular.elements.common.Checkbox; +import com.epam.jdi.light.angular.elements.complex.radiobuttons.RadioGroup; +import com.epam.jdi.light.angular.elements.composite.MaterialSelectorContainer; +import com.epam.jdi.light.angular.elements.composite.SideNavContainer; +import com.epam.jdi.light.elements.pageobjects.annotations.locators.UI; +import com.epam.jdi.light.ui.html.elements.common.TextField; +import io.github.com.pages.sections.SideNavSection; + +public class SideNavPage extends NewAngularPage { + + public static SideNavContainer basicSideNav; + public static SideNavContainer basicDrawer; + public static SideNavContainer sidenavBackdropContainer; + public static SideNavContainer implicitMainContent; + public static SideNavContainer openCloseBehavior; + + @UI("#open-close-behavior mat-checkbox") + public static Checkbox sideNavOpened; + + @UI("#open-close-behavior button") + public static Button sideNavToggle; + + public static SideNavContainer configurableMode; + + @UI("#configurable-mode .mat-sidenav button") + public static Button sideToggle; + + @UI("#configurable-mode .mat-sidenav-content button") + public static Button contentToggle; + + @UI("#configurable-mode .mat-sidenav .mat-mdc-radio-group") + public static RadioGroup sideNavRadioGroup; + @UI("#mat-select-position") + public static MaterialSelectorContainer sideNavPosition; + + @UI("#mat-select-focus-on-the-first-item") + public static MaterialSelectorContainer sideNavFocusSelection; + + @UI("#configurable-mode .mat-sidenav-content .mat-mdc-radio-group") + public static RadioGroup contentRadioGroup; + + public static SideNavContainer customEscapeBackdrop; + + @UI("#custom-escape-backdrop .mat-sidenav button") + public static Button toggleSideNav; + + @UI("#custom-escape-backdrop .mat-sidenav-content button") + public static Button openSideNav; + + public static SideNavContainer autoSizeSideNav; + + @UI("#auto-size-side-nav .mat-drawer-content button") + public static Button toggleAutoNav; + + @UI("#auto-size-side-nav .mat-drawer button") + public static Button toggleExtraText; + + public static SideNavContainer fixedPosition; + + @UI("#fixed-position mat-checkbox") + public static Checkbox fixSideNav; + + @UI("#fixed-position .mat-sidenav-content button") + public static Button toggleFixedSideNav; + + @UI("#fixed-position .mat-sidenav-content mat-form-field input[formcontrolname='top']") + public static TextField topGap; + + @UI("#fixed-position .mat-sidenav-content mat-form-field input[formcontrolname='bottom']") + public static TextField bottomGap; + + public static SideNavSection sidenavBackdropDrawer; + + public static SideNavContainer responsiveContent; + + @UI("//*[@id='responsive-content']/preceding-sibling::mat-toolbar/button") + public static Button toolbarToggle; + + @UI("#mat-drawer-open-button") + public static Button backDropToggle; + + @UI("//button[.//span[contains(@class, 'mdc-button__label') and text()='First Element']]") + public static Button firstElement; + + // @UI("//button[.//span[contains(@class, 'mdc-button__label') and text()='First Element'] and contains(@class, 'cdk-focused')]") + @UI("//button[contains(@class, 'cdk-focused') and contains(@class, 'cdk-program-focused') and //span[contains(@class, 'mdc-button__label') and text()='First Element']]") + public static Button firstElementFocused; + + @UI("//button[.//span[contains(@class, 'mdc-button__label') and text()='Second Element']]") + public static Button secondElement; +} diff --git a/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/complex/SideNavTests.java b/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/complex/SideNavTests.java index 1790b30a99..70f74e9637 100644 --- a/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/complex/SideNavTests.java +++ b/jdi-light-angular-tests/src/test/java/io/github/epam/angular/tests/elements/complex/SideNavTests.java @@ -1,20 +1,50 @@ package io.github.epam.angular.tests.elements.complex; -import com.epam.jdi.light.elements.common.UIElement; +import com.epam.jdi.light.angular.elements.complex.SideNav; import io.github.epam.TestsInit; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Ignore; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import static com.epam.jdi.light.elements.composite.WebPage.refresh; -import static com.jdiai.tools.StringUtils.format; -import static io.github.com.StaticSite.angularPage; -import static io.github.com.pages.sections.SideNavSection.*; -import static io.github.epam.site.steps.States.shouldBeLoggedIn; +import static com.jdiai.tools.Timer.waitCondition; +import static io.github.com.StaticSite.sideNavPage; +import static io.github.com.enums.ConfigurableMode.OVER; +import static io.github.com.enums.ConfigurableMode.PUSH; +import static io.github.com.enums.ConfigurableMode.SIDE; +import static io.github.com.pages.SideNavPage.autoSizeSideNav; +import static io.github.com.pages.SideNavPage.backDropToggle; +import static io.github.com.pages.SideNavPage.basicDrawer; +import static io.github.com.pages.SideNavPage.basicSideNav; +import static io.github.com.pages.SideNavPage.bottomGap; +import static io.github.com.pages.SideNavPage.configurableMode; +import static io.github.com.pages.SideNavPage.contentRadioGroup; +import static io.github.com.pages.SideNavPage.contentToggle; +import static io.github.com.pages.SideNavPage.customEscapeBackdrop; +import static io.github.com.pages.SideNavPage.firstElementFocused; +import static io.github.com.pages.SideNavPage.fixSideNav; +import static io.github.com.pages.SideNavPage.fixedPosition; +import static io.github.com.pages.SideNavPage.implicitMainContent; +import static io.github.com.pages.SideNavPage.openCloseBehavior; +import static io.github.com.pages.SideNavPage.openSideNav; +import static io.github.com.pages.SideNavPage.responsiveContent; +import static io.github.com.pages.SideNavPage.sideNavFocusSelection; +import static io.github.com.pages.SideNavPage.sideNavOpened; +import static io.github.com.pages.SideNavPage.sideNavPosition; +import static io.github.com.pages.SideNavPage.sideNavRadioGroup; +import static io.github.com.pages.SideNavPage.sideNavToggle; +import static io.github.com.pages.SideNavPage.sideToggle; +import static io.github.com.pages.SideNavPage.sidenavBackdropContainer; +import static io.github.com.pages.SideNavPage.sidenavBackdropDrawer; +import static io.github.com.pages.SideNavPage.toggleAutoNav; +import static io.github.com.pages.SideNavPage.toggleExtraText; +import static io.github.com.pages.SideNavPage.toggleFixedSideNav; +import static io.github.com.pages.SideNavPage.toggleSideNav; +import static io.github.com.pages.SideNavPage.toolbarToggle; +import static io.github.com.pages.SideNavPage.topGap; +import static java.lang.String.format; import static org.hamcrest.Matchers.containsString; -// TODO Move to the new page -@Ignore + public class SideNavTests extends TestsInit { public static final String SIDE_NAV_CONTENT = "Sidenav content"; @@ -24,15 +54,15 @@ public class SideNavTests extends TestsInit { public static final String STYLE_VISIBLE = "transform: none; visibility: visible;"; public static final String STYLE_HIDDEN = "box-shadow: none; visibility: hidden;"; public static final String MODE = "mode"; - public static final String SIDE = "side"; - @BeforeMethod(alwaysRun = true) + @BeforeClass(alwaysRun = true) public void before() { - shouldBeLoggedIn(); - angularPage.shouldBeOpened(); + sideNavPage.open(); + waitCondition(() -> sideNavPage.isOpened()); + sideNavPage.checkOpened(); } - @Test + @Test(description = "Verify that the basic sideNav is displayed") public void verifyBasicSideNavTest() { basicSideNav.show(); basicSideNav.is().displayed(); @@ -41,7 +71,7 @@ public void verifyBasicSideNavTest() { basicSideNav.getContent().has().text(MAIN_CONTENT); } - @Test + @Test(description = "Verify that the basicDrawer sideNav is displayed") public void verifyBasicDrawerTest() { basicDrawer.show(); basicDrawer.is().displayed(); @@ -50,27 +80,58 @@ public void verifyBasicDrawerTest() { basicDrawer.getMatDrawerContent().has().text(MAIN_CONTENT); } - @Test + @Test(description = "Tests confirm menu position changes for 'start' or 'end' selector options.") + public void verifyPositionSelectionDrawerWithExplicitBackdropSettingSideNavTest() { + sidenavBackdropContainer.show(); + sidenavBackdropContainer.is().displayed(); + sidenavBackdropContainer.is().enabled(); + + sideNavPosition.click(); + sideNavPosition.select("End"); + + backDropToggle.click(); + sidenavBackdropDrawer.is().displayed(); + sidenavBackdropContainer.has().sideNavSectionOnTheRight(sidenavBackdropDrawer.getLocation()); + } + + @Test(description = "Test verifies first menu item focus when 'true' is selected") + public void verifyFocusSelectionDrawerWithExplicitBackdropSettingSideNavTest() { + sidenavBackdropContainer.show(); + sidenavBackdropContainer.is().displayed(); + sidenavBackdropContainer.is().enabled(); + + sideNavFocusSelection.click(); + sideNavFocusSelection.select("True"); + + backDropToggle.click(); + + firstElementFocused.has().text("First Element"); + firstElementFocused.is().displayed(); + firstElementFocused.is().focused(); + } + + @Test(description = "Verify main content is properly displayed alongside two side navigation panels") public void verifyImplicitMainContentWithTwoSideNavTest() { implicitMainContent.show(); - UIElement startSideNav = implicitMainContent.getSideNav("start"); - UIElement endSideNav = implicitMainContent.getSideNav("end"); + SideNav start = implicitMainContent.getSideNav("start"); + SideNav end = implicitMainContent.getSideNav("end"); - startSideNav.has().attr(MODE, SIDE); - startSideNav.has().attr(STYLE, STYLE_VISIBLE); - startSideNav.has().text("Start content"); + start.has().attr(MODE, SIDE.getMode()); + start.has().attr(STYLE, STYLE_VISIBLE); + start.has().text("Start content"); - endSideNav.has().attr(MODE, SIDE); - endSideNav.has().attr(STYLE, STYLE_VISIBLE); - endSideNav.has().text("End content"); + end.has().attr(MODE, SIDE.getMode()); + end.has().attr(STYLE, STYLE_VISIBLE); + end.has().text("End content"); implicitMainContent.getContent().has().text("Implicit main content"); implicitMainContent.getContent().is().displayed(); implicitMainContent.getContent().is().enabled(); } - @Test + @Test(description = "Tests the opening and closing functionality of the component") public void verifyOpenCloseBehaviorTest() { + refresh(); openCloseBehavior.show(); openCloseBehavior.getContent().is().displayed(); openCloseBehavior.getContent().is().enabled(); @@ -79,47 +140,55 @@ public void verifyOpenCloseBehaviorTest() { openCloseBehavior.getSideNav().has().text(SIDE_NAV_CONTENT); sideNavOpened.click(); - openCloseBehavior.base().timer().wait(() -> openCloseBehavior.isEnabled()); - openCloseBehavior.getEvents().has().text("open!\nclose!"); + openCloseBehavior.isEnabled(); + openCloseBehavior.getSideNav().is().notVisible(); } - @Test + @Test(description = "Verify SideNav with with configurable mode") public void toggleConfigurableSideNavTest() { refresh(); configurableMode.show(); contentToggle.click(); - configurableMode.base().timer().wait(() -> configurableMode.visualValidation(".mat-sidenav")); + configurableMode.base().timer().wait(() -> configurableMode.getSideNav().has().attr(STYLE, STYLE_VISIBLE)); configurableMode.getSideNav().has().attr(STYLE, STYLE_VISIBLE); sideToggle.click(); - configurableMode.base().timer().wait(() -> configurableMode.visualValidation(".mat-sidenav")); + configurableMode.base().timer().wait(() -> configurableMode.getSideNav().has().attr(STYLE, STYLE_HIDDEN)); configurableMode.getSideNav().has().attr(STYLE, STYLE_HIDDEN); } - @Test + @Test(description = "Verify side radio group buttons") public void sideRadioGroupTest() { refresh(); contentToggle.click(); - configurableMode.getContent().has().attr(STYLE, ""); - sideNavRadioGroup.click("Side"); - configurableMode.getContent().has().attr(STYLE, "margin-left: 258px;"); + sideNavRadioGroup.show(); + configurableMode.getContent().is().displayed(); + configurableMode.getMatDrawer().has().configurableMode(OVER.getMode()); + + sideNavRadioGroup.click(SIDE.getMode()); + configurableMode.getContent().is().displayed(); + configurableMode.getMatDrawer().has().configurableMode(SIDE.getMode()); - sideNavRadioGroup.click("Push"); - configurableMode.getContent().has().attr(STYLE, "margin-left: 258px; margin-right: -258px;"); + sideNavRadioGroup.click(PUSH.getMode()); + configurableMode.getContent().is().displayed(); + configurableMode.getMatDrawer().has().configurableMode(PUSH.getMode()); } - @Test + @Test(description = "Verify content radio group buttons") public void contentRadioButtonsTest() { + refresh(); contentToggle.click(); - sideNavRadioGroup.click("Side"); - configurableMode.getContent().has().attr(STYLE, "margin-left: 258px;"); + sideNavRadioGroup.show(); + + sideNavRadioGroup.click(SIDE.getMode()); + configurableMode.getMatDrawer().has().configurableMode(SIDE.getMode()); - contentRadioGroup.click("Push"); - configurableMode.getContent().has().attr(STYLE, "margin-left: 258px; margin-right: -258px;"); + contentRadioGroup.click(PUSH.getMode()); + configurableMode.getMatDrawer().has().configurableMode(PUSH.getMode()); } - @Test + @Test(description = "Verify toggle button") public void closeByToggleTest() { refresh(); customEscapeBackdrop.show(); @@ -128,49 +197,47 @@ public void closeByToggleTest() { customEscapeBackdrop.getContent().has().text(containsString("toggle button")); } - @Test + @Test(description = "Verify backdrop click behavior") public void closeByBackdropTest() { openSideNav.click(); customEscapeBackdrop.core().click(); customEscapeBackdrop.getContent().has().text(containsString("backdrop")); } - @Test + @Test(description = "Verify auto size SideNav") public void verifyAutoSizeSideNav() { autoSizeSideNav.show(); toggleAutoNav.click(); toggleExtraText.click(); autoSizeSideNav.getMatDrawer().has().text(containsString("Toggle extra text")); - autoSizeSideNav.getMatDrawerContent().has().attr(STYLE, "margin-left: 294px;"); } - @Test + @Test(description = "Verify fixed sideNav") public void fixedSideNavTest() { String testValue = "100"; fixedPosition.show(); - topGap.click(); topGap.clear(); - topGap.sendKeys(testValue); - bottomGap.click(); + topGap.setValue(testValue); bottomGap.clear(); - bottomGap.sendKeys(testValue); + bottomGap.setValue(testValue); fixSideNav.click(); fixedPosition.getSideNav().has().attr(STYLE, "transform: none; visibility: visible; top: 100px; bottom: " + - "100px;"); + "100px;"); toggleFixedSideNav.click(); - fixedPosition.base().timer().wait(() -> fixedPosition.visualValidation(".mat-sidenav-content")); + + fixedPosition.base().timer().wait(() -> fixedPosition.getSideNav().is().hidden()); fixedPosition.getSideNav().has().attr(STYLE, "top: 100px; bottom: 100px; box-shadow: none; visibility: " + - "hidden;"); + "hidden;"); } - @Test + @Test(description = "Verify toggle responsive sideNave") public void toggleResponsiveSideNavTest() { int[] testValues = {1, 3}; responsiveContent.show(); toolbarToggle.click(); for (int value : testValues) { - responsiveContent.getSideNavLinks().get(value).click(); + responsiveContent.getSideNav().getSideNavLinks().get(value).click(); responsiveContent.getResponsiveResults().get(value).has().text(format("Selected Nav Item %d", value)); } } diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/SideNavContainerAssert.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/SideNavContainerAssert.java new file mode 100644 index 0000000000..4002d017f5 --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/SideNavContainerAssert.java @@ -0,0 +1,21 @@ +package com.epam.jdi.light.angular.asserts; + +import com.epam.jdi.light.angular.elements.composite.SideNavContainer; +import com.epam.jdi.light.asserts.generic.UIAssert; +import com.epam.jdi.light.common.JDIAction; +import org.hamcrest.Matchers; +import org.openqa.selenium.Point; + +import static com.epam.jdi.light.asserts.core.SoftAssert.jdiAssert; + +public class SideNavContainerAssert extends UIAssert { + + private static final String LOCATION_ERROR_MESSAGE = "SideNavSection with location %s isn't on the right side"; + + @JDIAction(value = "Assert that '{name}' has section with location '{0}' on the right side", isAssert = true) + public SideNavContainerAssert sideNavSectionOnTheRight(Point locationOfSection) { + jdiAssert(element().isSectionInRightPart(locationOfSection), Matchers.is(true), + String.format(LOCATION_ERROR_MESSAGE, locationOfSection)); + return this; + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/SideNaveAssert.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/SideNaveAssert.java new file mode 100644 index 0000000000..a8f705cbd7 --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/asserts/SideNaveAssert.java @@ -0,0 +1,33 @@ +package com.epam.jdi.light.angular.asserts; + +import com.epam.jdi.light.angular.elements.complex.SideNav; +import com.epam.jdi.light.asserts.generic.ITextAssert; +import com.epam.jdi.light.asserts.generic.UIAssert; +import com.epam.jdi.light.common.JDIAction; +import org.hamcrest.Matcher; +import org.hamcrest.Matchers; + +import static com.epam.jdi.light.asserts.core.SoftAssert.jdiAssert; +import static java.lang.String.format; + +public class SideNaveAssert extends UIAssert implements ITextAssert { + private static final String MAT_DRAWER_TEMPLATE = "mat-drawer-%s"; + + @JDIAction(value = "Assert that '{name}' text {0}", isAssert = true) + @Override + public SideNaveAssert text(Matcher condition) { + jdiAssert(element().getSideNaveText(), condition); + return this; + } + + @JDIAction(value = "Assert that '{name}' text is '{0}'", isAssert = true) + @Override + public SideNaveAssert text(String text) { + return text(Matchers.is(text)); + } + + @JDIAction(value = "Assert that '{name}' has class '{0}'", isAssert = true) + public void configurableMode(String mode) { + this.cssClass(format(MAT_DRAWER_TEMPLATE, mode.toLowerCase())); + } +} diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/SideNav.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/SideNav.java index 65664fe3ee..5f456cda7c 100644 --- a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/SideNav.java +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/complex/SideNav.java @@ -1,67 +1,33 @@ package com.epam.jdi.light.angular.elements.complex; -import com.epam.jdi.light.asserts.generic.UIAssert; +import com.epam.jdi.light.angular.asserts.SideNaveAssert; import com.epam.jdi.light.common.JDIAction; import com.epam.jdi.light.elements.base.UIBaseElement; -import com.epam.jdi.light.elements.common.UIElement; import com.epam.jdi.light.elements.complex.WebList; +import com.epam.jdi.light.elements.interfaces.base.HasLabel; /** * To see an example of Checkbox web element please visit https://material.angular.io/components/sidenav/overview. */ -public class SideNav extends UIBaseElement> { +public class SideNav extends UIBaseElement implements HasLabel { - @JDIAction("Get '{name}' side nav") - public UIElement getSideNav() { - return this.find(".mat-sidenav"); + @Override + public SideNaveAssert is() { + return new SideNaveAssert().set(this); } - @JDIAction("Get '{name}' side nav content") - public UIElement getContent() { - return this.find(".mat-sidenav-content"); - } - - /*for several side navs*/ - @JDIAction("Get '{name}' side nav by '{0}' position value") - public UIElement getSideNav(String position) { - UIElement element = null; - for (UIElement e : getSideNavItems()) { - if (e.attr("position").equalsIgnoreCase(position)) { - element = e; - } - } - return element; - } - - @JDIAction("Get '{name}' side nav content") - public UIElement getEvents() { - return getContent().find(".example-events"); + @Override + public SideNaveAssert has() { + return is(); } @JDIAction("Get '{name}' side nav content") public WebList getSideNavLinks() { - return getSideNav().finds("a"); - } - - @JDIAction("Get '{name}' side nav content") - public WebList getResponsiveResults() { - return getContent().finds("p"); - } - - @JDIAction("Get '{name}' side nav items") - private WebList getSideNavItems() { - return this.finds(".mat-sidenav"); - } - - /*mat-drawer*/ - @JDIAction("Get '{name}' mat drawer") - public UIElement getMatDrawer() { - return this.find(".mat-drawer"); + return this.finds("a"); } - @JDIAction("Get '{name}' mat drawer content content") - public UIElement getMatDrawerContent() { - return this.find(".mat-drawer-content"); + public String getSideNaveText() { + return core().text(); } } diff --git a/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/composite/SideNavContainer.java b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/composite/SideNavContainer.java new file mode 100644 index 0000000000..a074c543a8 --- /dev/null +++ b/jdi-light-angular/src/main/java/com/epam/jdi/light/angular/elements/composite/SideNavContainer.java @@ -0,0 +1,80 @@ +package com.epam.jdi.light.angular.elements.composite; + +import com.epam.jdi.light.angular.asserts.SideNavContainerAssert; +import com.epam.jdi.light.angular.elements.complex.SideNav; +import com.epam.jdi.light.common.JDIAction; +import com.epam.jdi.light.elements.base.UIBaseElement; +import com.epam.jdi.light.elements.common.UIElement; +import com.epam.jdi.light.elements.complex.WebList; +import com.epam.jdi.light.elements.interfaces.base.HasLabel; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.Point; + +import java.util.function.Predicate; + +public class SideNavContainer extends UIBaseElement implements HasLabel { + + private static final String POSITION = "position"; + private static final String ATTRIBUTE_NOT_FOUND_MESSAGE = "Element with attribute %s %s not found"; + + private Predicate attributeMatches(String attributeName, String attributeValue) { + return e -> e.attr(attributeName).equalsIgnoreCase(attributeValue); + } + + @Override + public SideNavContainerAssert is() { + return new SideNavContainerAssert().set(this); + } + + @Override + public SideNavContainerAssert has() { + return is(); + } + + @JDIAction("Get '{name}' side nav") + public SideNav getSideNav() { + return new SideNav().setCore(SideNav.class, this.find(".mat-sidenav")); + } + + @JDIAction("Get '{name}' side nav by '{0}' position value") + public SideNav getSideNav(String position) { + String notFoundMessage = String.format(ATTRIBUTE_NOT_FOUND_MESSAGE, POSITION, position); + var sideNav = getSideNavItems().stream() + .filter(attributeMatches(POSITION, position)) + .findFirst() + .orElseThrow(() -> new NoSuchElementException(notFoundMessage)); + return new SideNav().setCore(SideNav.class, sideNav); + } + + @JDIAction("Get '{name}' side nav content") + public UIElement getContent() { + return this.find(".mat-sidenav-content"); + } + + @JDIAction("Get paragraphs from the side navigation content") + public WebList getResponsiveResults() { + return getContent().finds("p"); + } + + @JDIAction("Get '{name}' mat drawer") + public SideNav getMatDrawer() { + return new SideNav().setCore(SideNav.class, this.find(".mat-drawer")); + + } + + @JDIAction("Get '{name}' mat drawer content content") + public UIElement getMatDrawerContent() { + return this.find(".mat-drawer-content"); + } + + @JDIAction("Is '{name}' side nav has section with location '{0}' on right side") + public boolean isSectionInRightPart(Point locationOfSection) { + int containerCenterX = this.getLocation().getX() + this.getSize().getWidth() / 2; + return locationOfSection.getX() >= containerCenterX; + } + + @JDIAction("Get '{name}' side nav items") + private WebList getSideNavItems() { + return this.finds(".mat-sidenav"); + } +}