package com.piggymetrics.notification.repository;
import com.google.common.collect.ImmutableMap;
import com.piggymetrics.notification.NotificationServiceApplication;
import com.piggymetrics.notification.domain.Frequency;
import com.piggymetrics.notification.domain.NotificationSettings;
import com.piggymetrics.notification.domain.NotificationType;
import com.piggymetrics.notification.domain.Recipient;
import org.apache.commons.lang.time.DateUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Date;
import java.util.List;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = NotificationServiceApplication.class)
public class RecipientRepositoryTest {
@Autowired
private RecipientRepository repository;
@Test
public void shouldFindByAccountName() {
NotificationSettings remind = new NotificationSettings();
remind.setActive(true);
remind.setFrequency(Frequency.WEEKLY);
remind.setLastNotified(new Date(0));
NotificationSettings backup = new NotificationSettings();
backup.setActive(false);
backup.setFrequency(Frequency.MONTHLY);
backup.setLastNotified(new Date());
Recipient recipient = new Recipient();
recipient.setAccountName("test");
recipient.setEmail("test@test.com");
recipient.setScheduledNotifications(ImmutableMap.of(
NotificationType.BACKUP, backup,
NotificationType.REMIND, remind
));
repository.save(recipient);
Recipient found = repository.findByAccountName(recipient.getAccountName());
assertEquals(recipient.getAccountName(), found.getAccountName());
assertEquals(recipient.getEmail(), found.getEmail());
assertEquals(recipient.getScheduledNotifications().get(NotificationType.BACKUP).getActive(),
found.getScheduledNotifications().get(NotificationType.BACKUP).getActive());
assertEquals(recipient.getScheduledNotifications().get(NotificationType.BACKUP).getFrequency(),
found.getScheduledNotifications().get(NotificationType.BACKUP).getFrequency());
assertEquals(recipient.getScheduledNotifications().get(NotificationType.BACKUP).getLastNotified(),
found.getScheduledNotifications().get(NotificationType.BACKUP).getLastNotified());
assertEquals(recipient.getScheduledNotifications().get(NotificationType.REMIND).getActive(),
found.getScheduledNotifications().get(NotificationType.REMIND).getActive());
assertEquals(recipient.getScheduledNotifications().get(NotificationType.REMIND).getFrequency(),
found.getScheduledNotifications().get(NotificationType.REMIND).getFrequency());
assertEquals(recipient.getScheduledNotifications().get(NotificationType.REMIND).getLastNotified(),
found.getScheduledNotifications().get(NotificationType.REMIND).getLastNotified());
}
@Test
public void shouldFindReadyForRemindWhenFrequencyIsWeeklyAndLastNotifiedWas8DaysAgo() {
NotificationSettings remind = new NotificationSettings();
remind.setActive(true);
remind.setFrequency(Frequency.WEEKLY);
remind.setLastNotified(DateUtils.addDays(new Date(), -8));
Recipient recipient = new Recipient();
recipient.setAccountName("test");
recipient.setEmail("test@test.com");
recipient.setScheduledNotifications(ImmutableMap.of(
NotificationType.REMIND, remind
));
repository.save(recipient);
List<Recipient> found = repository.findReadyForRemind();
assertFalse(found.isEmpty());
}
@Test
public void shouldNotFindReadyForRemindWhenFrequencyIsWeeklyAndLastNotifiedWasYesterday() {
NotificationSettings remind = new NotificationSettings();
remind.setActive(true);
remind.setFrequency(Frequency.WEEKLY);
remind.setLastNotified(DateUtils.addDays(new Date(), -1));
Recipient recipient = new Recipient();
recipient.setAccountName("test");
recipient.setEmail("test@test.com");
recipient.setScheduledNotifications(ImmutableMap.of(
NotificationType.REMIND, remind
));
repository.save(recipient);
List<Recipient> found = repository.findReadyForRemind();
assertTrue(found.isEmpty());
}
@Test
public void shouldNotFindReadyForRemindWhenNotificationIsNotActive() {
NotificationSettings remind = new NotificationSettings();
remind.setActive(false);
remind.setFrequency(Frequency.WEEKLY);
remind.setLastNotified(DateUtils.addDays(new Date(), -30));
Recipient recipient = new Recipient();
recipient.setAccountName("test");
recipient.setEmail("test@test.com");
recipient.setScheduledNotifications(ImmutableMap.of(
NotificationType.REMIND, remind
));
repository.save(recipient);
List<Recipient> found = repository.findReadyForRemind();
assertTrue(found.isEmpty());
}
@Test
public void shouldNotFindReadyForBackupWhenFrequencyIsQuaterly() {
NotificationSettings remind = new NotificationSettings();
remind.setActive(true);
remind.setFrequency(Frequency.QUARTERLY);
remind.setLastNotified(DateUtils.addDays(new Date(), -91));
Recipient recipient = new Recipient();
recipient.setAccountName("test");
recipient.setEmail("test@test.com");
recipient.setScheduledNotifications(ImmutableMap.of(
NotificationType.BACKUP, remind
));
repository.save(recipient);
List<Recipient> found = repository.findReadyForBackup();
assertFalse(found.isEmpty());
}
}