/**
*
*/
package net.frontlinesms.data.importexport;
import static org.mockito.Mockito.*;
import java.io.File;
import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired;
import net.frontlinesms.csv.CsvParseException;
import net.frontlinesms.csv.CsvRowFormat;
import net.frontlinesms.csv.CsvUtils;
import net.frontlinesms.data.DuplicateKeyException;
import net.frontlinesms.data.domain.Contact;
import net.frontlinesms.data.domain.Group;
import net.frontlinesms.data.importexport.ContactCsvImporter;
import net.frontlinesms.data.repository.ContactDao;
import net.frontlinesms.data.repository.GroupDao;
import net.frontlinesms.data.repository.GroupMembershipDao;
import net.frontlinesms.junit.HibernateTestCase;
/**
* Test class for {@link ContactCsvImporter}.
* @author Alex Anderson <alex@frontlinesms.com>
* @author Morgan Belkadi <morgan@frontlinesms.com>
*/
public class ContactCsvImporterTest extends HibernateTestCase {
/** Path to the test resources folder. TODO should probably get these relative to the current {@link ClassLoader}'s path. */
private static final String RESOURCE_PATH = "src/test/resources/net/frontlinesms/data/importexport/ContactCsvImporter_";
/** DAO for {@link Group}s; used in {@link #testCreateGroupIfAbsent()} */
@Autowired
private GroupDao groupDao;
public void testCreateGroups() throws DuplicateKeyException {
ContactCsvImporter.createGroups(groupDao, "/A");
ContactCsvImporter.createGroups(groupDao, "B/2/a");
assertTrue(groupDao.getGroupByPath("/A") != null);
assertTrue(groupDao.getGroupByPath("/B") != null);
assertTrue(groupDao.getGroupByPath("/B/2") != null);
assertTrue(groupDao.getGroupByPath("/B/2/a") != null);
// Test that method does not fail if asked to create already-existing groups
ContactCsvImporter.createGroups(groupDao, "/A");
ContactCsvImporter.createGroups(groupDao, "B/2/a");
ContactCsvImporter.createGroups(groupDao, "/B/2/c");
assertTrue(groupDao.getGroupByPath("/B/2/a") != null);
assertTrue(groupDao.getGroupByPath("/B/2/c") != null);
ContactCsvImporter.createGroups(groupDao, "GroupB/Group2/Groupa");
assertTrue(groupDao.getGroupByPath("/GroupB") != null);
assertTrue(groupDao.getGroupByPath("/GroupB/Group2") != null);
assertTrue(groupDao.getGroupByPath("/GroupB/Group2/Groupa") != null);
}
public void testImportContactsWithGroups () throws IOException, CsvParseException, DuplicateKeyException {
File importFile = new File(RESOURCE_PATH + "WithGroups.csv");
CsvRowFormat rowFormat = getRowFormatForContacts();
ContactDao contactDao = mock(ContactDao.class);
GroupDao groupDao = mock(GroupDao.class);
GroupMembershipDao groupMembershipDao = mock(GroupMembershipDao.class);
new ContactCsvImporter(importFile).importContacts(contactDao, groupMembershipDao, groupDao, rowFormat);
verify(contactDao, times(4)).saveContact(any(Contact.class));
// TODO: check creation of groups
}
public void testImportContactStatus () throws IOException, CsvParseException, DuplicateKeyException {
File importFile = new File(RESOURCE_PATH + "WithStatus.csv");
CsvRowFormat rowFormat = getRowFormatForContacts();
ContactDao contactDao = mock(ContactDao.class);
GroupDao groupDao = mock(GroupDao.class);
GroupMembershipDao groupMembershipDao = mock(GroupMembershipDao.class);
new ContactCsvImporter(importFile).importContacts(contactDao, groupMembershipDao, groupDao, rowFormat);
Contact morgan = new Contact("Morgan", "07691321654", "", "", "dangerous", false);
Contact testNumber = new Contact("Test Number", "000", "", "", "dangerous", true);
Contact alex = new Contact("alex", "123456789", "", "", "dangerous", false);
Contact laura = new Contact("laura", "07788112233", "+44123456789", "lol@example.com", "", true);
verify(contactDao).saveContact(morgan);
verify(contactDao).saveContact(testNumber);
verify(contactDao).saveContact(alex);
verify(contactDao).saveContact(laura);
}
//> PRIVATE HELPER METHODS
private CsvRowFormat getRowFormatForContacts() {
CsvRowFormat rowFormat = new CsvRowFormat();
rowFormat.addMarker(CsvUtils.MARKER_CONTACT_NAME);
rowFormat.addMarker(CsvUtils.MARKER_CONTACT_PHONE);
rowFormat.addMarker(CsvUtils.MARKER_CONTACT_OTHER_PHONE);
rowFormat.addMarker(CsvUtils.MARKER_CONTACT_EMAIL);
rowFormat.addMarker(CsvUtils.MARKER_CONTACT_STATUS);
rowFormat.addMarker(CsvUtils.MARKER_CONTACT_NOTES);
rowFormat.addMarker(CsvUtils.MARKER_CONTACT_GROUPS);
return rowFormat;
}
}