diff --git a/services/src/main/java/org/exoplatform/news/rest/NewsRestResourcesV1.java b/services/src/main/java/org/exoplatform/news/rest/NewsRestResourcesV1.java index f5055760a5..cb021dc30b 100644 --- a/services/src/main/java/org/exoplatform/news/rest/NewsRestResourcesV1.java +++ b/services/src/main/java/org/exoplatform/news/rest/NewsRestResourcesV1.java @@ -44,6 +44,7 @@ import org.exoplatform.news.search.NewsESSearchResult; import org.exoplatform.news.service.NewsService; import org.exoplatform.news.utils.NewsUtils; +import org.exoplatform.news.utils.NewsUtils.NewsObjectType; import org.exoplatform.portal.application.localization.LocalizationFilter; import org.exoplatform.services.cms.thumbnail.ThumbnailService; import org.exoplatform.services.log.ExoLogger; @@ -272,7 +273,7 @@ public Response deleteNews(@Context HttpServletRequest request, if (StringUtils.isBlank(id)) { return Response.status(Response.Status.BAD_REQUEST).build(); } - News news = newsService.getNewsById(id, currentIdentity, false); + News news = newsService.getNewsById(id, currentIdentity, false, isDraft ? NewsObjectType.DRAFT.name().toLowerCase() : NewsObjectType.ARTICLE.name().toLowerCase()); if (news == null) { return Response.status(Response.Status.NOT_FOUND).build(); } diff --git a/services/src/main/java/org/exoplatform/news/service/impl/NewsServiceImplV2.java b/services/src/main/java/org/exoplatform/news/service/impl/NewsServiceImplV2.java index 018805175d..9628cac75d 100644 --- a/services/src/main/java/org/exoplatform/news/service/impl/NewsServiceImplV2.java +++ b/services/src/main/java/org/exoplatform/news/service/impl/NewsServiceImplV2.java @@ -30,7 +30,6 @@ import java.util.Map; import java.util.Set; -import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.exoplatform.commons.exception.ObjectNotFoundException; @@ -49,6 +48,7 @@ import org.exoplatform.news.service.NewsService; import org.exoplatform.news.service.NewsTargetingService; import org.exoplatform.news.utils.NewsUtils; +import org.exoplatform.news.utils.NewsUtils.NewsObjectType; import org.exoplatform.portal.config.UserACL; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; @@ -64,6 +64,7 @@ import org.exoplatform.social.metadata.MetadataService; import org.exoplatform.social.metadata.model.MetadataItem; import org.exoplatform.social.metadata.model.MetadataKey; +import org.exoplatform.social.metadata.model.MetadataObject; import org.exoplatform.social.metadata.model.MetadataType; import org.exoplatform.upload.UploadResource; import org.exoplatform.upload.UploadService; @@ -93,7 +94,6 @@ public class NewsServiceImplV2 implements NewsService { public static final String NEWS_UPLOAD_ID = "uploadId"; - private static final Log LOG = ExoLogger.getLogger(NewsServiceImplV2.class); private final SpaceService spaceService; @@ -177,8 +177,10 @@ public News postNews(News news, String poster) throws Exception { */ @Override public boolean canCreateNews(Space space, org.exoplatform.services.security.Identity currentIdentity) throws Exception { - return space != null && (NewsUtils.canPublishNews(space.getId(), currentIdentity) || spaceService.canRedactOnSpace(space, currentIdentity)); + return space != null + && (NewsUtils.canPublishNews(space.getId(), currentIdentity) || spaceService.canRedactOnSpace(space, currentIdentity)); } + /** * {@inheritDoc} */ @@ -257,8 +259,23 @@ public News updateNews(News news, String updater, Boolean post, boolean publish, * {@inheritDoc} */ @Override - public void deleteNews(String id, Identity currentIdentity, boolean isDraft) throws Exception { - + public void deleteNews(String newsId, Identity currentIdentity, boolean isDraft) throws Exception { + News news = getNewsById(newsId, + currentIdentity, + false, + isDraft ? NewsObjectType.DRAFT.name().toLowerCase() : NewsObjectType.ARTICLE.name().toLowerCase()); + if (!news.isCanDelete()) { + throw new IllegalArgumentException("User " + currentIdentity.getUserId() + " is not authorized to delete news"); + } + if (isDraft) { + deleteDraftArticle(newsId, currentIdentity.getUserId()); + } else { + // TODO delete article + indexingService.unindex(NewsIndexingServiceConnector.TYPE, String.valueOf(news.getId())); + MetadataObject newsMetadataObject = new MetadataObject(NewsUtils.NEWS_METADATA_OBJECT_TYPE, newsId); + metadataService.deleteMetadataItemsByObject(newsMetadataObject); + NewsUtils.broadcastEvent(NewsUtils.DELETE_NEWS, currentIdentity.getUserId(), news); + } } /** @@ -302,20 +319,19 @@ public News getNewsById(String newsId, boolean editMode, String newsObjectType) throws IllegalAccessException { News news = null; - if (newsObjectType == null) { - throw new IllegalArgumentException("required argument news type could not be null"); - } - if (DRAFT.name().toLowerCase().equals(newsObjectType)) { - try { - news = buildDraftArticle(newsId, currentIdentity.getUserId()); + try { + if (newsObjectType == null) { + throw new IllegalArgumentException("Required argument news object type could not be null"); } - catch (WikiException wikiException) { - return null; + if (DRAFT.name().toLowerCase().equals(newsObjectType)) { + news = buildDraftArticle(newsId, currentIdentity.getUserId()); + } else if (LATEST_DRAFT.name().toLowerCase().equals(newsObjectType)) { + // TODO + } else if (ARTICLE.name().toLowerCase().equals(newsObjectType)) { + // TODO } - } else if (LATEST_DRAFT.name().toLowerCase().equals(newsObjectType)) { - // TODO - } else if (ARTICLE.name().toLowerCase().equals(newsObjectType)) { - // TODO + } catch (Exception exception) { + LOG.error("An error occurred while retrieving news with id {}", newsId, exception); } if (news != null) { if (editMode) { @@ -438,18 +454,17 @@ public boolean canViewNews(News news, String authenticatedUser) { LOG.warn("Can't find space with id {} when checking access on news with id {}", spaceId, news.getId()); return false; } - if (!news.isPublished() - && StringUtils.equals(news.getPublicationState(), PublicationDefaultStates.PUBLISHED) - && !(spaceService.isSuperManager(authenticatedUser) - || spaceService.isMember(space, authenticatedUser) + if (!news.isPublished() && StringUtils.equals(news.getPublicationState(), PublicationDefaultStates.PUBLISHED) + && !(spaceService.isSuperManager(authenticatedUser) || spaceService.isMember(space, authenticatedUser) || isMemberOfsharedInSpaces(news, authenticatedUser))) { return false; } - if (news.isPublished() && news.getAudience().equals(NewsUtils.SPACE_NEWS_AUDIENCE) && !spaceService.isMember(space, authenticatedUser)) { + if (news.isPublished() && news.getAudience().equals(NewsUtils.SPACE_NEWS_AUDIENCE) + && !spaceService.isMember(space, authenticatedUser)) { return false; } if (StringUtils.equals(news.getPublicationState(), PublicationDefaultStates.STAGED) - && !canScheduleNews(space, NewsUtils.getUserIdentity(authenticatedUser))) { + && !canScheduleNews(space, NewsUtils.getUserIdentity(authenticatedUser))) { return false; } } catch (Exception e) { @@ -498,7 +513,9 @@ private News createDraftArticleForNewPage(News draftArticle, String pageOwnerId, Wiki wiki = wikiService.getWikiByTypeAndOwner(WikiType.GROUP.name().toLowerCase(), pageOwnerId); Page newsArticlesRootNotePage = null; if (wiki != null) { - newsArticlesRootNotePage = noteService.getNoteOfNoteBookByName(WikiType.GROUP.name().toLowerCase(), pageOwnerId, NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME); + newsArticlesRootNotePage = noteService.getNoteOfNoteBookByName(WikiType.GROUP.name().toLowerCase(), + pageOwnerId, + NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME); // create the news root page if the wiki exist if (newsArticlesRootNotePage == null) { newsArticlesRootNotePage = createNewsArticlesNoteRootPage(wiki); @@ -640,11 +657,11 @@ private News buildDraftArticle(String draftArticleId, String draftArticleCreator draftArticle.setSpaceAvatarUrl(draftArticleSpace.getAvatarUrl()); draftArticle.setSpaceDisplayName(draftArticleSpace.getDisplayName()); boolean hiddenSpace = draftArticleSpace.getVisibility().equals(Space.HIDDEN) - && !spaceService.isMember(draftArticleSpace, draftArticleCreator) - && !spaceService.isSuperManager(draftArticleCreator); + && !spaceService.isMember(draftArticleSpace, draftArticleCreator) + && !spaceService.isSuperManager(draftArticleCreator); draftArticle.setHiddenSpace(hiddenSpace); boolean isSpaceMember = spaceService.isSuperManager(draftArticleCreator) - || spaceService.isMember(draftArticleSpace, draftArticleCreator); + || spaceService.isMember(draftArticleSpace, draftArticleCreator); draftArticle.setSpaceMember(isSpaceMember); if (StringUtils.isNotEmpty(draftArticleSpace.getGroupId())) { String spaceGroupId = draftArticleSpace.getGroupId().split("/")[2]; @@ -655,12 +672,12 @@ private News buildDraftArticle(String draftArticleId, String draftArticleCreator } StringBuilder draftArticleUrl = new StringBuilder(""); draftArticleUrl.append("/") - .append(PortalContainer.getCurrentPortalContainerName()) - .append("/") - .append(CommonsUtils.getCurrentPortalOwner()) - .append("/news/detail?newsId=") - .append(draftArticle.getId()) - .append("&type=draft"); + .append(PortalContainer.getCurrentPortalContainerName()) + .append("/") + .append(CommonsUtils.getCurrentPortalOwner()) + .append("/news/detail?newsId=") + .append(draftArticle.getId()) + .append("&type=draft"); draftArticle.setUrl(draftArticleUrl.toString()); NewsDraftObject draftArticleMetaDataObject = @@ -688,6 +705,30 @@ private News buildDraftArticle(String draftArticleId, String draftArticleCreator return null; } + private void deleteDraftArticle(String draftArticleId, String draftArticleCreator) throws Exception { + DraftPage draftArticlePage = noteService.getDraftNoteById(draftArticleId, draftArticleCreator); + if (draftArticlePage != null) { + noteService.removeDraftById(draftArticlePage.getId()); + NewsDraftObject draftArticleMetaDataObject = new NewsDraftObject(NEWS_METADATA_DRAFT_OBJECT_TYPE, + draftArticlePage.getId(), + null); + MetadataKey draftArticleMetadataKey = new MetadataKey(NEWS_METADATA_TYPE.getName(), NEWS_METADATA_NAME, 0); + List draftArticleMetadataItems = + metadataService.getMetadataItemsByMetadataAndObject(draftArticleMetadataKey, + draftArticleMetaDataObject); + if (draftArticleMetadataItems != null && !draftArticleMetadataItems.isEmpty()) { + Map draftArticleMetadataItemProperties = draftArticleMetadataItems.get(0).getProperties(); + if (draftArticleMetadataItemProperties != null && draftArticleMetadataItemProperties.containsKey(NEWS_ILLUSTRATION_ID) + && draftArticleMetadataItemProperties.get(NEWS_ILLUSTRATION_ID) != null) { + FileItem draftArticleIllustrationFileItem = + fileService.getFile(Long.parseLong(draftArticleMetadataItemProperties.get(NEWS_ILLUSTRATION_ID))); + fileService.deleteFile(draftArticleIllustrationFileItem.getFileInfo().getId()); + } + metadataService.deleteMetadataItem(draftArticleMetadataItems.get(0).getId(), false); + } + } + } + private boolean canEditNews(News news, String authenticatedUser) { String spaceId = news.getSpaceId(); Space space = spaceId == null ? null : spaceService.getSpaceById(spaceId); @@ -699,7 +740,8 @@ private boolean canEditNews(News news, String authenticatedUser) { LOG.warn("Can't find user with id {} when checking access on news with id {}", authenticatedUser, news.getId()); return false; } - return NewsUtils.canPublishNews(news.getSpaceId(), authenticatedUserIdentity) || spaceService.canRedactOnSpace(space, authenticatedUserIdentity); + return NewsUtils.canPublishNews(news.getSpaceId(), authenticatedUserIdentity) + || spaceService.canRedactOnSpace(space, authenticatedUserIdentity); } private void setArticleIllustration(News article, Long articleIllustrationId, String newsObjectType) { @@ -757,13 +799,13 @@ private boolean canDeleteNews(org.exoplatform.services.security.Identity current String authenticatedUser = currentIdentity.getUserId(); Space currentSpace = spaceService.getSpaceById(spaceId); return authenticatedUser.equals(posterId) || userACL.isSuperUser() || spaceService.isSuperManager(authenticatedUser) - || spaceService.isManager(currentSpace, authenticatedUser); + || spaceService.isManager(currentSpace, authenticatedUser); } private boolean isMemberOfsharedInSpaces(News news, String username) { for (String sharedInSpaceId : news.getSharedInSpacesList()) { Space sharedInSpace = spaceService.getSpaceById(sharedInSpaceId); - if(sharedInSpace != null && spaceService.isMember(sharedInSpace, username)) { + if (sharedInSpace != null && spaceService.isMember(sharedInSpace, username)) { return true; } } diff --git a/services/src/test/java/org/exoplatform/news/rest/NewsRestResourcesV1Test.java b/services/src/test/java/org/exoplatform/news/rest/NewsRestResourcesV1Test.java index cf759d88ee..914370a015 100644 --- a/services/src/test/java/org/exoplatform/news/rest/NewsRestResourcesV1Test.java +++ b/services/src/test/java/org/exoplatform/news/rest/NewsRestResourcesV1Test.java @@ -1056,7 +1056,7 @@ public void shouldDeleteNewsWhenNewsExists() throws Exception { news.setSpaceId("1"); news.setCanDelete(true); - lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean())).thenReturn(news); + lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean(), anyString())).thenReturn(news); Space space1 = new Space(); space1.setId("1"); space1.setPrettyName("space1"); @@ -1085,7 +1085,7 @@ public void shouldNotDeleteNewsWhenUserIsNotDraftAuthor() throws Exception { news.setSpaceId("1"); news.setCanDelete(true); - lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean())).thenReturn(news); + lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean(), anyString())).thenReturn(news); Space space1 = new Space(); space1.setId("1"); space1.setPrettyName("space1"); @@ -1109,7 +1109,7 @@ public void shouldGetNotFoundWhenDeletingNewsDraftThatNotExists() throws Excepti ConversationState.setCurrent(new ConversationState(currentIdentity)); lenient().when(request.getRemoteUser()).thenReturn(JOHN); - lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean())).thenReturn(null); + lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean(), nullable(String.class))).thenReturn(null); lenient().when(spaceService.getSpaceById(anyString())).thenReturn(new Space()); lenient().when(spaceService.isMember(any(Space.class), eq(JOHN))).thenReturn(true); lenient().when(spaceService.isSuperManager(eq(JOHN))).thenReturn(true); @@ -1131,7 +1131,7 @@ public void shouldGetBadRequestWhenDeletingNewsDraftWithIdNull() throws Exceptio ConversationState.setCurrent(new ConversationState(currentIdentity)); lenient().when(request.getRemoteUser()).thenReturn(JOHN); - lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean())).thenReturn(null); + lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean(), nullable(String.class))).thenReturn(null); lenient().when(spaceService.getSpaceById(anyString())).thenReturn(new Space()); lenient().when(spaceService.isMember(any(Space.class), eq(JOHN))).thenReturn(true); lenient().when(spaceService.isSuperManager(eq(JOHN))).thenReturn(true); @@ -1721,7 +1721,7 @@ public void shouldDeleteNews() throws Exception { News news = new News(); news.setId("1"); news.setCanDelete(true); - lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean())).thenReturn(news); + lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean(), anyString())).thenReturn(news); lenient().when(spaceService.getSpaceById(anyString())).thenReturn(new Space()); lenient().when(spaceService.isMember(any(Space.class), eq(JOHN))).thenReturn(true); diff --git a/services/src/test/java/org/exoplatform/news/service/impl/NewsServiceImplV2Test.java b/services/src/test/java/org/exoplatform/news/service/impl/NewsServiceImplV2Test.java index c76b318bcc..81720e5bd0 100644 --- a/services/src/test/java/org/exoplatform/news/service/impl/NewsServiceImplV2Test.java +++ b/services/src/test/java/org/exoplatform/news/service/impl/NewsServiceImplV2Test.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -34,15 +35,10 @@ import static org.mockito.Mockito.when; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.exoplatform.portal.config.UserACL; -import org.exoplatform.social.core.manager.ActivityManager; -import org.exoplatform.wiki.model.Wiki; -import org.exoplatform.wiki.service.WikiService; import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; @@ -60,7 +56,9 @@ import org.exoplatform.news.service.NewsService; import org.exoplatform.news.service.NewsTargetingService; import org.exoplatform.news.utils.NewsUtils; +import org.exoplatform.portal.config.UserACL; import org.exoplatform.services.security.Identity; +import org.exoplatform.social.core.manager.ActivityManager; import org.exoplatform.social.core.manager.IdentityManager; import org.exoplatform.social.core.space.model.Space; import org.exoplatform.social.core.space.spi.SpaceService; @@ -70,7 +68,9 @@ import org.exoplatform.social.metadata.model.MetadataObject; import org.exoplatform.upload.UploadService; import org.exoplatform.wiki.model.DraftPage; +import org.exoplatform.wiki.model.Wiki; import org.exoplatform.wiki.service.NoteService; +import org.exoplatform.wiki.service.WikiService; @RunWith(MockitoJUnitRunner.Silent.class) public class NewsServiceImplV2Test { @@ -141,6 +141,7 @@ public static void afterRunBare() throws Exception { // NOSONAR @Test public void testCreateDraftArticle() throws Exception { + // Given News draftArticle = new News(); draftArticle.setAuthor("john"); draftArticle.setTitle("draft article for new page"); @@ -150,7 +151,9 @@ public void testCreateDraftArticle() throws Exception { Space space = mock(Space.class); when(spaceService.getSpaceById(draftArticle.getSpaceId())).thenReturn(space); + when(spaceService.getSpaceByGroupId(anyString())).thenReturn(space); when(space.getGroupId()).thenReturn("/space/groupId"); + when(space.getId()).thenReturn("1"); DraftPage draftPage = new DraftPage(); draftPage.setContent(draftArticle.getBody()); @@ -158,7 +161,7 @@ public void testCreateDraftArticle() throws Exception { draftPage.setId("1"); draftPage.setAuthor("john"); - org.exoplatform.services.security.Identity identity = mock(Identity.class); + Identity identity = mock(Identity.class); when(identity.getUserId()).thenReturn("john"); when(spaceService.getSpaceById(any())).thenReturn(space); when(spaceService.isSuperManager(anyString())).thenReturn(true); @@ -166,13 +169,17 @@ public void testCreateDraftArticle() throws Exception { when(wikiService.getWikiByTypeAndOwner(anyString(), anyString())).thenReturn(wiki); org.exoplatform.wiki.model.Page rootPage = mock(org.exoplatform.wiki.model.Page.class); when(rootPage.getName()).thenReturn(NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME); - // - when(noteService.getNotesOfWiki(anyString(), anyString())).thenReturn(new ArrayList<>()); + + // When News savedDraftArticle = newsService.createNews(draftArticle, identity); - // + + // Then assertNull(savedDraftArticle); - // - when(noteService.getNoteOfNoteBookByName("group", space.getGroupId(), NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME)).thenReturn(rootPage); + + // Given + when(noteService.getNoteOfNoteBookByName("group", + space.getGroupId(), + NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME)).thenReturn(rootPage); when(noteService.createDraftForNewPage(any(DraftPage.class), anyLong())).thenReturn(draftPage); when(rootPage.getId()).thenReturn("1"); org.exoplatform.social.core.identity.model.Identity identity1 = @@ -181,9 +188,11 @@ public void testCreateDraftArticle() throws Exception { when(identity1.getId()).thenReturn("1"); NEWS_UTILS.when(() -> NewsUtils.canPublishNews(anyString(), any(Identity.class))).thenReturn(true); when(spaceService.canRedactOnSpace(any(Space.class), any(Identity.class))).thenReturn(true); - // + + // When savedDraftArticle = newsService.createNews(draftArticle, identity); - // + + // Then assertNotNull(savedDraftArticle); verify(metadataService, times(1)).createMetadataItem(any(NewsDraftObject.class), any(MetadataKey.class), @@ -198,7 +207,8 @@ public void testCreateDraftArticle() throws Exception { @Test public void testGetDraftArticleById() throws Exception { - // case draft of non-existing page + + // Given DraftPage draftPage = new DraftPage(); draftPage.setContent("draft body"); draftPage.setTitle("draft article for new page"); @@ -227,12 +237,15 @@ public void testGetDraftArticleById() throws Exception { when(metadataItem.getProperties()).thenReturn(properties); PORTAL_CONTAINER.when(() -> PortalContainer.getCurrentPortalContainerName()).thenReturn("portal"); COMMONS_UTILS.when(() -> CommonsUtils.getCurrentPortalOwner()).thenReturn("dw"); - org.exoplatform.services.security.Identity identity = mock(Identity.class); + Identity identity = mock(Identity.class); when(identity.getUserId()).thenReturn("john"); when(activityManager.getActivity(nullable(String.class))).thenReturn(null); when(newsTargetingService.getTargetsByNewsId(anyString())).thenReturn(null); - // + + // When News news = newsService.getNewsById("1", identity, false, NewsUtils.NewsObjectType.DRAFT.name().toLowerCase()); + + // Then assertNotNull(news); assertEquals(draftPage.getId(), news.getId()); assertEquals(draftPage.getAuthor(), news.getAuthor()); @@ -245,7 +258,8 @@ public void testGetDraftArticleById() throws Exception { @Test public void testUpdateDraftArticle() throws Exception { - // case draft of non-existing page + + // Given DraftPage draftPage = new DraftPage(); draftPage.setContent("draft body"); draftPage.setTitle("draft article for new page"); @@ -255,13 +269,13 @@ public void testUpdateDraftArticle() throws Exception { Space space = mock(Space.class); when(space.getId()).thenReturn("1"); - when(spaceService.getSpaceByGroupId(anyString())).thenReturn(space); when(space.getGroupId()).thenReturn("/space/groupId"); when(space.getAvatarUrl()).thenReturn("space/avatar/url"); when(space.getDisplayName()).thenReturn("spaceDisplayName"); when(space.getVisibility()).thenReturn("public"); when(spaceService.isSuperManager(anyString())).thenReturn(true); when(spaceService.getSpaceById(any())).thenReturn(space); + when(spaceService.getSpaceByGroupId(anyString())).thenReturn(space); when(noteService.getDraftNoteById(anyString(), anyString())).thenReturn(draftPage); MetadataItem metadataItem = mock(MetadataItem.class); @@ -273,18 +287,14 @@ public void testUpdateDraftArticle() throws Exception { when(metadataItem.getProperties()).thenReturn(properties); PORTAL_CONTAINER.when(() -> PortalContainer.getCurrentPortalContainerName()).thenReturn("portal"); COMMONS_UTILS.when(() -> CommonsUtils.getCurrentPortalOwner()).thenReturn("dw"); - org.exoplatform.services.security.Identity identity = mock(Identity.class); + Identity identity = mock(Identity.class); when(identity.getUserId()).thenReturn("john"); when(activityManager.getActivity(nullable(String.class))).thenReturn(null); when(newsTargetingService.getTargetsByNewsId(anyString())).thenReturn(null); - // org.exoplatform.wiki.model.Page rootPage = mock(org.exoplatform.wiki.model.Page.class); when(rootPage.getName()).thenReturn(NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME); - when(noteService.getNotesOfWiki("group", space.getGroupId())).thenReturn(Arrays.asList(rootPage)); when(noteService.getDraftNoteById(anyString(), anyString())).thenReturn(draftPage); - // NEWS_UTILS.when(() -> NewsUtils.getUserIdentity(anyString())).thenReturn(identity); - // News news = new News(); news.setAuthor("john"); news.setTitle("new draft title"); @@ -299,18 +309,73 @@ public void testUpdateDraftArticle() throws Exception { expecteddraftPage.setAuthor(news.getAuthor()); expecteddraftPage.setContent(news.getBody()); expecteddraftPage.setId(news.getId()); - // + expecteddraftPage.setWikiOwner("/space/groupId"); + + // When, Then assertThrows(IllegalArgumentException.class, () -> newsService.updateNews(news, "john", false, false, "draft")); - // + + // Given when(spaceService.canRedactOnSpace(space, identity)).thenReturn(true); org.exoplatform.social.core.identity.model.Identity identity1 = mock(org.exoplatform.social.core.identity.model.Identity.class); when(identityManager.getOrCreateUserIdentity(anyString())).thenReturn(identity1); when(identity1.getId()).thenReturn("1"); when(noteService.updateDraftForNewPage(any(DraftPage.class), anyLong())).thenReturn(expecteddraftPage); + + // When newsService.updateNews(news, "john", false, false, "draft"); - // + + // Then verify(noteService, times(1)).updateDraftForNewPage(eq(expecteddraftPage), anyLong()); verify(metadataService, times(1)).updateMetadataItem(any(MetadataItem.class), anyLong()); } + + @Test + public void testDeleteDraftArticle() throws Exception { + + // Given + DraftPage draftPage = new DraftPage(); + draftPage.setContent("draft body"); + draftPage.setTitle("draft article for new page"); + draftPage.setId("1"); + draftPage.setAuthor("john"); + draftPage.setWikiOwner("/space/groupId"); + + Space space = mock(Space.class); + when(space.getId()).thenReturn("1"); + when(space.getGroupId()).thenReturn("/space/groupId"); + when(space.getAvatarUrl()).thenReturn("space/avatar/url"); + when(space.getDisplayName()).thenReturn("spaceDisplayName"); + when(space.getVisibility()).thenReturn("public"); + when(spaceService.isSuperManager(anyString())).thenReturn(true); + when(spaceService.getSpaceById(any())).thenReturn(space); + when(spaceService.getSpaceByGroupId(anyString())).thenReturn(space); + + when(noteService.getDraftNoteById(anyString(), anyString())).thenReturn(draftPage); + MetadataItem metadataItem = mock(MetadataItem.class); + List metadataItems = new ArrayList<>(); + metadataItems.add(metadataItem); + when(metadataService.getMetadataItemsByMetadataAndObject(any(MetadataKey.class), + any(MetadataObject.class))).thenReturn(metadataItems); + Map properties = new HashMap<>(); + when(metadataItem.getProperties()).thenReturn(properties); + PORTAL_CONTAINER.when(() -> PortalContainer.getCurrentPortalContainerName()).thenReturn("portal"); + COMMONS_UTILS.when(() -> CommonsUtils.getCurrentPortalOwner()).thenReturn("dw"); + Identity identity = mock(Identity.class); + when(identity.getUserId()).thenReturn("john"); + when(activityManager.getActivity(nullable(String.class))).thenReturn(null); + when(newsTargetingService.getTargetsByNewsId(anyString())).thenReturn(null); + org.exoplatform.wiki.model.Page rootPage = mock(org.exoplatform.wiki.model.Page.class); + when(rootPage.getName()).thenReturn(NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME); + when(noteService.getDraftNoteById(anyString(), anyString())).thenReturn(draftPage); + NEWS_UTILS.when(() -> NewsUtils.getUserIdentity(anyString())).thenReturn(identity); + when(spaceService.canRedactOnSpace(space, identity)).thenReturn(true); + + // When + newsService.deleteNews(draftPage.getId(), identity, true); + + // Then + verify(noteService, times(1)).removeDraftById(draftPage.getId()); + verify(metadataService, times(1)).deleteMetadataItem(any(Long.class), anyBoolean()); + } }