package org.fenixedu.cms.api;
import java.util.stream.Stream;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Application;
import org.fenixedu.bennu.core.groups.ManualGroupRegister;
import org.fenixedu.bennu.core.json.JsonBuilder;
import org.fenixedu.bennu.core.rest.DomainExceptionMapper;
import org.fenixedu.bennu.core.rest.DomainObjectParamConverter;
import org.fenixedu.bennu.core.rest.JsonAwareResource;
import org.fenixedu.bennu.core.rest.JsonBodyReaderWriter;
import org.fenixedu.cms.api.json.CategoryAdapter;
import org.fenixedu.cms.api.json.MenuAdapter;
import org.fenixedu.cms.api.json.MenuItemAdapter;
import org.fenixedu.cms.api.json.PageAdapter;
import org.fenixedu.cms.api.json.PostAdapter;
import org.fenixedu.cms.api.json.PostRevisionAdapter;
import org.fenixedu.cms.api.json.SiteAdapter;
import org.fenixedu.cms.api.json.ThemeAdapter;
import org.fenixedu.cms.api.resource.CategoryResource;
import org.fenixedu.cms.api.resource.MenuItemResource;
import org.fenixedu.cms.api.resource.MenuResource;
import org.fenixedu.cms.api.resource.PageResource;
import org.fenixedu.cms.api.resource.PostResource;
import org.fenixedu.cms.api.resource.RevisionResource;
import org.fenixedu.cms.api.resource.SiteResource;
import org.fenixedu.cms.api.resource.ThemeResource;
import org.fenixedu.cms.domain.CMSTheme;
import org.fenixedu.cms.domain.Category;
import org.fenixedu.cms.domain.Menu;
import org.fenixedu.cms.domain.MenuItem;
import org.fenixedu.cms.domain.Page;
import org.fenixedu.cms.domain.Post;
import org.fenixedu.cms.domain.PostContentRevision;
import org.fenixedu.cms.domain.Site;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.BeforeClass;
import pt.ist.fenixframework.Atomic;
import pt.ist.fenixframework.Atomic.TxMode;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
public class TestCmsApi extends JerseyTest {
protected static final String EMPTY_RESPONSE = "[]";
protected JsonBuilder ctx = new JsonBuilder();
@Override
protected void configureClient(ClientConfig config) {
super.configureClient(config);
config.register(DomainObjectParamConverter.class);
}
@Override
protected Application configure() {
return new ResourceConfig(DomainObjectParamConverter.class, SiteResource.class, PostResource.class,
RevisionResource.class, PageResource.class, CategoryResource.class, MenuResource.class, MenuItemResource.class,
ThemeResource.class, DomainExceptionMapper.class, JsonBodyReaderWriter.class);
}
public static void ensure() {
ManualGroupRegister.ensure();
JsonAwareResource.setDefault(Site.class, SiteAdapter.class);
JsonAwareResource.setDefault(Post.class, PostAdapter.class);
JsonAwareResource.setDefault(PostContentRevision.class, PostRevisionAdapter.class);
JsonAwareResource.setDefault(Page.class, PageAdapter.class);
JsonAwareResource.setDefault(Category.class, CategoryAdapter.class);
JsonAwareResource.setDefault(Menu.class, MenuAdapter.class);
JsonAwareResource.setDefault(MenuItem.class, MenuItemAdapter.class);
JsonAwareResource.setDefault(CMSTheme.class, ThemeAdapter.class);
}
@BeforeClass
@Atomic(mode = TxMode.WRITE)
public static void initObjects() {
ensure();
}
protected JsonElement removeNullKeys(JsonElement elem) {
Gson builder = new GsonBuilder().create();
return builder.toJsonTree(elem);
}
public WebTarget getCmsTarget() {
return target("cms");
}
public WebTarget getSitesTarget() {
return getCmsTarget().path("sites");
}
public WebTarget getSiteTarget(Site site) {
return getSitesTarget().path(site.getExternalId());
}
public WebTarget getSitePostsTarget(Site site) {
return getSiteTarget(site).path("posts");
}
public WebTarget getSitePostsTargetWithCategory(Site site, Category category) {
return getSitePostsTarget(site).queryParam("category", category.getExternalId());
}
public WebTarget getSitePostsTargetWithCategories(Site site, Category... category) {
return getSitePostsTarget(site).queryParam("category", Stream.of(category).map(Category::getExternalId).toArray());
}
public WebTarget getSitePagesTarget(Site site) {
return getSiteTarget(site).path("pages");
}
public WebTarget getSiteCategoriesTarget(Site site) {
return getSiteTarget(site).path("categories");
}
public WebTarget getSiteMenusTarget(Site site) {
return getSiteTarget(site).path("menus");
}
public WebTarget getPostsTarget() {
return getCmsTarget().path("posts");
}
public WebTarget getPostTarget(Post post) {
return getPostsTarget().path(post.getExternalId());
}
public WebTarget getPostVersionsTarget(Post post) {
return getPostTarget(post).path("versions");
}
public WebTarget getVersionsTarget() {
return getCmsTarget().path("versions");
}
public WebTarget getVersionTarget(PostContentRevision version) {
return getVersionsTarget().path(version.getExternalId());
}
public WebTarget getPagesTarget() {
return getCmsTarget().path("pages");
}
public WebTarget getPageTarget(Page page) {
return getPagesTarget().path(page.getExternalId());
}
public WebTarget getCategoriesTarget() {
return getCmsTarget().path("categories");
}
public WebTarget getCategoryTarget(Category category) {
return getCategoriesTarget().path(category.getExternalId());
}
public WebTarget getMenusTarget() {
return getCmsTarget().path("menus");
}
public WebTarget getMenuTarget(Menu menu) {
return getMenusTarget().path(menu.getExternalId());
}
public WebTarget getMenuMenuItemsTarget(Menu menu) {
return getMenuTarget(menu).path("menuItems");
}
public WebTarget getMenuItemsTarget() {
return getCmsTarget().path("menuItems");
}
public WebTarget getMenuItemTarget(MenuItem menuItem) {
return getMenuItemsTarget().path(menuItem.getExternalId());
}
public WebTarget getThemesTarget() {
return getCmsTarget().path("themes");
}
public WebTarget getThemeTarget(CMSTheme theme) {
return getThemesTarget().path(theme.getExternalId());
}
}