package org.appfuse.webapp.controller;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.appfuse.model.User;
import org.appfuse.service.UserManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.context.support.StaticApplicationContext;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import java.util.HashMap;
import java.util.Map;
import static org.hamcrest.Matchers.hasProperty;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.*;
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.*;
@RunWith(MockitoJUnitRunner.class)
public class UserFormControllerTest {
final Log log = LogFactory.getLog(UserFormControllerTest.class);
@InjectMocks
private UserFormController controller;
@Mock
private UserManager userManager;
private MockMvc mockMvc;
private User user;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/");
viewResolver.setSuffix(".jsp");
mockMvc = MockMvcBuilders.standaloneSetup(controller).setViewResolvers(viewResolver).build();
// Set messages to avoid NPE when controller calls getMessageSourceAccessor().getMessage()
StaticApplicationContext ctx = new StaticApplicationContext();
Map<String, String> properties = new HashMap<>();
properties.put("basename", "messages");
ctx.registerSingleton("messageSource", ResourceBundleMessageSource.class,
new MutablePropertyValues(properties));
ctx.refresh();
controller.setMessages((MessageSource) ctx.getBean("messageSource"));
// setup user values
user = new User();
user.setId(1L);
user.setFirstName("Matt");
user.setLastName("Raible");
}
@Test
public void testEdit() throws Exception {
log.debug("testing edit...");
// set expected behavior on manager
when(userManager.getUser("1")).thenReturn(user);
mockMvc.perform(get("/userform").param("id", "1"))
.andExpect(status().isOk())
.andExpect(model().attributeExists("user"))
.andExpect(model().attribute("user", hasProperty("firstName", is("Matt"))))
.andExpect(view().name("userform"));
verify(userManager, times(1)).getUser("1");
}
@Test
public void testSave() throws Exception {
final User savedUser = user;
savedUser.setLastName("Updated Last Name");
ResultActions update = mockMvc.perform(post("/userform").param("user.lastName", savedUser.getLastName()))
.andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl("users"));
MvcResult result = update.andReturn();
MockHttpSession session = (MockHttpSession) result.getRequest().getSession();
assertNotNull("success message is null", session.getAttribute(BaseFormController.MESSAGES_KEY));
verify(userManager, times(1)).saveUser(savedUser);
}
@Test
public void testRemove() throws Exception {
ResultActions update = mockMvc.perform(post("/userform")
.param("id", user.getId().toString())
.param("delete", ""))
.andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl("users"));
MvcResult result = update.andReturn();
MockHttpSession session = (MockHttpSession) result.getRequest().getSession();
assertNotNull("success message is null", session.getAttribute(BaseFormController.MESSAGES_KEY));
verify(userManager, times(1)).removeUser("1");
}
}