package org.jooby;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Locale.LanguageRange;
import java.util.Map;
import java.util.Optional;
import java.util.function.BiFunction;
import org.jooby.test.MockUnit;
import org.junit.Test;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
public class RequestTest {
public class RequestMock implements Request {
@Override
public MediaType type() {
throw new UnsupportedOperationException();
}
@Override
public String rawPath() {
throw new UnsupportedOperationException();
}
@Override
public Optional<String> queryString() {
throw new UnsupportedOperationException();
}
@Override
public boolean matches(final String pattern) {
throw new UnsupportedOperationException();
}
@Override
public List<MediaType> accept() {
throw new UnsupportedOperationException();
}
@Override
public String contextPath() {
throw new UnsupportedOperationException();
}
@Override
public Optional<MediaType> accepts(final List<MediaType> types) {
throw new UnsupportedOperationException();
}
@Override
public Mutant params() {
throw new UnsupportedOperationException();
}
@Override
public Mutant params(final String... xss) {
throw new UnsupportedOperationException();
}
@Override
public Mutant param(final String name) {
throw new UnsupportedOperationException();
}
@Override
public Mutant param(final String name, final String... xss) {
throw new UnsupportedOperationException();
}
@Override
public Mutant header(final String name) {
throw new UnsupportedOperationException();
}
@Override
public Mutant header(final String name, final String... xss) {
throw new UnsupportedOperationException();
}
@Override
public Map<String, Mutant> headers() {
throw new UnsupportedOperationException();
}
@Override
public Mutant cookie(final String name) {
throw new UnsupportedOperationException();
}
@Override
public List<Cookie> cookies() {
throw new UnsupportedOperationException();
}
@Override
public Mutant body() throws Exception {
throw new UnsupportedOperationException();
}
@Override
public <T> T require(final Key<T> key) {
throw new UnsupportedOperationException();
}
@Override
public Charset charset() {
throw new UnsupportedOperationException();
}
@Override
public Locale locale() {
throw new UnsupportedOperationException();
}
@Override
public List<Locale> locales(
final BiFunction<List<LanguageRange>, List<Locale>, List<Locale>> filter) {
throw new UnsupportedOperationException();
}
@Override
public Locale locale(final BiFunction<List<LanguageRange>, List<Locale>, Locale> filter) {
throw new UnsupportedOperationException();
}
@Override
public List<Locale> locales() {
return Request.super.locales();
}
@Override
public long length() {
throw new UnsupportedOperationException();
}
@Override
public String ip() {
throw new UnsupportedOperationException();
}
@Override
public Route route() {
throw new UnsupportedOperationException();
}
@Override
public String hostname() {
throw new UnsupportedOperationException();
}
@Override
public Session session() {
throw new UnsupportedOperationException();
}
@Override
public Optional<Session> ifSession() {
throw new UnsupportedOperationException();
}
@Override
public String protocol() {
throw new UnsupportedOperationException();
}
@Override
public Request push(final String path, final Map<String, Object> headers) {
throw new UnsupportedOperationException();
}
@Override
public boolean secure() {
throw new UnsupportedOperationException();
}
@Override
public Map<String, Object> attributes() {
throw new UnsupportedOperationException();
}
@Override
public <T> Optional<T> ifGet(final String name) {
throw new UnsupportedOperationException();
}
@Override
public Request set(final String name, final Object value) {
throw new UnsupportedOperationException();
}
@Override
public Request set(final Key<?> key, final Object value) {
throw new UnsupportedOperationException();
}
@Override
public Request set(final Class<?> type, final Object value) {
throw new UnsupportedOperationException();
}
@Override
public Request set(final TypeLiteral<?> type, final Object value) {
throw new UnsupportedOperationException();
}
@Override
public <T> Optional<T> unset(final String name) {
throw new UnsupportedOperationException();
}
@Override
public boolean isSet(final String name) {
throw new UnsupportedOperationException();
}
@Override
public int port() {
throw new UnsupportedOperationException();
}
@Override
public long timestamp() {
throw new UnsupportedOperationException();
}
}
@Test
public void accepts() throws Exception {
LinkedList<MediaType> dataList = new LinkedList<>();
new RequestMock() {
@Override
public Optional<MediaType> accepts(final List<MediaType> types) {
dataList.addAll(types);
return null;
}
}.accepts(MediaType.json);
assertEquals(Arrays.asList(MediaType.json), dataList);
}
@Test
public void acceptsStr() throws Exception {
LinkedList<Object> dataList = new LinkedList<>();
new RequestMock() {
@Override
public Optional<MediaType> accepts(final List<MediaType> types) {
dataList.addAll(types);
return null;
}
}.accepts("json");
assertEquals(Arrays.asList(MediaType.json), dataList);
}
@Test
public void getInstance() throws Exception {
LinkedList<Object> dataList = new LinkedList<>();
new RequestMock() {
@Override
public <T> T require(final Key<T> key) {
dataList.add(key);
return null;
}
}.require(Object.class);
assertEquals(Arrays.asList(Key.get(Object.class)), dataList);
}
@Test
public void getTypeLiteralInstance() throws Exception {
LinkedList<Object> dataList = new LinkedList<>();
new RequestMock() {
@Override
public <T> T require(final Key<T> key) {
dataList.add(key);
return null;
}
}.require(TypeLiteral.get(Object.class));
assertEquals(Arrays.asList(Key.get(Object.class)), dataList);
}
@Test
public void xhr() throws Exception {
new MockUnit(Mutant.class)
.expect(unit -> {
Mutant xRequestedWith = unit.get(Mutant.class);
expect(xRequestedWith.toOptional(String.class)).andReturn(Optional.of("XMLHttpRequest"));
expect(xRequestedWith.toOptional(String.class)).andReturn(Optional.empty());
})
.run(unit -> {
assertEquals(true, new RequestMock() {
@Override
public Mutant header(final String name) {
assertEquals("X-Requested-With", name);
return unit.get(Mutant.class);
}
}.xhr());
assertEquals(false, new RequestMock() {
@Override
public Mutant header(final String name) {
assertEquals("X-Requested-With", name);
return unit.get(Mutant.class);
}
}.xhr());
});
}
@Test
public void path() throws Exception {
new MockUnit(Route.class)
.expect(unit -> {
Route route = unit.get(Route.class);
expect(route.path()).andReturn("/path");
})
.run(unit -> {
assertEquals("/path", new RequestMock() {
@Override
public Route route() {
return unit.get(Route.class);
}
}.path());
});
}
@Test
public void verb() throws Exception {
new MockUnit(Route.class)
.expect(unit -> {
Route route = unit.get(Route.class);
expect(route.method()).andReturn("PATCH");
})
.run(unit -> {
assertEquals("PATCH", new RequestMock() {
@Override
public Route route() {
return unit.get(Route.class);
}
}.method());
});
}
@Test
public void locales() throws Exception {
new MockUnit(Route.class)
.run(unit -> {
assertEquals(null, new RequestMock() {
@Override
public List<Locale> locales(
final BiFunction<List<LanguageRange>, List<Locale>, List<Locale>> filter) {
return null;
}
}.locales());
});
}
@Test
public void setFlashAttr() throws Exception {
Map<String, String> flash = new HashMap<>();
new RequestMock() {
@Override
public Map<String, String> flash() {
return flash;
}
}.flash("foo", "bar");
assertEquals("bar", flash.get("foo"));
}
@Test
public void removeFlashAttr() throws Exception {
Map<String, String> flash = new HashMap<>();
flash.put("foo", "bar");
new RequestMock() {
@Override
public Map<String, String> flash() {
return flash;
}
}.flash("foo", null);
assertEquals(null, flash.get("foo"));
}
@Test
public void getFlashAttr() throws Exception {
Map<String, String> flash = new HashMap<>();
flash.put("foo", "bar");
RequestMock req = new RequestMock() {
@Override
public Map<String, String> flash() {
return flash;
}
};
assertEquals("bar", req.flash("foo"));
}
@Test(expected = Err.class)
public void noSuchFlashAttr() throws Exception {
Map<String, String> flash = new HashMap<>();
RequestMock req = new RequestMock() {
@Override
public Map<String, String> flash() {
return flash;
}
};
req.flash("foo");
}
}