/**
* Copyright (C) 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ninja;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.StringWriter;
import java.io.Writer;
import java.util.AbstractMap;
import java.util.Map;
import java.util.Map.Entry;
import ninja.utils.ResponseStreams;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.google.common.collect.Maps;
@RunWith(MockitoJUnitRunner.class)
public class ResultTest {
@Mock
Context context;
@Mock
ResponseStreams responseStreams;
@Test
public void testConstructor() {
Result result = new Result(Result.SC_307_TEMPORARY_REDIRECT);
assertEquals(Result.SC_307_TEMPORARY_REDIRECT, result.getStatusCode());
assertEquals(0, result.getCookies().size());
assertEquals(0, result.getHeaders().keySet().size());
}
@Test
public void testGetRenderable() {
TestObject testObject = new TestObject();
Result result = new Result(200);
result.render(testObject);
assertEquals(testObject, result.getRenderable());
}
@Test
public void testGetContentType() {
Result result = new Result(200);
result.contentType("text/my-funky-content-type");
assertEquals("text/my-funky-content-type", result.getContentType());
}
@Test
public void testAndAddHeaders() {
Result result = new Result(200);
result.addHeader("header1", "value1");
result.addHeader("header2", "value2");
assertEquals(2, result.getHeaders().size());
assertEquals("value1", result.getHeaders().get("header1"));
assertEquals("value2", result.getHeaders().get("header2"));
}
@Test
public void testAndAddCookies() {
Result result = new Result(200);
result.addCookie(Cookie.builder("cookie1", "value1").build());
result.addCookie(Cookie.builder("cookie2", "value2").build());
assertEquals(2, result.getCookies().size());
assertEquals("value1", result.getCookies().get(0).getValue());
assertEquals("value2", result.getCookies().get(1).getValue());
}
@Test
public void testUnsetCookie() {
Result result = new Result(200);
result.unsetCookie("Cookie-to-be-unset");
assertEquals(1, result.getCookies().size());
assertEquals("Cookie-to-be-unset", result.getCookies().get(0).getName());
assertEquals("", result.getCookies().get(0).getValue());
}
@Test
public void testSetAndGetStatus() {
Result result = new Result(Result.SC_200_OK);
// set the status:
result.status(Result.SC_501_NOT_IMPLEMENTED);
// and verify that we retrieve the correct one:
assertEquals(Result.SC_501_NOT_IMPLEMENTED, result.getStatusCode());
}
@Test
public void testSetAndGetTemplate() {
Result result = new Result(Result.SC_200_OK);
// set the status:
result.template("/my/custom/template.ftl.html");
// and verify that we retrieve the correct one:
assertEquals("/my/custom/template.ftl.html", result.getTemplate());
assertEquals(Result.SC_200_OK, result.getStatusCode());
}
@Test
public void testSetAndGetJsonView() {
Result result = new Result(Result.SC_200_OK);
result.jsonView(TestObject.class);
assertEquals(TestObject.class, result.getJsonView());
}
@Test
public void testRedirect() {
Result result = new Result(Result.SC_200_OK);
result.redirect("http://example.com");
// assert that headers are set:
assertEquals(1, result.getHeaders().size());
assertEquals("http://example.com", result.getHeaders().get(Result.LOCATION));
assertEquals(Result.SC_303_SEE_OTHER, result.getStatusCode());
}
@Test
public void testRedirectTemporary() {
Result result = new Result(Result.SC_200_OK);
result.redirectTemporary("http://example.com");
// assert that headers are set:
assertEquals(1, result.getHeaders().size());
assertEquals("http://example.com", result.getHeaders().get(Result.LOCATION));
assertEquals(Result.SC_307_TEMPORARY_REDIRECT, result.getStatusCode());
}
@Test
public void testHtml() {
Result result = new Result(Result.SC_200_OK);
result.html();
assertEquals(Result.TEXT_HTML, result.getContentType());
}
@Test
public void testJson() {
Result result = new Result(Result.SC_200_OK);
result.json();
assertEquals(Result.APPLICATION_JSON, result.getContentType());
}
@Test
public void testUtf8IsUsedAsDefaultCharset() {
Result result = new Result(Result.SC_200_OK);
assertEquals("utf-8", result.getCharset());
}
@Test
public void testSettingOfCharsetWorks() {
Result result = new Result(Result.SC_200_OK);
result.charset("iso-7777");
assertEquals("iso-7777", result.getCharset());
}
@Test
public void testRenderRenderable() {
Renderable renderable = new Renderable() {
@Override
public void render(Context context, Result result) {
// do nothing
}
};
// step 1: normal operation
Result result = new Result(200);
result.render(renderable);
assertEquals(renderable, result.getRenderable());
// step 2: now we expect an illegal argument exception:
boolean gotException = true;
try {
result.render(new TestObject());
} catch (IllegalArgumentException e) {
gotException = true;
}
assertTrue(gotException);
}
@Test
public void testRenderSingleObject() {
TestObject testObject = new TestObject();
Result result = new Result(200);
result.render(testObject);
assertEquals(testObject, result.getRenderable());
}
@Test
public void testRenderMultipleObjects() {
TestObject testObject = new TestObject();
// step 1: add one object.
Result result = new Result(200);
result.render(testObject);
assertEquals(testObject, result.getRenderable());
// step 2: add a second object (string is just a dummy)
// => we expect to get a map from the result now...
String string = new String("test");
result.render(string);
assertTrue(result.getRenderable() instanceof Map);
Map<String, Object> resultMap = (Map) result.getRenderable();
assertEquals(string, resultMap.get("string"));
assertEquals(testObject, resultMap.get("testObject"));
// step 3: add same object => we expect an illegal argument exception as the map
// cannot handle that case:
TestObject anotherObject = new TestObject();
boolean gotException = false;
try {
result.render(anotherObject);
} catch (IllegalArgumentException e) {
gotException = true;
}
assertTrue(gotException);
// step 4: add an entry
Entry<String, Object> entry = new AbstractMap.SimpleImmutableEntry<String, Object>("anotherObject", anotherObject);
result.render(entry);
resultMap = (Map) result.getRenderable();
assertEquals(3, resultMap.size());
assertEquals(anotherObject, resultMap.get("anotherObject"));
// step 5: add another map and check that conversion works:
Map<String, Object> mapToRender = Maps.newHashMap();
String anotherString = new String("anotherString");
TestObject anotherTestObject = new TestObject();
mapToRender.put("anotherString", anotherString);
mapToRender.put("anotherTestObject", anotherTestObject);
result.render(mapToRender);
resultMap = (Map) result.getRenderable();
assertEquals(2, resultMap.size());
assertEquals(anotherString, resultMap.get("anotherString"));
assertEquals(anotherTestObject, resultMap.get("anotherTestObject"));
}
@Test
public void testRenderEntryAndMakeSureMapIsCreated() {
String stringy = new String("stringy");
// step 1: add one object.
Result result = new Result(200);
result.render("stringy", stringy);
Map<String, Object> resultMap = (Map) result.getRenderable();
assertEquals(stringy, resultMap.get("stringy"));
}
@Test
public void testRenderingOfStringObjectPairsWorks() {
String object1 = new String("stringy1");
String object2 = new String("stringy2");
// step 1: add one object.
Result result = new Result(200);
result.render("object1", object1);
result.render("object2", object2);
Map<String, Object> resultMap = (Map) result.getRenderable();
assertEquals(object1, resultMap.get("object1"));
assertEquals(object2, resultMap.get("object2"));
}
@Test
public void testRenderRaw() throws Exception {
String stringToRender = "{\"user\" : \"john@woo.com\"}";
// Construct a new result via Results.
Result result = Results.json().renderRaw(stringToRender);
// Setup some stuff to catch the output that gets written to the
// output stream.
Writer writer = new StringWriter();
when(context.finalizeHeaders(result)).thenReturn(responseStreams);
when(responseStreams.getWriter()).thenReturn(writer);
Renderable renderable = (Renderable) result.getRenderable();
// Now issue a "render":
renderable.render(context, result);
// make sure we called the finalizeHeaders
verify(context).finalizeHeaders(result);
// make sure we did render the string to the OutputStream.
assertEquals(writer.toString(), stringToRender);
// also make sure the content type is set correctly.
assertEquals(Result.APPLICATION_JSON, result.getContentType());
}
/**
* Simple helper to test if objects get copied to result.
*
*/
public class TestObject {
}
}