mirror of https://github.com/tasks/tasks
Reminder test improvements
parent
c02164ad7a
commit
f46aebb784
@ -1,71 +0,0 @@
|
||||
package com.todoroo.astrid.reminders;
|
||||
|
||||
import android.support.test.runner.AndroidJUnit4;
|
||||
|
||||
import com.todoroo.astrid.data.Task;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.tasks.preferences.Preferences;
|
||||
import org.tasks.time.DateTime;
|
||||
|
||||
import static android.support.test.InstrumentationRegistry.getTargetContext;
|
||||
import static com.natpryce.makeiteasy.MakeItEasy.with;
|
||||
import static com.todoroo.astrid.data.Task.NOTIFY_AT_DEADLINE;
|
||||
import static com.todoroo.astrid.reminders.ReminderService.NO_ALARM;
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
import static org.tasks.makers.TaskMaker.DUE_DATE;
|
||||
import static org.tasks.makers.TaskMaker.DUE_TIME;
|
||||
import static org.tasks.makers.TaskMaker.REMINDERS;
|
||||
import static org.tasks.makers.TaskMaker.REMINDER_LAST;
|
||||
import static org.tasks.makers.TaskMaker.newTask;
|
||||
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class NotifyAtDeadlineTest {
|
||||
|
||||
private ReminderService reminderService;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
Preferences preferences = new Preferences(getTargetContext(), null);
|
||||
reminderService = new ReminderService(preferences, null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoReminderWhenNoDueDate() {
|
||||
Task task = newTask(with(REMINDERS, NOTIFY_AT_DEADLINE));
|
||||
assertEquals(NO_ALARM, reminderService.calculateNextDueDateReminder(task));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoReminderWhenNotifyAtDeadlineFlagNotSet() {
|
||||
Task task = newTask(with(DUE_TIME, new DateTime(2014, 1, 24, 19, 23)));
|
||||
assertEquals(NO_ALARM, reminderService.calculateNextDueDateReminder(task));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testScheduleReminderAtDueTime() {
|
||||
final DateTime dueDate = new DateTime(2014, 1, 24, 19, 23);
|
||||
Task task = newTask(with(DUE_TIME, dueDate), with(REMINDERS, NOTIFY_AT_DEADLINE));
|
||||
assertEquals(dueDate.plusSeconds(1).getMillis(), reminderService.calculateNextDueDateReminder(task));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testScheduleReminderAtDefaultDueTime() {
|
||||
final DateTime dueDate = new DateTime(2015, 12, 29, 12, 0);
|
||||
Task task = newTask(with(DUE_DATE, dueDate), with(REMINDERS, NOTIFY_AT_DEADLINE));
|
||||
assertEquals(dueDate.withHourOfDay(18).getMillis(),
|
||||
reminderService.calculateNextDueDateReminder(task));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoReminderIfAlreadyRemindedPastDueDate() {
|
||||
final DateTime dueDate = new DateTime(2015, 12, 29, 19, 23);
|
||||
Task task = newTask(
|
||||
with(DUE_TIME, dueDate),
|
||||
with(REMINDER_LAST, dueDate.plusSeconds(1)),
|
||||
with(REMINDERS, NOTIFY_AT_DEADLINE));
|
||||
assertEquals(NO_ALARM, reminderService.calculateNextDueDateReminder(task));
|
||||
}
|
||||
}
|
@ -1,139 +0,0 @@
|
||||
package com.todoroo.astrid.reminders;
|
||||
|
||||
import android.support.test.runner.AndroidJUnit4;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.InOrder;
|
||||
import org.tasks.Freeze;
|
||||
import org.tasks.Snippet;
|
||||
import org.tasks.jobs.JobManager;
|
||||
import org.tasks.jobs.Reminder;
|
||||
import org.tasks.makers.TaskMaker;
|
||||
import org.tasks.preferences.Preferences;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static com.natpryce.makeiteasy.MakeItEasy.with;
|
||||
import static com.todoroo.astrid.reminders.ReminderService.TYPE_DUE;
|
||||
import static java.util.Arrays.asList;
|
||||
import static java.util.Collections.singletonList;
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
import static org.mockito.AdditionalAnswers.returnsFirstArg;
|
||||
import static org.mockito.Matchers.anyLong;
|
||||
import static org.mockito.Mockito.inOrder;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.tasks.makers.TaskMaker.newTask;
|
||||
import static org.tasks.time.DateTimeUtils.currentTimeMillis;
|
||||
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class ReminderAlarmSchedulerTest {
|
||||
|
||||
private static final long ONE_MINUTE = TimeUnit.MINUTES.toMillis(1);
|
||||
|
||||
private JobManager jobManager;
|
||||
private ReminderAlarmScheduler scheduler;
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
jobManager = mock(JobManager.class);
|
||||
Preferences preferences = mock(Preferences.class);
|
||||
when(preferences.adjustForQuietHours(anyLong())).then(returnsFirstArg());
|
||||
scheduler = new ReminderAlarmScheduler(jobManager, preferences);
|
||||
}
|
||||
|
||||
@After
|
||||
public void after() {
|
||||
verifyNoMoreInteractions(jobManager);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void scheduleFirstReminder() {
|
||||
long now = currentTimeMillis();
|
||||
|
||||
scheduler.createAlarm(newTask(with(TaskMaker.ID, 1L)), now, 0);
|
||||
|
||||
verify(jobManager).scheduleReminder(now, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dontScheduleLaterReminder() {
|
||||
long now = currentTimeMillis();
|
||||
|
||||
scheduler.createAlarm(newTask(with(TaskMaker.ID, 1L)), now, 0);
|
||||
scheduler.createAlarm(newTask(with(TaskMaker.ID, 1L)), now + ONE_MINUTE, 0);
|
||||
|
||||
verify(jobManager).scheduleReminder(now, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void rescheduleNewerReminder() {
|
||||
long now = currentTimeMillis();
|
||||
|
||||
scheduler.createAlarm(newTask(with(TaskMaker.ID, 1L)), now, 0);
|
||||
scheduler.createAlarm(newTask(with(TaskMaker.ID, 2L)), now - ONE_MINUTE, 0);
|
||||
|
||||
InOrder order = inOrder(jobManager);
|
||||
order.verify(jobManager).scheduleReminder(now, true);
|
||||
order.verify(jobManager).scheduleReminder(now - ONE_MINUTE, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeLastReminderCancelsJob() {
|
||||
long now = currentTimeMillis();
|
||||
scheduler.createAlarm(newTask(with(TaskMaker.ID, 1L)), now, 0);
|
||||
|
||||
scheduler.createAlarm(newTask(with(TaskMaker.ID, 1L)), 0, 0);
|
||||
|
||||
InOrder order = inOrder(jobManager);
|
||||
order.verify(jobManager).scheduleReminder(now, true);
|
||||
order.verify(jobManager).cancelReminders();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removePastRemindersReturnsPastReminder() {
|
||||
long now = currentTimeMillis();
|
||||
|
||||
Freeze.freezeAt(now).thawAfter(new Snippet() {{
|
||||
scheduler.createAlarm(newTask(with(TaskMaker.ID, 1L)), now, TYPE_DUE);
|
||||
|
||||
List<Reminder> reminders = scheduler.removePastReminders();
|
||||
|
||||
verify(jobManager).scheduleReminder(now, true);
|
||||
|
||||
assertEquals(singletonList(new Reminder(1, now, TYPE_DUE)), reminders);
|
||||
}});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dontRescheduleForSecondJobAtSameTime() {
|
||||
long now = currentTimeMillis();
|
||||
|
||||
scheduler.createAlarm(newTask(with(TaskMaker.ID, 1L)), now, TYPE_DUE);
|
||||
scheduler.createAlarm(newTask(with(TaskMaker.ID, 2L)), now, TYPE_DUE);
|
||||
|
||||
verify(jobManager).scheduleReminder(now, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removePastRemindersReturnsPastRemindersAtSameTime() {
|
||||
long now = currentTimeMillis();
|
||||
|
||||
Freeze.freezeAt(now).thawAfter(new Snippet() {{
|
||||
scheduler.createAlarm(newTask(with(TaskMaker.ID, 1L)), now, TYPE_DUE);
|
||||
scheduler.createAlarm(newTask(with(TaskMaker.ID, 2L)), now, TYPE_DUE);
|
||||
|
||||
List<Reminder> reminders = scheduler.removePastReminders();
|
||||
|
||||
verify(jobManager).scheduleReminder(now, true);
|
||||
|
||||
assertEquals(asList(new Reminder(1, now, TYPE_DUE), new Reminder(2, now, TYPE_DUE)), reminders);
|
||||
}});
|
||||
}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
package com.todoroo.astrid.reminders;
|
||||
|
||||
import com.todoroo.astrid.data.Task;
|
||||
|
||||
public interface AlarmScheduler {
|
||||
void createAlarm(Task task, long time, int type);
|
||||
|
||||
void clear();
|
||||
}
|
@ -1,74 +0,0 @@
|
||||
package com.todoroo.astrid.reminders;
|
||||
|
||||
import com.todoroo.astrid.data.Task;
|
||||
|
||||
import org.tasks.injection.ApplicationScope;
|
||||
import org.tasks.jobs.JobManager;
|
||||
import org.tasks.jobs.JobQueue;
|
||||
import org.tasks.jobs.Reminder;
|
||||
import org.tasks.preferences.Preferences;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import static com.todoroo.astrid.reminders.ReminderService.NO_ALARM;
|
||||
|
||||
@ApplicationScope
|
||||
public class ReminderAlarmScheduler implements AlarmScheduler {
|
||||
|
||||
private final JobQueue<Reminder> jobs;
|
||||
private final JobManager jobManager;
|
||||
|
||||
@Inject
|
||||
public ReminderAlarmScheduler(JobManager jobManager, Preferences preferences) {
|
||||
this.jobManager = jobManager;
|
||||
jobs = new JobQueue<>(preferences);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an alarm for the given task at the given type
|
||||
*/
|
||||
@Override
|
||||
public void createAlarm(Task task, long time, int type) {
|
||||
long taskId = task.getId();
|
||||
if(taskId == Task.NO_ID) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (time == 0 || time == NO_ALARM) {
|
||||
if (jobs.cancel(taskId)) {
|
||||
scheduleNext(true);
|
||||
}
|
||||
} else {
|
||||
Reminder reminder = new Reminder(taskId, time, type);
|
||||
if (jobs.add(reminder)) {
|
||||
scheduleNext(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
jobs.clear();
|
||||
jobManager.cancelReminders();
|
||||
}
|
||||
|
||||
public void scheduleNextJob() {
|
||||
scheduleNext(false);
|
||||
}
|
||||
|
||||
private void scheduleNext(boolean cancelCurrent) {
|
||||
if (jobs.isEmpty()) {
|
||||
if (cancelCurrent) {
|
||||
jobManager.cancelReminders();
|
||||
}
|
||||
} else {
|
||||
jobManager.scheduleReminder(jobs.nextScheduledTime(), cancelCurrent);
|
||||
}
|
||||
}
|
||||
|
||||
public List<Reminder> removePastReminders() {
|
||||
return jobs.removeOverdueJobs();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue