From 2d40fb0b826caa153cd9af227fb9768d13b5fa4b Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 4 Aug 2016 07:34:38 -0400 Subject: [PATCH] Write tests for receivers --- app/build.gradle | 3 +- .../java/org/isoron/uhabits/AppComponent.java | 12 ++- .../commands/ToggleRepetitionCommand.java | 2 +- .../notifications/NotificationTray.java | 1 + .../uhabits/receivers/ReminderController.java | 2 +- .../uhabits/receivers/ReminderReceiver.java | 2 +- .../uhabits/receivers/WidgetReceiver.java | 2 +- .../java/org/isoron/uhabits/BaseUnitTest.java | 9 ++ .../receivers/ReminderControllerTest.java | 92 +++++++++++++++++ .../receivers/WidgetControllerTest.java | 98 +++++++++++++++++++ .../isoron/uhabits/utils/DateUtilsTest.java | 7 -- 11 files changed, 216 insertions(+), 14 deletions(-) create mode 100644 app/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java create mode 100644 app/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java diff --git a/app/build.gradle b/app/build.gradle index a28b62c11..2a5f2ae4b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -127,7 +127,8 @@ task coverageReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) { '**/*_Provide*', '**/com/android/**/*', 'android/**/*', - '**/*Dagger*' + '**/*Dagger*', + '**/*_Factory*' ] def srcDir = "${project.projectDir}/src/main/java" diff --git a/app/src/main/java/org/isoron/uhabits/AppComponent.java b/app/src/main/java/org/isoron/uhabits/AppComponent.java index 1113bd645..8c07b93ea 100644 --- a/app/src/main/java/org/isoron/uhabits/AppComponent.java +++ b/app/src/main/java/org/isoron/uhabits/AppComponent.java @@ -19,12 +19,15 @@ package org.isoron.uhabits; +import android.content.*; + import org.isoron.uhabits.activities.habits.list.model.*; import org.isoron.uhabits.commands.*; import org.isoron.uhabits.intents.*; import org.isoron.uhabits.io.*; import org.isoron.uhabits.models.*; import org.isoron.uhabits.models.sqlite.*; +import org.isoron.uhabits.notifications.*; import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.tasks.*; import org.isoron.uhabits.utils.*; @@ -40,6 +43,9 @@ public interface AppComponent { CommandRunner getCommandRunner(); + @AppContext + Context getContext(); + CreateHabitCommandFactory getCreateHabitCommandFactory(); DirFinder getDirFinder(); @@ -48,6 +54,8 @@ public interface AppComponent GenericImporter getGenericImporter(); + HabitCardListCache getHabitCardListCache(); + HabitList getHabitList(); HabitLogger getHabitsLogger(); @@ -58,6 +66,8 @@ public interface AppComponent ModelFactory getModelFactory(); + NotificationTray getNotificationTray(); + PendingIntentFactory getPendingIntentFactory(); Preferences getPreferences(); @@ -69,6 +79,4 @@ public interface AppComponent WidgetPreferences getWidgetPreferences(); WidgetUpdater getWidgetUpdater(); - - HabitCardListCache getHabitCardListCache(); } diff --git a/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java b/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java index 8a3e981f8..17f907d95 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java +++ b/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java @@ -19,7 +19,7 @@ package org.isoron.uhabits.commands; -import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.models.*; /** * Command to toggle a repetition. diff --git a/app/src/main/java/org/isoron/uhabits/notifications/NotificationTray.java b/app/src/main/java/org/isoron/uhabits/notifications/NotificationTray.java index fe62ccf9c..22856f4f0 100644 --- a/app/src/main/java/org/isoron/uhabits/notifications/NotificationTray.java +++ b/app/src/main/java/org/isoron/uhabits/notifications/NotificationTray.java @@ -36,6 +36,7 @@ import javax.inject.*; import static android.graphics.BitmapFactory.*; import static org.isoron.uhabits.utils.RingtoneUtils.*; +@AppScope public class NotificationTray { @NonNull diff --git a/app/src/main/java/org/isoron/uhabits/receivers/ReminderController.java b/app/src/main/java/org/isoron/uhabits/receivers/ReminderController.java index 3db66579c..64d02d425 100644 --- a/app/src/main/java/org/isoron/uhabits/receivers/ReminderController.java +++ b/app/src/main/java/org/isoron/uhabits/receivers/ReminderController.java @@ -68,8 +68,8 @@ public class ReminderController long now = DateUtils.getLocalTime(); long reminderTime = now + snoozeInterval * 60 * 1000; - reminderScheduler.schedule(habit, reminderTime); + reminderScheduler.schedule(habit, reminderTime); notificationTray.cancel(habit); } diff --git a/app/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java b/app/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java index 3f1ea8502..ce31869ee 100644 --- a/app/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java +++ b/app/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java @@ -102,7 +102,7 @@ public class ReminderReceiver extends BroadcastReceiver } @ReceiverScope - @Component(dependencies = AppComponent.class, modules = AppModule.class) + @Component(dependencies = AppComponent.class) interface ReminderComponent { ReminderController getReminderController(); diff --git a/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java b/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java index a52a85c9b..763c41871 100644 --- a/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java +++ b/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java @@ -87,7 +87,7 @@ public class WidgetReceiver extends BroadcastReceiver } @ReceiverScope - @Component(dependencies = AppComponent.class, modules = AppModule.class) + @Component(dependencies = AppComponent.class) interface WidgetComponent { WidgetController getWidgetController(); diff --git a/app/src/test/java/org/isoron/uhabits/BaseUnitTest.java b/app/src/test/java/org/isoron/uhabits/BaseUnitTest.java index 1f8f1326d..5bd3d841a 100644 --- a/app/src/test/java/org/isoron/uhabits/BaseUnitTest.java +++ b/app/src/test/java/org/isoron/uhabits/BaseUnitTest.java @@ -24,6 +24,8 @@ import org.isoron.uhabits.models.memory.*; import org.isoron.uhabits.utils.*; import org.junit.*; +import java.util.*; + public class BaseUnitTest { protected HabitList habitList; @@ -49,4 +51,11 @@ public class BaseUnitTest { DateUtils.setFixedLocalTime(null); } + + public long timestamp(int year, int month, int day) + { + GregorianCalendar cal = DateUtils.getStartOfTodayCalendar(); + cal.set(year, month, day); + return cal.getTimeInMillis(); + } } diff --git a/app/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java b/app/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java new file mode 100644 index 000000000..aabf6527a --- /dev/null +++ b/app/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2016 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.receivers; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.models.*; +import org.isoron.uhabits.notifications.*; +import org.isoron.uhabits.preferences.*; +import org.isoron.uhabits.utils.*; +import org.junit.*; + +import static org.mockito.Mockito.*; + +public class ReminderControllerTest extends BaseUnitTest +{ + + private ReminderController controller; + + private ReminderScheduler reminderScheduler; + + private NotificationTray notificationTray; + + private Preferences preferences; + + @Override + public void setUp() + { + super.setUp(); + + reminderScheduler = mock(ReminderScheduler.class); + notificationTray = mock(NotificationTray.class); + preferences = mock(Preferences.class); + + controller = new ReminderController(reminderScheduler, + notificationTray, preferences); + } + + @Test + public void testOnDismiss() throws Exception + { + verifyNoMoreInteractions(reminderScheduler); + verifyNoMoreInteractions(notificationTray); + verifyNoMoreInteractions(preferences); + } + + @Test + public void testOnSnooze() throws Exception + { + Habit habit = mock(Habit.class); + long now = timestamp(2015, 1, 1); + DateUtils.setFixedLocalTime(now); + when(preferences.getSnoozeInterval()).thenReturn(15L); + + controller.onSnooze(habit); + + verify(reminderScheduler).schedule(habit, now + 900000); + verify(notificationTray).cancel(habit); + } + + @Test + public void testOnShowReminder() throws Exception + { + Habit habit = mock(Habit.class); + controller.onShowReminder(habit, 123, 456); + verify(notificationTray).show(habit, 123, 456); + verify(reminderScheduler).scheduleAll(); + } + + @Test + public void testOnBootCompleted() throws Exception + { + controller.onBootCompleted(); + verify(reminderScheduler).scheduleAll(); + } +} \ No newline at end of file diff --git a/app/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java b/app/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java new file mode 100644 index 000000000..779ec5170 --- /dev/null +++ b/app/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2016 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.receivers; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.commands.*; +import org.isoron.uhabits.models.*; +import org.isoron.uhabits.utils.*; +import org.junit.*; + +import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.core.IsEqual.*; +import static org.isoron.uhabits.models.Checkmark.*; +import static org.mockito.Mockito.*; + +public class WidgetControllerTest extends BaseUnitTest +{ + private WidgetController controller; + + private CommandRunner commandRunner; + + private Habit habit; + + private long today; + + @Override + public void setUp() + { + super.setUp(); + + today = DateUtils.getStartOfToday(); + habit = fixtures.createEmptyHabit(); + commandRunner = mock(CommandRunner.class); + controller = new WidgetController(commandRunner); + } + + @Test + public void testOnAddRepetition_whenChecked() throws Exception + { + habit.getRepetitions().toggleTimestamp(today); + int todayValue = habit.getCheckmarks().getTodayValue(); + assertThat(todayValue, equalTo(CHECKED_EXPLICITLY)); + controller.onAddRepetition(habit, today); + verifyZeroInteractions(commandRunner); + } + + @Test + public void testOnAddRepetition_whenUnchecked() throws Exception + { + int todayValue = habit.getCheckmarks().getTodayValue(); + assertThat(todayValue, equalTo(UNCHECKED)); + controller.onAddRepetition(habit, today); + verify(commandRunner).execute(any(), anyLong()); + } + + @Test + public void testOnRemoveRepetition_whenChecked() throws Exception + { + habit.getRepetitions().toggleTimestamp(today); + int todayValue = habit.getCheckmarks().getTodayValue(); + assertThat(todayValue, equalTo(CHECKED_EXPLICITLY)); + controller.onRemoveRepetition(habit, today); + verify(commandRunner).execute(any(), anyLong()); + } + + @Test + public void testOnRemoveRepetition_whenUnchecked() throws Exception + { + int todayValue = habit.getCheckmarks().getTodayValue(); + assertThat(todayValue, equalTo(UNCHECKED)); + controller.onRemoveRepetition(habit, today); + verifyZeroInteractions(commandRunner); + } + + @Test + public void testOnToggleRepetition() throws Exception + { + controller.onToggleRepetition(habit, today); + verify(commandRunner).execute(any(), anyLong()); + } +} \ No newline at end of file diff --git a/app/src/test/java/org/isoron/uhabits/utils/DateUtilsTest.java b/app/src/test/java/org/isoron/uhabits/utils/DateUtilsTest.java index a5acab321..1bc2481fe 100644 --- a/app/src/test/java/org/isoron/uhabits/utils/DateUtilsTest.java +++ b/app/src/test/java/org/isoron/uhabits/utils/DateUtilsTest.java @@ -134,11 +134,4 @@ public class DateUtilsTest extends BaseUnitTest assertThat(DateUtils.truncate(field, t1), equalTo(expected)); assertThat(DateUtils.truncate(field, t2), equalTo(expected)); } - - public long timestamp(int year, int month, int day) - { - GregorianCalendar cal = DateUtils.getStartOfTodayCalendar(); - cal.set(year, month, day); - return cal.getTimeInMillis(); - } }