package fitnesse.responders;
import static org.junit.Assert.assertEquals;
import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals;
import fitnesse.wiki.WikiPageUtil;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import fitnesse.FitNesseContext;
import fitnesse.Responder;
import fitnesse.http.MockRequest;
import fitnesse.http.SimpleResponse;
import fitnesse.testutil.FitNesseUtil;
import fitnesse.wiki.PathParser;
import fitnesse.wiki.WikiPage;
public class PacketResponderTest {
protected WikiPage root;
protected MockRequest request;
protected Responder responder;
protected FitNesseContext context;
@Before
public void setUp() throws Exception {
context = FitNesseUtil.makeTestContext();
root = context.getRootPage();
request = new MockRequest();
responder = new PacketResponder();
}
private SimpleResponse makeResponse() throws Exception {
return (SimpleResponse) responder.makeResponse(context, request);
}
private void assertResponseContentEquals(String expected, SimpleResponse response) {
if (expected.startsWith("{")) {
assertJsonEquals(expected, response.getContent());
} else {
assertEquals(expected, response.getContent());
}
}
private void assertPageWithTableResponseWith(String table, String expected) throws Exception {
WikiPageUtil.addPage(root, PathParser.parse("TablePage"), table);
request.setResource("TablePage");
SimpleResponse response = makeResponse();
assertResponseContentEquals(expected, response);
}
@Test
public void noSuchPage() throws Exception {
request.setResource("NoSuchPage");
SimpleResponse response = makeResponse();
assertEquals(404, response.getStatus());
}
@Test
public void pageWithNoTables() throws Exception {
WikiPageUtil.addPage(root, PathParser.parse("SimplePage"), "simple content");
request.setResource("SimplePage");
SimpleResponse response = makeResponse();
assertEquals(200, response.getStatus());
assertEquals("{\"tables\": []}", response.getContent());
}
@Test
public void pageWithOneSimpleTable() throws Exception {
assertPageWithTableResponseWith("|cell|\n", "{\"tables\": [{\"cell\": {}}]}");
}
@Test
public void pageWithOneSimplePair() throws Exception {
assertPageWithTableResponseWith("|name|value|\n", "{\"tables\": [{\"name\": \"value\"}]}");
}
@Test
public void pageWithTwoPairs() throws Exception {
assertPageWithTableResponseWith("|name1|value1|\n|name2|value2|\n",
"{\"tables\": [{\n" +
" \"name1\": \"value1\",\n" +
" \"name2\": \"value2\"\n" +
"}]}");
}
@Test
public void twoTablesWithSimplePairs() throws Exception {
assertPageWithTableResponseWith("|n|v|\n\n|n2|v2|\n",
"{\"tables\": [\n" +
" {\"n\": \"v\"},\n" +
" {\"n2\": \"v2\"}\n" +
"]}");
}
@Test
public void oneTableWithNestedPair() throws Exception {
JSONObject expected = new JSONObject("{\"tables\": [{\"n\": {\"m\": \"v\"}}]}");
assertPageWithTableResponseWith("|n|\n||m|v|\n", expected.toString(1));
}
@Test
public void tableWithBlankLinesIgnored() throws Exception {
JSONObject expected = new JSONObject("{\"tables\": [{\"n\": {\"m\": \"v\"}}]}");
assertPageWithTableResponseWith("|n|\n||||\n||m|v|\n", expected.toString(1));
}
@Test
public void deeplyNestedTable() throws Exception {
String table =
"|bob|\n" +
"||Angela|\n" +
"|||Lexy|6|\n" +
"|||Sami|4|\n" +
"|||Mandy|2|\n" +
"||Micah|\n" +
"|||Luka|5|\n" +
"||Gina|\n" +
"||Justin|\n";
String expectedString = "{\"tables\": [{\"bob\": {\n" +
" \"Angela\": {\n" +
" \"Lexy\": \"6\",\n" +
" \"Mandy\": \"2\",\n" +
" \"Sami\": \"4\"\n" +
" },\n" +
" \"Gina\": {},\n" +
" \"Justin\": {},\n" +
" \"Micah\": {\"Luka\": \"5\"}\n" +
"}}]}";
JSONObject expected = new JSONObject(expectedString);
assertPageWithTableResponseWith(table, expected.toString(1));
}
@Test
public void jsonpQueryArgument() throws Exception {
request.addInput("jsonp", "load");
assertPageWithTableResponseWith("|cell|\n", "load({\"tables\": [{\"cell\": {}}]})");
}
}