package com.piggymetrics.notification.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
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 com.piggymetrics.notification.service.RecipientService;
import com.sun.security.auth.UserPrincipal;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = NotificationServiceApplication.class)
@WebAppConfiguration
public class RecipientControllerTest {
private static final ObjectMapper mapper = new ObjectMapper();
@InjectMocks
private RecipientController recipientController;
@Mock
private RecipientService recipientService;
private MockMvc mockMvc;
@Before
public void setup() {
initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(recipientController).build();
}
@Test
public void shouldSaveCurrentRecipientSettings() throws Exception {
Recipient recipient = getStubRecipient();
String json = mapper.writeValueAsString(recipient);
mockMvc.perform(put("/recipients/current").principal(new UserPrincipal(recipient.getAccountName())).contentType(MediaType.APPLICATION_JSON).content(json))
.andExpect(status().isOk());
}
@Test
public void shouldGetCurrentRecipientSettings() throws Exception {
Recipient recipient = getStubRecipient();
when(recipientService.findByAccountName(recipient.getAccountName())).thenReturn(recipient);
mockMvc.perform(get("/recipients/current").principal(new UserPrincipal(recipient.getAccountName())))
.andExpect(jsonPath("$.accountName").value(recipient.getAccountName()))
.andExpect(status().isOk());
}
private Recipient getStubRecipient() {
NotificationSettings remind = new NotificationSettings();
remind.setActive(true);
remind.setFrequency(Frequency.WEEKLY);
remind.setLastNotified(null);
NotificationSettings backup = new NotificationSettings();
backup.setActive(false);
backup.setFrequency(Frequency.MONTHLY);
backup.setLastNotified(null);
Recipient recipient = new Recipient();
recipient.setAccountName("test");
recipient.setEmail("test@test.com");
recipient.setScheduledNotifications(ImmutableMap.of(
NotificationType.BACKUP, backup,
NotificationType.REMIND, remind
));
return recipient;
}
}