package springmvc.controller;
import bsh.ParseException;
import springmvc.model.Member;
import javax.servlet.http.HttpServletRequest;
import org.hamcrest.Matcher;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.hamcrest.core.IsNot.not;
import static org.hamcrest.text.IsEmptyString.isEmptyOrNullString;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.TestingAuthenticationToken;
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 static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
import org.springframework.test.util.JsonPathExpectationsHelper;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultMatcher;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import org.springframework.web.context.WebApplicationContext;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import springdao.DaoManager;
import springdao.RepositoryManager;
/**
*
* @author kent
*/
@WebAppConfiguration
@ContextConfiguration(classes = springmvc.context.TestContext.class)
public class TestDefaultController extends AbstractTestNGSpringContextTests {
private static Logger logger = LogManager.getLogger(TestDefaultController.class);
@Autowired
WebApplicationContext wac;
private MockMvc mockMvc;
@DaoManager
private RepositoryManager<Member> memberManager;
@BeforeClass
public void setup() {
this.mockMvc = webAppContextSetup(this.wac).alwaysExpect(status().isOk()).build();
}
@Test
void testDevice() throws Exception {
MvcResult mvcResult =mockMvc.perform(get("/").param("device", "mobile")).andExpect(request().asyncStarted())
.andExpect(request().asyncResult("index")).andReturn();
mockMvc.perform(asyncDispatch(mvcResult)).andExpect(model().attribute("device", is(equalTo("mobile"))));
}
public <T> ResultMatcher asyncJsonPath(final String expression, final Matcher<T> matcher) {
return new ResultMatcher() {
@Override
public void match(MvcResult result) throws ParseException, java.text.ParseException {
HttpServletRequest request = result.getRequest();
assertThat("Async not started.", request.isAsyncStarted());
Object res = result.getAsyncResult();
assertThat("Not string return.", res, is(instanceOf(String.class)));
new JsonPathExpectationsHelper(expression).assertValue((String) res, matcher);
}
};
}
@Test
public void testListuser() throws Exception {
String ql = new StringBuilder("SELECT COUNT(").append(memberManager.getAliasName()).append(") FROM ")
.append(memberManager.getEntityName()).append(" AS ").append(memberManager.getAliasName())
.append(" WHERE ").append(memberManager.getAliasName()).append(".enabled=?1").toString();
int count = memberManager.findUniqueByQL(Long.class, ql, "Y").intValue();
mockMvc.perform(post("/admin/users")).andExpect(request().asyncStarted())
.andExpect(asyncJsonPath("$.total", is(equalTo(count)))).andDo(print());
}
@Test
public void testMyinfo() throws Exception {
MvcResult mvcResult = mockMvc.perform(post("/user/myinfo").principal(new TestingAuthenticationToken("admin", null)))
.andExpect(request().asyncStarted()).andExpect(request().asyncResult(is(not(isEmptyOrNullString())))).andReturn();
mvcResult = mockMvc.perform(asyncDispatch(mvcResult)).andReturn();
Member member = (Member) mvcResult.getRequest().getAttribute("member");
logger.debug("My account is \"{}\" and my name is {}", member.getId(), member.getName());
assertThat("Test UserInfo error ", "admin", is(equalTo(member.getId())));
}
@Test
public void testUserInfo() throws Exception {
MvcResult mvcResult = mockMvc.perform(post("/admin/user/{account}", "admin"))
.andExpect(request().asyncStarted()).andExpect(request().asyncResult(is(not(isEmptyOrNullString())))).andReturn();
mvcResult = mockMvc.perform(asyncDispatch(mvcResult)).andReturn();
Member member = (Member) mvcResult.getRequest().getAttribute("member");
logger.debug("account \"{}\" name is {}", member.getId(), member.getName());
assertThat("Test UserInfo error ", "admin", is(equalTo(member.getId())));
}
}