/*
*
* * 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.mycila.testing.junit.MycilaJunitRunner;
import com.mycila.testing.plugin.guice.GuiceContext;
import com.mycila.testing.plugin.guice.ModuleProvider;
import com.vaadin.server.VaadinSession;
import net.engio.mbassy.bus.MBassador;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import uk.q3c.krail.core.config.ApplicationConfigurationModule;
import uk.q3c.krail.core.eventbus.BusMessage;
import uk.q3c.krail.core.eventbus.EventBusModule;
import uk.q3c.krail.core.guice.uiscope.UIScopeModule;
import uk.q3c.krail.core.guice.vsscope.VaadinSessionScopeModule;
import uk.q3c.krail.core.i18n.LocaleChangeBusMessage;
import uk.q3c.krail.core.navigate.StrictURIFragmentHandler;
import uk.q3c.krail.core.navigate.URIFragmentHandler;
import uk.q3c.krail.core.navigate.sitemap.UserSitemapBuilderTest.TestVaadinSessionScopeModule;
import uk.q3c.krail.core.services.ServicesModule;
import uk.q3c.krail.core.shiro.VaadinSessionProvider;
import uk.q3c.krail.core.user.status.UserStatusBusMessage;
import uk.q3c.krail.core.user.status.UserStatusChangeSource;
import uk.q3c.krail.testutil.i18n.TestI18NModule;
import uk.q3c.krail.testutil.option.TestOptionModule;
import uk.q3c.krail.testutil.persist.TestPersistenceModule;
import uk.q3c.krail.util.UtilsModule;
import java.util.Locale;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
@RunWith(MycilaJunitRunner.class)
@GuiceContext({TestI18NModule.class, TestVaadinSessionScopeModule.class, TestOptionModule.class, TestPersistenceModule.class, EventBusModule.class,
UIScopeModule.class, SitemapModule.class, ServicesModule.class, UtilsModule.class, ApplicationConfigurationModule.class})
public class UserSitemapBuilderTest extends TestWithSitemap {
@Mock
VaadinSessionProvider mockVaadinSessionProvider;
@Mock
UserSitemapNodeModifier nodeModifier;
@Mock
VaadinSession vaadinSession;
@Mock
MBassador<BusMessage> eventBus;
@Mock
private UserSitemapCopyExtension copyExtension;
@Mock
private UserStatusChangeSource userStatusChangeSource;
@Override
@Before
public void setup() {
super.setup();
when(mockVaadinSessionProvider.get()).thenReturn(vaadinSession);
}
@Test
public void pageNotAuthorised() {
// given
buildMasterSitemap(8);
when(subject.isAuthenticated()).thenReturn(false);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode1)).thenReturn(true);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode2)).thenReturn(false);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode3)).thenReturn(true);
// when
createUserSitemap();
// then
assertThat(userSitemap.getAllNodes()).hasSize(2);
assertThat(userSitemapContains(masterNode1)).isTrue();
assertThat(userSitemapContains(masterNode2)).isFalse();
assertThat(userSitemapContains(masterNode3)).isTrue();
UserSitemapNode userNode3 = userSitemap.userNodeFor(masterNode3);
assertThat(userNode3).isNotNull();
assertThat(userSitemap.getParent(userNode3)).isNotNull();
UserSitemapNode userNode3Parent = userSitemap.getParent(userNode3);
assertThat(userNode3Parent.getMasterNode()).isEqualTo(masterNode1);
}
private boolean userSitemapContains(SitemapNode masterNode) {
return userSitemap.userNodeFor(masterNode) != null;
}
@Test
public void redirects() {
// given
buildMasterSitemap(8);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode1)).thenReturn(true);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode2)).thenReturn(false);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode3)).thenReturn(true);
// when
createUserSitemap();
// then
assertThat(userSitemap.getRedirects()
.keySet()).containsOnly("a");
}
@Test
public void uriMap() {
// given
buildMasterSitemap(8);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode1)).thenReturn(true);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode2)).thenReturn(false);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode3)).thenReturn(true);
createUserSitemap();
// when
// then
assertThat(userSitemap.getUriMap()
.keySet()).containsOnly("1", "1/3");
}
@Test
public void userStatusChanged() {
// given
buildMasterSitemap(8);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode1)).thenReturn(true);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode2)).thenReturn(false);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode3)).thenReturn(true);
createUserSitemap();
// when
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode2)).thenReturn(true);
//it doesn't matter what the user status actually is, just that it has changed
userSitemapBuilder.userStatusChanged(new UserStatusBusMessage(userStatusChangeSource,true));
// then
assertThat(userSitemap.getUriMap()
.keySet()).containsOnly("1", "1/3", "2");
assertThat(userSitemap.getRedirects()
.keySet()).containsOnly("a");
}
@Test
public void standardPages() {
// given
buildMasterSitemap(8);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode1)).thenReturn(true);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode2)).thenReturn(false);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode3)).thenReturn(true);
when(pageAccessController.isAuthorised(subject, masterSitemap, privateHomeNode)).thenReturn(false);
when(pageAccessController.isAuthorised(subject, masterSitemap, publicHomeNode)).thenReturn(true);
when(pageAccessController.isAuthorised(subject, masterSitemap, loginNode)).thenReturn(true);
when(pageAccessController.isAuthorised(subject, masterSitemap, logoutNode)).thenReturn(true);
// when
createUserSitemap();
// then
// never shown but needs to be in userSitemap to navigate to
assertThat(userSitemap.standardPageNode(StandardPageKey.Log_Out)).isNotNull();
assertThat(userSitemap.standardPageNode(StandardPageKey.Private_Home)).isNotNull();
assertThat(userSitemap.standardPageNode(StandardPageKey.Public_Home)).isNotNull();
assertThat(userSitemap.standardPageNode(StandardPageKey.Log_In)).isNotNull();
}
@Test
public void translationAndLocaleChange() {
// given
buildMasterSitemap(8);
currentLocale.setLocale(Locale.UK);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode1)).thenReturn(true);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode2)).thenReturn(false);
when(pageAccessController.isAuthorised(subject, masterSitemap, masterNode3)).thenReturn(true);
when(pageAccessController.isAuthorised(subject, masterSitemap, privateHomeNode)).thenReturn(false);
when(pageAccessController.isAuthorised(subject, masterSitemap, publicHomeNode)).thenReturn(true);
when(pageAccessController.isAuthorised(subject, masterSitemap, loginNode)).thenReturn(true);
when(pageAccessController.isAuthorised(subject, masterSitemap, logoutNode)).thenReturn(true);
// when
createUserSitemap();
// then
assertThat(userNode1.getCollationKey()).isNotNull();
assertThat(userNode1.getLabel()).isEqualTo("Yes");
assertThat(userNode3.getCollationKey()).isNotNull();
assertThat(userNode3.getLabel()).isEqualTo("Enable Account");
// when
currentLocale.setLocale(Locale.GERMANY);
((DefaultUserSitemap) userSitemap).localeChanged(new LocaleChangeBusMessage(this, Locale.GERMANY));
assertThat(userNode1.getCollationKey()).isNotNull();
assertThat(userNode1.getLabel()).isEqualTo("Ja");
assertThat(userNode3.getCollationKey()).isNotNull();
assertThat(userNode3.getLabel()).isEqualTo("Konto aktivieren");
}
@Override
@ModuleProvider
protected AbstractModule moduleProvider() {
return new AbstractModule() {
@Override
protected void configure() {
bind(URIFragmentHandler.class).to(StrictURIFragmentHandler.class);
}
};
}
@ModuleProvider
protected AbstractModule moduleProvider2() {
return new AbstractModule() {
@Override
protected void configure() {
bind(VaadinSessionProvider.class).toInstance(mockVaadinSessionProvider);
bind(MasterSitemap.class).to(DefaultMasterSitemap.class);
bind(UserSitemap.class).to(DefaultUserSitemap.class);
}
};
}
// Overrides the VaadinSeesionProvider so we can use a mock
public static class TestVaadinSessionScopeModule extends VaadinSessionScopeModule {
@Override
protected void bindVaadinSessionProvider() {
}
}
}