package org.jooby.servlet;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import org.jooby.Jooby;
import org.jooby.test.MockUnit;
import org.junit.Test;
public class ServerInitializerTest {
@SuppressWarnings({"rawtypes", "unchecked" })
@Test
public void contextInitialized() throws Exception {
new MockUnit(ServletContextEvent.class)
.expect(unit -> {
Class appClass = Jooby.class;
String appClassname = appClass.getName();
ClassLoader loader = unit.mock(ClassLoader.class);
expect(loader.loadClass(appClassname)).andReturn(appClass);
ServletContext ctx = unit.mock(ServletContext.class);
expect(ctx.getInitParameter("application.class")).andReturn(appClassname);
expect(ctx.getClassLoader()).andReturn(loader);
expect(ctx.getContextPath()).andReturn("/");
ctx.setAttribute(eq(Jooby.class.getName()), isA(Jooby.class));
ServletContextEvent sce = unit.get(ServletContextEvent.class);
expect(sce.getServletContext()).andReturn(ctx);
})
.run(unit -> {
try {
ServerInitializer initializer = new ServerInitializer();
initializer.contextInitialized(unit.get(ServletContextEvent.class));
} catch (Throwable ex) {
ex.printStackTrace();
}
});
}
@SuppressWarnings({"rawtypes" })
@Test(expected = IllegalStateException.class)
public void contextInitializedShouldReThrowException() throws Exception {
new MockUnit(ServletContextEvent.class)
.expect(
unit -> {
Class appClass = Jooby.class;
String appClassname = appClass.getName();
ClassLoader loader = unit.mock(ClassLoader.class);
expect(loader.loadClass(appClassname)).andThrow(
new ClassNotFoundException("intentional err"));
ServletContext ctx = unit.mock(ServletContext.class);
expect(ctx.getInitParameter("application.class")).andReturn(appClassname);
expect(ctx.getClassLoader()).andReturn(loader);
expect(ctx.getContextPath()).andReturn("/");
ctx.setAttribute(eq(Jooby.class.getName()), isA(Jooby.class));
ServletContextEvent sce = unit.get(ServletContextEvent.class);
expect(sce.getServletContext()).andReturn(ctx);
})
.run(unit -> {
ServerInitializer initializer = new ServerInitializer();
initializer.contextInitialized(unit.get(ServletContextEvent.class));
});
}
@SuppressWarnings({"rawtypes" })
@Test
public void contextDestroyed() throws Exception {
new MockUnit(ServletContextEvent.class)
.expect(unit -> {
Class appClass = Jooby.class;
String appClassname = appClass.getName();
Jooby app = unit.mock(Jooby.class);
app.stop();
ServletContext ctx = unit.mock(ServletContext.class);
expect(ctx.getAttribute(appClassname)).andReturn(app);
ServletContextEvent sce = unit.get(ServletContextEvent.class);
expect(sce.getServletContext()).andReturn(ctx);
})
.run(unit -> {
new ServerInitializer().contextDestroyed(unit.get(ServletContextEvent.class));
});
}
@SuppressWarnings({"rawtypes" })
@Test
public void contextDestroyedShouldIgnoreMissingAttr() throws Exception {
new MockUnit(ServletContextEvent.class)
.expect(unit -> {
Class appClass = Jooby.class;
String appClassname = appClass.getName();
ServletContext ctx = unit.mock(ServletContext.class);
expect(ctx.getAttribute(appClassname)).andReturn(null);
ServletContextEvent sce = unit.get(ServletContextEvent.class);
expect(sce.getServletContext()).andReturn(ctx);
})
.run(unit -> {
new ServerInitializer().contextDestroyed(unit.get(ServletContextEvent.class));
});
}
}