/*
* (C) Copyright 2015-2016 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.ecm.web.resources.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.net.URL;
import java.util.List;
import javax.inject.Inject;
import org.apache.log4j.spi.LoggingEvent;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.nuxeo.ecm.web.resources.api.Processor;
import org.nuxeo.ecm.web.resources.api.Resource;
import org.nuxeo.ecm.web.resources.api.ResourceBundle;
import org.nuxeo.ecm.web.resources.api.ResourceContext;
import org.nuxeo.ecm.web.resources.api.ResourceContextImpl;
import org.nuxeo.ecm.web.resources.api.ResourceType;
import org.nuxeo.ecm.web.resources.api.service.WebResourceManager;
import org.nuxeo.runtime.model.RuntimeContext;
import org.nuxeo.runtime.test.runner.Deploy;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.nuxeo.runtime.test.runner.LocalDeploy;
import org.nuxeo.runtime.test.runner.LogCaptureFeature;
import org.nuxeo.runtime.test.runner.RuntimeFeature;
import org.nuxeo.runtime.test.runner.RuntimeHarness;
/**
* @since 7.3
*/
@RunWith(FeaturesRunner.class)
@Features({ RuntimeFeature.class, LogCaptureFeature.class })
@Deploy({ "org.nuxeo.web.resources.core" })
@LocalDeploy({ TestWebResourceService.BUNDLE + ":webresources-test-config.xml" })
@LogCaptureFeature.FilterOn(loggerName = "org.nuxeo.ecm.web.resources.core.service.WebResourceManagerImpl", logLevel = "ERROR")
public class TestWebResourceService {
@Inject
LogCaptureFeature.Result logCaptureResult;
static final String BUNDLE = "org.nuxeo.web.resources.core";
@Inject
protected WebResourceManager service;
@Inject
protected RuntimeHarness harness;
@Test
public void testService() {
assertNotNull(service);
}
@Test
public void testResource() throws Exception {
Resource r = service.getResource("jquery.js");
assertNotNull(r);
assertEquals("jquery.js", r.getName());
assertEquals(ResourceType.js.name(), r.getType());
assertEquals(0, r.getDependencies().size());
assertEquals("scripts/jquery.js", r.getPath());
r = service.getResource("effects");
assertNotNull(r);
assertEquals("effects", r.getName());
assertEquals(ResourceType.js.name(), r.getType());
assertEquals(0, r.getDependencies().size());
assertEquals("scripts/effects.js", r.getPath());
r = service.getResource("foldable-box.js");
assertNotNull(r);
assertEquals("foldable-box.js", r.getName());
assertEquals(ResourceType.js.name(), r.getType());
assertEquals(1, r.getDependencies().size());
assertEquals("effects", r.getDependencies().get(0));
assertEquals("scripts/foldable-box.js", r.getPath());
r = service.getResource("foldable-box.css");
assertNotNull(r);
assertEquals("foldable-box.css", r.getName());
assertEquals(ResourceType.css.name(), r.getType());
assertEquals(0, r.getDependencies().size());
assertEquals("css/foldable-box.css", r.getPath());
r = service.getResource("my.css");
assertNull(r);
String contrib = "webresources-test-override-config.xml";
URL url = getClass().getClassLoader().getResource(contrib);
try (RuntimeContext ctx = harness.deployTestContrib(BUNDLE, url)) {
r = service.getResource("my.css");
assertNotNull(r);
assertEquals("my.css", r.getName());
assertEquals(ResourceType.css.name(), r.getType());
assertEquals(0, r.getDependencies().size());
assertEquals("css/my.css", r.getPath());
}
}
@Test
public void testResourceBundle() throws Exception {
ResourceBundle r = service.getResourceBundle("myapp");
assertNotNull(r);
assertEquals("myapp", r.getName());
assertEquals(3, r.getResources().size());
assertEquals("jquery.js", r.getResources().get(0));
assertEquals("foldable-box.js", r.getResources().get(1));
assertEquals("foldable-box.css", r.getResources().get(2));
String contrib = "webresources-test-override-config.xml";
URL url = getClass().getClassLoader().getResource(contrib);
try (RuntimeContext ctx = harness.deployTestContrib(BUNDLE, url)) {
r = service.getResourceBundle("myapp");
assertNotNull(r);
assertEquals("myapp", r.getName());
assertEquals(4, r.getResources().size());
assertEquals("jquery.js", r.getResources().get(0));
assertEquals("foldable-box.js", r.getResources().get(1));
assertEquals("foldable-box.css", r.getResources().get(2));
assertEquals("my.css", r.getResources().get(3));
}
}
@Test
public void testFaultyResourcesBundleDeclaration() throws Exception {
String contrib = "webresources-test-faulty-declaration.xml";
URL url = getClass().getClassLoader().getResource(contrib);
try (RuntimeContext ctx = harness.deployTestContrib(BUNDLE, url)) {
ResourceBundle r = service.getResourceBundle("myFaultyApp");
assertNotNull(r);
assertTrue(r.getResources().isEmpty());
assertEquals("myFaultyApp", r.getName());
logCaptureResult.assertHasEvent();
List<LoggingEvent> events = logCaptureResult.getCaughtEvents();
assertEquals(1, events.size());
assertEquals(
"Some resources references were null or blank while setting myFaultyApp and have been supressed. "
+ "This probably happened because some <resource> tags were empty in the xml declaration. "
+ "The correct form is <resource>resource name</resource>.",
events.get(0).getMessage());
}
}
@Test
public void testResources() throws Exception {
ResourceContext ctx = new ResourceContextImpl();
List<Resource> res = service.getResources(ctx, "foo", null);
assertNotNull(res);
assertEquals(0, res.size());
// test cycle detection
res = service.getResources(ctx, "cycles", null);
assertNotNull(res);
assertEquals(3, res.size());
assertEquals("cycle3.js", res.get(0).getName());
assertEquals("cycle2.js", res.get(1).getName());
assertEquals("cycle1.js", res.get(2).getName());
res = service.getResources(ctx, "myapp", ResourceType.any.name());
assertNotNull(res);
assertEquals(4, res.size());
assertEquals("jquery.js", res.get(0).getName());
assertEquals("effects", res.get(1).getName());
assertEquals("foldable-box.js", res.get(2).getName());
assertEquals("foldable-box.css", res.get(3).getName());
res = service.getResources(ctx, "myapp", ResourceType.js.name());
assertNotNull(res);
assertEquals(3, res.size());
assertEquals("jquery.js", res.get(0).getName());
assertEquals("effects", res.get(1).getName());
assertEquals("foldable-box.js", res.get(2).getName());
res = service.getResources(ctx, "myapp", ResourceType.css.name());
assertNotNull(res);
assertEquals(1, res.size());
assertEquals("foldable-box.css", res.get(0).getName());
}
@Test
public void testProcessors() throws Exception {
Processor p = service.getProcessor("myProc");
assertNotNull(p);
assertEquals(10, p.getOrder());
assertEquals(MockProcessor.class, p.getTargetProcessorClass());
assertEquals(1, p.getTypes().size());
assertEquals("wroPost", p.getTypes().get(0));
List<Processor> procs = service.getProcessors("wroPost");
assertEquals(1, procs.size());
assertEquals(p, procs.get(0));
String contrib = "webresources-test-override-config.xml";
URL url = getClass().getClassLoader().getResource(contrib);
try (RuntimeContext ctx = harness.deployTestContrib(BUNDLE, url)) {
p = service.getProcessor("myProc");
assertNull(p);
procs = service.getProcessors("wroPost");
assertEquals(0, procs.size());
}
}
}