package org.fenixedu.cms.domain; import com.google.common.io.Files; import org.fenixedu.bennu.core.domain.User; import org.fenixedu.cms.domain.component.Component; import org.fenixedu.cms.domain.component.ListCategoryPosts; import org.fenixedu.cms.domain.component.StaticPost; import org.fenixedu.cms.domain.component.ViewPost; import org.joda.time.DateTime; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.FenixFrameworkRunner; import javax.servlet.ServletException; import java.io.ByteArrayOutputStream; import java.io.File; import java.util.List; import java.util.UUID; import java.util.zip.ZipFile; import static java.util.stream.Collectors.toList; import static org.junit.Assert.*; @RunWith(FenixFrameworkRunner.class) public class TestSiteImportExportIntegration extends TestCMS { @Test public void jsonImportEmptySite() { User user = CmsTestUtils.createAuthenticatedUser("exportEmptySiteUser"); Site site = CmsTestUtils.createSite(user, "exportEmptySite"); Site importedSite = exportAndImport(site); assertEqualSites(site, importedSite); } @Test public void jsonExportPost() { User user = CmsTestUtils.createAuthenticatedUser("jsonExportEmptyPost"); Site site = CmsTestUtils.createSite(user, "jsonExportEmptyPost"); Post post = CmsTestUtils.createPost(site, "jsonExportEmptyPost"); PostContentRevision version = CmsTestUtils.createVersion(post, "jsonExportEmptyPostPostBody"); post.setLocation(CmsTestUtils.createLocalizedString("jsonExportEmptyPostLocation")); post.setMetadata(new PostMetadata().with("firstKey", "my-test-value").with("secondKey", "secondTestValue")); post.setPublicationBegin(new DateTime()); post.setPublicationEnd(null); Site importedSite = exportAndImport(site); assertEqualSites(site, importedSite); } @Test public void jsonCategories() { User user = CmsTestUtils.createAuthenticatedUser("jsonCategories"); Site site = CmsTestUtils.createSite(user, "jsonCategories"); Post post = CmsTestUtils.createPost(site, "jsonCategories"); Category category1 = CmsTestUtils.createCategory(site, "jsonCategories1"); Category category2 = CmsTestUtils.createCategory(site, "jsonCategories2"); Category category3 = CmsTestUtils.createCategory(site, "jsonCategories3"); category2.addComponents(new ListCategoryPosts(category2)); category3.addComponents(new ListCategoryPosts(category3)); category3.addComponents(new ListCategoryPosts(category3)); category3.addComponents(new ListCategoryPosts(category3)); Site importedSite = exportAndImport(site); assertEqualSites(site, importedSite); } @Test public void jsonPage() throws ServletException { User user = CmsTestUtils.createAuthenticatedUser("jsonPage"); Site site = CmsTestUtils.createSite(user, "jsonPage"); Page page1 = CmsTestUtils.createPage(site, "jsonPage1"); Page page2 = CmsTestUtils.createPage(site, "jsonPage2"); Page page3 = CmsTestUtils.createPage(site, "jsonPage3"); page2.addComponents(new ListCategoryPosts(CmsTestUtils.createCategory(site, "jsonPage"))); page3.addComponents(new StaticPost(CmsTestUtils.createPost(site, "jsonPage"))); page3.addComponents(new StaticPost(CmsTestUtils.createPost(site, "jsonPage22"))); page3.addComponents(new ListCategoryPosts(CmsTestUtils.createCategory(site, "jsonPage22Cate"))); page3.addComponents(Component.forType(ViewPost.class)); Site importedSite = exportAndImport(site); assertEqualSites(site, importedSite); } @Test private void assertEqualSites(Site site, Site importedSite) { assertNotNull(importedSite); Assert.assertEquals(importedSite.getName(), site.getName()); assertTrue(importedSite.getRolesSet().stream() .allMatch(role -> site.getRolesSet().stream() .anyMatch(r -> r.getGroup().expression().equals(role.getGroup().expression()) && r.getRoleTemplate().getExternalId().equals(role.getRoleTemplate().getExternalId())))); Assert.assertEquals(importedSite.getCanViewGroup(), site.getCanViewGroup()); Assert.assertNotEquals(importedSite.getExternalId(), site.getExternalId()); Assert.assertEquals(importedSite.getThemeType(), site.getThemeType()); Assert.assertFalse(importedSite.getPublished()); Assert.assertEquals(importedSite.getDescription(), site.getDescription()); Assert.assertTrue(importedSite.getInitialPage() == null && site.getInitialPage() == null || importedSite.getInitialPage().getSlug().equals(site.getInitialPage().getSlug())); Assert.assertEquals(importedSite.getEmbedded(), site.getEmbedded()); Assert.assertEquals(importedSite.getAnalyticsCode(), site.getAnalyticsCode()); Assert.assertEquals(importedSite.getCategoriesSet().size(), site.getCategoriesSet().size()); for (Category originalCategory : site.getCategoriesSet()) { Category importedCategory = importedSite.categoryForSlug(originalCategory.getSlug()); assertNotNull(importedCategory); Assert.assertEquals(importedCategory.getName(), originalCategory.getName()); Assert.assertEquals(importedCategory.getPostsSet().size(), originalCategory.getPostsSet().size()); assertTrue(importedCategory.getComponentsSet().stream().map(Component::getType).collect(toList()) .containsAll(originalCategory.getComponentsSet().stream().map(Component::getType).collect(toList()))); assertTrue(importedCategory.getPostsSet().stream().map(Post::getSlug).collect(toList()) .containsAll(originalCategory.getPostsSet().stream().map(Post::getSlug).collect(toList()))); } Assert.assertEquals(importedSite.getPagesSet().size(), site.getPagesSet().size()); for (Page originalPage : site.getPagesSet()) { Page importedPage = importedSite.pageForSlug(originalPage.getSlug()); assertNotNull(importedPage); Assert.assertEquals(importedPage.getName(), originalPage.getName()); Assert.assertEquals(importedPage.getComponentsSet().size(), originalPage.getComponentsSet().size()); assertTrue(importedPage.getComponentsSet().stream().map(Component::getType).collect(toList()) .containsAll(originalPage.getComponentsSet().stream().map(Component::getType).collect(toList()))); } Assert.assertEquals(importedSite.getMenusSet().size(), site.getMenusSet().size()); for (Menu originalMenu : site.getMenusSet()) { Menu importedMenu = importedSite.menuForSlug(originalMenu.getSlug()); assertNotNull(importedMenu); Assert.assertEquals(importedMenu.getName(), originalMenu.getName()); Assert.assertEquals(importedMenu.getOrder(), originalMenu.getOrder()); Assert.assertEquals(importedMenu.getToplevelItemsSet().size(), originalMenu.getToplevelItemsSet().size()); Assert.assertEquals(importedMenu.getItemsSet().size(), originalMenu.getItemsSet().size()); List<MenuItem> originalMenuItems = originalMenu.getItemsSorted().collect(toList()); List<MenuItem> importedMenuItems = importedMenu.getItemsSorted().collect(toList()); for (int i = 0; i < originalMenuItems.size(); ++i) { MenuItem originalMenuItem = originalMenuItems.get(i); MenuItem importedMenuItem = importedMenuItems.get(i); Assert.assertEquals(importedMenuItem.getName(), originalMenuItem.getName()); Assert.assertEquals(importedMenuItem.getAddress(), originalMenuItem.getAddress()); Assert.assertEquals(importedMenuItem.getMenu().getSlug(), originalMenuItem.getMenu().getSlug()); Assert.assertEquals(importedMenuItem.getPosition(), originalMenuItem.getPosition()); Assert.assertEquals(importedMenuItem.getChildrenSet().size(), originalMenuItem.getChildrenSet().size()); Assert.assertEquals(importedMenuItem.getFolder(), originalMenuItem.getFolder()); Assert.assertEquals(importedMenuItem.getUrl(), originalMenuItem.getUrl()); Assert.assertTrue(importedMenuItem.getTop() == null && originalMenuItem.getTop() == null || importedMenuItem.getTop().getSlug().equals(originalMenuItem.getTop().getSlug())); Assert.assertTrue(importedMenuItem.getPage() == null && originalMenuItem.getPage() == null || importedMenuItem.getPage().getSlug().equals(originalMenuItem.getPage().getSlug())); } } Assert.assertEquals(importedSite.getPostSet().size(), site.getPostSet().size()); for (Post originalPost : site.getPostSet()) { Post importedPost = importedSite.postForSlug(originalPost.getSlug()); assertNotNull(importedPost); assertEquals(importedPost.getName(), originalPost.getName()); assertEquals(importedPost.getBody(), originalPost.getBody()); assertEquals(importedPost.getCanViewGroup(), originalPost.getCanViewGroup()); assertEquals(importedPost.getCategoriesSet().size(), originalPost.getCategoriesSet().size()); importedPost.getCategoriesSet().stream().map(Category::getSlug).collect(toList()) .containsAll(originalPost.getCategoriesSet().stream().map(Category::getSlug).collect(toList())); assertEquals(importedPost.getMetadata(), originalPost.getMetadata()); assertTrue(equalDates(importedPost.getPublicationBegin(), originalPost.getPublicationBegin())); assertTrue(equalDates(importedPost.getPublicationEnd(), originalPost.getPublicationEnd())); assertEquals(importedPost.getLocation(), originalPost.getLocation()); assertEquals(importedPost.getActive(), originalPost.getActive()); List<PostFile> originalPostFiles = originalPost.getFilesSorted(); List<PostFile> importedPostFiles = importedPost.getFilesSorted(); for (int i = 0; i < originalPostFiles.size(); ++i) { PostFile originalPostFile = originalPostFiles.get(i); PostFile importedPostFile = importedPostFiles.get(i); assertEquals(originalPostFile.getIndex(), importedPostFile.getIndex()); assertEquals(originalPostFile.getIsEmbedded(), importedPostFile.getIsEmbedded()); assertEquals(originalPostFile.getFiles().getDisplayName(), importedPostFile.getFiles().getDisplayName()); assertEquals(originalPostFile.getFiles().getFilename(), originalPostFile.getFiles().getFilename()); assertEquals(originalPostFile.getFiles().getSize(), importedPostFile.getFiles().getSize()); assertEquals(originalPostFile.getFiles().getChecksum(), importedPostFile.getFiles().getChecksum()); } } } @Test private Site exportAndImport(Site site) { try { ByteArrayOutputStream exportedSite = new SiteExporter(site).export(); File tempFile = File.createTempFile(UUID.randomUUID().toString(), ".zip"); Files.write(exportedSite.toByteArray(), tempFile); return new SiteImporter(new ZipFile(tempFile)).importSite(); } catch (Exception e) { e.printStackTrace(); Assert.fail(e.getMessage()); return null; } } }