package de.otto.edison.status.controller;
import de.otto.edison.status.configuration.ApplicationInfoProperties;
import de.otto.edison.status.domain.*;
import de.otto.edison.testsupport.util.JsonMap;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
import static de.otto.edison.status.configuration.ApplicationInfoProperties.applicationInfoProperties;
import static de.otto.edison.status.configuration.VersionInfoProperties.versionInfoProperties;
import static de.otto.edison.status.controller.StatusRepresentation.statusRepresentationOf;
import static de.otto.edison.status.domain.ApplicationInfo.applicationInfo;
import static de.otto.edison.status.domain.ApplicationStatus.applicationStatus;
import static de.otto.edison.status.domain.Link.link;
import static de.otto.edison.status.domain.Status.OK;
import static de.otto.edison.status.domain.Status.WARNING;
import static de.otto.edison.status.domain.StatusDetail.statusDetail;
import static de.otto.edison.testsupport.util.JsonMap.jsonMapFrom;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.mockito.Mockito.mock;
public class StatusRepresentationTest {
@Test
public void shouldCreateStatusRepresentationWithoutDetails() {
// given
ApplicationInfoProperties applicationInfoProperties = applicationInfoProperties("Some Title", "group", "local-env", "desc");
final StatusRepresentation json = statusRepresentationOf(
applicationStatus(applicationInfo("app-name", applicationInfoProperties), mock(ClusterInfo.class), mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), emptyList(), emptyList())
);
// then
assertThat(json.application.name, is("app-name"));
assertThat(json.application.title, is("Some Title"));
assertThat(json.application.status, is(OK));
assertThat(json.application.statusDetails.size(), is(0));
}
@Test
public void shouldCreateStatusRepresentationWithVersionInfo() {
// given
final StatusRepresentation json = statusRepresentationOf(
applicationStatus(mock(ApplicationInfo.class), mock(ClusterInfo.class), mock(SystemInfo.class), VersionInfo.versionInfo(versionInfoProperties("1.0.0", "0815", "http://example.org/commits/{commit}")), mock(TeamInfo.class), emptyList(), emptyList())
);
// then
assertThat(json.application.version, is("1.0.0"));
assertThat(json.application.commit, is("0815"));
assertThat(json.application.vcsUrl, is("http://example.org/commits/0815"));
}
@Test
public void shouldCreateStatusRepresentationWithClusterInfo() {
// given
final ClusterInfo cluster = new ClusterInfo("BLU", "active");
final StatusRepresentation json = statusRepresentationOf(
applicationStatus(mock(ApplicationInfo.class), cluster, mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), emptyList(), emptyList())
);
// then
assertThat(json.cluster.getColor(), is("BLU"));
assertThat(json.cluster.getColorState(), is("active"));
}
@Test
public void shouldCreateStatusRepresentationWithoutClusterInfo() {
// given
final ClusterInfo cluster = new ClusterInfo("", "");
final StatusRepresentation json = statusRepresentationOf(
applicationStatus(mock(ApplicationInfo.class), cluster, mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), emptyList(), emptyList())
);
// then
assertThat(json.cluster, is(nullValue()));
}
@Test
public void shouldCreateStatusRepresentationWithSingleDetail() {
// given
final StatusRepresentation json = statusRepresentationOf(
applicationStatus(mock(ApplicationInfo.class), mock(ClusterInfo.class), mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), singletonList(
statusDetail("someDetail", WARNING, "detailed warning")), emptyList()
)
);
// then
assertThat(json.application.status, is(WARNING));
@SuppressWarnings("unchecked")
final Map<String, String> someDetail = (Map) json.application.statusDetails.get("someDetail");
assertThat(someDetail.get("status"), is("WARNING"));
assertThat(someDetail.get("message"), is("detailed warning"));
assertThat(someDetail.get("link"), is(nullValue()));
}
@Test
public void shouldCreateStatusRepresentationWithDetailInclUrl() {
// given
final StatusRepresentation json = statusRepresentationOf(
applicationStatus(
mock(ApplicationInfo.class),
mock(ClusterInfo.class),
mock(SystemInfo.class),
mock(VersionInfo.class),
mock(TeamInfo.class),
singletonList(
statusDetail("someDetail", OK, "some message", link("item", "http://example.org/some/url", "some title"))),
emptyList()
)
);
// then
assertThat(json.application.status, is(OK));
final JsonMap jsonMap = jsonMapFrom(json.application.statusDetails.get("someDetail"));
final JsonMap link = jsonMap.get("links").asListOf(JsonMap.class).get(0);
assertThat(link.getString("href"), is("http://example.org/some/url"));
assertThat(link.getString("title"), is("some title"));
assertThat(link.getString("rel"), is("item"));
}
@Test
public void shouldCreateStatusRepresentationWithMultipleDetails() {
// given
final Map<String, String> detailMap = new HashMap<>();
detailMap.put("Count", "1000");
final StatusRepresentation json = statusRepresentationOf(
applicationStatus(mock(ApplicationInfo.class), mock(ClusterInfo.class), mock(SystemInfo.class), mock(VersionInfo.class), mock(TeamInfo.class), asList(
statusDetail("Some Detail", OK, "perfect"),
statusDetail("Some Other Detail", WARNING, "detailed warning", detailMap)), emptyList()
)
);
// then
assertThat(json.application.status, is(WARNING));
@SuppressWarnings("unchecked")
final Map<String, String> someDetail = (Map) json.application.statusDetails.get("someDetail");
assertThat(someDetail.get("status"), is("OK"));
assertThat(someDetail.get("message"), is("perfect"));
assertThat(someDetail.get("status"), is("OK"));
@SuppressWarnings("unchecked")
final Map<String, String> someOtherDetail = (Map) json.application.statusDetails.get("someOtherDetail");
assertThat(someOtherDetail.get("status"), is("WARNING"));
assertThat(someOtherDetail.get("message"), is("detailed warning"));
assertThat(someOtherDetail.get("count"), is("1000"));
}
}