diff --git a/src/it/java/org/sahli/asciidoc/confluence/publisher/client/ConfluencePublisherIntegrationTest.java b/src/it/java/org/sahli/asciidoc/confluence/publisher/client/ConfluencePublisherIntegrationTest.java index e14ed68c..3826b40a 100644 --- a/src/it/java/org/sahli/asciidoc/confluence/publisher/client/ConfluencePublisherIntegrationTest.java +++ b/src/it/java/org/sahli/asciidoc/confluence/publisher/client/ConfluencePublisherIntegrationTest.java @@ -24,11 +24,14 @@ import org.sahli.asciidoc.confluence.publisher.client.metadata.ConfluencePublisherMetadata; import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; import static io.restassured.RestAssured.given; import static java.util.Arrays.asList; import static java.util.UUID.randomUUID; import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.fail; @@ -66,6 +69,10 @@ public void publish_singlePageAndReplaceAncestorPublishingStrategy_pageIsUpdated // arrange String title = uniqueTitle("Single Page"); ConfluencePageMetadata confluencePageMetadata = confluencePageMetadata(title, absolutePathTo("single-page/single-page.xhtml")); + Map attachments = new HashMap<>(); + attachments.put("attachmentOne.txt", absolutePathTo("attachments/attachmentOne.txt")); + attachments.put("attachmentTwo.txt", absolutePathTo("attachments/attachmentTwo.txt")); + confluencePageMetadata.setAttachments(attachments); ConfluencePublisherMetadata confluencePublisherMetadata = confluencePublisherMetadata(confluencePageMetadata); ConfluencePublisher confluencePublisher = confluencePublisher(confluencePublisherMetadata, REPLACE_ANCESTOR); @@ -77,6 +84,13 @@ public void publish_singlePageAndReplaceAncestorPublishingStrategy_pageIsUpdated givenAuthenticatedAsPublisher() .when().get(rootPage()) .then().body("title", is(title)); + givenAuthenticatedAsPublisher() + .when().get(rootPageAttachments()) + .then() + .body("results", hasSize(2)) + .body("results[0].title", is("attachmentOne.txt")) + .body("results[1].title", is("attachmentTwo.txt")); + } @Test @@ -157,6 +171,10 @@ private static String rootPage() { return "http://localhost:8090/rest/api/content/" + ANCESTOR_ID; } + private static String rootPageAttachments() { + return "http://localhost:8090/rest/api/content/" + ANCESTOR_ID + "/child/attachment"; + } + private static String pageVersionOf(String contentId) { return "http://localhost:8090/rest/api/content/" + contentId + "?expand=version"; } diff --git a/src/it/resources/attachments/attachmentOne.txt b/src/it/resources/attachments/attachmentOne.txt new file mode 100644 index 00000000..233f7805 --- /dev/null +++ b/src/it/resources/attachments/attachmentOne.txt @@ -0,0 +1 @@ +attachment1 \ No newline at end of file diff --git a/src/it/resources/attachments/attachmentTwo.txt b/src/it/resources/attachments/attachmentTwo.txt new file mode 100644 index 00000000..46cc440f --- /dev/null +++ b/src/it/resources/attachments/attachmentTwo.txt @@ -0,0 +1 @@ +attachment2 \ No newline at end of file diff --git a/src/main/java/org/sahli/asciidoc/confluence/publisher/client/ConfluencePublisher.java b/src/main/java/org/sahli/asciidoc/confluence/publisher/client/ConfluencePublisher.java index c17d8723..60d66792 100644 --- a/src/main/java/org/sahli/asciidoc/confluence/publisher/client/ConfluencePublisher.java +++ b/src/main/java/org/sahli/asciidoc/confluence/publisher/client/ConfluencePublisher.java @@ -80,12 +80,7 @@ public void publish() { startPublishingUnderAncestorId(this.metadata.getPages(), this.metadata.getSpaceKey(), this.metadata.getAncestorId()); break; case REPLACE_ANCESTOR: - ConfluencePageMetadata rootPageMetaData = singleRootPageMetadata(this.metadata); - - if (rootPageMetaData != null) { - updatePage(this.metadata.getAncestorId(), null, rootPageMetaData); - startPublishingUnderAncestorId(rootPageMetaData.getChildren(), this.metadata.getSpaceKey(), this.metadata.getAncestorId()); - } + startPublishingReplacingAncestorId(this.metadata, this.metadata.getSpaceKey(), this.metadata.getAncestorId()); break; default: throw new IllegalArgumentException("Invalid publishing strategy '" + this.publishingStrategy + "'"); @@ -112,6 +107,19 @@ private static ConfluencePageMetadata singleRootPageMetadata(ConfluencePublisher return null; } + private void startPublishingReplacingAncestorId(ConfluencePublisherMetadata metadata, String spaceKey, String ancestorId) { + ConfluencePageMetadata rootPage = singleRootPageMetadata(metadata); + + if (rootPage != null) { + updatePage(ancestorId, null, rootPage); + + deleteConfluenceAttachmentsNotPresentUnderPage(ancestorId, rootPage.getAttachments()); + addAttachments(ancestorId, rootPage.getAttachments()); + + startPublishingUnderAncestorId(rootPage.getChildren(), spaceKey, ancestorId); + } + } + private void startPublishingUnderAncestorId(List pages, String spaceKey, String ancestorId) { deleteConfluencePagesNotPresentUnderAncestor(pages, ancestorId); pages.forEach(page -> { @@ -119,6 +127,7 @@ private void startPublishingUnderAncestorId(List pages, deleteConfluenceAttachmentsNotPresentUnderPage(contentId, page.getAttachments()); addAttachments(contentId, page.getAttachments()); + startPublishingUnderAncestorId(page.getChildren(), spaceKey, contentId); }); } diff --git a/src/test/java/org/sahli/asciidoc/confluence/publisher/client/ConfluencePublisherTest.java b/src/test/java/org/sahli/asciidoc/confluence/publisher/client/ConfluencePublisherTest.java index af50be96..8fbaf2e8 100644 --- a/src/test/java/org/sahli/asciidoc/confluence/publisher/client/ConfluencePublisherTest.java +++ b/src/test/java/org/sahli/asciidoc/confluence/publisher/client/ConfluencePublisherTest.java @@ -282,6 +282,39 @@ public void publish_metadataWithExistingPageWithSameContentButDifferentTitleAndR verifyNoMoreInteractions(confluencePublisherListenerMock); } + @Test + public void publish_metadataWithExistingPageAndNewAttachments_sendsUpdateAndAddAttachmentRequests() { + // arrange + ConfluencePage existingPage = new ConfluencePage("72189173", "Existing Page (Old Title)", "

