From 5b159f781555749e427aefafe078753d99dd57db Mon Sep 17 00:00:00 2001 From: Elliot Mawby Date: Thu, 13 Jun 2024 12:42:56 -0700 Subject: [PATCH] Add tests for pausing and resuming polling based on app focus --- .../NotificationPermissionControllerTests.kt | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/permission/NotificationPermissionControllerTests.kt b/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/permission/NotificationPermissionControllerTests.kt index efc124c59..f5ff0260a 100644 --- a/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/permission/NotificationPermissionControllerTests.kt +++ b/OneSignalSDK/onesignal/notifications/src/test/java/com/onesignal/notifications/internal/permission/NotificationPermissionControllerTests.kt @@ -1,6 +1,9 @@ package com.onesignal.notifications.internal.permission +import androidx.test.core.app.ApplicationProvider import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest +import com.onesignal.core.internal.application.IApplicationLifecycleHandler +import com.onesignal.core.internal.application.IApplicationService import com.onesignal.core.internal.permissions.IRequestPermissionService import com.onesignal.core.internal.preferences.IPreferencesService import com.onesignal.debug.LogLevel @@ -57,4 +60,85 @@ class NotificationPermissionControllerTests : FunSpec({ // permissionChanged Event should fire handlerFired shouldBe true } + + test("NotificationPermissionController permission polling pauses when app loses") { + // Given + val mockRequestPermissionService = mockk() + every { mockRequestPermissionService.registerAsCallback(any(), any()) } just runs + val mockPreferenceService = mockk() + val handlerList = mutableListOf() + val mockAppService = mockk() + every { mockAppService.addApplicationLifecycleHandler(any()) } answers { + handlerList.add(firstArg()) + } + every { mockAppService.appContext } returns ApplicationProvider.getApplicationContext() + + var handlerFired = false + val notificationPermissionController = NotificationPermissionController(mockAppService, mockRequestPermissionService, mockAppService, mockPreferenceService, MockHelper.configModelStore()) + + notificationPermissionController.subscribe( + object : INotificationPermissionChangedHandler { + override fun onNotificationPermissionChanged(enabled: Boolean) { + handlerFired = true + } + }, + ) + + // When + // the app has loses focus + for (handler in handlerList) { + handler.onUnfocused() + } + delay(5) + // the permission changes + ShadowRoboNotificationManager.setNotificationsEnabled(false) + delay(5) + + // Then + // permissionChanged Event should not fire + handlerFired shouldBe false + } + + test("NotificationPermissionController permission polling resumes when app gains focus") { + // Given + val mockRequestPermissionService = mockk() + every { mockRequestPermissionService.registerAsCallback(any(), any()) } just runs + val mockPreferenceService = mockk() + val handlerList = mutableListOf() + val mockAppService = mockk() + every { mockAppService.addApplicationLifecycleHandler(any()) } answers { + handlerList.add(firstArg()) + } + every { mockAppService.appContext } returns ApplicationProvider.getApplicationContext() + + var handlerFired = false + val notificationPermissionController = NotificationPermissionController(mockAppService, mockRequestPermissionService, mockAppService, mockPreferenceService, MockHelper.configModelStore()) + + notificationPermissionController.subscribe( + object : INotificationPermissionChangedHandler { + override fun onNotificationPermissionChanged(enabled: Boolean) { + handlerFired = true + } + }, + ) + + // When + // the app loses focus + for (handler in handlerList) { + handler.onUnfocused() + } + delay(5) + // the permission changes + ShadowRoboNotificationManager.setNotificationsEnabled(false) + delay(5) + // the app regains focus + for (handler in handlerList) { + handler.onFocus() + } + delay(5) + + // Then + // permissionChanged Event should fire + handlerFired shouldBe true + } })