/*
* Copyright (C) 2014 Jan Pokorsky
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package cz.cas.lib.proarc.common.user;
import cz.cas.lib.proarc.common.CustomTemporaryFolder;
import cz.cas.lib.proarc.common.dao.empiredb.DbUnitSupport;
import cz.cas.lib.proarc.common.dao.empiredb.EmpireDaoFactory;
import cz.cas.lib.proarc.common.dao.empiredb.EmpireUserDaoTest;
import cz.cas.lib.proarc.common.fedora.FedoraTestSupport;
import cz.cas.lib.proarc.common.fedora.RemoteStorage;
import java.sql.Connection;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Collections;
import javax.sql.DataSource;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.CompositeDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ReplacementDataSet;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import org.junit.After;
import org.junit.AfterClass;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
/**
* Integration tests.
*
* @author Jan Pokorsky
*/
public class UserManagerSqlTest {
@Rule
public CustomTemporaryFolder temp = new CustomTemporaryFolder(true);
private DbUnitSupport db;
private FedoraTestSupport fedora;
private RemoteStorage remoteStorage;
private UserManagerSql manager;
public UserManagerSqlTest() {
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() throws Exception {
// fedora init
fedora = new FedoraTestSupport();
fedora.cleanUp();
remoteStorage = fedora.getRemoteStorage();
// rdbms init
db = new DbUnitSupport();
EmpireDaoFactory daos = new EmpireDaoFactory(db.getEmireCfg());
daos.init();
DataSource dataSource = EasyMock.createMock(DataSource.class);
EasyMock.expect(dataSource.getConnection()).andAnswer(new IAnswer<Connection>() {
@Override
public Connection answer() throws Throwable {
return db.getEmireCfg().getConnection();
}
}).anyTimes();
IDataSet database = database(
// XXX related fedora objects do not exist!
db.loadFlatXmlDataStream(EmpireUserDaoTest.class, "user.xml")
// db.loadFlatXmlDataStream(getClass(), "group.xml")
);
final IDatabaseConnection con = db.getConnection();
try {
db.cleanInsert(con, database);
db.initSequences(con.getConnection(), 10, db.getEmireCfg().getSchema().tableUser.id.getSequenceName());
db.initSequences(con.getConnection(), 10, db.getEmireCfg().getSchema().tableUserGroup.id.getSequenceName());
con.getConnection().commit();
} finally {
con.getConnection().close();
}
EasyMock.replay(dataSource);
manager = new UserManagerSql(dataSource, temp.getRoot(), remoteStorage, daos);
}
@After
public void tearDown() {
}
private IDataSet database(IDataSet... ds) throws Exception {
ReplacementDataSet rds = new ReplacementDataSet(new CompositeDataSet(ds));
rds.addReplacementObject("{$user.home}", "relative/path/");
rds.addReplacementObject("{$now}", new Timestamp(System.currentTimeMillis()));
return rds;
}
@Test
public void testAddUser() {
String userName = "datel";
String passwd = "123456";
// proarc user
UserProfile user = UserProfile.create(userName, passwd, "Datel");
user.setEmail("email@somewhere");
manager.add(user, Collections.<Group>emptyList(), fedora.getTestUser(), "add user");
assertNotNull(user.getId());
assertNull(user.getUserPassword());
// set permissions
manager.setPermissions(user.getUserGroup(), Permissions.ADMIN);
// authentication
UserProfile authenticate = manager.authenticate(userName, passwd);
assertNotNull(authenticate);
assertEquals(userName, authenticate.getUserName());
assertNull(authenticate.getUserPassword());
// invalid authentication
authenticate = manager.authenticate(userName, "invalid");
assertNull(authenticate);
}
@Test
public void testAddRemoteUser() {
String remoteType = "desa";
String remoteGroupName = "producer";
String remoteUserName = "desa_user";
Group group = manager.findRemoteGroup(remoteGroupName, remoteType);
if (group == null) {
group = Group.createRemote(
UserUtil.toUserName("desa", remoteGroupName),
remoteGroupName, remoteGroupName, remoteType);
manager.addGroup(group, Arrays.asList(Permissions.REPO_SEARCH_GROUPOWNER),
fedora.getTestUser(), "add remote group");
}
UserProfile user = manager.find(remoteUserName, remoteType);
if (user == null) {
user = UserProfile.createRemote(remoteUserName, remoteType, "Datel");
user.setEmail("email@somewhere");
user.setUserName(UserUtil.toUserName("desa", remoteUserName));
user.setDefaultGroup(group.getId());
manager.add(user, Arrays.asList(group), fedora.getTestUser(), "add remote user");
}
}
}