package rmblworx.tools.timey;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import rmblworx.tools.timey.exception.NullArgumentException;
import rmblworx.tools.timey.exception.ValueMinimumArgumentException;
import rmblworx.tools.timey.persistence.service.IAlarmService;
import rmblworx.tools.timey.vo.AlarmDescriptor;
import rmblworx.tools.timey.vo.TimeDescriptor;
/*
* Copyright 2014-2015 Christian Raue
* MIT License http://opensource.org/licenses/mit-license.php
*/
/**
* @author mmatthies
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/spring-timey-context.xml", "/alarm-spring-timey-context.xml" })
public class AlarmTest {
private static final long EXPECTED_MILLISECONDS = 100;
@Autowired
private AlarmDescriptor descriptor;
private IAlarm effectiveDelegate;
private List<AlarmDescriptor> list;
@Mock
private IAlarmService service;
private Boolean assertThatTimestampIsPresent(final List<AlarmDescriptor> list, final AlarmDescriptor expectedDescriptor) {
Boolean result = Boolean.FALSE;
for (AlarmDescriptor timeDescr : list) {
if (timeDescr.getAlarmtime().getMilliSeconds() == expectedDescriptor.getAlarmtime()
.getMilliSeconds()) {
result = Boolean.TRUE;
break;
}
}
return result;
}
private List<AlarmDescriptor> createListWithDescriptors() {
this.list = new ArrayList<>();
final AlarmDescriptor ad = new AlarmDescriptor(new TimeDescriptor(EXPECTED_MILLISECONDS), false, "Text",
"/bla/blub", null);
this.list.add(ad);
return this.list;
}
@Before
public final void setUp() {
MockitoAnnotations.initMocks(this);
this.effectiveDelegate = new Alarm(this.service, 1, TimeUnit.MINUTES);
this.descriptor.getAlarmtime().setMilliSeconds(EXPECTED_MILLISECONDS);
this.list = this.createListWithDescriptors();
}
@After
public final void tearDown() {
this.descriptor = null;
}
/**
* Test method for {@link Alarm#getAllAlarms()}.
*/
@Test
public final void testGetAllAlarms() {
when(this.service.getAll()).thenReturn(this.list);
this.effectiveDelegate.setAlarm(this.descriptor);
assertNotNull("Es wurde keine leere Liste geliefert!", this.effectiveDelegate.getAllAlarms());
assertFalse("Leere Ergebnismenge!", this.effectiveDelegate.getAllAlarms().isEmpty());
}
/**
* Test method for {@link Alarm#isAlarmActivated(AlarmDescriptor)}.
*/
@Test
public final void testIsActivatedShouldReturnNullBecauseNoAlarmtimeWasSetBefore() {
this.effectiveDelegate = new Alarm(this.service, 1, TimeUnit.MINUTES);
final AlarmDescriptor expected = null;
when(this.service.isActivated(expected)).thenReturn(null);
this.effectiveDelegate.setAlarm(expected);
assertNull(this.effectiveDelegate.isAlarmActivated(expected));
}
/**
* Test method for {@link Alarm#isAlarmActivated(AlarmDescriptor)}.
*/
@Test
public final void testIsAlarmActivated() {
when(this.service.isActivated(this.descriptor)).thenReturn(Boolean.TRUE);
when(this.service.create(this.descriptor)).thenReturn(Boolean.TRUE);
when(this.service.setState(this.descriptor, Boolean.TRUE)).thenReturn(Boolean.TRUE);
this.effectiveDelegate.setAlarm(this.descriptor);
this.effectiveDelegate.setStateOfAlarm(this.descriptor, true);
assertTrue("Alarmzeit nicht aktiv!", this.effectiveDelegate.isAlarmActivated(this.descriptor));
}
/**
* Test method for {@link Alarm#removeAlarm(AlarmDescriptor)}.
*/
@Test
public final void testRemoveAlarm() {
this.effectiveDelegate.setAlarm(this.descriptor);
when(this.service.delete(this.descriptor)).thenReturn(true);
assertTrue("Alarmzeit wurde nicht aus der DB entfernt!",
this.effectiveDelegate.removeAlarm(this.descriptor));
}
/**
* Test method for {@link Alarm#setAlarm(AlarmDescriptor)}.
*/
@Test
public final void testSetAlarm() {
Boolean result = Boolean.FALSE;
this.descriptor.getAlarmtime().setMilliSeconds(EXPECTED_MILLISECONDS);
when(this.service.create(this.descriptor)).thenReturn(Boolean.TRUE);
this.effectiveDelegate.setAlarm(this.descriptor);
when(this.service.getAll()).thenReturn(this.list);
result = this.assertThatTimestampIsPresent(this.effectiveDelegate.getAllAlarms(), this.descriptor);
assertTrue("Alarmzeit wurde nicht erzeugt!", result);
}
/**
* Test method for {@link Alarm#setStateOfAlarm(AlarmDescriptor, Boolean)}.
*/
@Test
public final void testSetStateOfAlarm() {
when(this.service.create(this.descriptor)).thenReturn(Boolean.TRUE);
when(this.service.setState(this.descriptor, Boolean.TRUE)).thenReturn(Boolean.TRUE);
when(this.service.isActivated(this.descriptor)).thenReturn(Boolean.TRUE);
this.effectiveDelegate.setAlarm(this.descriptor);
assertTrue(this.effectiveDelegate.setStateOfAlarm(this.descriptor, true));
assertTrue("Aktivierung fehlgeschlagen!", this.effectiveDelegate.isAlarmActivated(this.descriptor));
when(this.service.setState(this.descriptor, Boolean.FALSE)).thenReturn(Boolean.TRUE);
when(this.service.isActivated(this.descriptor)).thenReturn(Boolean.FALSE);
assertTrue(this.effectiveDelegate.setStateOfAlarm(this.descriptor, false));
assertFalse("Deaktivierung fehlgeschlagen!", this.effectiveDelegate.isAlarmActivated(this.descriptor));
}
/**
* Test method for {@link Alarm#Alarm(IAlarmService, int, TimeUnit)}.
*/
@Test(expected = NullArgumentException.class)
public final void testShouldFailBecauseServiceIsNull() {
this.effectiveDelegate = new Alarm(null, 1, TimeUnit.MINUTES);
}
/**
* Test method for {@link Alarm#Alarm(IAlarmService, int, TimeUnit)}.
*/
@Test(expected = NullArgumentException.class)
public final void testShouldFailBecauseTimeUnitIsNull() {
this.effectiveDelegate = new Alarm(null, 1, null);
}
/**
* Test method for {@link Alarm#Alarm(IAlarmService, int, TimeUnit)}.
*/
@Test(expected = ValueMinimumArgumentException.class)
public final void testShouldFailBecauseDelayIsLessThanOne() {
this.effectiveDelegate = new Alarm(this.service, 0, TimeUnit.MINUTES);
}
}