From a2f7e7406d5b1dcb141401b515bb700f76d892e3 Mon Sep 17 00:00:00 2001 From: InfinityTwo <2poh.junkang@gmail.com> Date: Wed, 26 Feb 2025 22:51:53 +0800 Subject: [PATCH 1/3] Add test for CalculateUsageStatisticsAction --- .../CalculateUsageStatisticsActionTest.java | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 src/test/java/teammates/sqlui/webapi/CalculateUsageStatisticsActionTest.java diff --git a/src/test/java/teammates/sqlui/webapi/CalculateUsageStatisticsActionTest.java b/src/test/java/teammates/sqlui/webapi/CalculateUsageStatisticsActionTest.java new file mode 100644 index 00000000000..069d7357c8b --- /dev/null +++ b/src/test/java/teammates/sqlui/webapi/CalculateUsageStatisticsActionTest.java @@ -0,0 +1,136 @@ +package teammates.sqlui.webapi; + +import static org.mockito.ArgumentMatchers.isA; +import static org.mockito.Mockito.when; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.List; + +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import teammates.common.datatransfer.attributes.UsageStatisticsAttributes; +import teammates.common.util.Const; +import teammates.common.util.TimeHelper; +import teammates.storage.sqlentity.UsageStatistics; +import teammates.ui.webapi.CalculateUsageStatisticsAction; + +/** + * SUT: {@link CalculateUsageStatisticsAction}. + */ +public class CalculateUsageStatisticsActionTest extends BaseActionTest { + private static final int NUMBER_OF_RESPONSES = 2; + private static final int NUMBER_OF_COURSES = 2; + private static final int NUMBER_OF_STUDENTS = 2; + private static final int NUMBER_OF_INSTRUCTORS = 2; + private static final int NUMBER_OF_ACCOUNT_REQUESTS = 2; + private static final int COLLECTION_TIME_PERIOD = 60; + Instant endTime = TimeHelper.getInstantNearestHourBefore(Instant.now()); + Instant startTime = endTime.minus(COLLECTION_TIME_PERIOD, ChronoUnit.MINUTES); + UsageStatistics testUsageStatistics; + UsageStatisticsAttributes testUsageStatisticsAttributes; + + @Override + protected String getActionUri() { + return Const.CronJobURIs.AUTOMATED_USAGE_STATISTICS_COLLECTION; + } + + @Override + protected String getRequestMethod() { + return GET; + } + + @Test + void testAccessControl_admin_canAccess() { + verifyCanAccess(); + } + + @Test + void testAccessControl_maintainers_canAccess() { + logoutUser(); + loginAsMaintainer(); + verifyCanAccess(); + } + + @Test + void testAccessControl_instructor_cannotAccess() { + logoutUser(); + loginAsInstructor(Const.ParamsNames.INSTRUCTOR_ID); + verifyCannotAccess(); + } + + @Test + void testAccessControl_student_cannotAccess() { + logoutUser(); + loginAsStudent(Const.ParamsNames.STUDENT_ID); + verifyCannotAccess(); + } + + @Test + void testAccessControl_loggedOut_cannotAccess() { + logoutUser(); + verifyCannotAccess(); + } + + @Test + void testAccessControl_unregistered_cannotAccess() { + logoutUser(); + loginAsUnregistered(Const.ParamsNames.USER_ID); + verifyCannotAccess(); + } + + @BeforeMethod + void setUp() { + testUsageStatistics = new UsageStatistics( + startTime, + COLLECTION_TIME_PERIOD, + NUMBER_OF_RESPONSES, + NUMBER_OF_COURSES, + NUMBER_OF_STUDENTS, + NUMBER_OF_INSTRUCTORS, + NUMBER_OF_ACCOUNT_REQUESTS, + 0, + 0); + testUsageStatisticsAttributes = + UsageStatisticsAttributes.builder(startTime, COLLECTION_TIME_PERIOD) + .withNumResponses(NUMBER_OF_RESPONSES) + .withNumCourses(NUMBER_OF_COURSES) + .withNumStudents(NUMBER_OF_STUDENTS) + .withNumInstructors(NUMBER_OF_INSTRUCTORS) + .withNumAccountRequests(NUMBER_OF_ACCOUNT_REQUESTS) + .build(); + } + + @Test + public void testExecute_normalCase_shouldSucceed() { + when(mockLogic.calculateEntitiesStatisticsForTimeRange(isA(Instant.class), isA(Instant.class))) + .thenReturn(testUsageStatistics); + when(mockDatastoreLogic.calculateEntitiesStatisticsForTimeRange(isA(Instant.class), isA(Instant.class))) + .thenReturn(testUsageStatisticsAttributes); + when(mockLogic.getUsageStatisticsForTimeRange(isA(Instant.class), isA(Instant.class))) + .thenReturn(List.of(testUsageStatistics)); + + CalculateUsageStatisticsAction action = getAction(); + action.execute(); + + List statsObjects = mockLogic.getUsageStatisticsForTimeRange( + TimeHelper.getInstantDaysOffsetBeforeNow(1L), + TimeHelper.getInstantDaysOffsetFromNow(1L)); + + // Only check that there is a stats object created. + // Everything else is not predictable. + assertEquals(1, statsObjects.size()); + + UsageStatistics statsObject = statsObjects.get(0); + assertEquals(COLLECTION_TIME_PERIOD, statsObject.getTimePeriod()); + + // Note that there is a slim possibility that this assertion may fail, if the hour has changed + // between when the stats was gathered and the line where Instant.now is called. + // However, as the execution happens in milliseconds precision, the risk is too small to justify + // the additional code needed to handle this case. + Instant pastHour = TimeHelper.getInstantNearestHourBefore(Instant.now()).minus(1, ChronoUnit.HOURS); + assertEquals(pastHour, statsObject.getStartTime()); + + } +} From 5fef82c9d54f7a1005cae1895d9a4118110a0ab3 Mon Sep 17 00:00:00 2001 From: InfinityTwo <2poh.junkang@gmail.com> Date: Wed, 26 Feb 2025 23:03:34 +0800 Subject: [PATCH 2/3] Add missing login as admin --- .../sqlui/webapi/CalculateUsageStatisticsActionTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/teammates/sqlui/webapi/CalculateUsageStatisticsActionTest.java b/src/test/java/teammates/sqlui/webapi/CalculateUsageStatisticsActionTest.java index 069d7357c8b..f810334959e 100644 --- a/src/test/java/teammates/sqlui/webapi/CalculateUsageStatisticsActionTest.java +++ b/src/test/java/teammates/sqlui/webapi/CalculateUsageStatisticsActionTest.java @@ -82,6 +82,7 @@ void testAccessControl_unregistered_cannotAccess() { @BeforeMethod void setUp() { + loginAsAdmin(); testUsageStatistics = new UsageStatistics( startTime, COLLECTION_TIME_PERIOD, From d519932829b6b76b8095cd6ee9926972785b35a3 Mon Sep 17 00:00:00 2001 From: InfinityTwo <2poh.junkang@gmail.com> Date: Wed, 26 Feb 2025 23:31:47 +0800 Subject: [PATCH 3/3] Update maintainer test to cannot access --- .../sqlui/webapi/CalculateUsageStatisticsActionTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/teammates/sqlui/webapi/CalculateUsageStatisticsActionTest.java b/src/test/java/teammates/sqlui/webapi/CalculateUsageStatisticsActionTest.java index f810334959e..f4e37fcb89e 100644 --- a/src/test/java/teammates/sqlui/webapi/CalculateUsageStatisticsActionTest.java +++ b/src/test/java/teammates/sqlui/webapi/CalculateUsageStatisticsActionTest.java @@ -47,10 +47,10 @@ void testAccessControl_admin_canAccess() { } @Test - void testAccessControl_maintainers_canAccess() { + void testAccessControl_maintainers_cannotAccess() { logoutUser(); loginAsMaintainer(); - verifyCanAccess(); + verifyCannotAccess(); } @Test