/** * */ package net.frontlinesms.data.importexport; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import net.frontlinesms.csv.CsvParseException; import net.frontlinesms.csv.CsvRowFormat; import net.frontlinesms.csv.CsvUtils; import net.frontlinesms.data.domain.FrontlineMessage; import net.frontlinesms.data.domain.FrontlineMultimediaMessage; import net.frontlinesms.data.domain.FrontlineMultimediaMessagePart; import net.frontlinesms.data.domain.FrontlineMessage.Type; import net.frontlinesms.data.repository.MessageDao; import net.frontlinesms.junit.BaseTestCase; /** * Test class for {@link MessageCsvImporter}. * @author Alex Anderson <alex@frontlinesms.com> * @author Morgan Belkadi <morgan@frontlinesms.com> */ public class MessageCsvImporterTest extends BaseTestCase { //> CONSTANTS /** 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/MessageCsvImporter_"; //> PROPERTIES private SimpleDateFormat formatter; //> INIT METHODS @Override protected void setUp() throws Exception { super.setUp(); this.formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } @Override protected void tearDown() throws Exception { super.tearDown(); this.formatter = null; } //> TEST METHODS public void testImportMessages() throws IOException, CsvParseException, ParseException { File importFile = new File(RESOURCE_PATH + "Messages.csv"); File importFileInternationalised = new File(RESOURCE_PATH + "Messages_fr.csv"); CsvRowFormat rowFormat = getRowFormatForMessages(); MessageDao messageDao = mock(MessageDao.class); new MessageCsvImporter(importFile).importMessages(messageDao, rowFormat); new MessageCsvImporter(importFileInternationalised).importMessages(messageDao, rowFormat); FrontlineMessage messageOne = FrontlineMessage.createOutgoingMessage(formatter.parse("2010-10-13 14:28:57").getTime(), "+33673586586", "+15559999", "Message sent!"); FrontlineMessage messageTwo = FrontlineMessage.createIncomingMessage(formatter.parse("2010-10-13 13:08:57").getTime(), "+15559999", "+33673586586", "Received this later..."); FrontlineMessage messageThree = FrontlineMessage.createOutgoingMessage(formatter.parse("2010-10-12 15:17:02").getTime(), "+447789654123", "+447762297258", "First message sent"); FrontlineMessage messageFour = FrontlineMessage.createIncomingMessage(formatter.parse("2010-12-13 10:29:02").getTime(), "+447762297258", "+447789654123", "First message received"); verify(messageDao, times(8)).saveMessage(any(FrontlineMessage.class)); verify(messageDao, times(2)).saveMessage(messageOne); verify(messageDao, times(2)).saveMessage(messageTwo); verify(messageDao, times(2)).saveMessage(messageThree); verify(messageDao, times(2)).saveMessage(messageFour); } public void testImportMultimediaMessages() throws IOException, CsvParseException, ParseException { File importFile = new File(RESOURCE_PATH + "MMS.csv"); CsvRowFormat rowFormat = getRowFormatForMessages(); MessageDao messageDao = mock(MessageDao.class); new MessageCsvImporter(importFile).importMessages(messageDao, rowFormat); FrontlineMessage messageOne = new FrontlineMultimediaMessage(Type.RECEIVED, "You have received a new message", "Subject: You have received a new message; File: 100MEDIA_IMAG0041.jpg; \"It's like Charles bloody dickens!\""); List<FrontlineMultimediaMessagePart> multimediaPartsOne = new ArrayList<FrontlineMultimediaMessagePart>(); multimediaPartsOne.add(FrontlineMultimediaMessagePart.createBinaryPart("100MEDIA_IMAG0041.jpg")); multimediaPartsOne.add(FrontlineMultimediaMessagePart.createTextPart("It's like Charles bloody dickens!")); ((FrontlineMultimediaMessage)messageOne).setMultimediaParts(multimediaPartsOne); messageOne.setDate(formatter.parse("2010-07-21 17:18:20").getTime()); messageOne.setSenderMsisdn("+447988156550"); FrontlineMessage messageTwo = new FrontlineMultimediaMessage(Type.RECEIVED, "", "\"Testing frontline sms\"; File: Image040.jpg"); List<FrontlineMultimediaMessagePart> multimediaPartsTwo = new ArrayList<FrontlineMultimediaMessagePart>(); multimediaPartsTwo.add(FrontlineMultimediaMessagePart.createTextPart("Testing frontline sms")); multimediaPartsTwo.add(FrontlineMultimediaMessagePart.createBinaryPart("Image040.jpg")); ((FrontlineMultimediaMessage)messageTwo).setMultimediaParts(multimediaPartsTwo); messageTwo.setDate(formatter.parse("2010-07-20 17:57:04").getTime()); messageTwo.setSenderMsisdn("+254722707140"); verify(messageDao, times(2)).saveMessage(any(FrontlineMultimediaMessage.class)); verify(messageDao).saveMessage(messageOne); verify(messageDao).saveMessage(messageTwo); } private CsvRowFormat getRowFormatForMessages() { CsvRowFormat rowFormat = new CsvRowFormat(); rowFormat.addMarker(CsvUtils.MARKER_MESSAGE_TYPE); rowFormat.addMarker(CsvUtils.MARKER_MESSAGE_STATUS); rowFormat.addMarker(CsvUtils.MARKER_MESSAGE_DATE); rowFormat.addMarker(CsvUtils.MARKER_MESSAGE_CONTENT); rowFormat.addMarker(CsvUtils.MARKER_SENDER_NUMBER); rowFormat.addMarker(CsvUtils.MARKER_RECIPIENT_NUMBER); return rowFormat; } }