package org.openmhealth.shim.fitbit.mapper;
import com.fasterxml.jackson.databind.JsonNode;
import org.openmhealth.schema.domain.omh.DataPoint;
import org.openmhealth.schema.domain.omh.DurationUnit;
import org.openmhealth.schema.domain.omh.DurationUnitValue;
import org.openmhealth.schema.domain.omh.StepCount;
import org.openmhealth.shim.common.mapper.DataPointMapperUnitTests;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.io.IOException;
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.util.List;
import static java.time.ZoneOffset.UTC;
import static java.util.Collections.singletonList;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.equalTo;
import static org.openmhealth.schema.domain.omh.TimeInterval.ofStartDateTimeAndDuration;
/**
* @author Chris Schaefbauer
*/
public class FitbitStepCountDataPointMapperUnitTests extends DataPointMapperUnitTests {
private final FitbitStepCountDataPointMapper mapper = new FitbitStepCountDataPointMapper();
private JsonNode responseNode;
@BeforeTest
public void initializeResponseNodes() throws IOException {
responseNode = asJsonNode("org/openmhealth/shim/fitbit/mapper/fitbit-activities-steps-timeseries.json");
}
@Test
public void asDataPointsShouldReturnCorrectNumberOfDataPoints() {
assertThat(mapper.asDataPoints(responseNode).size(), equalTo(2));
}
@Test
public void asDataPointsShouldReturnCorrectDataPointsWhenMultipleInResponse() {
List<DataPoint<StepCount>> dataPoints = mapper.asDataPoints(singletonList(responseNode));
assertThatDataPointMatches(dataPoints.get(0), 175, "2015-08-23");
assertThatDataPointMatches(dataPoints.get(1), 2937, "2015-08-24");
}
public void assertThatDataPointMatches(DataPoint<StepCount> dataPoint, long expectedStepCountValue,
String expectedEffectiveDate) {
StepCount expectedStepCount = new StepCount.Builder(expectedStepCountValue)
.setEffectiveTimeFrame(ofStartDateTimeAndDuration(
OffsetDateTime.of(LocalDate.parse(expectedEffectiveDate).atStartOfDay(), UTC),
new DurationUnitValue(DurationUnit.DAY, 1)))
.build();
assertThat(dataPoint.getBody(), equalTo(expectedStepCount));
assertThat(dataPoint.getHeader().getBodySchemaId(), equalTo(StepCount.SCHEMA_ID));
assertThat(dataPoint.getHeader().getAcquisitionProvenance().getAdditionalProperties().get("external_id"),
nullValue());
assertThat(dataPoint.getHeader().getAcquisitionProvenance().getSourceName(),
equalTo(FitbitDataPointMapper.RESOURCE_API_SOURCE_NAME));
}
@Test
public void asDataPointsShouldReturnEmptyListWhenStepCountEqualsZero() throws IOException {
JsonNode zeroStepsNode = objectMapper.readTree("{\n" +
" \"activities-steps\": [\n" +
" {\n" +
" \"dateTime\": \"2015-05-24\",\n" +
" \"value\": \"0\"\n" +
" }\n" +
" ]\n" +
"}\n");
assertThat(mapper.asDataPoints(zeroStepsNode), is(empty()));
}
}