/* * * * 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.navigate.sitemap; 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 org.apache.shiro.subject.Subject; import org.junit.Before; import org.junit.runner.RunWith; import org.mockito.Mock; import uk.q3c.krail.core.eventbus.SessionBusProvider; import uk.q3c.krail.core.i18n.*; import uk.q3c.krail.core.navigate.StrictURIFragmentHandler; import uk.q3c.krail.core.navigate.URIFragmentHandler; import uk.q3c.krail.core.option.DefaultOption; import uk.q3c.krail.core.option.Option; import uk.q3c.krail.core.shiro.PageAccessControl; import uk.q3c.krail.core.shiro.PageAccessController; import uk.q3c.krail.core.shiro.SubjectProvider; import uk.q3c.krail.core.view.PublicHomeView; import uk.q3c.krail.testutil.i18n.TestLabelKey; import java.text.Collator; import java.util.Locale; import static org.mockito.Mockito.when; @RunWith(MycilaJunitRunner.class) @GuiceContext({}) public abstract class TestWithSitemap { @Inject protected CurrentLocale currentLocale; @Inject protected Translate translate; @Inject protected URIFragmentHandler uriHandler; @Inject protected MasterSitemap masterSitemap; @Mock protected SubjectProvider subjectProvider; @Mock protected Subject subject; @Mock protected PageAccessController pageAccessController; protected UserSitemapBuilder userSitemapBuilder; protected MasterSitemapNode masterNode1; protected MasterSitemapNode masterNode2; protected MasterSitemapNode masterNode3; protected MasterSitemapNode masterNode4; protected MasterSitemapNode masterNode5; protected MasterSitemapNode masterNode6; protected MasterSitemapNode privateHomeNode; protected MasterSitemapNode publicHomeNode; protected MasterSitemapNode loginNode; protected MasterSitemapNode logoutNode; protected UserSitemap userSitemap; protected UserSitemapNode userNode1; protected UserSitemapNode userNode2; protected UserSitemapNode userNode3; protected UserSitemapNode userNode4; protected UserSitemapNode userNode5; protected UserSitemapNode userNode6; @Inject SessionBusProvider sessionBusProvider; Locale locale = Locale.UK; Collator collator; // @Inject // MasterSitemapQueue masterSitemapQueue; int id; @Before public void setup() { id = 1; Locale.setDefault(Locale.UK); currentLocale.setLocale(Locale.UK); collator = Collator.getInstance(locale); when(subjectProvider.get()).thenReturn(subject); } /** * If using the userSitemap, the order of calling should be: buildMasterSitemap, set up mocks for user sitemap, * createUserSitemap() * * @param i */ protected void buildMasterSitemap(int i) { switch (i) { case 0: break; // empty sitemap case 2: masterNode4 = newNode("b"); masterNode5 = newNode("b1"); masterNode6 = newNode("b11"); masterSitemap.addChild(masterNode4, masterNode5); masterSitemap.addChild(masterNode5, masterNode6); case 1: masterNode1 = newNode("a"); masterNode2 = newNode("a1"); masterNode3 = newNode("a11"); masterSitemap.addChild(masterNode1, masterNode2); masterSitemap.addChild(masterNode2, masterNode3); break; case 3: masterNode1 = newNode("public", StandardPageKey.Public_Home); masterNode2 = newNode("logout", StandardPageKey.Log_Out); masterSitemap.addChild(masterNode1, masterNode2); break; case 4: masterNode1 = newNode("public", StandardPageKey.Public_Home); masterNode2 = newNode("logout", StandardPageKey.Log_Out); masterNode3 = newNode("private"); masterNode4 = newNode("wiggly"); masterSitemap.addChild(masterNode1, masterNode2); masterSitemap.addChild(masterNode3, masterNode4); break; case 5: // one node has missing key masterNode4 = newNode("b"); masterNode5 = newNode("b1"); masterNode6 = newNode("b11"); masterSitemap.addChild(masterNode4, masterNode5); masterSitemap.addChild(masterNode5, masterNode6); masterNode1 = new MasterSitemapNode(id++, "a", null, null, -1, PageAccessControl.PUBLIC, null); masterNode2 = newNode("a1"); masterNode3 = newNode("a11"); masterSitemap.addChild(masterNode1, masterNode2); masterSitemap.addChild(masterNode2, masterNode3); break; case 6: // one node is private masterNode4 = newNode("b"); masterNode5 = newNode("b1"); masterNode6 = newNode("b11").modifyPageAccessControl(PageAccessControl.PERMISSION); masterSitemap.addChild(masterNode4, masterNode5); masterSitemap.addChild(masterNode5, masterNode6); masterNode1 = new MasterSitemapNode(id++, "a", null, TestLabelKey.Yes, -1, PageAccessControl.PUBLIC, null); masterNode2 = newNode("a1", TestLabelKey.Home); masterNode3 = newNode("a11", TestLabelKey.Yes); masterSitemap.addChild(masterNode1, masterNode2); masterSitemap.addChild(masterNode2, masterNode3); break; case 7: // redirect has no page access control masterNode4 = newNode("b").modifyPageAccessControl(null); masterNode5 = newNode("b1"); masterNode6 = newNode("b11"); String fromPage = masterSitemap.navigationState(masterNode4) .getVirtualPage(); String toPage = masterSitemap.navigationState(masterNode5) .getVirtualPage(); masterSitemap.addRedirect(fromPage, toPage); masterSitemap.addChild(masterNode4, masterNode5); masterSitemap.addChild(masterNode5, masterNode6); break; case 8: masterNode1 = newNode("1", LabelKey.Yes); masterNode2 = newNode("2", LabelKey.No); masterNode3 = newNode("3", LabelKey.Enable_Account); masterSitemap.addChild(null, masterNode1); masterSitemap.addChild(null, masterNode2); masterSitemap.addChild(masterNode1, masterNode3); masterSitemap.addRedirect("a", "1"); masterSitemap.addRedirect("b", "9"); buildStandardPages(); break; } masterSitemap.lock(); // masterSitemapQueue.addModel(masterSitemap); } protected MasterSitemapNode newNode(String urlSegment) { return new MasterSitemapNode(id++, urlSegment, PublicHomeView.class, TestLabelKey.Home, -1, PageAccessControl.PUBLIC, null); } protected MasterSitemapNode newNode(String urlSegment, I18NKey key) { return new MasterSitemapNode(id++, urlSegment, PublicHomeView.class, key, -1, PageAccessControl.PUBLIC, null); } protected void buildStandardPages() { loginNode = newNode("login", StandardPageKey.Log_In); logoutNode = newNode("logout", StandardPageKey.Log_Out); publicHomeNode = newNode("public/home", StandardPageKey.Public_Home); privateHomeNode = newNode("private/home", StandardPageKey.Private_Home); masterSitemap.addChild(masterSitemap.nodeFor("public"), publicHomeNode); masterSitemap.addChild(masterSitemap.nodeFor("private"), privateHomeNode); masterSitemap.addChild(null, loginNode); masterSitemap.addChild(null, logoutNode); } /** * user sitemap cannot be created until the master sitemap has been created. You will also need to set up any mocks * needed before calling this method */ protected void createUserSitemap() { userSitemap = new DefaultUserSitemap(translate, uriHandler, sessionBusProvider); UserSitemapNodeModifier nodeModifier = new UserSitemapNodeModifier(subjectProvider, currentLocale, pageAccessController, translate); UserSitemapCopyExtension copyExtension = new UserSitemapCopyExtension(userSitemap, translate, currentLocale); userSitemapBuilder = new UserSitemapBuilder(userSitemap, nodeModifier, copyExtension, subjectProvider); userSitemapBuilder.setMasterSitemap(masterSitemap); userSitemapBuilder.build(); userNode1 = createUserNode(masterNode1); userNode2 = createUserNode(masterNode2); userNode3 = createUserNode(masterNode3); userNode5 = createUserNode(masterNode4); userNode5 = createUserNode(masterNode5); userNode6 = createUserNode(masterNode6); } private UserSitemapNode createUserNode(MasterSitemapNode masterNode) { if (masterNode != null) { return userSitemap.userNodeFor(masterNode); } return null; } @ModuleProvider protected AbstractModule moduleProvider() { return new AbstractModule() { @Override protected void configure() { bind(URIFragmentHandler.class).to(StrictURIFragmentHandler.class); bind(I18NProcessor.class).to(DefaultI18NProcessor.class); bind(Option.class).to(DefaultOption.class); } }; } }