package ch.alv.components.iam.service; import ch.alv.components.iam.model.Role; import ch.alv.components.iam.model.User; import ch.alv.components.service.ServiceLayerException; 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.*; /** * Test cases for the {@link ch.alv.components.service.ServiceRegistry} class. * * @since 1.0.0 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/default-user-service-test-context.xml") @SuppressWarnings("unchecked") public class DefaultUserServiceTest { 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 UserService service; private User user; private Authentication auth; @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); auth = new TestAuthentication(user); } @Test public void testGetCurrentUser() { SecurityContextHolder.getContext().setAuthentication(auth); User currentUser = service.getCurrentUser(); assertEquals(user.getId(), currentUser.getId()); assertEquals(2, currentUser.getAuthorities().size()); } @Test public void testGetCurrentUserNoAuthentication() { SecurityContextHolder.getContext().setAuthentication(null); assertNull(service.getCurrentUser()); } @Test public void testGetCurrentUserNoUserDetail() { SecurityContextHolder.getContext().setAuthentication(new TestAuthentication("UserDetails")); assertNull(service.getCurrentUser()); } @Test public void testHasRole() { SecurityContextHolder.getContext().setAuthentication(auth); assertTrue(service.hasRole("ROLE_ADMIN")); assertFalse(service.hasRole("ROLE_NONE")); } @Test public void testHasAnyRole() { SecurityContextHolder.getContext().setAuthentication(auth); assertTrue(service.hasAnyRole(new String[]{"ROLE", "ROLE_ADMIN"})); assertFalse(service.hasAnyRole(new String[]{"ROLE_NONE", "ROLE_ADM"})); } @Test public void testHasAllRoles() { SecurityContextHolder.getContext().setAuthentication(auth); assertTrue(service.hasAllRoles(new String[]{"ROLE_TEST", "ROLE_ADMIN"})); assertFalse(service.hasAllRoles(new String[]{"ROLE_TEST", "ROLE_ADMIN", "ROLE_NONE"})); } @Test public void testLoadUserByUsername() throws ServiceLayerException { SecurityContextHolder.getContext().setAuthentication(auth); User user = new User(); user.setUsername("testUser"); user.setFirstName("testFirstName"); user.setLastName("testLastName"); service.save(user, User.class); assertEquals("testUser", service.loadUserByUsername("testUser").getUsername()); assertNull("testUser", service.loadUserByUsername("unknownUser")); } public class TestAuthentication implements Authentication { private static final long serialVersionUID = -3498912841097406310L; 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 = -3589771667894556779L; @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; } } }