Java tutorial
/* * Copyright (C) 2000 - 2019 Silverpeas * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * As a special exception to the terms and conditions of version 3.0 of * the GPL, you may redistribute this Program in connection with Free/Libre * Open Source Software ("FLOSS") applications as described in Silverpeas's * FLOSS exception. You should have received a copy of the text describing * the FLOSS exception, and it is also available here: * "https://www.silverpeas.org/legal/floss_exception.html" * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.silverpeas.components.gallery.notification.user; import org.apache.commons.lang3.reflect.FieldUtils; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.silverpeas.components.gallery.model.AlbumDetail; import org.silverpeas.components.gallery.model.Media; import org.silverpeas.core.admin.component.model.ComponentInstLight; import org.silverpeas.core.admin.component.model.SilverpeasComponentInstance; import org.silverpeas.core.admin.component.service.SilverpeasComponentInstanceProvider; import org.silverpeas.core.admin.service.OrganizationController; import org.silverpeas.core.admin.user.model.User; import org.silverpeas.core.node.model.NodeDetail; import org.silverpeas.core.node.model.NodePath; import org.silverpeas.core.node.service.NodeService; import org.silverpeas.core.notification.user.UserNotification; import org.silverpeas.core.subscription.ResourceSubscriptionService; import org.silverpeas.core.subscription.SubscriptionResource; import org.silverpeas.core.subscription.service.ResourceSubscriptionProvider; import org.silverpeas.core.subscription.service.UserSubscriptionSubscriber; import org.silverpeas.core.subscription.util.SubscriptionSubscriberList; import org.silverpeas.core.test.extention.EnableSilverTestEnv; import org.silverpeas.core.test.extention.LocalizationBundleStub; import org.silverpeas.core.test.extention.TestManagedMock; import java.util.HashMap; import java.util.Map; import java.util.Optional; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * @author silveryocha */ @EnableSilverTestEnv class GalleryAlbumMediaSubscriptionNotificationBuilderTest { private static final String FR = "fr"; private static final String EN = "en"; private static final String DE = "de"; private static final ComponentInstLight componentInstance = new ComponentInstLight(); private static final AlbumDetail albumDetail = new AlbumDetail(new NodeDetail()); private static final AlbumDetail parentAlbumDetail = new AlbumDetail(new NodeDetail()); private static final NodePath albumPath = new NodePath(); private static final User sender = mock(User.class); @RegisterExtension static LocalizationBundleStub galleryBundle = new LocalizationBundleStub( "org.silverpeas.gallery.multilang.galleryBundle"); @TestManagedMock private ResourceSubscriptionService subscriptionService; private Map<String, ResourceSubscriptionService> componentImplementations; private SubscriptionSubscriberList subscriptionSubscribers = new SubscriptionSubscriberList(); @BeforeAll static void setupStaticData() { componentInstance.setLocalId(38); componentInstance.setName("gallery"); albumDetail.setId(26); albumDetail.getNodePK().setComponentName(componentInstance.getId()); albumDetail.setName("B"); albumPath.add(albumDetail); parentAlbumDetail.setId(25); parentAlbumDetail.getNodePK().setComponentName(componentInstance.getId()); parentAlbumDetail.setName("A"); albumPath.add(parentAlbumDetail); when(sender.getId()).thenReturn("1"); galleryBundle.put(DE, "GML.st.notification.subject", ""); galleryBundle.put(EN, "GML.st.notification.subject", ""); galleryBundle.put(FR, "GML.st.notification.subject", ""); galleryBundle.put(DE, "gallery.media.subscription.subject", "Subscription_DE"); galleryBundle.put(EN, "gallery.media.subscription.subject", "Subscription_EN"); galleryBundle.put(FR, "gallery.media.subscription.subject", "Subscription_FR"); galleryBundle.put("gallery.album.link.label", "AlbumLink"); } @SuppressWarnings("unchecked") @BeforeEach void setup(@TestManagedMock OrganizationController organizationController, @TestManagedMock SilverpeasComponentInstanceProvider componentInstanceProvider, @TestManagedMock NodeService nodeService) throws Exception { when(organizationController.getComponentInstLight(componentInstance.getId())).thenReturn(componentInstance); final Optional<SilverpeasComponentInstance> optionalInstance = Optional.of(componentInstance); when(componentInstanceProvider.getById(componentInstance.getId())).thenReturn(optionalInstance); componentImplementations = (Map) FieldUtils.readDeclaredStaticField(ResourceSubscriptionProvider.class, "componentImplementations", true); componentImplementations.put(componentInstance.getName(), subscriptionService); when(subscriptionService.getSubscribersOfSubscriptionResource(any(SubscriptionResource.class))) .thenReturn(subscriptionSubscribers); subscriptionSubscribers.add(UserSubscriptionSubscriber.from("1")); when(nodeService.getPath(albumDetail.getNodePK())).thenReturn(albumPath); } @AfterEach void clear() { componentImplementations.clear(); subscriptionSubscribers.clear(); } @Test void oneMediaAdded() { final GalleryAlbumMediaSubscriptionNotificationBuilder builder = new GalleryAlbumMediaSubscriptionNotificationBuilder( albumDetail, sender); builder.aboutMedia(aMedia()); final UserNotification userNotification = builder.build(); final Map<String, String> titles = computeNotificationTitles(userNotification); assertThat(titles.get(DE), is("Subscription_DE")); assertThat(titles.get(EN), is("Subscription_EN")); assertThat(titles.get(FR), is("Subscription_FR")); final Map<String, String> contents = computeNotificationContents(userNotification); assertThat(contents.get(DE), is("Dem Album <b>A > B</b> wurde ein Medium hinzugefgt.")); assertThat(contents.get(EN), is("A media has been added into album <b>A > B</b>.")); assertThat(contents.get(FR), is("Un mdia a t ajout dans l'album <b>A > B</b>.")); } @Test void severalMediaAdded() { final GalleryAlbumMediaSubscriptionNotificationBuilder builder = new GalleryAlbumMediaSubscriptionNotificationBuilder( albumDetail, sender); builder.aboutMedia(aMedia(), aMedia()); final UserNotification userNotification = builder.build(); final Map<String, String> titles = computeNotificationTitles(userNotification); assertThat(titles.get(DE), is("Subscription_DE")); assertThat(titles.get(EN), is("Subscription_EN")); assertThat(titles.get(FR), is("Subscription_FR")); final Map<String, String> contents = computeNotificationContents(userNotification); assertThat(contents.get(DE), is("Dem Album <b>A > B</b> wurde Medien hinzugefgt.")); assertThat(contents.get(EN), is("Media have been added into album <b>A > B</b>.")); assertThat(contents.get(FR), is("Des mdias ont t ajouts dans l'album <b>A > B</b>.")); } private Map<String, String> computeNotificationContents(UserNotification userNotification) { final Map<String, String> result = new HashMap<>(); result.put(FR, getContent(userNotification, FR)); result.put(EN, getContent(userNotification, EN)); result.put(DE, getContent(userNotification, DE)); assertThat(result.get(FR), not(is(result.get(EN)))); assertThat(result.get(EN), not(is(result.get(DE)))); return result; } private Map<String, String> computeNotificationTitles(UserNotification userNotification) { final Map<String, String> result = new HashMap<>(); result.put(FR, getTitle(userNotification, FR)); result.put(EN, getTitle(userNotification, EN)); result.put(DE, getTitle(userNotification, DE)); assertThat(result.get(FR), not(is(result.get(EN)))); assertThat(result.get(EN), not(is(result.get(DE)))); return result; } private String getContent(final UserNotification userNotification, final String language) { return userNotification.getNotificationMetaData().getContent(language) .replaceAll("<!--BEFORE_MESSAGE_FOOTER-->NOTIFIED_USERS_AND_GROUPS_PART_" + language.toUpperCase() + "<!--AFTER_MESSAGE_FOOTER-->", ""); } private String getTitle(final UserNotification userNotification, final String language) { return userNotification.getNotificationMetaData().getTitle(language); } private Media aMedia() { return mock(Media.class); } }