/* * * * Copyright (c) 2016. David Sowerby * * * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * * the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * * specific language governing permissions and limitations under the License. * */ package uk.q3c.krail.core.view.component; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.mycila.testing.junit.MycilaJunitRunner; import com.mycila.testing.plugin.guice.GuiceContext; import com.mycila.testing.plugin.guice.ModuleProvider; import com.vaadin.ui.MenuBar.MenuItem; import fixture.ReferenceUserSitemap; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import uk.q3c.krail.core.eventbus.EventBusAutoSubscriber; import uk.q3c.krail.core.eventbus.EventBusModule; import uk.q3c.krail.core.guice.vsscope.VaadinSessionScopeModule; import uk.q3c.krail.core.i18n.CurrentLocale; import uk.q3c.krail.core.i18n.LabelKey; import uk.q3c.krail.core.i18n.Translate; import uk.q3c.krail.core.navigate.Navigator; import uk.q3c.krail.core.navigate.StrictURIFragmentHandler; import uk.q3c.krail.core.navigate.URIFragmentHandler; import uk.q3c.krail.core.option.Option; import uk.q3c.krail.testutil.guice.uiscope.TestUIScopeModule; import uk.q3c.krail.testutil.i18n.TestI18NModule; import uk.q3c.krail.testutil.option.TestOptionModule; import uk.q3c.krail.testutil.persist.TestPersistenceModule; import java.util.ArrayList; import java.util.List; import java.util.Locale; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; @RunWith(MycilaJunitRunner.class) @GuiceContext({TestUIScopeModule.class, VaadinSessionScopeModule.class, TestI18NModule.class, TestOptionModule.class, TestPersistenceModule.class, EventBusModule.class}) public class DefaultUserNavigationMenuTest { @Inject ReferenceUserSitemap userSitemap; @Inject CurrentLocale currentLocale; @Mock Navigator navigator; @Inject Option option; @Inject Translate translate; @Inject EventBusAutoSubscriber autoSubscriber; DefaultUserNavigationMenuBuilder builder; private DefaultUserNavigationMenu userNavigationMenu; @Before public void setUp() throws Exception { Locale.setDefault(Locale.UK); currentLocale.setLocale(Locale.UK); userSitemap.clear(); userSitemap.populate(); builder = new DefaultUserNavigationMenuBuilder(userSitemap, navigator); } @After public void tearDown() throws Exception { } @SuppressWarnings("ConstantConditions") @Test public void build() { // given System.out.println(userSitemap.toString()); userNavigationMenu = newMenu(); // when userNavigationMenu.build(); // then List<String> captions = menuCaptions(null); assertThat(captions).containsOnly("Public", "Private"); MenuItem pblic = childWithText("Public", null); captions = menuCaptions(pblic); assertThat(captions).containsOnly("Log In", "Public Home", "ViewA"); assertThat(pblic.getCommand()).isNull(); MenuItem login = childWithText("Log In", pblic); captions = menuCaptions(login); assertThat(captions).containsOnly(); assertThat(login.getCommand()).isNotNull(); MenuItem publicHome = childWithText("Public Home", pblic); captions = menuCaptions(publicHome); assertThat(captions).containsOnly(); assertThat(publicHome.getCommand()).isNotNull(); MenuItem viewA = childWithText("ViewA", pblic); captions = menuCaptions(viewA); assertThat(captions).containsOnly("ViewA1"); assertThat(viewA.getCommand()).isNull(); MenuItem viewA1 = childWithText("ViewA1", viewA); captions = menuCaptions(viewA1); assertThat(captions).containsOnly("ViewA11"); assertThat(viewA1.getCommand()).isNull(); MenuItem viewA11 = childWithText("ViewA11", viewA1); captions = menuCaptions(viewA11); assertThat(captions).containsOnly(); assertThat(viewA11.getCommand()).isNotNull(); MenuItem prvate = childWithText("Private", null); captions = menuCaptions(prvate); assertThat(captions).containsOnly("Private Home", "ViewB"); assertThat(prvate.getCommand()).isNull(); MenuItem privateHome = childWithText("Private Home", prvate); captions = menuCaptions(privateHome); assertThat(captions).containsOnly(); assertThat(privateHome.getCommand()).isNotNull(); MenuItem viewB = childWithText("ViewB", prvate); captions = menuCaptions(viewB); assertThat(captions).containsOnly("ViewB1"); assertThat(viewB.getCommand()).isNull(); MenuItem viewB1 = childWithText("ViewB1", viewB); captions = menuCaptions(viewB1); assertThat(captions).containsOnly("ViewB12"); //B11 excluded assertThat(viewB1.getCommand()).isNull(); //B11 removed by using positionIndex <0 MenuItem viewB11 = childWithText("ViewB11", viewB1); assertThat(viewB11).isNull(); //A111 removed by using positionIndex <0, and its parent, A11 has the command MenuItem viewA111 = childWithText("ViewA111", viewA11); assertThat(viewA111).isNull(); assertThat(viewA11.getCommand()).isNotNull(); //B122 removed by using positionIndex <0, but its parent B12 does not have command as other child B121 is not excluded MenuItem viewB12 = childWithText("ViewB12", viewB1); MenuItem viewB121 = childWithText("ViewB121", viewB12); MenuItem viewB122 = childWithText("ViewB122", viewB12); assertThat(viewB121).isNotNull(); assertThat(viewB122).isNull(); assertThat(viewB12.getCommand()).isNull(); assertThat(viewB121.getCommand()).isNotNull(); } private List<String> menuCaptions(MenuItem parentItem) { List<MenuItem> items = childrenOf(parentItem); List<String> captions = new ArrayList<>(); if (items != null) { for (MenuItem item : items) { captions.add(item.getText()); } } return captions; } private List<MenuItem> childrenOf(MenuItem parentItem) { if (parentItem == null) { return userNavigationMenu.getItems(); } else { return parentItem.getChildren(); } } private MenuItem childWithText(String text, MenuItem parentItem) { List<MenuItem> items = childrenOf(parentItem); if (items == null) { return null; } for (MenuItem item : items) { if (item.getText() .equals(text)) { return item; } } return null; } @SuppressWarnings("unchecked") private DefaultUserNavigationMenu newMenu() { DefaultUserNavigationMenu menu = new DefaultUserNavigationMenu(option, builder); //simulates Guice construction autoSubscriber.afterInjection(menu); return menu; } @Test @SuppressWarnings("ConstantConditions") public void build_branch_hidden() { //given userNavigationMenu = newMenu(); //re-instate as 'displayable' userSitemap.b11Node() .setPositionIndex(5); // hide the b branch userSitemap.bNode() .setPositionIndex(-1); //when userNavigationMenu.build(); //then MenuItem prvate = childWithText("Private", null); List<String> captions = menuCaptions(prvate); assertThat(captions).containsOnly("Private Home"); assertThat(prvate.getCommand()).isNull(); MenuItem privateHome = childWithText("Private Home", prvate); captions = menuCaptions(privateHome); assertThat(captions).containsOnly(); assertThat(privateHome.getCommand()).isNotNull(); MenuItem viewB = childWithText("ViewB", prvate); assertThat(viewB).isNull(); } @Test @SuppressWarnings("ConstantConditions") public void build_depthLimited() { // given System.out.println(userSitemap.toString()); userNavigationMenu = newMenu(); // when userNavigationMenu.setOptionMaxDepth(2); // then List<String> captions = menuCaptions(null); assertThat(captions).containsOnly("Public", "Private"); MenuItem pblic = childWithText("Public", null); captions = menuCaptions(pblic); assertThat(captions).containsOnly("Log In", "Public Home", "ViewA"); assertThat(pblic.getCommand()).isNull(); MenuItem login = childWithText("Log In", pblic); captions = menuCaptions(login); assertThat(captions).containsOnly(); assertThat(login.getCommand()).isNotNull(); MenuItem publicHome = childWithText("Public Home", pblic); captions = menuCaptions(publicHome); assertThat(captions).containsOnly(); assertThat(publicHome.getCommand()).isNotNull(); MenuItem viewA = childWithText("ViewA", pblic); captions = menuCaptions(viewA); assertThat(captions).containsOnly(); assertThat(viewA.getCommand()).isNotNull(); MenuItem prvate = childWithText("Private", null); captions = menuCaptions(prvate); assertThat(captions).containsOnly("Private Home", "ViewB"); assertThat(prvate.getCommand()).isNull(); MenuItem privateHome = childWithText("Private Home", prvate); captions = menuCaptions(privateHome); assertThat(captions).containsOnly(); assertThat(privateHome.getCommand()).isNotNull(); MenuItem viewB = childWithText("ViewB", prvate); captions = menuCaptions(viewB); assertThat(captions).containsOnly(); assertThat(viewB.getCommand()).isNotNull(); } @Test public void setMaxDepth() { // given userNavigationMenu = newMenu(); // when userNavigationMenu.setOptionMaxDepth(3); // then assertThat(userNavigationMenu.getOptionMaxDepth()).isEqualTo(3); // option has been set int result = userNavigationMenu.getOption() .get(DefaultUserNavigationMenu.optionKeyMaximumDepth); assertThat(result).isEqualTo(3); } @Test @SuppressWarnings("ConstantConditions") public void localeChange() { // given userNavigationMenu = newMenu(); userNavigationMenu.build(); // when currentLocale.setLocale(Locale.GERMANY); // then List<String> captions = menuCaptions(null); assertThat(captions).containsOnly("Öffentlich", "Privat"); String txt = translate.from(LabelKey.Public); MenuItem pblic = childWithText(txt, null); MenuItem publicHome = childWithText("Öffentliche Startseite", pblic); assertThat(publicHome.getText()).isEqualTo("Öffentliche Startseite"); } @Test public void defaults() { // given // when userNavigationMenu = newMenu(); // then assertThat(userNavigationMenu.isImmediate()).isTrue(); assertThat(userNavigationMenu.getOptionMaxDepth()).isEqualTo(10); } @Test @SuppressWarnings("ConstantConditions") public void userSelection() { // given userNavigationMenu = newMenu(); userNavigationMenu.build(); MenuItem pblic = childWithText("Public", null); MenuItem viewA = childWithText("ViewA", pblic); MenuItem viewA1 = childWithText("ViewA1", viewA); MenuItem viewA11 = childWithText("ViewA11", viewA1); // when viewA11.getCommand() .menuSelected(viewA11); // then verify(navigator).navigateTo(userSitemap.a11Node()); } @Test public void sorted() { userNavigationMenu = newMenu(); // when userNavigationMenu.build(); // then List<String> captions = menuCaptions(null); assertThat(captions).containsExactly("Private", "Public"); MenuItem pblic = childWithText("Public", null); captions = menuCaptions(pblic); // sorting is true by default assertThat(captions).containsExactly("Log In", "Public Home", "ViewA"); // when currentLocale.setLocale(Locale.GERMANY); captions = menuCaptions(null); assertThat(captions).containsExactly("Öffentlich", "Privat"); pblic = childWithText("Öffentlich", null); captions = menuCaptions(pblic); // sorting is true by default assertThat(captions).containsExactly("DE_ViewA", "Einloggen", "Öffentliche Startseite"); } @ModuleProvider protected AbstractModule moduleProvider() { return new AbstractModule() { @Override protected void configure() { bind(URIFragmentHandler.class).to(StrictURIFragmentHandler.class); } }; } }