package com.zegoggles.smssync.service;
import android.provider.CallLog;
import com.fsck.k9.mail.internet.MimeMessage;
import com.zegoggles.smssync.calendar.CalendarAccessor;
import com.zegoggles.smssync.mail.CallFormatter;
import com.zegoggles.smssync.mail.ConversionResult;
import com.zegoggles.smssync.mail.DataType;
import com.zegoggles.smssync.mail.PersonLookup;
import com.zegoggles.smssync.mail.PersonRecord;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.RobolectricTestRunner;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
@RunWith(RobolectricTestRunner.class)
public class CalendarSyncerTest {
CalendarSyncer syncer;
@Mock CalendarAccessor accessor;
@Mock PersonLookup personLookup;
@Mock CallFormatter callFormatter;
final static long CALENDAR_ID = 123;
@Before public void before() {
initMocks(this);
syncer = new CalendarSyncer(
accessor,
CALENDAR_ID,
personLookup,
callFormatter
);
}
@Test public void shouldSyncCalendar() throws Exception {
ConversionResult result = new ConversionResult(DataType.CALLLOG);
final String NUMBER = "12345";
final String NAME = "Foo";
final int DURATION = 10;
final int TYPE = 1;
Date callTime = new Date();
result.add(new MimeMessage(), message(DURATION, TYPE, NUMBER, callTime));
result.add(new MimeMessage(), message(DURATION, TYPE, NUMBER, callTime));
when(callFormatter.callTypeString(TYPE, NAME)).thenReturn("title1");
when(callFormatter.formatForCalendar(TYPE, NUMBER, DURATION)).thenReturn("title2");
when(personLookup.lookupPerson(NUMBER)).thenReturn(new PersonRecord(1, NAME, "foo@bar", NUMBER));
syncer.syncCalendar(result);
verify(accessor, times(2)).addEntry(eq(CALENDAR_ID), eq(callTime), eq(DURATION), eq("title1"), eq("title2"));
}
@Test
public void shouldEnableSync() throws Exception {
shouldSyncCalendar();
verify(accessor).enableSync(CALENDAR_ID);
}
@Test
public void shouldOnlyEnableSyncOnce() throws Exception {
shouldSyncCalendar();
reset(accessor);
shouldSyncCalendar();
verify(accessor, never()).enableSync(CALENDAR_ID);
}
private Map<String,String> message(int DURATION, int TYPE, String NUMBER, Date callTime) {
Map<String, String> map = new HashMap<String, String>();
map.put(CallLog.Calls.DURATION, String.valueOf(DURATION));
map.put(CallLog.Calls.TYPE, String.valueOf(TYPE));
map.put(CallLog.Calls.NUMBER, NUMBER);
map.put(CallLog.Calls.DATE, String.valueOf(callTime.getTime()));
return map;
}
}