Skip to content

Commit

Permalink
Add tests for pausing and resuming polling based on app focus
Browse files Browse the repository at this point in the history
  • Loading branch information
emawby committed Jun 13, 2024
1 parent 4134618 commit 5d8d226
Showing 1 changed file with 84 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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<IRequestPermissionService>()
every { mockRequestPermissionService.registerAsCallback(any(), any()) } just runs
val mockPreferenceService = mockk<IPreferencesService>()
val handlerList = mutableListOf<IApplicationLifecycleHandler>()
val mockAppService = mockk<IApplicationService>()
every { mockAppService.addApplicationLifecycleHandler(any()) } answers {
handlerList.add(firstArg<IApplicationLifecycleHandler>())
}
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<IRequestPermissionService>()
every { mockRequestPermissionService.registerAsCallback(any(), any()) } just runs
val mockPreferenceService = mockk<IPreferencesService>()
val handlerList = mutableListOf<IApplicationLifecycleHandler>()
val mockAppService = mockk<IApplicationService>()
every { mockAppService.addApplicationLifecycleHandler(any()) } answers {
handlerList.add(firstArg<IApplicationLifecycleHandler>())
}
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
}
})

0 comments on commit 5d8d226

Please sign in to comment.