package fr.ippon.tatami.web.rest;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import fr.ippon.tatami.AbstractCassandraTatamiTest;
import fr.ippon.tatami.domain.User;
import fr.ippon.tatami.security.AuthenticationService;
import fr.ippon.tatami.service.GroupService;
import fr.ippon.tatami.service.StatusUpdateService;
import fr.ippon.tatami.service.TimelineService;
import fr.ippon.tatami.service.dto.StatusDTO;
import org.junit.Before;
import org.junit.Test;
import org.springframework.http.MediaType;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import javax.inject.Inject;
import java.util.Collection;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
public class TimelineControllerTest extends AbstractCassandraTatamiTest {
@Inject
private TimelineService timelineService;
@Inject
private StatusUpdateService statusUpdateService;
@Inject
private GroupService groupService;
private MockMvc mockMvc;
private static final String username = "timelineUser";
@Before
public void setup() {
TimelineController timelineController = new TimelineController();
ReflectionTestUtils.setField(timelineController, "timelineService", timelineService);
ReflectionTestUtils.setField(timelineController, "statusUpdateService", statusUpdateService);
ReflectionTestUtils.setField(timelineController, "groupService", groupService);
User authenticateUser = constructAUser(username + "@ippon.fr");
AuthenticationService mockAuthenticationService = mock(AuthenticationService.class);
when(mockAuthenticationService.getCurrentUser()).thenReturn(authenticateUser);
ReflectionTestUtils.setField(timelineController, "authenticationService", mockAuthenticationService);
ReflectionTestUtils.setField(timelineService, "authenticationService", mockAuthenticationService);
ReflectionTestUtils.setField(statusUpdateService, "authenticationService", mockAuthenticationService);
this.mockMvc = MockMvcBuilders.standaloneSetup(timelineController).build();
}
@Test
public void testStatusUpdate() throws Exception {
mockMvc.perform(post("/rest/statuses/")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"content\":\"Test status with Spring TestContext\"}"))
.andExpect(status().isOk());
mockMvc.perform(get("/rest/statuses/home_timeline")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType("application/json"))
.andExpect(jsonPath("$.[0].content").value("Test status with Spring TestContext"));
mockMvc.perform(get("/rest/statuses/" + username + "/timeline")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType("application/json"))
.andExpect(jsonPath("$.[0].content").value("Test status with Spring TestContext"));
}
@Test
public void testStatusReply() throws Exception {
//Create status
mockMvc.perform(post("/rest/statuses/")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"content\":\"Test discussion\"}"))
.andExpect(status().isOk());
String statusAsJson = mockMvc.perform(get("/rest/statuses/home_timeline")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType("application/json"))
.andReturn().getResponse().getContentAsString();
Collection<StatusDTO> statusDTOs = new ObjectMapper().readValue(statusAsJson,
new TypeReference<List<StatusDTO>>() {
});
String statusId = statusDTOs.iterator().next().getStatusId();
mockMvc.perform(post("/rest/statuses/")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"replyTo\":\"" + statusId + "\", \"content\":\"Reply discussion\"}"))
.andExpect(status().isOk());
String replyAsJson = mockMvc.perform(get("/rest/statuses/home_timeline")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType("application/json"))
.andReturn().getResponse().getContentAsString();
statusDTOs = new ObjectMapper().readValue(replyAsJson,
new TypeReference<List<StatusDTO>>() {
});
StatusDTO statusDTO = statusDTOs.iterator().next();
assertEquals("Reply discussion", statusDTO.getContent());
assertEquals(statusId, statusDTO.getReplyTo());
}
}