package org.fenixedu.cms.domain;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.groups.Group;
import org.fenixedu.cms.domain.component.*;
import org.fenixedu.commons.i18n.LocalizedString;
import org.joda.time.DateTime;
import org.joda.time.format.ISODateTimeFormat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.FenixFrameworkRunner;
import javax.servlet.ServletException;
import java.util.List;
import static java.util.stream.Collectors.toList;
import static org.junit.Assert.*;
@RunWith(FenixFrameworkRunner.class)
public class TestSiteExporter extends TestCMS {
@Test
public void jsonExportEmptySite() {
User user = CmsTestUtils.createAuthenticatedUser("exportEmptySiteUser");
Site site = CmsTestUtils.createSite(user, "exportEmptySite");
JsonObject json = new SiteExporter(site).export(site);
assertTrue(json.has("slug"));
assertEquals(json.get("slug").getAsString(), site.getSlug());
assertTrue(json.has("name"));
assertEquals(json.get("name"), site.getName().json());
assertTrue(LocalizedString.fromJson(json.get("name")).equals(site.getName()));
assertTrue(json.has("description"));
assertEquals(json.get("description"), site.getDescription().json());
assertTrue(LocalizedString.fromJson(json.get("description")).equals(site.getDescription()));
assertTrue(json.has("canViewGroup"));
assertEquals(json.get("canViewGroup").getAsString(), site.getCanViewGroup().getExpression());
assertTrue(Group.parse(json.get("canViewGroup").getAsString()).equals(site.getCanViewGroup()));
assertTrue(json.has("canAdminGroup"));
assertEquals(json.get("canAdminGroup").getAsString(), site.getCanAdminGroup().getExpression());
assertTrue(Group.parse(json.get("canAdminGroup").getAsString()).equals(site.getCanAdminGroup()));
assertTrue(json.has("canPostGroup"));
assertEquals(json.get("canPostGroup").getAsString(), site.getCanAdminGroup().getExpression());
assertTrue(Group.parse(json.get("canPostGroup").getAsString()).equals(site.getCanAdminGroup()));
assertTrue(json.has("themeType"));
assertTrue(json.get("themeType").isJsonNull());
assertTrue(json.has("embedded"));
assertEquals(json.get("embedded").getAsBoolean(), site.getEmbedded());
assertTrue(json.has("analyticsCode"));
assertTrue(json.get("analyticsCode").isJsonNull());
assertTrue(json.has("createdBy"));
assertEquals(json.get("createdBy").getAsString(), site.getCreatedBy().getUsername());
assertTrue(User.findByUsername(json.get("createdBy").getAsString()).equals(site.getCreatedBy()));
assertTrue(json.has("published"));
assertEquals(json.get("published").getAsBoolean(), site.getPublished());
assertTrue(json.has("menus"));
assertTrue(json.get("menus").isJsonArray());
assertTrue(json.get("menus").getAsJsonArray().size() == site.getMenusSet().size());
assertTrue(json.has("posts"));
assertTrue(json.get("posts").isJsonArray());
assertTrue(json.get("posts").getAsJsonArray().size() == site.getPostSet().size());
assertTrue(json.has("pages"));
assertTrue(json.get("pages").isJsonArray());
assertTrue(json.get("pages").getAsJsonArray().size() == site.getPagesSet().size());
assertTrue(json.has("categories"));
assertTrue(json.get("categories").isJsonArray());
assertTrue(json.get("categories").getAsJsonArray().size() == site.getCategoriesSet().size());
}
@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);
JsonObject json = new SiteExporter(site).export(site);
assertTrue(json.has("posts"));
assertTrue(json.get("posts").isJsonArray());
assertTrue(json.get("posts").getAsJsonArray().size() == 1);
JsonElement postElement = json.get("posts").getAsJsonArray().get(0);
assertNotNull(postElement);
assertTrue(postElement.isJsonPrimitive());
assertTrue(postElement.getAsString().equals(post.getSlug()));
JsonObject postJson = new SiteExporter(site).export(post);
assertTrue(postJson.has("slug"));
assertEquals(postJson.get("slug").getAsString(), post.getSlug());
assertTrue(postJson.has("site"));
assertEquals(postJson.get("site").getAsString(), site.getSlug());
assertTrue(postJson.has("name"));
assertEquals(postJson.get("name"), post.getName().json());
assertTrue(LocalizedString.fromJson(postJson.get("name").getAsJsonObject()).equals(post.getName()));
assertTrue(postJson.has("body"));
assertEquals(postJson.get("body"), post.getBody().json());
assertTrue(LocalizedString.fromJson(postJson.get("body").getAsJsonObject()).equals(post.getBody()));
assertTrue(postJson.has("createdBy"));
assertEquals(postJson.get("createdBy").getAsString(), post.getCreatedBy().getUsername());
assertTrue(User.findByUsername(postJson.get("createdBy").getAsString()).equals(post.getCreatedBy()));
assertTrue(postJson.has("creationDate"));
DateTime creationDate = ISODateTimeFormat.dateTime().parseDateTime(postJson.get("creationDate").getAsString());
assertTrue(equalDates(creationDate, post.getCreationDate()));
assertTrue(postJson.has("canViewGroup"));
assertEquals(postJson.get("canViewGroup").getAsString(), post.getCanViewGroup().getExpression());
assertTrue(Group.parse(postJson.get("canViewGroup").getAsString()).equals(post.getCanViewGroup()));
assertTrue(postJson.has("active"));
assertEquals(postJson.get("active").getAsBoolean(), post.getActive());
assertTrue(postJson.has("location"));
assertTrue(post.getLocation().equals(LocalizedString.fromJson(postJson.get("location"))));
assertTrue(postJson.has("metadata"));
assertTrue(postJson.get("metadata").isJsonObject());
assertTrue(post.getMetadata().equals(new PostMetadata(postJson.get("metadata").getAsJsonObject())));
assertTrue(postJson.has("modificationDate"));
DateTime modificationDate = DateTime.parse(postJson.get("modificationDate").getAsString());
assertTrue(equalDates(modificationDate, post.getModificationDate()));
assertTrue(postJson.has("publicationBegin"));
DateTime publicationBegin = DateTime.parse(postJson.get("publicationBegin").getAsString());
assertTrue(equalDates(publicationBegin, post.getPublicationBegin()));
assertTrue(postJson.has("publicationEnd"));
assertTrue(postJson.get("publicationEnd").isJsonNull());
assertTrue(postJson.has("files"));
assertTrue(postJson.get("files").isJsonArray());
assertTrue(postJson.get("files").getAsJsonArray().size() == post.getFilesSet().size());
assertTrue(postJson.has("categories"));
assertTrue(postJson.get("categories").isJsonArray());
assertTrue(postJson.get("categories").getAsJsonArray().size() == post.getCategoriesSet().size());
}
@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");
category3.addComponents(new ListCategoryPosts(category3));
post.addCategories(category1);
post.addCategories(category2);
post.addCategories(category3);
JsonObject siteJson = new SiteExporter(site).export(site);
assertTrue(siteJson.has("categories"));
assertTrue(siteJson.get("categories").isJsonArray());
assertEquals(siteJson.get("categories").getAsJsonArray().size(), site.getCategoriesSet().size());
List<String> siteCatSlugs = site.getCategoriesSet().stream().map(Category::getSlug).collect(toList());
for (JsonElement catEl : siteJson.get("categories").getAsJsonArray()) {
assertTrue(catEl.isJsonPrimitive());
assertTrue(siteCatSlugs.contains(catEl.getAsString()));
}
JsonObject postJson = new SiteExporter(site).export(post);
assertTrue(postJson.has("categories"));
assertTrue(postJson.get("categories").isJsonArray());
assertTrue(postJson.get("categories").getAsJsonArray().size() == post.getCategoriesSet().size());
List<String> postCatSlugs = post.getCategoriesSet().stream().map(Category::getSlug).collect(toList());
for (JsonElement catEl : postJson.get("categories").getAsJsonArray()) {
assertTrue(catEl.isJsonPrimitive());
assertTrue(postCatSlugs.contains(catEl.getAsString()));
}
for (Category category : post.getCategoriesSet()) {
JsonObject categoryJson = new SiteExporter(site).export(category);
assertTrue(categoryJson.has("slug"));
assertEquals(categoryJson.get("slug").getAsString(), category.getSlug());
assertTrue(categoryJson.has("site"));
assertEquals(categoryJson.get("site").getAsString(), site.getSlug());
assertTrue(categoryJson.has("creationDate"));
DateTime creationDate = DateTime.parse(categoryJson.get("creationDate").getAsString());
assertTrue(equalDates(creationDate, category.getCreationDate()));
assertTrue(categoryJson.has("createdBy"));
assertEquals(User.findByUsername(categoryJson.get("createdBy").getAsString()), category.getCreatedBy());
assertTrue(categoryJson.has("name"));
assertEquals(LocalizedString.fromJson(categoryJson.get("name")), category.getName());
assertTrue(categoryJson.has("posts"));
assertTrue(categoryJson.get("posts").isJsonArray());
assertTrue(categoryJson.get("posts").getAsJsonArray().size() == category.getPostsSet().size());
List<String> categoryPosts = category.getPostsSet().stream().map(Post::getSlug).collect(toList());
for (JsonElement postSlugEl : categoryJson.get("posts").getAsJsonArray()) {
categoryPosts.contains(postSlugEl.getAsString());
}
assertTrue(categoryJson.has("components"));
assertTrue(categoryJson.get("components").isJsonArray());
assertTrue(categoryJson.get("components").getAsJsonArray().size() == category.getComponentsSet().size());
for (JsonElement categoryComponentEl : categoryJson.get("components").getAsJsonArray()) {
assertTrue(categoryComponentEl.isJsonObject());
JsonObject categoryComponentJson = categoryComponentEl.getAsJsonObject();
assertTrue(categoryComponentJson.has("type"));
assertEquals(categoryComponentJson.get("type").getAsString(), ListCategoryPosts.class.getName());
assertEquals(categoryComponentJson.get("site").getAsString(), category.getSite().getSlug());
assertEquals(categoryComponentJson.get("category").getAsString(), category.getSlug());
}
}
}
@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));
JsonObject siteJson = new SiteExporter(site).export(site);
assertTrue(siteJson.has("pages"));
assertTrue(siteJson.get("pages").isJsonArray());
assertTrue(siteJson.get("pages").getAsJsonArray().size() == site.getPagesSet().size());
List<String> sitePagesSlugs = site.getPagesSet().stream().map(Page::getSlug).collect(toList());
for (JsonElement pageEl : siteJson.get("pages").getAsJsonArray()) {
assertTrue(sitePagesSlugs.contains(pageEl.getAsString()));
}
for (Page page : site.getPagesSet()) {
JsonObject pageJson = new SiteExporter(site).export(page);
assertTrue(pageJson.has("slug"));
assertEquals(pageJson.get("slug").getAsString(), page.getSlug());
assertTrue(pageJson.has("name"));
assertEquals(LocalizedString.fromJson(pageJson.get("name")), page.getName());
assertTrue(pageJson.has("site"));
assertEquals(pageJson.get("site").getAsString(), page.getSite().getSlug());
assertTrue(pageJson.has("canViewGroup"));
assertEquals(Group.parse(pageJson.get("canViewGroup").getAsString()), page.getCanViewGroup());
assertTrue(pageJson.has("templateType"));
if (page.getTemplateType() == null) {
assertTrue(pageJson.get("templateType").isJsonNull());
} else {
assertEquals(pageJson.get("templateType").getAsString(), page.getTemplateType());
}
assertTrue(pageJson.has("published"));
assertEquals(pageJson.get("published").getAsBoolean(), page.getPublished());
assertTrue(pageJson.has("createdBy"));
assertEquals(User.findByUsername(pageJson.get("createdBy").getAsString()), page.getCreatedBy());
assertTrue(pageJson.has("creationDate"));
DateTime creationDate = DateTime.parse(pageJson.get("creationDate").getAsString());
assertTrue(equalDates(creationDate, page.getCreationDate()));
assertTrue(pageJson.has("modificationDate"));
DateTime modificationDate = DateTime.parse(pageJson.get("modificationDate").getAsString());
assertTrue(equalDates(modificationDate, page.getModificationDate()));
assertTrue(pageJson.has("menuItems"));
assertTrue(pageJson.get("menuItems").isJsonArray());
List<String> menuItemsIds = page.getMenuItemsSet().stream().map(MenuItem::getExternalId).collect(toList());
assertEquals(pageJson.get("menuItems").getAsJsonArray().size(), page.getMenuItemsSet().size());
for (JsonElement menuItemEl : pageJson.get("menuItems").getAsJsonArray()) {
assertTrue(menuItemEl.isJsonPrimitive());
assertTrue(menuItemsIds.contains(menuItemEl.getAsString()));
}
assertTrue(pageJson.has("components"));
assertTrue(pageJson.get("components").isJsonArray());
assertEquals(pageJson.get("components").getAsJsonArray().size(), page.getComponentsSet().size());
List<String> pageComponentSlugs = page.getComponentsSet().stream().map(Component::getType).collect(toList());
for (JsonElement componentEl : pageJson.get("components").getAsJsonArray()) {
assertTrue(componentEl.isJsonObject());
JsonObject componentJson = componentEl.getAsJsonObject();
assertTrue(componentJson.has("type"));
assertTrue(componentJson.get("type").isJsonPrimitive());
assertTrue(pageComponentSlugs.contains(componentJson.get("type").getAsString()));
ComponentDescriptor type = Component.forType(componentJson.get("type").getAsString());
assertNotNull(type);
if (!type.isStateless()) {
assertTrue(componentJson.has("site"));
assertEquals(componentJson.get("site").getAsString(), page.getSite().getSlug());
assertTrue(componentJson.has("page"));
assertEquals(componentJson.get("page").getAsString(), page.getSlug());
}
}
}
}
}