package org.molgenis.security.captcha; import org.molgenis.security.captcha.CaptchaControllerTest.Config; import org.molgenis.util.GsonConfig; import org.molgenis.util.GsonHttpMessageConverter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.http.converter.BufferedImageHttpMessageConverter; import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.awt.image.BufferedImage; 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.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WebAppConfiguration @ContextConfiguration(classes = { Config.class, GsonConfig.class }) public class CaptchaControllerTest extends AbstractTestNGSpringContextTests { @Autowired private CaptchaController captchaController; @Autowired private GsonHttpMessageConverter gsonHttpMessageConverter; private MockMvc mockMvc; @BeforeMethod public void setUp() { mockMvc = MockMvcBuilders.standaloneSetup(captchaController) .setMessageConverters(new BufferedImageHttpMessageConverter(), gsonHttpMessageConverter, new FormHttpMessageConverter()).build(); } @Test public void getCaptcha() throws Exception { this.mockMvc.perform(get("/captcha").accept(MediaType.IMAGE_JPEG)).andExpect(status().isOk()) .andExpect(content().contentType(MediaType.IMAGE_JPEG)); } @Test public void validateCaptcha_valid() throws Exception { this.mockMvc.perform( post("/captcha").content("{\"captcha\":\"captcha_answer\"}").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()).andExpect(content().string("true")); } @Test public void validateCaptcha_invalid() throws Exception { this.mockMvc.perform( post("/captcha").content("{\"captcha\":\"invalid_answer\"}").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()).andExpect(content().string("false")); } @Test public void validateCaptchaFromForm_valid() throws Exception { this.mockMvc.perform( post("/captcha").param("captcha", "captcha_answer").contentType(MediaType.APPLICATION_FORM_URLENCODED)) .andExpect(status().isOk()).andExpect(content().string("true")); } @Test public void validateCaptchaFromForm_invalid() throws Exception { this.mockMvc.perform( post("/captcha").param("captcha", "invalid_answer").contentType(MediaType.APPLICATION_FORM_URLENCODED)) .andExpect(status().isOk()).andExpect(content().string("false")); } @Configuration public static class Config { @Bean public CaptchaController captchaController() { return new CaptchaController(); } @Bean public CaptchaService captchaService() throws CaptchaException { CaptchaService captchaService = mock(CaptchaService.class); when(captchaService.createCaptcha(220, 50)) .thenReturn(new BufferedImage(220, 50, BufferedImage.TYPE_INT_RGB)); when(captchaService.validateCaptcha("captcha_answer")).thenReturn(true); return captchaService; } } }