package org.vaelen.contactmanager.test;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.annotation.Resource;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.vaelen.contactmanager.ContactRepository;
import org.vaelen.contactmanager.model.Contact;
import org.vaelen.contactmanager.model.EmailAddress;
import org.vaelen.contactmanager.model.PhoneNumber;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContext-test.xml")
public class TestContactRepository {
protected ContactRepository repository;
protected String contactId;
protected String lastName;
protected int lastNameCount;
protected String firstName;
protected int firstNameCount;
protected String phoneNumber;
protected int phoneNumberCount;
protected String emailAddress;
protected int emailAddressCount;
protected AtomicBoolean initialized = new AtomicBoolean(false);
@Resource
public void setRepository(ContactRepository repository) {
this.repository = repository;
}
@Before
public void init() {
if(initialized.compareAndSet(false, true)) {
List<Contact> contacts = repository.listContacts();
Assert.assertNotNull("Contact List Was Null", contacts);
Assert.assertFalse("Contact List Was Empty", contacts.isEmpty());
for(Contact contact: contacts) {
// Find a contact id to use for loadContact()
if(contactId == null) {
contactId = contact.getContactId();
}
// Find a last name to use for findContactsByLastName()
if(lastName == null) {
lastName = contact.getLastName();
lastNameCount = 0;
}
if(lastName != null) {
if(lastName.equals(contact.getLastName())) {
lastNameCount++;
}
}
// Find a first name to use for findContactsByFirstName()
if(firstName == null) {
firstName = contact.getFirstName();
firstNameCount = 0;
}
if(firstName != null) {
if(firstName.equals(contact.getFirstName())) {
firstNameCount++;
}
}
// Find an email address to use for findContactsByEmailAddress()
if(emailAddress == null) {
for(EmailAddress email: contact.getEmailAddresses()) {
if(email.getEmailAddress() != null) {
emailAddress = email.getEmailAddress();
emailAddressCount = 0;
break;
}
}
}
if(emailAddress != null) {
for(EmailAddress email: contact.getEmailAddresses()) {
if(emailAddress.equals(email.getEmailAddress())) {
emailAddressCount++;
break;
}
}
}
// Find a phone number to use for findContactsByPhoneNumber()
if(phoneNumber == null) {
for(PhoneNumber phone: contact.getPhoneNumbers()) {
if(phone.getPhoneNumber() != null) {
phoneNumber = phone.getPhoneNumber();
phoneNumberCount = 0;
break;
}
}
}
if(phoneNumber != null) {
for(PhoneNumber phone: contact.getPhoneNumbers()) {
if(phoneNumber.equals(phone.getPhoneNumber())) {
phoneNumberCount++;
break;
}
}
}
}
}
}
@Test
public void listContacts() {
List<Contact> contacts = repository.listContacts();
Assert.assertNotNull("Contact List Was Null", contacts);
Assert.assertFalse("Contact List Was Empty", contacts.isEmpty());
}
@Test
public void findContactsByLastName() {
List<Contact> contacts = repository.findContactsByLastName(lastName);
Assert.assertNotNull("Contact List Was Null", contacts);
Assert.assertFalse("Contact List Was Empty", contacts.isEmpty());
Assert.assertEquals("Contact List Is The Wrong Size", lastNameCount, contacts.size());
}
@Test
public void findContactsByFirstName() {
List<Contact> contacts = repository.findContactsByFirstName(firstName);
Assert.assertNotNull("Contact List Was Null", contacts);
Assert.assertFalse("Contact List Was Empty", contacts.isEmpty());
Assert.assertEquals("Contact List Is The Wrong Size", firstNameCount, contacts.size());
}
@Test
public void findContactsByPhoneNumber() {
List<Contact> contacts = repository.findContactsByPhoneNumber(phoneNumber);
Assert.assertNotNull("Contact List Was Null", contacts);
Assert.assertFalse("Contact List Was Empty", contacts.isEmpty());
Assert.assertEquals("Contact List Is The Wrong Size", phoneNumberCount, contacts.size());
}
@Test
public void findContactsByEmailAddress() {
List<Contact> contacts = repository.findContactsByEmailAddress(emailAddress);
Assert.assertNotNull("Contact List Was Null", contacts);
Assert.assertFalse("Contact List Was Empty", contacts.isEmpty());
Assert.assertEquals("Contact List Is The Wrong Size", emailAddressCount, contacts.size());
}
@Test
public void loadContact() {
Contact contact = repository.loadContact(contactId);
Assert.assertNotNull("Contact Was Null", contact);
}
@Test
public void saveContact() {
String note = String.format("Updated Last: %tc", new Date());
Contact contact = repository.loadContact(contactId);
Assert.assertNotNull("Contact Was Null Before Save", contact);
contact.setNotes(note);
repository.saveContact(contact);
contact = repository.loadContact(contactId);
Assert.assertNotNull("Contact Was Null After Save", contact);
Assert.assertNotNull("Contact Was Not Saved, Notes Are Not There", contact.getNotes());
Assert.assertEquals("Contact Was Not Saved, Notes Are Different", note, contact.getNotes());
}
}