package org.zalando.catwatch.backend.web;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.zalando.catwatch.backend.model.Statistics;
import org.zalando.catwatch.backend.repo.AbstractRepositoryIT;
import org.zalando.catwatch.backend.repo.StatisticsRepository;
import org.zalando.catwatch.backend.repo.builder.StatisticsBuilder;
import org.zalando.catwatch.backend.util.Constants;
import org.zalando.catwatch.backend.util.StringParser;
import java.util.Date;
import static java.time.Instant.now;
import static java.time.temporal.ChronoUnit.DAYS;
import static org.hamcrest.Matchers.hasSize;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.zalando.catwatch.backend.util.TestUtils.createRelativeStatisticsUrl;
public class StatisticsApiMvcIT extends AbstractRepositoryIT {
@Autowired
private StatisticsApi statisticsApi;
@Autowired
private StatisticsRepository repository;
@Autowired
private Environment env;
private MockMvc mockMvc;
private String configuredOrganizations;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(statisticsApi).build();
configuredOrganizations = env.getProperty(Constants.CONFIG_ORGANIZATION_LIST);
}
@Test
public void testDateParams() throws Exception {
Date oneDayAgo = Date.from(now().minus(1, DAYS));
Date twoDaysAgo = Date.from(now().minus(2, DAYS));
Date threeDaysAgo = Date.from(now().minus(3, DAYS));
String organization = StringParser.parseStringList(configuredOrganizations, ",").iterator().next();
if (organization == null) {
return;
}
//when
repository.deleteAll();
String from = StringParser.getISO8601StringForDate(threeDaysAgo);
String to = StringParser.getISO8601StringForDate(oneDayAgo);
//do request with valid time formats
mockMvc.perform(get(createRelativeStatisticsUrl(null, from, to)))
//then
.andExpect(status().isOk())
.andExpect(content().string("[]"));
//
//when
insertStatisics(organization, twoDaysAgo);
//do request with valid time formats
mockMvc.perform(get(createRelativeStatisticsUrl(null, from, to)))
//then
.andExpect(status().isOk())
.andExpect(jsonPath("$", hasSize(1)));
//do request with no startDate
mockMvc.perform(get(createRelativeStatisticsUrl(null, null, to)))
//then
.andExpect(status().is(200))
.andExpect(jsonPath("$", hasSize(1)));
//do request with no endDate time
mockMvc.perform(get(createRelativeStatisticsUrl(null, from, null)))
//then
.andExpect(status().isOk())
.andExpect(jsonPath("$", hasSize(1)));
//do request with invalid endDate time
mockMvc.perform(get(createRelativeStatisticsUrl(null, from, new Date().toString())))
//then
.andExpect(status().is(400));
//do request with invalid endDate time
mockMvc.perform(get(createRelativeStatisticsUrl(null, to, from)))
//then
.andExpect(status().is(200))
.andExpect(jsonPath("$", hasSize(0)));
}
@Test
public void testWithoutOrganizationParam() throws Exception {
// when
repository.deleteAll();
// do
mockMvc.perform(get(createRelativeStatisticsUrl(null, null, null)))
// then
.andExpect(status().isOk()).andExpect(content().string("[]"));
// when
insertStatisics("unknownOrganization");
// do
mockMvc.perform(get(createRelativeStatisticsUrl(null, null, null)))
// then
.andExpect(status().isOk()).andExpect(content().string("[]"));
// when
if (configuredOrganizations != null) {
String organization = StringParser.parseStringList(configuredOrganizations, ",").iterator().next();
insertStatisics(organization);
// do
mockMvc.perform(get(createRelativeStatisticsUrl(null, null, null)))
// then
.andExpect(status().isOk()).andExpect(jsonPath("$", hasSize(1)));
insertStatisics(organization);
// do
mockMvc.perform(get(createRelativeStatisticsUrl(null, null, null)))
// then
.andExpect(status().isOk()).andExpect(jsonPath("$", hasSize(1)));
}
}
@Test
public void testWithOrganizationParam() throws Exception {
String organization = "TestOrganization";
// when
repository.deleteAll();
insertStatisics("unknownOrganization");
// do
mockMvc.perform(get(createRelativeStatisticsUrl(organization, null, null)))
// then
.andExpect(status().isOk()).andExpect(content().string("[]"));
// when
insertStatisics(organization);
// do
mockMvc.perform(get(createRelativeStatisticsUrl(organization, null, null)))
// then
.andExpect(status().isOk()).andExpect(jsonPath("$", hasSize(1)));
// do (evil organization name/list)
mockMvc.perform(get(createRelativeStatisticsUrl("," + organization + ",", null, null)))
// then
.andExpect(status().isOk()).andExpect(jsonPath("$", hasSize(1)));
}
private Statistics insertStatisics(final String organization) {
return insertStatisics(organization, null);
}
private Statistics insertStatisics(final String organization, final Date snapshotDate) {
Statistics s = new StatisticsBuilder(null).organizationName(organization).create();
if (snapshotDate != null) {
s.setSnapshotDate(snapshotDate);
}
return repository.save(s);
}
}