/**
*
*/
package com.thinkbiganalytics.alerts.spi.defaults;
/*-
* #%L
* thinkbig-alerts-default
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import com.thinkbiganalytics.alerts.api.Alert;
import com.thinkbiganalytics.alerts.api.Alert.Level;
import com.thinkbiganalytics.alerts.api.Alert.State;
import com.thinkbiganalytics.alerts.api.AlertResponse;
import com.thinkbiganalytics.alerts.spi.AlertNotifyReceiver;
import com.thinkbiganalytics.metadata.persistence.MetadataPersistenceConfig;
import com.thinkbiganalytics.testing.jpa.TestPersistenceConfiguration;
import org.joda.time.DateTime;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.net.URI;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Optional;
import javax.inject.Inject;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
/**
*
*/
@TestPropertySource(locations = "classpath:test-jpa-application.properties")
@SpringApplicationConfiguration(classes = {MetadataPersistenceConfig.class, TestPersistenceConfiguration.class, DefaultAlertManagerConfig.class})
public class DefaultAlertManagerTest extends AbstractTestNGSpringContextTests {
private static final String LONG_DESCR;
private static final String TRUNK_DESCR;
static {
char[] descr = new char[257];
Arrays.fill(descr, 'x');
LONG_DESCR = new String(descr);
TRUNK_DESCR = LONG_DESCR.substring(0, 252) + "...";
}
@Mock
private AlertNotifyReceiver alertReceiver;
@Inject
private DefaultAlertManager manager;
private Alert.ID id1;
private Alert.ID id2;
private DateTime beforeTime;
private DateTime middleTime;
private DateTime afterTime;
@BeforeClass
public void init() {
MockitoAnnotations.initMocks(this);
manager.addReceiver(alertReceiver);
}
@AfterMethod
public void afterMethod() {
Mockito.reset(this.alertReceiver);
}
@Test(groups = "create")
public void testCreateAlert() throws Exception {
this.beforeTime = DateTime.now().minusMillis(50);
Alert alert1 = this.manager.create(URI.create("http://example.com/test/alert/1"), Level.MINOR, LONG_DESCR, "1st content");
Thread.sleep(100);
Alert alert2 = this.manager.create(URI.create("http://example.com/test/alert/2"), Level.CRITICAL, "2nd description", "2nd content");
Thread.sleep(100);
assertThat(alert1)
.isNotNull()
.extracting("type", "level", "description", "content")
.contains(URI.create("http://example.com/test/alert/1"), Level.MINOR, TRUNK_DESCR, "1st content");
assertThat(alert2)
.isNotNull()
.extracting("type", "level", "description", "content")
.contains(URI.create("http://example.com/test/alert/2"), Level.CRITICAL, "2nd description", "2nd content");
assertThat(alert2.getEvents())
.hasSize(1)
.extracting("state", "content")
.contains(tuple(State.UNHANDLED, null));
verify(this.alertReceiver, times(2)).alertsAvailable(anyInt());
this.middleTime = alert2.getCreatedTime().minusMillis(50);
this.afterTime = DateTime.now();
this.id1 = alert1.getId();
this.id2 = alert2.getId();
}
@Test(dependsOnGroups = "create", groups = "read1")
public void testGetAlerts() {
Iterator<Alert> itr = this.manager.getAlerts(null);
assertThat(itr)
.isNotNull()
.hasSize(2)
.extracting("type", "level", "description", "content")
.contains(tuple(URI.create("http://example.com/test/alert/1"), Level.MINOR, TRUNK_DESCR, "1st content"),
tuple(URI.create("http://example.com/test/alert/2"), Level.CRITICAL, "2nd description", "2nd content"));
}
@Test(dependsOnGroups = "create", groups = "read1")
public void testGetAlertById() {
Optional<Alert> optional = this.manager.getAlert(id2);
assertThat(optional.isPresent()).isTrue();
assertThat(optional.get())
.isNotNull()
.extracting("id", "type", "level", "description", "content")
.contains(this.id2, URI.create("http://example.com/test/alert/2"), Level.CRITICAL, "2nd description", "2nd content");
assertThat(optional.get().getEvents())
.hasSize(1)
.extracting("state", "content")
.contains(tuple(State.UNHANDLED, null));
}
@Test(dependsOnGroups = "create", groups = "read1")
public void testGetAlertsSinceTime() {
Iterator<Alert> itr = this.manager.getAlerts(this.manager.criteria().after(this.beforeTime));
assertThat(itr).isNotNull().hasSize(2).extracting("id").contains(this.id1, this.id2);
itr = this.manager.getAlerts(this.manager.criteria().after(this.middleTime));
assertThat(itr).isNotNull().hasSize(1).extracting("id").contains(this.id2);
itr = this.manager.getAlerts(this.manager.criteria().after(this.afterTime));
assertThat(itr).isNotNull().hasSize(0);
}
@Test(dependsOnGroups = "create", groups = "read1")
public void testGetAlertsByType() {
Iterator<Alert> itr = this.manager.getAlerts(this.manager.criteria().type(URI.create("http://example.com/test/alert/1")));
assertThat(itr).isNotNull().hasSize(1).extracting("id").contains(this.id1);
}
@Test(dependsOnGroups = "create", groups = "read1")
public void testGetAlertsBySuperType() {
Iterator<Alert> itr = this.manager.getAlerts(this.manager.criteria().type(URI.create("http://example.com/test/alert")));
assertThat(itr).isNotNull().hasSize(2).extracting("id").contains(this.id1, this.id2);
}
@Test(dependsOnGroups = "create", groups = "update1")
public void testAlertResponding() {
Alert alert = this.manager.getAlert(id1).get();
AlertResponse resp = this.manager.getResponse(alert);
alert = resp.inProgress(LONG_DESCR);
assertThat(alert.getEvents())
.hasSize(2)
.extracting("state", "description", "content")
.contains(tuple(State.UNHANDLED, null, null), tuple(State.IN_PROGRESS, TRUNK_DESCR, null));
alert = resp.handle("Change handled", new Integer(42));
assertThat(alert.getEvents())
.hasSize(3)
.extracting("state", "description", "content")
.contains(tuple(State.UNHANDLED, null, null), tuple(State.IN_PROGRESS, TRUNK_DESCR, null), tuple(State.HANDLED, "Change handled", 42));
verify(this.alertReceiver, times(2)).alertsAvailable(anyInt());
}
@Test(dependsOnGroups = "update1", groups = "read2")
public void testGetAlertsByState() {
Iterator<Alert> itr = this.manager.getAlerts(this.manager.criteria().state(Alert.State.UNHANDLED));
assertThat(itr).isNotNull().hasSize(1).extracting("id").contains(this.id2);
itr = this.manager.getAlerts(this.manager.criteria().state(Alert.State.HANDLED));
assertThat(itr).isNotNull().hasSize(1);
itr = this.manager.getAlerts(this.manager.criteria().state(Alert.State.CREATED));
assertThat(itr).isNotNull().hasSize(0);
}
@Test(dependsOnGroups = "read2", groups = "update2")
public void testClear() {
Alert alert = this.manager.getAlert(id1).get();
AlertResponse resp = this.manager.getResponse(alert);
resp.clear();
alert = this.manager.getAlert(id1).get();
assertThat(alert).isNotNull();
assertThat(alert.isCleared()).isTrue();
verify(this.alertReceiver, times(0)).alertsAvailable(anyInt());
}
@Test(dependsOnGroups = "update2", groups = "read3")
public void testGetAlertsAfterClear() {
Iterator<Alert> itr = this.manager.getAlerts(null);
assertThat(itr)
.isNotNull()
.hasSize(1)
.extracting("id", "type", "level", "description", "content")
.contains(tuple(this.id2, URI.create("http://example.com/test/alert/2"), Level.CRITICAL, "2nd description", "2nd content"));
}
}