package com.nightscout.core.upload;
import com.nightscout.core.drivers.AbstractUploaderDevice;
import com.nightscout.core.preferences.TestPreferences;
import net.tribe7.common.io.CharStreams;
import org.apache.http.HttpResponse;
import org.apache.http.ProtocolVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.message.BasicStatusLine;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import static com.nightscout.core.test.MockFactory.mockCalRecord;
import static com.nightscout.core.test.MockFactory.mockDeviceStatus;
import static com.nightscout.core.test.MockFactory.mockGlucoseDataSet;
import static com.nightscout.core.test.MockFactory.mockMeterRecord;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
public class RestLegacyUploaderTest {
RestLegacyUploader restUploader;
HttpClient mockHttpClient;
ArgumentCaptor<HttpUriRequest> captor;
private TestPreferences preferences;
public static void verifyGlucoseDataSet(JSONObject jsonObject)
throws JSONException {
assertThat(jsonObject.getString("device"), is("UNKNOWN"));
assertThat(jsonObject.get("date"), is(not(nullValue())));
assertThat(jsonObject.get("dateString"), is(not(nullValue())));
assertThat(jsonObject.get("sgv"), is(not(nullValue())));
assertThat(jsonObject.get("direction"), is(not(nullValue())));
}
public static void verifyDeviceStatus(JSONObject jsonObject, AbstractUploaderDevice deviceStatus)
throws JSONException {
assertThat(jsonObject.getInt("uploaderBattery"), is(deviceStatus.getBatteryLevel()));
}
@Before
public void setUp() throws Exception {
preferences = new TestPreferences();
restUploader = new RestLegacyUploader(preferences, URI.create("http://test.com/"));
mockHttpClient = mock(HttpClient.class);
restUploader.setClient(mockHttpClient);
setUpExecuteCaptor();
}
public void setUpExecuteCaptor() throws IOException {
setUpExecuteCaptor(200);
}
public void setUpExecuteCaptor(int status) throws IOException {
captor = ArgumentCaptor.forClass(HttpUriRequest.class);
HttpResponse response = new BasicHttpResponse(
new BasicStatusLine(new ProtocolVersion("mock", 1, 2), status, ""));
response.setEntity(new StringEntity(""));
when(mockHttpClient.execute(captor.capture())).thenReturn(response);
}
@Test
public void testGlucoseDataSet_Endpoint() throws Exception {
restUploader.uploadGlucoseDataSets(new ArrayList<>(Arrays.asList(mockGlucoseDataSet())));
assertThat(captor.getValue().getURI().toString(), containsString("entries"));
}
@Test
public void testGlucoseDataSet_Entity() throws Exception {
restUploader.uploadGlucoseDataSets(new ArrayList<>(Arrays.asList(mockGlucoseDataSet())));
HttpPost post = (HttpPost) captor.getValue();
String entity = CharStreams.toString(new InputStreamReader(post.getEntity().getContent()));
verifyGlucoseDataSet(new JSONObject(entity));
}
@Test
public void testMeterRecord_NoPost() throws Exception {
reset(mockHttpClient);
verifyNoMoreInteractions(mockHttpClient);
restUploader.uploadMeterRecords(new ArrayList<>(Arrays.asList(mockMeterRecord())));
}
@Test
public void testCalRecord_NoPost() throws Exception {
preferences.setRawEnabled(true);
reset(mockHttpClient);
verifyNoMoreInteractions(mockHttpClient);
restUploader.uploadCalRecords(new ArrayList<>(Arrays.asList(mockCalRecord())));
}
@Test
public void testDeviceStatus_Endpoint() throws Exception {
restUploader.uploadDeviceStatus(mockDeviceStatus(), 100);
assertThat(captor.getValue().getURI().toString(), containsString("devicestatus"));
}
@Test
public void testDeviceStatus_Entity() throws Exception {
AbstractUploaderDevice deviceStatus = mockDeviceStatus();
restUploader.uploadDeviceStatus(deviceStatus, 100);
HttpPost post = (HttpPost) captor.getValue();
String entity = CharStreams.toString(new InputStreamReader(post.getEntity().getContent()));
verifyDeviceStatus(new JSONObject(entity), deviceStatus);
}
}