/*
* (C) Copyright 2011 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributors:
* Anahide Tchertchian
*/
package org.nuxeo.theme.styling.tests;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.nuxeo.ecm.web.resources.api.ResourceBundle;
import org.nuxeo.ecm.web.resources.api.service.WebResourceManager;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.test.NXRuntimeTestCase;
import org.nuxeo.theme.styling.service.ThemeStylingService;
import org.nuxeo.theme.styling.service.descriptors.FlavorDescriptor;
import org.nuxeo.theme.styling.service.descriptors.IconDescriptor;
import org.nuxeo.theme.styling.service.descriptors.LogoDescriptor;
import org.nuxeo.theme.styling.service.descriptors.PageDescriptor;
import org.nuxeo.theme.styling.service.descriptors.PalettePreview;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
/**
* @since 5.5
*/
public class TestThemeStylingService extends NXRuntimeTestCase {
public static final String THEME_NAME = "testStyling";
public static final String DEFAULT_PAGE_NAME = THEME_NAME + "/default";
public static final String PRINT_PAGE_NAME = THEME_NAME + "/print";
protected ThemeStylingService service;
@Before
public void setUp() throws Exception {
super.setUp();
deployBundle("org.nuxeo.web.resources.core");
deployBundle("org.nuxeo.theme.styling");
deployContrib("org.nuxeo.theme.styling.tests", "theme-styling-test-config.xml");
deployContrib("org.nuxeo.theme.styling.tests", "theme-styling-test-addon-config.xml");
// force application start
fireFrameworkStarted();
service = Framework.getService(ThemeStylingService.class);
assertNotNull(service);
}
protected void checkOriginalTheme() throws Exception {
assertEquals("default", service.getDefaultFlavorName(DEFAULT_PAGE_NAME));
List<String> flavorNames = service.getFlavorNames(DEFAULT_PAGE_NAME);
assertNotNull(flavorNames);
assertEquals(4, flavorNames.size());
assertEquals("default", flavorNames.get(0));
assertEquals("dark", flavorNames.get(1));
assertEquals("subDark", flavorNames.get(2));
assertEquals("addon_flavor", flavorNames.get(3));
List<FlavorDescriptor> flavors = service.getFlavors(DEFAULT_PAGE_NAME);
assertNotNull(flavors);
assertEquals(4, flavors.size());
assertEquals("default", flavors.get(0).getName());
assertEquals("dark", flavors.get(1).getName());
assertEquals("subDark", flavors.get(2).getName());
assertEquals("addon_flavor", flavors.get(3).getName());
assertEquals("default", service.getDefaultFlavorName(PRINT_PAGE_NAME));
flavorNames = service.getFlavorNames(PRINT_PAGE_NAME);
assertNotNull(flavorNames);
assertEquals(3, flavorNames.size());
assertEquals("default", flavorNames.get(0));
assertEquals("dark", flavorNames.get(1));
assertEquals("addon_flavor", flavorNames.get(2));
flavors = service.getFlavors(PRINT_PAGE_NAME);
assertNotNull(flavors);
assertEquals(3, flavors.size());
assertEquals("default", flavors.get(0).getName());
assertEquals("dark", flavors.get(1).getName());
assertEquals("addon_flavor", flavors.get(2).getName());
FlavorDescriptor flavor = service.getFlavor("*");
assertNull(flavor);
PalettePreview pp;
LogoDescriptor logo = service.getLogo("*");
assertNull(logo);
flavor = service.getFlavor("default");
assertEquals("default", flavor.getName());
assertEquals("Default flavor", flavor.getLabel());
logo = flavor.getLogo();
assertNotNull(logo);
assertEquals("/img/nuxeo_logo.png", logo.getPath());
assertEquals("92", logo.getWidth());
assertEquals("36", logo.getHeight());
assertEquals("Nuxeo", logo.getTitle());
pp = flavor.getPalettePreview();
assertNotNull(pp);
assertNotNull(pp.getColors());
assertEquals(9, pp.getColors().size());
assertEquals("#cfecff", pp.getColors().get(0));
assertEquals("#70bbff", pp.getColors().get(1));
flavor = service.getFlavor("dark");
assertEquals("dark", flavor.getName());
assertEquals("Dark flavor", flavor.getLabel());
logo = flavor.getLogo();
assertNotNull(logo);
assertEquals("/img/nuxeo_dark_logo.png", logo.getPath());
assertEquals("100", logo.getWidth());
assertEquals("666", logo.getHeight());
assertEquals("Dark Nuxeo", logo.getTitle());
pp = flavor.getPalettePreview();
assertNull(pp);
flavor = service.getFlavor("subDark");
assertEquals("subDark", flavor.getName());
assertEquals("SubDark flavor", flavor.getLabel());
logo = flavor.getLogo();
assertNotNull(logo);
assertEquals("/img/nuxeo_dark_logo.png", logo.getPath());
assertEquals("100", logo.getWidth());
assertEquals("666", logo.getHeight());
assertEquals("Dark Nuxeo", logo.getTitle());
pp = flavor.getPalettePreview();
assertNull(pp);
Map<String, String> presets = service.getPresetVariables("default");
assertNotNull(presets);
assertEquals(42, presets.size());
WebResourceManager wrm = Framework.getService(WebResourceManager.class);
ResourceBundle bundle = wrm.getResourceBundle(PageDescriptor.RESOURCE_BUNDLE_PREFIX + "testStyling_default");
assertNotNull(bundle);
assertEquals(2, bundle.getResources().size());
assertEquals("nuxeo_dm_default.css", bundle.getResources().get(0));
assertEquals("jquery.fancybox.js", bundle.getResources().get(1));
}
@Test
public void testStylesRegistration() throws Exception {
checkOriginalTheme();
// override conf, by adding additional nuxeo_dm_default2 css to the
// page
deployContrib("org.nuxeo.theme.styling.tests", "theme-styling-test-config2.xml");
assertEquals("default", service.getDefaultFlavorName(DEFAULT_PAGE_NAME));
assertEquals("default", service.getDefaultFlavorName(PRINT_PAGE_NAME));
WebResourceManager wrm = Framework.getService(WebResourceManager.class);
ResourceBundle bundle = wrm.getResourceBundle(PageDescriptor.RESOURCE_BUNDLE_PREFIX + "testStyling_default");
assertNotNull(bundle);
assertEquals(4, bundle.getResources().size());
assertEquals("nuxeo_dm_default.css", bundle.getResources().get(0));
assertEquals("jquery.fancybox.js", bundle.getResources().get(1));
assertEquals("nuxeo_dm_default2.css", bundle.getResources().get(2));
assertEquals("jquery.fancybox.style.css", bundle.getResources().get(3));
ResourceBundle globalBundle = wrm.getResourceBundle(PageDescriptor.RESOURCE_BUNDLE_PREFIX + "*");
assertNotNull(globalBundle);
assertEquals(2, globalBundle.getResources().size());
assertEquals("addon_style.css", globalBundle.getResources().get(0));
assertEquals("jquery.addon.js", globalBundle.getResources().get(1));
// undeploy, check theme styling is back to first definition
undeployContrib("org.nuxeo.theme.styling.tests", "theme-styling-test-config2.xml");
checkOriginalTheme();
}
@Test
public void testFlavorsRegistration() throws Exception {
checkOriginalTheme();
// override conf, by changing dark flavor colors and default flavor
deployContrib("org.nuxeo.theme.styling.tests", "theme-styling-test-config3.xml");
assertEquals("dark", service.getDefaultFlavorName(DEFAULT_PAGE_NAME));
List<String> flavorNames = service.getFlavorNames(DEFAULT_PAGE_NAME);
assertNotNull(flavorNames);
assertEquals(2, flavorNames.size());
assertEquals("dark", flavorNames.get(0));
assertEquals("addon_flavor", flavorNames.get(1));
List<FlavorDescriptor> flavors = service.getFlavors(DEFAULT_PAGE_NAME);
assertNotNull(flavors);
assertEquals(2, flavors.size());
assertEquals("dark", flavors.get(0).getName());
assertEquals("addon_flavor", flavors.get(1).getName());
assertEquals("default", service.getDefaultFlavorName(PRINT_PAGE_NAME));
flavorNames = service.getFlavorNames(PRINT_PAGE_NAME);
assertNotNull(flavorNames);
assertEquals("fl: " + flavorNames, 5, flavorNames.size());
assertEquals("default", flavorNames.get(0));
assertEquals("dark", flavorNames.get(1));
assertEquals("subDark", flavorNames.get(2));
assertEquals("nonExistingFlavor", flavorNames.get(3));
assertEquals("addon_flavor", flavorNames.get(4));
flavors = service.getFlavors(PRINT_PAGE_NAME);
assertNotNull(flavors);
assertEquals(4, flavors.size());
assertEquals("default", flavors.get(0).getName());
assertEquals("dark", flavors.get(1).getName());
assertEquals("subDark", flavors.get(2).getName());
assertEquals("addon_flavor", flavors.get(3).getName());
// non existing flavors are omitted
FlavorDescriptor flavor = service.getFlavor("*");
assertNull(flavor);
LogoDescriptor logo = service.getLogo("*");
assertNull(logo);
flavor = service.getFlavor("default");
assertEquals("default", flavor.getName());
assertEquals("Default flavor", flavor.getLabel());
logo = flavor.getLogo();
assertNotNull(logo);
assertEquals("/img/nuxeo_logo.png", logo.getPath());
assertEquals("92", logo.getWidth());
assertEquals("36", logo.getHeight());
assertEquals("Nuxeo", logo.getTitle());
List<IconDescriptor> icons = flavor.getFavicons();
assertEquals(2, icons.size());
assertEquals("icon", icons.get(0).getName());
assertEquals("/icons/favicon.png", icons.get(0).getValue());
assertEquals("shortcut icon", icons.get(1).getName());
assertEquals("/icons/favicon.ico", icons.get(1).getValue());
flavor = service.getFlavor("dark");
assertEquals("dark", flavor.getName());
assertEquals("Dark flavor", flavor.getLabel());
logo = flavor.getLogo();
assertNotNull(logo);
assertEquals("/img/nuxeo_dark_logo.png", logo.getPath());
assertEquals("100", logo.getWidth());
assertEquals("666", logo.getHeight());
// title merged
assertEquals("Darxeo", logo.getTitle());
icons = flavor.getFavicons();
assertEquals(2, icons.size());
assertEquals("icon", icons.get(0).getName());
assertEquals("/icons/dark_favicon.png", icons.get(0).getValue());
assertEquals("shortcut icon", icons.get(1).getName());
assertEquals("/icons/dark_favicon.ico", icons.get(1).getValue());
flavor = service.getFlavor("subDark");
assertEquals("subDark", flavor.getName());
assertEquals("SubDark flavor", flavor.getLabel());
logo = flavor.getLogo();
assertNotNull(logo);
assertEquals("/img/nuxeo_dark_logo.png", logo.getPath());
assertEquals("100", logo.getWidth());
assertEquals("666", logo.getHeight());
// title merged
assertEquals("Darxeo", logo.getTitle());
icons = flavor.getFavicons();
assertEquals(2, icons.size());
assertEquals("icon", icons.get(0).getName());
assertEquals("/icons/dark_favicon.png", icons.get(0).getValue());
assertEquals("shortcut icon", icons.get(1).getName());
assertEquals("/icons/dark_favicon.ico", icons.get(1).getValue());
// undeploy, check theme styling is back to first definition
undeployContrib("org.nuxeo.theme.styling.tests", "theme-styling-test-config3.xml");
checkOriginalTheme();
}
@Test
public void testUnregister() throws Exception {
checkOriginalTheme();
// undeploy => check web resources manage service status
undeployContrib("org.nuxeo.theme.styling.tests", "theme-styling-test-config.xml");
assertNull(service.getDefaultFlavorName(DEFAULT_PAGE_NAME));
assertNull(service.getFlavorNames(DEFAULT_PAGE_NAME));
assertNull(service.getFlavors(DEFAULT_PAGE_NAME));
assertNull(service.getDefaultFlavorName(PRINT_PAGE_NAME));
assertNull(service.getFlavorNames(PRINT_PAGE_NAME));
assertNull(service.getFlavors(PRINT_PAGE_NAME));
// check page is null
PageDescriptor page = service.getPage(DEFAULT_PAGE_NAME);
assertNull(page);
// check resources are not registered on resource manager anymore
WebResourceManager wrm = Framework.getService(WebResourceManager.class);
ResourceBundle bundle = wrm.getResourceBundle(PageDescriptor.RESOURCE_BUNDLE_PREFIX + "testStyling_default");
assertNull(bundle);
ResourceBundle includes = wrm.getResourceBundle("nuxeo_includes");
assertNull(includes);
// check global resources from addon are still there
ResourceBundle global = wrm.getResourceBundle(PageDescriptor.RESOURCE_BUNDLE_PREFIX + "*");
assertNotNull(global);
assertEquals(2, global.getResources().size());
assertEquals("addon_style.css", global.getResources().get(0));
assertEquals("jquery.addon.js", global.getResources().get(1));
// check presets are not registered on service anymore
Map<String, String> presets = service.getPresetVariables("default");
assertNotNull(presets);
assertEquals(0, presets.size());
}
@Test
public void testPageRegistration() throws Exception {
PageDescriptor page = service.getPage("testStyling/default");
assertNotNull(page);
assertEquals("testStyling/default", page.getName());
assertEquals("default", page.getDefaultFlavor());
assertEquals(4, page.getFlavors().size());
assertEquals("default", page.getFlavors().get(0));
assertEquals("dark", page.getFlavors().get(1));
assertEquals("subDark", page.getFlavors().get(2));
assertEquals("addon_flavor", page.getFlavors().get(3));
assertEquals(1, page.getResourceBundles().size());
assertEquals("pageResourceBundle_testStyling_default", page.getResourceBundles().get(0));
assertEquals(4, page.getResources().size());
assertEquals("nuxeo_dm_default.css", page.getResources().get(0));
assertEquals("addon_style.css", page.getResources().get(1));
assertEquals("jquery.fancybox.js", page.getResources().get(2));
assertEquals("jquery.addon.js", page.getResources().get(3));
}
@Test
public void testNegotiator() throws Exception {
assertNull(service.negotiate("foo", null));
assertEquals("bar", service.negotiate("testNegotiation", null));
}
}