Some Confluence Content

", 1); + + ConfluenceRestClient confluenceRestClientMock = mock(ConfluenceRestClient.class); + when(confluenceRestClientMock.getPageWithContentAndVersionById("72189173")).thenReturn(existingPage); + when(confluenceRestClientMock.getPropertyByKey("72189173", CONTENT_HASH_PROPERTY_KEY)).thenReturn(SOME_CONFLUENCE_CONTENT_SHA256_HASH); + when(confluenceRestClientMock.getAttachmentByFileName("72189173", "attachmentOne.txt")) + .thenThrow(new NotFoundException()); + when(confluenceRestClientMock.getAttachmentByFileName("72189173", "attachmentTwo.txt")) + .thenReturn(new ConfluenceAttachment("att2", "attachmentOne.txt", "/download/attachmentOne.txt", 1)); + when(confluenceRestClientMock.getAttachmentContent("/download/attachmentOne.txt")) + .thenReturn(new ByteArrayInputStream("Old content".getBytes())); + + ConfluencePublisherListener confluencePublisherListenerMock = mock(ConfluencePublisherListener.class); + + ConfluencePublisher confluencePublisher = confluencePublisher("root-ancestor-id-page-with-attachments", REPLACE_ANCESTOR, confluenceRestClientMock, confluencePublisherListenerMock, null); + + // act + confluencePublisher.publish(); + + // assert + verify(confluenceRestClientMock, never()).addPageUnderAncestor(any(), any(), any(), any(), any()); + verify(confluenceRestClientMock, times(1)).updatePage(eq("72189173"), eq(null), eq("Some Confluence Content"), eq("

Some Confluence Content

"), eq(2), eq(null)); + verify(confluenceRestClientMock).addAttachment(eq("72189173"), eq("attachmentOne.txt"), any(InputStream.class)); + verify(confluenceRestClientMock).updateAttachmentContent(eq("72189173"), eq("att2"), any(InputStream.class)); + + verify(confluencePublisherListenerMock, times(1)).pageUpdated(existingPage, new ConfluencePage("72189173", "Some Confluence Content", "

Some Confluence Content

", 2)); + verify(confluencePublisherListenerMock, times(1)).publishCompleted(); + verifyNoMoreInteractions(confluencePublisherListenerMock); + } + @Test public void publish_metadataWithExistingPageAndAttachmentWithDifferentAttachmentContentUnderRootSpace_sendsUpdateAttachmentRequest() { // arrange