package org.jvalue.ods.notifications.sender;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.squareup.okhttp.mockwebserver.MockResponse;
import com.squareup.okhttp.mockwebserver.MockWebServer;
import com.squareup.okhttp.mockwebserver.RecordedRequest;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.jvalue.ods.api.notifications.HttpClient;
import org.jvalue.ods.api.sources.DataSource;
import mockit.integration.junit4.JMockit;
import retrofit.RetrofitError;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@RunWith(JMockit.class)
public final class HttpSenderTest {
private static final String SOURCE_ID = "someSourceId";
private final DataSource source = new DataSource(SOURCE_ID, null, null, null);
private HttpSender sender;
@Test
public final void testSuccess() throws Throwable {
MockWebServer server = new MockWebServer();
server.enqueue(new MockResponse().setResponseCode(200));
server.play();
String path = "/foo/bar/data/";
String callbackUrl = server.getUrl(path).toString();
ObjectNode sentData = new ObjectNode(JsonNodeFactory.instance);
sentData.put("sourceId", SOURCE_ID);
ArrayNode data = sentData.putArray("data");
data.addObject().put("hello", "world");
data.addObject().put("and", "again");
setupSender(new HttpClient(SOURCE_ID, callbackUrl, true));
sender.onNewDataStart();
for (JsonNode item : data) sender.onNewDataItem((ObjectNode) item);
sender.onNewDataComplete();
assertEquals(SenderResult.Status.SUCCESS, sender.getSenderResult().getStatus());
RecordedRequest request = server.takeRequest();
assertEquals(path, request.getPath());
assertEquals(sentData.toString(), request.getUtf8Body());
server.shutdown();
}
@Test
public final void testNoServerResponse() {
setupSender(new HttpClient("dummy", "dummy", false));
sender.onNewDataStart();
sender.onNewDataItem(new ObjectNode(JsonNodeFactory.instance));
sender.onNewDataComplete();
SenderResult result = sender.getSenderResult();
assertEquals(result.getStatus(), SenderResult.Status.ERROR);
assertTrue(result.getErrorCause() instanceof RetrofitError);
}
private void setupSender(HttpClient client) {
sender = new HttpSender(source, client);
}
}