package org.apereo.cas.adaptors.jdbc; import org.apereo.cas.authentication.CoreAuthenticationTestUtils; import org.apereo.cas.authentication.UsernamePasswordCredential; import org.junit.After; 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.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.security.auth.login.FailedLoginException; import javax.sql.DataSource; import java.sql.Connection; import java.sql.Statement; import static org.junit.Assert.*; /** * Tests for {@link SearchModeSearchDatabaseAuthenticationHandler}. * * @author Misagh Moayyed mmoayyed@unicon.net * @since 4.0.0 */ @RunWith(SpringRunner.class) @SpringBootTest(classes = {RefreshAutoConfiguration.class}) @ContextConfiguration(locations = {"classpath:/jpaTestApplicationContext.xml"}) public class SearchModeSearchDatabaseAuthenticationHandlerTests { @Rule public ExpectedException thrown = ExpectedException.none(); private SearchModeSearchDatabaseAuthenticationHandler handler; @Autowired @Qualifier("dataSource") private DataSource dataSource; @Before public void setUp() throws Exception { this.handler = new SearchModeSearchDatabaseAuthenticationHandler("", null, null, null, this.dataSource, "username", "password", "cassearchusers"); final Connection c = this.dataSource.getConnection(); final Statement s = c.createStatement(); c.setAutoCommit(true); s.execute(getSqlInsertStatementToCreateUserAccount(0)); for (int i = 0; i < 10; i++) { s.execute(getSqlInsertStatementToCreateUserAccount(i)); } c.close(); } @After public void tearDown() throws Exception { final Connection c = this.dataSource.getConnection(); final Statement s = c.createStatement(); c.setAutoCommit(true); for (int i = 0; i < 5; i++) { s.execute("delete from casusers;"); } c.close(); } private static String getSqlInsertStatementToCreateUserAccount(final int i) { return String.format("insert into cassearchusers (username, password) values('%s', '%s');", "user" + i, "psw" + i); } @Entity(name = "cassearchusers") public static class UsersTable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; } @Test public void verifyNotFoundUser() throws Exception { final UsernamePasswordCredential c = CoreAuthenticationTestUtils.getCredentialsWithDifferentUsernameAndPassword("hello", "world"); this.thrown.expect(FailedLoginException.class); this.thrown.expectMessage("hello not found with SQL query."); this.handler.authenticate(c); } @Test public void verifyFoundUser() throws Exception { final UsernamePasswordCredential c = CoreAuthenticationTestUtils.getCredentialsWithDifferentUsernameAndPassword("user3", "psw3"); assertNotNull(this.handler.authenticate(c)); } @Test public void verifyMultipleUsersFound() throws Exception { final UsernamePasswordCredential c = CoreAuthenticationTestUtils.getCredentialsWithDifferentUsernameAndPassword("user0", "psw0"); assertNotNull(this.handler.authenticate(c)); } }