package com.juick.api.tests; import com.juick.Message; import com.juick.Tag; import com.juick.User; import com.juick.api.configuration.ApiAppConfiguration; import com.juick.api.configuration.ApiMvcConfiguration; import com.juick.api.configuration.ApiSecurityConfig; import com.juick.configuration.DataConfiguration; import com.juick.service.MessagesService; import com.juick.service.UserService; import org.apache.commons.lang3.RandomStringUtils; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Primary; import org.springframework.http.MediaType; import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers; import org.springframework.test.context.ContextConfiguration; 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 org.springframework.web.context.WebApplicationContext; import javax.inject.Inject; import java.util.Collections; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.when; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; /** * Created by vitalyster on 25.11.2016. */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @WebAppConfiguration public class MessagesTests { @Configuration @Import(value = {ApiMvcConfiguration.class, ApiAppConfiguration.class, ApiSecurityConfig.class, DataConfiguration.class}) static class Config { @Bean @Primary MessagesService messagesService() { return Mockito.mock(MessagesService.class); } @Bean @Primary UserService userService() { return Mockito.mock(UserService.class); } } private MockMvc mockMvc; @Inject private WebApplicationContext webApplicationContext; @Inject private MessagesService messagesService; @Inject private UserService userService; @Before public void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) .apply(SecurityMockMvcConfigurers.springSecurity()) .dispatchOptions(true) .build(); } @Test public void messageTests() throws Exception { String ugnichName = "ugnich"; String uginchPassword = "MyPassw0rd!"; String msgText = "Привет, я - Угнич"; User user = new User(); user.setName(ugnichName); user.setUid(1); user.setCredentials(uginchPassword); user.setBanned(false); Message msg = new Message(); msg.setMid(1); msg.setUser(user); msg.setText(msgText); msg.setTags(Collections.singletonList(new Tag("yo"))); mockMvc.perform(get("/home")) .andExpect(status().is4xxClientError()); when(userService.getUserByName(ugnichName)) .thenReturn(user); when(userService.getFullyUserByName(ugnichName)) .thenReturn(user); when(messagesService.getMyFeed(1, 0)) .thenReturn(Collections.singletonList(1)); when(messagesService.getMessages(Collections.singletonList(1))) .thenReturn(Collections.singletonList(msg)); mockMvc.perform(get("/home").with(httpBasic(ugnichName, uginchPassword))) .andExpect(status().isOk()) .andExpect(header().string("Access-Control-Allow-Origin", "*")) .andExpect(header().string("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE")) .andExpect(header().string("Access-Control-Allow-Headers", "*")) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(jsonPath("$", hasSize(1))) .andExpect(jsonPath("$[0].mid", is(1))) .andExpect(jsonPath("$[0].body", is(msgText))); String hash = RandomStringUtils.random(16); when(userService.getHashByUID(1)).thenReturn(hash); mockMvc.perform(get("/messages") .param("hash", hash)) .andExpect(status().isOk()); } }