/*
* Copyright 2009-2012 by KNURT Systeme (http://www.knurt.de)
*
* Licensed under the Creative Commons License Attribution-NonCommercial-ShareAlike 3.0 Unported;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://creativecommons.org/licenses/by-nc-sa/3.0/
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.knurt.fam.test.unit.persistence;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Calendar;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import de.knurt.fam.core.aspects.security.auth.FamAuth;
import de.knurt.fam.core.model.persist.LogbookEntry;
import de.knurt.fam.core.model.persist.User;
import de.knurt.fam.core.model.persist.booking.Booking;
import de.knurt.fam.core.model.persist.booking.TimeBooking;
import de.knurt.fam.core.model.persist.document.Job;
import de.knurt.fam.core.persistence.dao.FamDaoProxy;
import de.knurt.fam.core.persistence.dao.couchdb.FamCouchDBDao;
import de.knurt.fam.template.controller.json.DeleteUserFromUsersManagerController;
import de.knurt.fam.test.utils.FamIBatisTezt;
import de.knurt.fam.test.utils.TeztBeanSimpleFactory;
/**
*
* @author Daniel Oltmanns <info@knurt.de>
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/test-dependencies.xml" })
public class DeleteUserTest extends FamIBatisTezt {
private static DeleteUserMock mockAdmin() {
return new DeleteUserMock(TeztBeanSimpleFactory.getAdmin());
}
@Test
public void noAdminThere() {
this.clearDatabase();
User user = TeztBeanSimpleFactory.getNewValidUser();
user.insert();
assertFalse(FamAuth.hasRight(user, FamAuth.DELETE_USERS_DATA, null));
assertFalse(new DeleteUserMock(user).totalDestroy(user));
}
@Test
public void generatingNiceFailMessages() {
this.clearDatabase();
User user = TeztBeanSimpleFactory.getNewValidUser();
user.insert();
assertFalse(FamAuth.hasRight(user, FamAuth.DELETE_USERS_DATA, null));
DeleteUserMock dmock = new DeleteUserMock(user);
dmock.putUserToTrash(user);
assertNotNull(dmock.getMessages());
assertEquals(1, dmock.getMessages().length());
try {
assertNotNull(dmock.getMessages().getJSONObject(0).get("0"));
} catch (JSONException e) {
fail("Should not throw " + e);
}
}
@Test
public void generatingNiceSuccMessages() {
this.clearDatabase();
User user = TeztBeanSimpleFactory.getNewValidUser();
user.insert();
assertFalse(FamAuth.hasRight(user, FamAuth.DELETE_USERS_DATA, null));
DeleteUserMock dmock = mockAdmin();
assertNotNull(dmock.getMessages());
dmock.putUserToTrash(user);
assertEquals(1, dmock.getMessages().length());
try {
assertNotNull(dmock.getMessages().getJSONObject(0).get("1"));
} catch (JSONException e) {
fail("Should not throw " + e);
}
}
@Test
public void moveToTrash() {
this.clearDatabase();
User u = TeztBeanSimpleFactory.getNewValidUser();
u.insert();
assertFalse(u.isExcluded());
assertTrue(mockAdmin().putUserToTrash(u));
assertTrue(u.isExcluded());
}
@Test
public void destroyUser() {
this.clearDatabase();
User user1 = TeztBeanSimpleFactory.getNewValidUser();
String username = user1.getUsername();
user1.insert();
Job job1 = this.insertJob(user1);
LogbookEntry logbookEntry1 = this.insertLogbookEntry(user1);
assertNotNull(user1);
assertNotNull(job1);
assertNotNull(logbookEntry1);
assertTrue(FamDaoProxy.jobsDao().getJobs(user1, true).size() > 0);
assertTrue(FamDaoProxy.bookingDao().getAllBookingsOfUser(user1).size() > 0);
assertTrue(FamDaoProxy.logbookEntryDao().getAllLogbookEntriesOfUser(user1).size() > 0);
User user2 = TeztBeanSimpleFactory.getNewValidUser();
user2.setUniqueUsernameForInsertion();
user2.setMail("mail_2@la.le");
user2.insert();
Job job2 = this.insertJob(user2);
LogbookEntry logbookEntry2 = this.insertLogbookEntry(user2);
assertNotNull(user2);
assertNotNull(job2);
assertNotNull(logbookEntry2);
assertTrue(FamDaoProxy.jobsDao().getJobs(user2, true).size() > 0);
assertTrue(FamDaoProxy.bookingDao().getAllBookingsOfUser(user2).size() > 0);
assertTrue(FamDaoProxy.logbookEntryDao().getAllLogbookEntriesOfUser(user2).size() > 0);
assertTrue(mockAdmin().totalDestroy(user1));
assertNull(FamDaoProxy.userDao().getUserFromUsername(username));
assertEquals(0, FamDaoProxy.jobsDao().getJobs(user1, true).size());
assertEquals(0, FamDaoProxy.bookingDao().getAllBookingsOfUser(user1).size());
assertEquals(0, FamDaoProxy.logbookEntryDao().getAllLogbookEntriesOfUser(user1).size());
assertTrue(FamDaoProxy.jobsDao().getJobs(user2, true).size() > 0);
assertTrue(FamDaoProxy.bookingDao().getAllBookingsOfUser(user2).size() > 0);
assertTrue(FamDaoProxy.logbookEntryDao().getAllLogbookEntriesOfUser(user2).size() > 0);
}
@Test
public void trashAndAnonym() {
this.clearDatabase();
User u = TeztBeanSimpleFactory.getNewValidUser();
String originalUsername = u.getUsername();
String anonymUsername = "anonym";
u.insert();
Job job = this.insertJob(u);
LogbookEntry logbookEntry = this.insertLogbookEntry(u);
assertNotNull(u);
assertNotNull(job);
assertNotNull(logbookEntry);
assertTrue(mockAdmin().putUserToTrashAndAnonym(u));
assertNotNull(u);
assertNotNull(job);
assertNotNull(logbookEntry);
assertFalse(u.getUsername().equals(originalUsername));
assertEquals(anonymUsername, u.getUsername());
assertNull(FamDaoProxy.userDao().getUserFromUsername(originalUsername));
User back = FamDaoProxy.userDao().getUserFromUsername(anonymUsername);
assertNotNull(back);
// check data
boolean entryStillExists = false;
for (LogbookEntry le : FamDaoProxy.logbookEntryDao().getAll()) {
assertFalse(le.getOfUserName().equals(originalUsername));
if (le.getOfUserName().equals(anonymUsername)) {
entryStillExists = true;
}
}
assertTrue(entryStillExists);
entryStillExists = false;
for (Booking b : FamDaoProxy.bookingDao().getAll()) {
assertFalse(b.getUsername().equals(originalUsername));
if (b.getUsername().equals(anonymUsername)) {
entryStillExists = true;
}
}
assertTrue(entryStillExists);
entryStillExists = false;
for (Job j : FamDaoProxy.jobsDao().getJobs(u, false)) {
assertFalse(j.getUsername().equals(originalUsername));
if (j.getUsername().equals(anonymUsername)) {
entryStillExists = true;
}
}
assertTrue(entryStillExists);
}
@Test
public void adminNotDeletable() {
this.clearDatabase();
User u = TeztBeanSimpleFactory.getAdmin();
u.insert();
assertFalse(mockAdmin().putUserToTrash(u));
assertFalse(mockAdmin().putUserToTrashAndAnonym(u));
assertFalse(mockAdmin().putUserToTrashAndAnonymizeAndDeleteJobs(u));
assertFalse(mockAdmin().totalDestroy(u));
}
@Test
public void userCanOnlyBeAnonymizedOnce() {
this.clearDatabase();
User u = TeztBeanSimpleFactory.getNewValidUser();
u.insert();
assertFalse(u.isAnonym());
assertTrue(mockAdmin().putUserToTrashAndAnonym(u));
assertTrue(u.isAnonym());
assertFalse(mockAdmin().putUserToTrashAndAnonym(u));
}
@Test
public void differentAnonymUsersHasDifferentUsernames() {
this.clearDatabase();
User u1 = TeztBeanSimpleFactory.getNewValidUser();
u1.insert();
assertFalse(u1.isAnonym());
User u2 = TeztBeanSimpleFactory.getNewUniqueValidUser("salt");
u2.insert();
assertFalse(u2.isAnonym());
User auth = TeztBeanSimpleFactory.getAdmin();
assertTrue(u1.anonymize(auth));
assertTrue(u2.anonymize(auth));
assertEquals("anonym", u1.getUsername());
assertEquals("anonym1", u2.getUsername());
}
@Test
public void putUserToTrashAndAnonymizeAndDeleteJobs() {
this.clearDatabase();
this.clearCouchDB();
User u = TeztBeanSimpleFactory.getNewValidUser();
String originalUsername = u.getUsername();
u.insert();
Job job = this.insertJob(u);
LogbookEntry logbookEntry = this.insertLogbookEntry(u);
assertNotNull(u);
assertNotNull(job);
assertNotNull(logbookEntry);
assertTrue(mockAdmin().putUserToTrashAndAnonymizeAndDeleteJobs(u));
assertNotNull(u);
assertFalse(u.getUsername().equals(originalUsername));
assertNull(FamDaoProxy.userDao().getUserFromUsername(originalUsername));
assertNotNull(FamDaoProxy.userDao().getUserFromUsername(u.getUsername()));
// check data
boolean entryStillExists = false;
for (LogbookEntry le : FamDaoProxy.logbookEntryDao().getAll()) {
assertFalse(le.getOfUserName().equals(originalUsername));
if (u.getUsername().equals(le.getOfUserName())) {
entryStillExists = true;
}
}
assertTrue(entryStillExists);
entryStillExists = false;
for (Booking b : FamDaoProxy.bookingDao().getAll()) {
assertFalse(b.getUsername().equals(originalUsername));
if (b.getUsername().equals(u.getUsername())) {
entryStillExists = true;
}
}
assertTrue(entryStillExists);
for (Job j : FamDaoProxy.jobsDao().getJobs(u, true)) {
assertFalse(j.getUsername().equals(originalUsername));
assertFalse(j.getUsername().equals(u.getUsername()));
}
}
private LogbookEntry insertLogbookEntry(User u) {
LogbookEntry le = TeztBeanSimpleFactory.getNewValidLogbookEntry();
le.setOfUserName(u.getUsername());
le.insert();
return le;
}
private Job insertJob(User u) {
TimeBooking booking = TeztBeanSimpleFactory.getNewValidBooking();
booking.getSessionTimeFrame().add(Calendar.YEAR, 1);
booking.setApplied();
booking.setUsername(u.getUsername());
booking.insert();
Job document = new Job();
document.setJobId(booking.getId());
document.setUsername(u.getUsername());
document.setStep(0);
document.setIdJobDataProcessing("foo");
document.setJobSurvey(new JSONObject());
assertTrue(FamCouchDBDao.getInstance().createDocument(document));
return document;
}
}
/**
* override protected methods to public
*/
class DeleteUserMock extends DeleteUserFromUsersManagerController {
public DeleteUserMock(User auth) {
super(auth);
}
@Override
public boolean putUserToTrash(User user) {
return super.putUserToTrash(user);
}
@Override
public boolean totalDestroy(User user) {
return super.totalDestroy(user);
}
@Override
public boolean putUserToTrashAndAnonym(User user) {
return super.putUserToTrashAndAnonym(user);
}
@Override
public boolean putUserToTrashAndAnonymizeAndDeleteJobs(User user) {
return super.putUserToTrashAndAnonymizeAndDeleteJobs(user);
}
}