package org.jooby.handlers;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertNotNull;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.jooby.test.MockUnit;
import org.jooby.test.MockUnit.Block;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({AssetHandler.class, File.class, Paths.class, Files.class })
public class AssetHandlerTest {
@Test
public void customClassloader() throws Exception {
URI uri = Paths.get("src", "test", "resources", "org", "jooby").toUri();
new MockUnit(ClassLoader.class)
.expect(publicDir(uri, "JoobyTest.js"))
.run(unit -> {
URL value = new AssetHandler("/", unit.get(ClassLoader.class))
.resolve("JoobyTest.js");
assertNotNull(value);
});
}
@Test
public void shouldCallParentOnMissing() throws Exception {
URI uri = Paths.get("src", "test", "resources", "org", "jooby").toUri();
new MockUnit(ClassLoader.class)
.expect(publicDir(uri, "index.js", false))
.expect(unit -> {
ClassLoader loader = unit.get(ClassLoader.class);
expect(loader.getResource("index.js")).andReturn(uri.toURL());
})
.run(unit -> {
URL value = new AssetHandler("/", unit.get(ClassLoader.class))
.resolve("index.js");
assertNotNull(value);
});
}
@Test
public void ignoreMalformedURL() throws Exception {
Path path = Paths.get("src", "test", "resources", "org", "jooby");
new MockUnit(ClassLoader.class, URI.class)
.expect(publicDir(null, "index.js"))
.expect(unit -> {
URI uri = unit.get(URI.class);
expect(uri.toURL()).andThrow(new MalformedURLException());
})
.expect(unit -> {
ClassLoader loader = unit.get(ClassLoader.class);
expect(loader.getResource("index.js")).andReturn(path.toUri().toURL());
})
.run(unit -> {
URL value = new AssetHandler("/", unit.get(ClassLoader.class))
.resolve("index.js");
assertNotNull(value);
});
}
private Block publicDir(final URI uri, final String name) {
return publicDir(uri, name, true);
}
private Block publicDir(final URI uri, final String name, final boolean exists) {
return unit -> {
unit.mockStatic(Paths.class);
Path basedir = unit.mock(Path.class);
expect(Paths.get("public")).andReturn(basedir);
Path path = unit.mock(Path.class);
expect(basedir.resolve(name)).andReturn(path);
expect(path.normalize()).andReturn(path);
if (exists) {
expect(path.startsWith(basedir)).andReturn(true);
}
unit.mockStatic(Files.class);
expect(Files.exists(basedir)).andReturn(true);
expect(Files.exists(path)).andReturn(exists);
if (exists) {
if (uri != null) {
expect(path.toUri()).andReturn(uri);
} else {
expect(path.toUri()).andReturn(unit.get(URI.class));
}
}
};
}
}