package ee.esutoniagodesu.web.rest;
import ee.esutoniagodesu.Application;
import ee.esutoniagodesu.security.AuthoritiesConstants;
import ee.esutoniagodesu.security.SecurityUtils;
import junit.framework.TestCase;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.IntegrationTest;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.FilterChainProxy;
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
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.annotation.Resource;
import javax.inject.Inject;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.io.Serializable;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
public class WebappTestEnvironment {
@Resource
private FilterChainProxy springSecurityFilterChain;
@Inject
protected UserDetailsService userDetailsService;
@Inject
private WebApplicationContext webApplicationContext;
@Inject
protected DataSource dataSource;
protected MockMvc mockMvc;
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
public static class MockSecurityContext implements SecurityContext, Serializable {
private static final long serialVersionUID = -1386535243513362694L;
private Authentication authentication;
public MockSecurityContext(Authentication authentication) {
this.authentication = authentication;
}
@Override
public Authentication getAuthentication() {
return this.authentication;
}
@Override
public void setAuthentication(Authentication authentication) {
this.authentication = authentication;
}
}
protected MockHttpSession session;
protected UsernamePasswordAuthenticationToken principal;
protected UsernamePasswordAuthenticationToken getPrincipal(String username) {
UserDetails user = this.userDetailsService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(
user,
user.getPassword(),
user.getAuthorities());
return authentication;
}
protected void setSession(String username) throws Exception {
principal = getPrincipal(username);
session = new MockHttpSession();
session.setAttribute(
HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,
new MockSecurityContext(principal)
);
UserDetails user = userDetailsService.loadUserByUsername(username);
Authentication newAuth = new UsernamePasswordAuthenticationToken(user, username, user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(newAuth);
TestCase.assertTrue(SecurityUtils.isAuthenticated());
TestCase.assertEquals(SecurityUtils.getUserUuid(), username);
TestCase.assertTrue(SecurityUtils.isUserInRole(AuthoritiesConstants.ADMIN));
/*
MvcResult mvcresult = mockMvc
.perform(
get("/oauth/token")
.principal(principal)).andDo(print())
.andExpect(status().isOk()).andReturn();
MockHttpServletRequest mockhttp = mvcresult.getRequest();
System.out.println(mockhttp.toString());
//*/
}
@Before
public void setupMockMvc() throws NamingException {
this.mockMvc = MockMvcBuilders
.webAppContextSetup(webApplicationContext)
.addFilters(springSecurityFilterChain)
.build();
}
}