From c36d48e26ff6e46b9b1f249a4e05b5baf3b3490a Mon Sep 17 00:00:00 2001 From: Sankalpa Sarkar Date: Thu, 12 Mar 2026 12:10:55 +0530 Subject: [PATCH] Add null handling and tests for average wait time calculation in QueueUtils --- .../module/queue/utils/QueueUtils.java | 4 +- .../module/queue/utils/QueueUtilsTest.java | 57 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/org/openmrs/module/queue/utils/QueueUtils.java b/api/src/main/java/org/openmrs/module/queue/utils/QueueUtils.java index 20a7e44d..c1172141 100644 --- a/api/src/main/java/org/openmrs/module/queue/utils/QueueUtils.java +++ b/api/src/main/java/org/openmrs/module/queue/utils/QueueUtils.java @@ -70,7 +70,9 @@ public static double computeAverageWaitTimeInMinutes(List queueEntri numEntries++; } } - averageWaitTime = totalWaitTime / numEntries; + if (numEntries > 0) { + averageWaitTime = totalWaitTime / numEntries; + } } return averageWaitTime; } diff --git a/api/src/test/java/org/openmrs/module/queue/utils/QueueUtilsTest.java b/api/src/test/java/org/openmrs/module/queue/utils/QueueUtilsTest.java index 8c927e8c..3eb948ce 100644 --- a/api/src/test/java/org/openmrs/module/queue/utils/QueueUtilsTest.java +++ b/api/src/test/java/org/openmrs/module/queue/utils/QueueUtilsTest.java @@ -12,9 +12,13 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; +import java.util.ArrayList; +import java.util.Collections; import java.util.Date; +import java.util.List; import org.junit.Test; +import org.openmrs.module.queue.model.QueueEntry; public class QueueUtilsTest { @@ -28,6 +32,59 @@ public class QueueUtilsTest { private static final Date AUG_4 = QueueUtils.parseDate("2023-08-04 10:00:00"); + @Test + public void computeAverageWaitTime_shouldReturnZeroForNullList() { + assertThat(QueueUtils.computeAverageWaitTimeInMinutes(null), is(0.0)); + } + + @Test + public void computeAverageWaitTime_shouldReturnZeroForEmptyList() { + assertThat(QueueUtils.computeAverageWaitTimeInMinutes(Collections.emptyList()), is(0.0)); + } + + @Test + public void computeAverageWaitTime_shouldReturnZeroWhenAllEntriesHaveNullEndedAt() { + QueueEntry entry = new QueueEntry(); + entry.setStartedAt(AUG_1); + entry.setEndedAt(null); + List entries = Collections.singletonList(entry); + assertThat(QueueUtils.computeAverageWaitTimeInMinutes(entries), is(0.0)); + } + + @Test + public void computeAverageWaitTime_shouldReturnCorrectAverageForEntriesWithEndedAt() { + // AUG_1 to AUG_2 = 1440 minutes (24 hours) + QueueEntry entry1 = new QueueEntry(); + entry1.setStartedAt(AUG_1); + entry1.setEndedAt(AUG_2); + // AUG_1 to AUG_3 = 2880 minutes (48 hours) + QueueEntry entry2 = new QueueEntry(); + entry2.setStartedAt(AUG_1); + entry2.setEndedAt(AUG_3); + List entries = new ArrayList<>(); + entries.add(entry1); + entries.add(entry2); + // Average = (1440 + 2880) / 2 = 2160 + assertThat(QueueUtils.computeAverageWaitTimeInMinutes(entries), is(2160.0)); + } + + @Test + public void computeAverageWaitTime_shouldSkipEntriesWithNullEndedAt() { + // AUG_1 to AUG_2 = 1440 minutes + QueueEntry entry1 = new QueueEntry(); + entry1.setStartedAt(AUG_1); + entry1.setEndedAt(AUG_2); + // This one has null endedAt, should be skipped + QueueEntry entry2 = new QueueEntry(); + entry2.setStartedAt(AUG_1); + entry2.setEndedAt(null); + List entries = new ArrayList<>(); + entries.add(entry1); + entries.add(entry2); + // Only entry1 counts: average = 1440 / 1 = 1440 + assertThat(QueueUtils.computeAverageWaitTimeInMinutes(entries), is(1440.0)); + } + @Test public void shouldReturnTrueIfDatesOverlap() { // Test that nulls are handled as open-ended dates