package ch.alv.components.iam.controller;
import ch.alv.components.iam.dto.CurrentUserDto;
import ch.alv.components.iam.model.Role;
import ch.alv.components.iam.model.User;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static org.junit.Assert.assertEquals;
/**
* Test cases for the {@link ch.alv.components.service.ServiceRegistry} class.
*
* @since 1.0.0
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/authentication-controller-test-context.xml")
public class AuthenticationControllerTest {
public static final String ROLE_ADMIN = "ROLE_ADMIN";
public static final String ROLE_USER = "ROLE_USER";
public static final String TEST_PASSWORD = "testPassword";
public static final String TEST_USER_NAME = "testUserName";
@Rule
public ExpectedException exception = ExpectedException.none();
@Resource
private AuthenticationController controller;
private User user;
@Before
public void initAuthentication() {
user = new TestUserDetails();
user.setId("user_id");
List<Role> roles = new ArrayList<>();
Role role = new Role();
role.setName("ROLE_ADMIN");
Role role2 = new Role();
role2.setName("ROLE_TEST");
roles.add(role);
roles.add(role2);
user.setRoles(roles);
Authentication auth = new TestAuthentication(user);
SecurityContextHolder.getContext().setAuthentication(auth);
}
@Test
public void testHandleRequest() {
CurrentUserDto dto = controller.handleRequest();
assertEquals(user.getId(), dto.getId());
}
public class TestAuthentication implements Authentication {
private static final long serialVersionUID = -6531125232265200644L;
private final Object user;
public TestAuthentication(Object user) {
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
if (user instanceof UserDetails) {
return ((UserDetails) user).getAuthorities();
}
return null;
}
@Override
public Object getCredentials() {
if (user instanceof UserDetails) {
return ((UserDetails) user).getPassword();
}
return null;
}
@Override
public Object getDetails() {
return user;
}
@Override
public Object getPrincipal() {
if (user instanceof UserDetails) {
return ((UserDetails) user).getUsername();
}
return null;
}
@Override
public boolean isAuthenticated() {
return true;
}
@Override
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
// nothing to do
}
@Override
public String getName() {
if (user instanceof UserDetails) {
return ((UserDetails) user).getUsername();
}
return null;
}
}
public class TestUserDetails extends User implements UserDetails {
private static final long serialVersionUID = -2731366248185805670L;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority(ROLE_ADMIN));
authorities.add(new SimpleGrantedAuthority(ROLE_USER));
return authorities;
}
@Override
public String getPassword() {
return TEST_PASSWORD;
}
@Override
public String getUsername() {
return TEST_USER_NAME;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
}