diff --git a/scm-webapp/src/main/java/sonia/scm/resources/AbstractResourceManager.java b/scm-webapp/src/main/java/sonia/scm/resources/AbstractResourceManager.java index 4890e4b983..45cc766582 100644 --- a/scm-webapp/src/main/java/sonia/scm/resources/AbstractResourceManager.java +++ b/scm-webapp/src/main/java/sonia/scm/resources/AbstractResourceManager.java @@ -150,6 +150,9 @@ public abstract class AbstractResourceManager implements ResourceManager processPlugin(resources, plugin); } } + + // fix order of script resources, see https://goo.gl/ok03l4 + Collections.sort(resources); return resources; } @@ -291,10 +294,10 @@ public abstract class AbstractResourceManager implements ResourceManager //~--- fields ------------------------------------------------------------- /** Field description */ - private String name; + private final String name; /** Field description */ - private ResourceType type; + private final ResourceType type; } diff --git a/scm-webapp/src/test/java/sonia/scm/resources/AbstractResourceManagerTest.java b/scm-webapp/src/test/java/sonia/scm/resources/AbstractResourceManagerTest.java new file mode 100644 index 0000000000..2bb564a60a --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/resources/AbstractResourceManagerTest.java @@ -0,0 +1,93 @@ +/*** + * Copyright (c) 2015, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * https://bitbucket.org/sdorra/scm-manager + * + */ + +package sonia.scm.resources; + +import com.google.common.collect.ImmutableSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.servlet.ServletContext; +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import static org.hamcrest.Matchers.*; +import org.mockito.runners.MockitoJUnitRunner; +import sonia.scm.plugin.PluginLoader; + +/** + * Unit tests for {@link AbstractResourceManager}. + * + * @author Sebastian Sdorra + */ +@RunWith(MockitoJUnitRunner.class) +public class AbstractResourceManagerTest extends ResourceManagerTestBase +{ + + private DummyResourceManager resourceManager; + + @Before + public void setUp() + { + Set resourceHandlers = ImmutableSet.of(resourceHandler); + resourceManager = new DummyResourceManager(servletContext, pluginLoader, resourceHandlers); + } + + /** + * Test {@link AbstractResourceManager#getScriptResources()} in the correct order. + * + * @see Issue 809 + */ + @Test + public void testGetScriptResources() + { + appendScriptResources("a/b.js", "z/a.js", "a/a.js"); + List scripts = resourceManager.getScriptResources(); + assertThat(scripts, contains("a/a.js", "a/b.js", "z/a.js")); + } + + private static class DummyResourceManager extends AbstractResourceManager + { + + public DummyResourceManager(ServletContext servletContext, PluginLoader pluginLoader, Set resourceHandlers) + { + super(servletContext, pluginLoader, resourceHandlers); + } + + @Override + protected void collectResources(Map resourceMap) + { + } + + } + +} diff --git a/scm-webapp/src/test/java/sonia/scm/resources/DefaultResourceManagerTest.java b/scm-webapp/src/test/java/sonia/scm/resources/DefaultResourceManagerTest.java new file mode 100644 index 0000000000..9b6b838e13 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/resources/DefaultResourceManagerTest.java @@ -0,0 +1,74 @@ +/*** + * Copyright (c) 2015, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * https://bitbucket.org/sdorra/scm-manager + * + */ + +package sonia.scm.resources; + +import com.google.common.collect.ImmutableSet; +import java.util.List; +import java.util.Set; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +/** + * Unit tests for {@link DefaultResourceManager}. + * + * @author Sebastian Sdorra + */ +@RunWith(MockitoJUnitRunner.class) +public class DefaultResourceManagerTest extends ResourceManagerTestBase { + + private DefaultResourceManager resourceManager; + + /** + * Set up {@link DefaultResourceManager} for tests. + */ + @Before + public void setUp() + { + Set resourceHandlers = ImmutableSet.of(resourceHandler); + resourceManager = new DefaultResourceManager(servletContext, pluginLoader, resourceHandlers); + } + + /** + * Test {@link DefaultResourceManager#getResources(sonia.scm.resources.ResourceType)} method. + */ + @Test + public void testGetResources() + { + appendScriptResources("a/b.js", "z/a.js", "a/a.js"); + List resources = resourceManager.getResources(ResourceType.SCRIPT); + assertEquals(1, resources.size()); + } + +} \ No newline at end of file diff --git a/scm-webapp/src/test/java/sonia/scm/resources/ResourceManagerTestBase.java b/scm-webapp/src/test/java/sonia/scm/resources/ResourceManagerTestBase.java new file mode 100644 index 0000000000..bb73bffe8e --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/resources/ResourceManagerTestBase.java @@ -0,0 +1,76 @@ +/*** + * Copyright (c) 2015, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * https://bitbucket.org/sdorra/scm-manager + * + */ + +package sonia.scm.resources; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Sets; +import java.util.List; +import javax.servlet.ServletContext; +import org.mockito.Mock; +import static org.mockito.Mockito.when; +import sonia.scm.plugin.Plugin; +import sonia.scm.plugin.PluginLoader; +import sonia.scm.plugin.PluginResources; + +/** + * Base class for {@link ResourceManager} tests. + * + * @author Sebastian Sdorra + */ +public abstract class ResourceManagerTestBase +{ + + @Mock + protected ServletContext servletContext; + + @Mock + protected PluginLoader pluginLoader; + + @Mock + protected ResourceHandler resourceHandler; + + + /** + * Append scripts resources to plugin loader. + * + * @param resources resource names + */ + protected void appendScriptResources(String... resources) + { + PluginResources pluginResources = new PluginResources(); + pluginResources.setScriptResources(Sets.newHashSet(resources)); + Plugin plugin = new Plugin(); + plugin.setResources(pluginResources); + List plugins = ImmutableList.of(plugin); + when(pluginLoader.getInstalledPlugins()).thenReturn(plugins); + } +}