package org.jooby.servlet;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.util.Collections;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.jooby.MediaType;
import org.jooby.test.MockUnit;
import org.junit.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
public class ServletServletRequestTest {
@Test
public void defaults() throws IOException, Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn("text/html");
expect(req.getPathInfo()).andReturn("/");
expect(req.getContextPath()).andReturn("");
})
.run(unit -> {
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir);
});
}
@Test
public void nullPathInfo() throws IOException, Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn("text/html");
expect(req.getPathInfo()).andReturn(null);
expect(req.getContextPath()).andReturn("");
})
.run(unit -> {
String path = new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir)
.path();
assertEquals("/", path);
});
}
@Test
public void withContextPath() throws IOException, Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn("text/html");
expect(req.getPathInfo()).andReturn(null);
expect(req.getContextPath()).andReturn("/foo");
})
.run(unit -> {
String path = new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir)
.path();
assertEquals("/foo/", path);
});
}
@Test
public void defaultsNullCT() throws IOException, Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn(null);
expect(req.getPathInfo()).andReturn("/");
expect(req.getContextPath()).andReturn("");
})
.run(unit -> {
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir);
});
}
@Test
public void multipartDefaults() throws IOException, Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn(MediaType.multipart.name());
expect(req.getPathInfo()).andReturn("/");
expect(req.getContextPath()).andReturn("");
})
.run(unit -> {
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir);
});
}
@Test
public void reqMethod() throws IOException, Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn("text/html");
expect(req.getPathInfo()).andReturn("/");
expect(req.getMethod()).andReturn("GET");
expect(req.getContextPath()).andReturn("");
})
.run(unit -> {
assertEquals("GET", new ServletServletRequest(unit.get(HttpServletRequest.class),
tmpdir).method());
});
}
@Test
public void path() throws IOException, Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn("text/html");
expect(req.getPathInfo()).andReturn("/spaces%20in%20it");
expect(req.getContextPath()).andReturn("");
})
.run(unit -> {
assertEquals("/spaces in it",
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir).path());
});
}
@Test
public void paramNames() throws IOException, Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn("text/html");
expect(req.getPathInfo()).andReturn("/");
expect(req.getParameterNames()).andReturn(
Iterators.asEnumeration(Lists.newArrayList("p1", "p2").iterator()));
expect(req.getContextPath()).andReturn("");
})
.run(unit -> {
assertEquals(Lists.newArrayList("p1", "p2"),
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir)
.paramNames());
});
}
@Test
public void params() throws IOException, Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn("text/html");
expect(req.getPathInfo()).andReturn("/");
expect(req.getParameterValues("x")).andReturn(new String[]{"a", "b" });
expect(req.getContextPath()).andReturn("");
})
.run(unit -> {
assertEquals(Lists.newArrayList("a", "b"),
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir)
.params("x"));
});
}
@Test
public void noparams() throws IOException, Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn("text/html");
expect(req.getPathInfo()).andReturn("/");
expect(req.getParameterValues("x")).andReturn(null);
expect(req.getContextPath()).andReturn("");
})
.run(unit -> {
assertEquals(Lists.newArrayList(),
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir)
.params("x"));
});
}
@Test
public void attributes() throws Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
final UUID serverAttribute = UUID.randomUUID();
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn("text/html");
expect(req.getPathInfo()).andReturn("/");
expect(req.getContextPath()).andReturn("");
expect(req.getAttributeNames()).andReturn(
Collections.enumeration(Collections.singletonList("server.attribute")));
expect(req.getAttribute("server.attribute")).andReturn(serverAttribute);
})
.run(unit -> {
assertEquals(ImmutableMap.of("server.attribute", serverAttribute),
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir)
.attributes());
});
}
@Test
public void emptyAttributes() throws Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn("text/html");
expect(req.getPathInfo()).andReturn("/");
expect(req.getContextPath()).andReturn("");
expect(req.getAttributeNames()).andReturn(Collections.emptyEnumeration());
})
.run(unit -> {
assertEquals(Collections.emptyMap(),
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir)
.attributes());
});
}
@Test(expected = IOException.class)
public void filesFailure() throws IOException, Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn(MediaType.multipart.name());
expect(req.getPathInfo()).andReturn("/");
expect(req.getParts()).andThrow(new ServletException("intentional err"));
expect(req.getContextPath()).andReturn("");
})
.run(unit -> {
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir)
.files("x");
});
}
@Test(expected = UnsupportedOperationException.class)
public void noupgrade() throws IOException, Exception {
String tmpdir = System.getProperty("java.io.tmpdir");
new MockUnit(HttpServletRequest.class)
.expect(unit -> {
HttpServletRequest req = unit.get(HttpServletRequest.class);
expect(req.getContentType()).andReturn(MediaType.multipart.name());
expect(req.getPathInfo()).andReturn("/");
expect(req.getContextPath()).andReturn("");
})
.run(unit -> {
assertEquals(Lists.newArrayList(),
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir)
.upgrade(ServletServletRequest.class));
});
}
}