From f6742448d738bca716e3bb600cecfda4ab2caa29 Mon Sep 17 00:00:00 2001 From: Florian Fetz <63090558+Futsch1@users.noreply.github.com> Date: Sun, 19 Jan 2025 22:50:48 +0100 Subject: [PATCH] 437 stock tracking does not work with additional doses (#439) * Rename .java to .kt * Use stock tracking for manual dose * Fix unit test * Fix unit test * Fix merge error * Fix test --- .../com/futsch1/medtimer/MedicineStockTest.kt | 17 +- .../com/futsch1/medtimer/ActivityCodes.java | 1 + .../futsch1/medtimer/overview/ManualDose.java | 154 ----------------- .../futsch1/medtimer/overview/ManualDose.kt | 158 ++++++++++++++++++ .../medtimer/overview/VariableAmount.kt | 1 - .../reminders/NotificationAction.java | 16 +- .../medtimer/reminders/ReminderProcessor.java | 6 +- .../medtimer/reminders/StockHandlingWork.kt | 16 +- .../medtimer/TakenSkippedWorkUnitTest.java | 21 ++- 9 files changed, 213 insertions(+), 177 deletions(-) delete mode 100644 app/src/main/java/com/futsch1/medtimer/overview/ManualDose.java create mode 100644 app/src/main/java/com/futsch1/medtimer/overview/ManualDose.kt diff --git a/app/src/androidTest/java/com/futsch1/medtimer/MedicineStockTest.kt b/app/src/androidTest/java/com/futsch1/medtimer/MedicineStockTest.kt index ba5e7a15..036481b7 100644 --- a/app/src/androidTest/java/com/futsch1/medtimer/MedicineStockTest.kt +++ b/app/src/androidTest/java/com/futsch1/medtimer/MedicineStockTest.kt @@ -12,9 +12,11 @@ import com.adevinta.android.barista.assertion.BaristaVisibilityAssertions.assert import com.adevinta.android.barista.assertion.BaristaVisibilityAssertions.assertDisplayed import com.adevinta.android.barista.assertion.BaristaVisibilityAssertions.assertNotContains import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn +import com.adevinta.android.barista.interaction.BaristaDialogInteractions import com.adevinta.android.barista.interaction.BaristaEditTextInteractions.writeTo import com.adevinta.android.barista.interaction.BaristaListInteractions.clickListItem import com.adevinta.android.barista.interaction.BaristaListInteractions.clickListItemChild +import com.adevinta.android.barista.rule.flaky.AllowFlaky import com.futsch1.medtimer.AndroidTestHelper.navigateTo import org.hamcrest.CoreMatchers.equalTo import org.junit.Test @@ -22,7 +24,7 @@ import org.junit.Test class MedicineStockTest : BaseTestHelper() { @Test - //@AllowFlaky(attempts = 1) + @AllowFlaky(attempts = 1) fun medicineStockTest() { val context = InstrumentationRegistry.getInstrumentation().targetContext @@ -93,15 +95,24 @@ class MedicineStockTest : BaseTestHelper() { navigateTo(AndroidTestHelper.MainMenu.MEDICINES) assertContains(R.id.medicineName, "⚠") + navigateTo(AndroidTestHelper.MainMenu.OVERVIEW) + clickOn(R.id.logManualDose) + clickListItem(null, 1) + writeTo(android.R.id.input, "12") + BaristaDialogInteractions.clickDialogPositiveButton() + clickOn(com.google.android.material.R.id.material_timepicker_ok_button) + + navigateTo(AndroidTestHelper.MainMenu.MEDICINES) + clickListItem(R.id.medicineList, 0) clickOn(R.id.openStockTracking) clickOn(R.id.refillNow) - assertDisplayed(R.id.amountLeft, "14") + assertDisplayed(R.id.amountLeft, "10.5") pressBack() pressBack() - assertContains(R.id.medicineName, "14") + assertContains(R.id.medicineName, "10.5") assertNotContains(R.id.medicineName, "⚠") } } \ No newline at end of file diff --git a/app/src/main/java/com/futsch1/medtimer/ActivityCodes.java b/app/src/main/java/com/futsch1/medtimer/ActivityCodes.java index d2af0a11..a0dc2f81 100644 --- a/app/src/main/java/com/futsch1/medtimer/ActivityCodes.java +++ b/app/src/main/java/com/futsch1/medtimer/ActivityCodes.java @@ -10,6 +10,7 @@ public class ActivityCodes { public static final String EXTRA_REPEAT_TIME_SECONDS = "com.futsch1.medTimer.EXTRA_REPEAT_TIME_SECONDS"; public static final String EXTRA_REMAINING_REPEATS = "com.futsch1.medTimer.EXTRA_REMAINING_REPEATS"; public static final String EXTRA_AMOUNT = "com.futsch1.medTimer.AMOUNT"; + public static final String EXTRA_MEDICINE_ID = "com.futsch1.medTimer.MEDICINE_ID"; public static final String REMINDER_ACTION = "com.futsch1.medTimer.REMINDER_ACTION"; public static final String DISMISSED_ACTION = "com.futsch1.medTimer.DISMISSED_ACTION"; diff --git a/app/src/main/java/com/futsch1/medtimer/overview/ManualDose.java b/app/src/main/java/com/futsch1/medtimer/overview/ManualDose.java deleted file mode 100644 index a48d3071..00000000 --- a/app/src/main/java/com/futsch1/medtimer/overview/ManualDose.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.futsch1.medtimer.overview; - -import android.app.AlertDialog; -import android.content.Context; -import android.content.SharedPreferences; - -import androidx.annotation.NonNull; -import androidx.fragment.app.FragmentActivity; - -import com.futsch1.medtimer.R; -import com.futsch1.medtimer.database.Medicine; -import com.futsch1.medtimer.database.MedicineRepository; -import com.futsch1.medtimer.database.MedicineWithReminders; -import com.futsch1.medtimer.database.Reminder; -import com.futsch1.medtimer.database.ReminderEvent; -import com.futsch1.medtimer.helpers.DialogHelper; -import com.futsch1.medtimer.helpers.ReminderHelperKt; -import com.futsch1.medtimer.helpers.TimeHelper; - -import java.time.Instant; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -public class ManualDose { - - private final Context context; - private final MedicineRepository medicineRepository; - private final FragmentActivity activity; - private final SharedPreferences sharedPreferences; - - @SuppressWarnings("java:S6300") // No sensitive data is stored in the shared preferences - public ManualDose(Context context, MedicineRepository medicineRepository, FragmentActivity activity) { - this.context = context; - this.medicineRepository = medicineRepository; - this.activity = activity; - this.sharedPreferences = context.getSharedPreferences("medtimer.data", Context.MODE_PRIVATE); - } - - public void logManualDose() { - List medicines = medicineRepository.getMedicines(); - List entries = getManualDoseEntries(medicines); - - // But run the actual dialog on the UI thread again - activity.runOnUiThread(() -> - new AlertDialog.Builder(context) - .setItems(entries.stream().map(e -> e.name).toArray(String[]::new), (dialog, which) -> - startLogProcess(entries.get(which))) - .setTitle(R.string.tab_medicine) - .show()); - } - - @NonNull - private List getManualDoseEntries(List medicines) { - String lastCustomDose = getLastCustomDose(); - List entries = new ArrayList<>(); - entries.add(new ManualDoseEntry(context.getString(R.string.custom))); - if (!lastCustomDose.isBlank()) { - entries.add(new ManualDoseEntry(lastCustomDose)); - } - for (MedicineWithReminders medicine : medicines) { - entries.add(new ManualDoseEntry(medicine.medicine, null)); - addInactiveReminders(medicine, entries); - } - return entries; - } - - private void startLogProcess(ManualDoseEntry entry) { - ReminderEvent reminderEvent = new ReminderEvent(); - // Manual dose is not assigned to an existing reminder - reminderEvent.reminderId = -1; - reminderEvent.status = ReminderEvent.ReminderStatus.TAKEN; - reminderEvent.medicineName = entry.name; - reminderEvent.color = entry.color; - reminderEvent.useColor = entry.useColor; - reminderEvent.iconId = entry.iconId; - if (reminderEvent.medicineName.equals(context.getString(R.string.custom))) { - new DialogHelper(context).title(R.string.log_additional_dose).hint(R.string.medicine_name).textSink(name -> { - setLastCustomDose(name); - reminderEvent.medicineName = name; - getAmountAndContinue(reminderEvent); - }).show(); - } else { - if (entry.amount == null) { - getAmountAndContinue(reminderEvent); - } else { - reminderEvent.amount = entry.amount; - getTimeAndLog(reminderEvent); - } - } - } - - private String getLastCustomDose() { - return sharedPreferences.getString("lastCustomDose", ""); - } - - private static void addInactiveReminders(MedicineWithReminders medicine, List entries) { - for (Reminder reminder : medicine.reminders) { - if (!ReminderHelperKt.isReminderActive(reminder)) { - entries.add(new ManualDoseEntry(medicine.medicine, reminder.amount)); - } - } - } - - private void getAmountAndContinue(ReminderEvent reminderEvent) { - new DialogHelper(context).title(R.string.log_additional_dose).hint(R.string.dosage).textSink(amount -> { - reminderEvent.amount = amount; - getTimeAndLog(reminderEvent); - }).show(); - } - - private void getTimeAndLog(ReminderEvent reminderEvent) { - LocalDateTime localDateTime = LocalDateTime.now(); - TimeHelper.TimePickerWrapper timePicker = new TimeHelper.TimePickerWrapper(activity); - timePicker.show(localDateTime.getHour(), localDateTime.getMinute(), minutes -> { - reminderEvent.remindedTimestamp = TimeHelper.instantFromTodayMinutes(minutes).getEpochSecond(); - reminderEvent.processedTimestamp = Instant.now().getEpochSecond(); - - medicineRepository.insertReminderEvent(reminderEvent); - }); - } - - private void setLastCustomDose(String lastCustomDose) { - sharedPreferences.edit().putString("lastCustomDose", lastCustomDose).apply(); - } - - private static class ManualDoseEntry { - public final String name; - public final int color; - public final boolean useColor; - public final String amount; - public final int iconId; - - public ManualDoseEntry(String name) { - this.name = name; - this.color = 0; - this.useColor = false; - this.amount = null; - this.iconId = 0; - } - - public ManualDoseEntry(Medicine medicine, String amount) { - if (amount != null) { - this.name = medicine.name + " (" + amount + ")"; - } else { - this.name = medicine.name; - } - this.color = medicine.color; - this.useColor = medicine.useColor; - this.amount = amount; - this.iconId = medicine.iconId; - } - } -} diff --git a/app/src/main/java/com/futsch1/medtimer/overview/ManualDose.kt b/app/src/main/java/com/futsch1/medtimer/overview/ManualDose.kt new file mode 100644 index 00000000..5c349841 --- /dev/null +++ b/app/src/main/java/com/futsch1/medtimer/overview/ManualDose.kt @@ -0,0 +1,158 @@ +package com.futsch1.medtimer.overview + +import android.app.AlertDialog +import android.content.Context +import android.content.DialogInterface +import android.content.SharedPreferences +import androidx.fragment.app.FragmentActivity +import com.futsch1.medtimer.R +import com.futsch1.medtimer.database.Medicine +import com.futsch1.medtimer.database.MedicineRepository +import com.futsch1.medtimer.database.MedicineWithReminders +import com.futsch1.medtimer.database.ReminderEvent +import com.futsch1.medtimer.helpers.DialogHelper +import com.futsch1.medtimer.helpers.TimeHelper +import com.futsch1.medtimer.helpers.TimeHelper.TimePickerWrapper +import com.futsch1.medtimer.helpers.isReminderActive +import com.futsch1.medtimer.reminders.ReminderProcessor +import java.time.Instant +import java.time.LocalDateTime +import java.util.stream.Collectors + +class ManualDose( + private val context: Context, + private val medicineRepository: MedicineRepository, + private val activity: FragmentActivity +) { + @Suppress("kotlin:S6291") // Preferences do not contain sensitive date + private val sharedPreferences: SharedPreferences = + context.getSharedPreferences("medtimer.data", Context.MODE_PRIVATE) + + fun logManualDose() { + val medicines = medicineRepository.medicines + val entries = getManualDoseEntries(medicines) + val names = + entries.stream().map { e: ManualDoseEntry -> e.name }.collect(Collectors.toList()) + .toTypedArray() + + // But run the actual dialog on the UI thread again + activity.runOnUiThread { + AlertDialog.Builder(context) + .setItems(names) { _: DialogInterface?, which: Int -> startLogProcess(entries[which]) } + .setTitle(R.string.tab_medicine) + .show() + } + } + + private fun getManualDoseEntries(medicines: List): List { + val lastCustomDose = lastCustomDose!! + val entries: MutableList = ArrayList() + entries.add(ManualDoseEntry(context.getString(R.string.custom))) + if (lastCustomDose.isNotBlank()) { + entries.add(ManualDoseEntry(lastCustomDose)) + } + for (medicine in medicines) { + entries.add(ManualDoseEntry(medicine.medicine, null)) + addInactiveReminders(medicine, entries) + } + return entries + } + + private fun startLogProcess(entry: ManualDoseEntry) { + val reminderEvent = ReminderEvent() + // Manual dose is not assigned to an existing reminder + reminderEvent.reminderId = -1 + reminderEvent.status = ReminderEvent.ReminderStatus.TAKEN + reminderEvent.medicineName = entry.name + reminderEvent.color = entry.color + reminderEvent.useColor = entry.useColor + reminderEvent.iconId = entry.iconId + if (reminderEvent.medicineName == context.getString(R.string.custom)) { + DialogHelper(context).title(R.string.log_additional_dose).hint(R.string.medicine_name) + .textSink { name: String? -> + lastCustomDose = name + reminderEvent.medicineName = name + getAmountAndContinue(reminderEvent, -1) + }.show() + } else { + if (entry.amount == null) { + getAmountAndContinue(reminderEvent, entry.medicineId) + } else { + reminderEvent.amount = entry.amount + getTimeAndLog(reminderEvent, entry.medicineId) + } + } + } + + private var lastCustomDose: String? + get() = sharedPreferences.getString("lastCustomDose", "") + private set(lastCustomDose) { + sharedPreferences.edit().putString("lastCustomDose", lastCustomDose).apply() + } + + private fun getAmountAndContinue(reminderEvent: ReminderEvent, medicineId: Int) { + DialogHelper(context).title(R.string.log_additional_dose).hint(R.string.dosage) + .textSink { amount: String? -> + reminderEvent.amount = amount + getTimeAndLog(reminderEvent, medicineId) + }.show() + } + + private fun getTimeAndLog(reminderEvent: ReminderEvent, medicineId: Int) { + val localDateTime = LocalDateTime.now() + val timePicker = TimePickerWrapper(activity) + timePicker.show(localDateTime.hour, localDateTime.minute) { minutes: Int -> + reminderEvent.remindedTimestamp = + TimeHelper.instantFromTodayMinutes(minutes).epochSecond + reminderEvent.processedTimestamp = Instant.now().epochSecond + medicineRepository.insertReminderEvent(reminderEvent) + } + if (medicineId != -1) { + ReminderProcessor.requestStockHandling(context, reminderEvent.amount!!, medicineId) + } + } + + private class ManualDoseEntry { + val name: String + val color: Int + val useColor: Boolean + val amount: String? + val iconId: Int + val medicineId: Int + + constructor(name: String) { + this.name = name + this.color = 0 + this.useColor = false + this.amount = null + this.iconId = 0 + this.medicineId = -1 + } + + constructor(medicine: Medicine, amount: String?) { + if (amount != null) { + this.name = medicine.name + " (" + amount + ")" + } else { + this.name = medicine.name + } + this.color = medicine.color + this.useColor = medicine.useColor + this.amount = amount + this.iconId = medicine.iconId + this.medicineId = medicine.medicineId + } + } + + companion object { + private fun addInactiveReminders( + medicine: MedicineWithReminders, + entries: MutableList + ) { + for (reminder in medicine.reminders) { + if (!isReminderActive(reminder)) { + entries.add(ManualDoseEntry(medicine.medicine, reminder.amount)) + } + } + } + } +} diff --git a/app/src/main/java/com/futsch1/medtimer/overview/VariableAmount.kt b/app/src/main/java/com/futsch1/medtimer/overview/VariableAmount.kt index 946cc205..ba610ed8 100644 --- a/app/src/main/java/com/futsch1/medtimer/overview/VariableAmount.kt +++ b/app/src/main/java/com/futsch1/medtimer/overview/VariableAmount.kt @@ -65,7 +65,6 @@ private fun updateReminderEvent( reminderEvent?.amount = amount NotificationAction.processReminderEvent( activity, - reminderEventId, ReminderEvent.ReminderStatus.TAKEN, reminderEvent!!, repository diff --git a/app/src/main/java/com/futsch1/medtimer/reminders/NotificationAction.java b/app/src/main/java/com/futsch1/medtimer/reminders/NotificationAction.java index 801784f2..0bb21c59 100644 --- a/app/src/main/java/com/futsch1/medtimer/reminders/NotificationAction.java +++ b/app/src/main/java/com/futsch1/medtimer/reminders/NotificationAction.java @@ -9,6 +9,7 @@ import com.futsch1.medtimer.LogTags; import com.futsch1.medtimer.database.MedicineRepository; +import com.futsch1.medtimer.database.Reminder; import com.futsch1.medtimer.database.ReminderEvent; import java.time.Instant; @@ -26,17 +27,17 @@ static void processNotification(Context context, int reminderEventId, ReminderEv if (reminderEvent.askForAmount) { context.startActivity(ReminderProcessor.getVariableAmountActionIntent(context, reminderEventId, reminderEvent.amount)); } else { - processReminderEvent(context, reminderEventId, status, reminderEvent, medicineRepository); + processReminderEvent(context, status, reminderEvent, medicineRepository); } } } - public static void processReminderEvent(Context context, int reminderEventId, ReminderEvent.ReminderStatus status, ReminderEvent reminderEvent, MedicineRepository medicineRepository) { + public static void processReminderEvent(Context context, ReminderEvent.ReminderStatus status, ReminderEvent reminderEvent, MedicineRepository medicineRepository) { cancelNotification(context, reminderEvent.notificationId); - cancelPendingAlarms(context, reminderEventId); + cancelPendingAlarms(context, reminderEvent.reminderEventId); reminderEvent.status = status; - doStockHandling(context, reminderEventId, reminderEvent); + doStockHandling(context, reminderEvent, medicineRepository); doTimestampHandling(reminderEvent); medicineRepository.updateReminderEvent(reminderEvent); Log.i(LogTags.REMINDER, String.format("%s reminder %d for %s", @@ -64,10 +65,13 @@ public static void cancelPendingAlarms(Context context, int reminderEventId) { context.getSystemService(AlarmManager.class).cancel(snoozePendingIntent); } - private static void doStockHandling(Context context, int reminderEventId, ReminderEvent reminderEvent) { + private static void doStockHandling(Context context, ReminderEvent reminderEvent, MedicineRepository medicineRepository) { if (!reminderEvent.stockHandled && reminderEvent.status == ReminderEvent.ReminderStatus.TAKEN) { reminderEvent.stockHandled = true; - ReminderProcessor.requestStockHandling(context, reminderEventId); + Reminder reminder = medicineRepository.getReminder(reminderEvent.reminderId); + if (reminder != null) { + ReminderProcessor.requestStockHandling(context, reminder.amount, reminder.medicineRelId); + } } } diff --git a/app/src/main/java/com/futsch1/medtimer/reminders/ReminderProcessor.java b/app/src/main/java/com/futsch1/medtimer/reminders/ReminderProcessor.java index ff5b1b9b..2f59d1ef 100644 --- a/app/src/main/java/com/futsch1/medtimer/reminders/ReminderProcessor.java +++ b/app/src/main/java/com/futsch1/medtimer/reminders/ReminderProcessor.java @@ -3,6 +3,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static com.futsch1.medtimer.ActivityCodes.DISMISSED_ACTION; import static com.futsch1.medtimer.ActivityCodes.EXTRA_AMOUNT; +import static com.futsch1.medtimer.ActivityCodes.EXTRA_MEDICINE_ID; import static com.futsch1.medtimer.ActivityCodes.EXTRA_NOTIFICATION_ID; import static com.futsch1.medtimer.ActivityCodes.EXTRA_REMAINING_REPEATS; import static com.futsch1.medtimer.ActivityCodes.EXTRA_REMINDER_DATE; @@ -76,12 +77,13 @@ public static Intent getSnoozeIntent(@NonNull Context context, int reminderId, i return snoozeIntent; } - public static void requestStockHandling(Context context, int reminderEventId) { + public static void requestStockHandling(Context context, String amount, int medicineId) { WorkManager workManager = WorkManagerAccess.getWorkManager(context); OneTimeWorkRequest stockHandlingWork = new OneTimeWorkRequest.Builder(StockHandlingWork.class) .setInputData(new Data.Builder() - .putInt(EXTRA_REMINDER_EVENT_ID, reminderEventId) + .putString(EXTRA_AMOUNT, amount) + .putInt(EXTRA_MEDICINE_ID, medicineId) .build()) .build(); workManager.enqueue(stockHandlingWork); diff --git a/app/src/main/java/com/futsch1/medtimer/reminders/StockHandlingWork.kt b/app/src/main/java/com/futsch1/medtimer/reminders/StockHandlingWork.kt index 8874d2de..d67ddab5 100644 --- a/app/src/main/java/com/futsch1/medtimer/reminders/StockHandlingWork.kt +++ b/app/src/main/java/com/futsch1/medtimer/reminders/StockHandlingWork.kt @@ -7,29 +7,25 @@ import androidx.work.WorkerParameters import com.futsch1.medtimer.ActivityCodes import com.futsch1.medtimer.database.Medicine import com.futsch1.medtimer.database.MedicineRepository -import com.futsch1.medtimer.database.Reminder import com.futsch1.medtimer.helpers.MedicineHelper class StockHandlingWork(val context: Context, workerParameters: WorkerParameters) : Worker(context, workerParameters) { override fun doWork(): Result { - val reminderEventId = inputData.getInt(ActivityCodes.EXTRA_REMINDER_EVENT_ID, 0) + val amount = inputData.getString(ActivityCodes.EXTRA_AMOUNT) ?: return Result.failure() + val medicineId = inputData.getInt(ActivityCodes.EXTRA_MEDICINE_ID, -1) val medicineRepository = MedicineRepository(context as Application?) - val reminderEvent = medicineRepository.getReminderEvent(reminderEventId) - ?: return Result.failure() - val reminder = medicineRepository.getReminder(reminderEvent.reminderId) - ?: return Result.failure() - val medicine = medicineRepository.getMedicine(reminder.medicineRelId) + val medicine = medicineRepository.getMedicine(medicineId) ?: return Result.failure() - processStock(medicine, reminder) + processStock(medicine, amount) medicineRepository.updateMedicine(medicine) return Result.success() } - private fun processStock(medicine: Medicine, reminder: Reminder) { - val amount: Double? = MedicineHelper.parseAmount(reminder.amount) + private fun processStock(medicine: Medicine, reminderAmount: String) { + val amount: Double? = MedicineHelper.parseAmount(reminderAmount) if (amount != null) { medicine.amount -= amount if (medicine.amount < 0) { diff --git a/app/src/test/java/com/futsch1/medtimer/TakenSkippedWorkUnitTest.java b/app/src/test/java/com/futsch1/medtimer/TakenSkippedWorkUnitTest.java index b546db37..6d688bb9 100644 --- a/app/src/test/java/com/futsch1/medtimer/TakenSkippedWorkUnitTest.java +++ b/app/src/test/java/com/futsch1/medtimer/TakenSkippedWorkUnitTest.java @@ -1,5 +1,7 @@ package com.futsch1.medtimer; +import static com.futsch1.medtimer.ActivityCodes.EXTRA_AMOUNT; +import static com.futsch1.medtimer.ActivityCodes.EXTRA_MEDICINE_ID; import static com.futsch1.medtimer.ActivityCodes.EXTRA_REMINDER_EVENT_ID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -17,11 +19,14 @@ import androidx.work.Data; import androidx.work.ListenableWorker; +import androidx.work.OneTimeWorkRequest; import androidx.work.WorkManager; +import androidx.work.WorkRequest; import androidx.work.Worker; import androidx.work.WorkerParameters; import com.futsch1.medtimer.database.MedicineRepository; +import com.futsch1.medtimer.database.Reminder; import com.futsch1.medtimer.database.ReminderEvent; import com.futsch1.medtimer.reminders.SkippedWork; import com.futsch1.medtimer.reminders.TakenWork; @@ -83,8 +88,13 @@ private void testWork(Worker worker, ReminderEvent.ReminderStatus status) { reminderEvent.reminderEventId = reminderEventId; reminderEvent.status = ReminderEvent.ReminderStatus.RAISED; reminderEvent.processedTimestamp = Instant.now().getEpochSecond(); + Reminder reminder = new Reminder(5); + reminder.amount = "4"; - try (MockedConstruction mockedMedicineRepositories = mockConstruction(MedicineRepository.class, (mock, context) -> when(mock.getReminderEvent(reminderEventId)).thenReturn(reminderEvent)); + try (MockedConstruction mockedMedicineRepositories = mockConstruction(MedicineRepository.class, (mock, context) -> { + when(mock.getReminderEvent(reminderEventId)).thenReturn(reminderEvent); + when(mock.getReminder(reminderId)).thenReturn(reminder); + }); MockedStatic mockedWorkManagerAccess = mockStatic(WorkManagerAccess.class)) { WorkManager mockWorkManager = mock(WorkManager.class); mockedWorkManagerAccess.when(() -> WorkManagerAccess.getWorkManager(mockApplication)).thenReturn(mockWorkManager); @@ -101,8 +111,17 @@ private void testWork(Worker worker, ReminderEvent.ReminderStatus status) { assertEquals(reminderEventId, captor.getValue().reminderEventId); assertEquals(status, captor.getValue().status); verify(mockNotificationManager, times(1)).cancel(notificationId); + ArgumentCaptor captor1 = ArgumentCaptor.forClass(PendingIntent.class); verify(mockAlarmManager, times(1)).cancel(captor1.capture()); + + if (status == ReminderEvent.ReminderStatus.TAKEN) { + ArgumentCaptor captor2 = ArgumentCaptor.forClass(WorkRequest.class); + verify(mockWorkManager, times(1)).enqueue(captor2.capture()); + assertInstanceOf(OneTimeWorkRequest.class, captor2.getValue()); + assertEquals(reminder.amount, captor2.getValue().getWorkSpec().input.getString(EXTRA_AMOUNT)); + assertEquals(reminder.medicineRelId, captor2.getValue().getWorkSpec().input.getInt(EXTRA_MEDICINE_ID, -1)); + } } }