/*
* 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.db.ibatis;
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 java.util.Calendar;
import java.util.Date;
import java.util.List;
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.model.persist.User;
import de.knurt.fam.core.model.persist.UserMail;
import de.knurt.fam.core.model.persist.booking.Cancelation;
import de.knurt.fam.core.model.persist.booking.TimeBooking;
import de.knurt.fam.core.persistence.dao.FamDaoProxy;
import de.knurt.fam.core.util.UserFactory;
import de.knurt.fam.core.util.mail.OutgoingUserMailBox;
import de.knurt.fam.core.util.mail.UserMailSender;
import de.knurt.fam.core.view.text.FamText;
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 EMailTest extends FamIBatisTezt {
/**
*
*/
@Test
public void placeholderTest() {
this.clearDatabase();
// prepare objects needed to send mails
User user = TeztBeanSimpleFactory.getNewValidUser();
TimeBooking bookedBooking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
bookedBooking.setBooked();
TimeBooking canceledBooking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
canceledBooking.setApplied();
canceledBooking.cancel(new Cancelation(user, "lala"));
// insert all mails
OutgoingUserMailBox.insert_BookingMade(bookedBooking);
OutgoingUserMailBox.insert_ApplicationConfirmation(user, bookedBooking, "nice work");
OutgoingUserMailBox.insert_BookingCancelation(canceledBooking);
OutgoingUserMailBox.insert_Registration(user);
OutgoingUserMailBox.insert_ForgottenPassword(user);
// get it back
List<UserMail> mails = FamDaoProxy.userDao().getAllUserMails();
// check message
for (UserMail mail : mails) {
assertFalse(mail.getSubject(), mail.getSubject().contains("}"));
assertFalse(mail.getMsg(), mail.getMsg().contains("}"));
}
}
@Test
public void sendMail_adminInitPasswordTest() {
this.clearDatabase();
User testuser = UserFactory.me().blank();
testuser.setMail("foo@bar.foo");
UserMail mail = OutgoingUserMailBox.sendMail_adminInitPassword(testuser, "very_unique_string *yeah*");
assertNotNull(mail);
assertTrue(mail.getMsg().indexOf("very_unique_string") < 0);
assertTrue(mail.getMsg().indexOf("*****") > 0);
}
/**
*
*/
@Test
public void debugging_1() {
String[] args = new String[5];
args[0] = "a";
args[1] = "b";
args[2] = "c";
args[3] = "d";
args[4] = "e";
String message = FamText.message("mail.registration.msg", args);
assertFalse(message, message.contains("}"));
}
/**
*
*/
@Test
public void sendMailLater() {
this.clearDatabase();
TimeBooking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.setBooked();
booking.cancel(new Cancelation(TeztBeanSimpleFactory.getNewValidUser(), "sd"));
// OutgoingUserMailBox.insert_BookingCancelation(booking);
List<UserMail> all = FamDaoProxy.userDao().getAllUserMails();
assertEquals(1, all.size());
assertFalse(all.get(0).getToSendDate().before(new Date()) || all.get(0).getToSendDate().equals(new Date()));
assertFalse(all.get(0).hasBeenSent());
assertFalse(all.get(0).mustBeSendNow());
List<UserMail> um = FamDaoProxy.userDao().getUserMailsThatMustBeSendNow();
assertEquals(0, um.size()); // must be sent
}
@Test
public void doNotSendReminderIfBookingIsCanceled() {
this.clearDatabase();
TimeBooking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
assertTrue("there is no reminder configured for this facility", booking.getBookingRule().getDefaultSetOfRulesForARole().getReminderMailMinutesBeforeStarting() > 0);
assertTrue("there is no reminder configured for this facility", booking.getBookingRule().getSetOfRulesForARole(booking.getUser()).getReminderMailMinutesBeforeStarting() > 0);
booking.add(Calendar.YEAR, 1);
booking.setBooked();
booking.insert();
// a mail has been inserted correctly
List<UserMail> all = FamDaoProxy.userDao().getAllUserMails();
assertEquals(2, all.size());
UserMail reminder = all.get(0);
UserMail confirm = all.get(1);
assertNotNull(confirm.getType());
assertNull(confirm.getNeverSendDate());
assertNull(reminder.getNeverSendDate());
assertNotNull(reminder.getType());
assertEquals(reminder.getType().intValue(), UserMail.TYPE_NEEDS_VALID_BOOKING);
// cancel booking
booking.cancel(new Cancelation(TeztBeanSimpleFactory.getAdmin(), Cancelation.REASON_NO_REASON));
// reminder must not been sent anymore
reminder.setToSendDate(new Date());
FamDaoProxy.userDao().update(reminder);
int sent = UserMailSender.sendUserMails();
assertEquals(0, sent);
reminder = FamDaoProxy.userDao().getUserMailWithId(reminder.getId());
assertNotNull(reminder.getNeverSendDate());
assertNotNull(reminder.getToSendDate());
assertNull(reminder.getWasSentDate());
// confirmation is in demo configured as "send now" - so this is sent
confirm = FamDaoProxy.userDao().getUserMailWithId(confirm.getId());
assertNull(confirm.getNeverSendDate());
assertNotNull(confirm.getToSendDate());
assertNotNull(confirm.getWasSentDate());
}
@Test
public void doNotSendReminderMailIfUserExcluded() {
this.clearDatabase();
TimeBooking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.add(Calendar.YEAR, 1);
booking.setBooked();
booking.insert();
List<UserMail> all = FamDaoProxy.userDao().getAllUserMails();
UserMail reminder = all.get(0);
User user = booking.getUser();
user.exclude();
user.update();
reminder.setToSendDate(new Date());
FamDaoProxy.userDao().update(reminder);
int sent = UserMailSender.sendUserMails();
assertEquals(0, sent);
reminder = FamDaoProxy.userDao().getUserMailWithId(reminder.getId());
assertNotNull(reminder.getNeverSendDate());
assertNotNull(reminder.getToSendDate());
assertNull(reminder.getWasSentDate());
}
/**
*
*/
@Test
public void hasRightMessage() {
this.clearDatabase();
TimeBooking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.setBooked();
OutgoingUserMailBox.insert_BookingMade(booking);
List<UserMail> all = FamDaoProxy.userDao().getAllUserMails();
assertEquals(1, all.size());
assertEquals(FamText.message("mail.bookingmade.subject"), all.get(0).getSubject());
}
/**
*
*/
@Test
public void insertApplication() {
this.clearDatabase();
TimeBooking booking = TeztBeanSimpleFactory.getNewValidBooking4TomorrowSameTimeAsNow();
booking.setApplied();
OutgoingUserMailBox.insert_BookingMade(booking);
List<UserMail> all = FamDaoProxy.userDao().getAllUserMails();
assertEquals(1, all.size());
}
/**
*
*/
@Test
public void conformity() {
this.clearDatabase();
User testuser = UserFactory.me().blank();
testuser.setMail("foo@bar.foo");
OutgoingUserMailBox.insert_Registration(testuser);
List<UserMail> all = FamDaoProxy.userDao().getAllUserMails();
UserMail toCheck = all.get(0);
assertEquals(testuser.getMail(), toCheck.getTo());
assertEquals(testuser.getUsername(), toCheck.getUsername());
}
/**
*
*/
@Test
public void sendMailNow() {
this.clearDatabase();
User testuser = TeztBeanSimpleFactory.getNewUniqueValidUser("foo");
testuser.insert();
OutgoingUserMailBox.insert_Registration(testuser);
List<UserMail> all = FamDaoProxy.userDao().getAllUserMails();
assertEquals(1, all.size());
assertTrue(all.get(0).getToSendDate().toString() + "<>" + new Date().toString(), all.get(0).getToSendDate().before(new Date()) || all.get(0).getToSendDate().equals(new Date()));
assertTrue(all.get(0).hasBeenSent());
assertFalse(all.get(0).mustBeSendNow());
List<UserMail> um = FamDaoProxy.userDao().getUserMailsThatMustBeSendNow();
assertEquals(0, um.size()); // must be sent
}
}