commit d58ff69d8d6d60ca6fb5d96387fcbd1fd7e47470
parent 738950e2474c2f0d961fd3a73dd37a04823f39e9
Author: t-p-white <towhite@mozilla.com>
Date: Thu, 20 Nov 2025 17:39:26 +0000
Bug 1991921 - Part 2: Refactored the TermsOfUseManager to move some high level conditional checks to the repository for a cleaner interface and simpler testing. r=android-reviewers,joberhauser
Differential Revision: https://phabricator.services.mozilla.com/D273207
Diffstat:
6 files changed, 165 insertions(+), 191 deletions(-)
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/TermsOfUseManager.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/TermsOfUseManager.kt
@@ -6,23 +6,21 @@ package org.mozilla.fenix.termsofuse
import androidx.annotation.VisibleForTesting
import org.mozilla.fenix.termsofuse.store.TermsOfUsePromptRepository
-import org.mozilla.fenix.utils.Settings.Companion.FIVE_DAYS_MS
-import org.mozilla.fenix.utils.Settings.Companion.THIRTY_SECONDS_MS
/**
- * Helps determine when the terms of use prompt should show.
+ * Helps determine when the Terms of Use prompt should show.
*
* @param repository the repository for data related to the Terms of Use prompt.
*/
class TermsOfUseManager(private val repository: TermsOfUsePromptRepository) {
- private var isFirstCheckSinceStartingApp: Boolean = false
+ private var isFirstCheckSinceAppStart: Boolean = false
/**
* Determines whether the Terms of Use bottom sheet should be shown on the homepage.
*/
fun shouldShowTermsOfUsePromptOnHomepage() =
- shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceStartingApp = true)
+ shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceAppStart = true)
/**
* Determines whether the Terms of Use bottom sheet should be shown in the browser fragment.
@@ -32,50 +30,34 @@ class TermsOfUseManager(private val repository: TermsOfUsePromptRepository) {
/**
* Determines whether the Terms of Use bottom sheet should be shown.
*
- * This function returns `true` if:
- * - The user has not accepted the Terms of Use.
- * - The terms of use prompt feature flag is enabled.
- * - The prompt has not already been displayed the maximum number of times.
- * - The user has not postponed accepting the Terms of Use or it's been at least 5 days since they did.
- * - This is the first time checking to see if we should show the prompt since starting the app
- * OR the [ignoreFirstCheckSinceStartingApp] flag is true (we should ignore this when checking from homepage).
+ * @param ignoreFirstCheckSinceAppStart Used to check whether the app start check is required.
+ * @param currentTimeInMillis The current time in milliseconds.
*
- * @param ignoreFirstCheckSinceStartingApp if we should ignore the [isFirstCheckSinceStartingApp] value.
- * It should be ignored when checking from homepage.
- * @param currentTimeInMillis the current time in milliseconds
* @return `true` if the Terms of Use bottom sheet should be shown; otherwise, `false`.
*/
- @Suppress("ReturnCount")
@VisibleForTesting
internal fun shouldShowTermsOfUsePrompt(
- ignoreFirstCheckSinceStartingApp: Boolean = false,
+ ignoreFirstCheckSinceAppStart: Boolean = false,
currentTimeInMillis: Long = System.currentTimeMillis(),
- ): Boolean {
- if (repository.hasAcceptedTermsOfUse) return false
- if (!repository.isTermsOfUsePromptEnabled) return false
- if (repository.hasExceededMaxDisplayCount) return false
+ ): Boolean = repository.canShowTermsOfUsePrompt() &&
+ !repository.userPostponedAndWithinCooldownPeriod(currentTimeInMillis) &&
+ isFirstCheckFromAppStart(ignoreFirstCheckSinceAppStart)
- val isFirstCheck = isFirstCheckSinceStartingApp
- isFirstCheckSinceStartingApp = false
-
- val durationSinceLastPrompt = currentTimeInMillis - repository.lastTermsOfUsePromptTimeInMillis
- val durationBetweenPrompts = if (repository.isDebugTermsOfUseTriggerTimeEnabled) {
- THIRTY_SECONDS_MS
- } else {
- FIVE_DAYS_MS
- }
-
- if (repository.hasPostponedAcceptingTermsOfUse && durationSinceLastPrompt < durationBetweenPrompts) return false
- if (!ignoreFirstCheckSinceStartingApp && !isFirstCheck) return false
-
- return true
+ /**
+ * This is the first time checking to see if we should show the prompt since starting the app
+ * OR the [ignore] flag is true (we should ignore this when checking from homepage).
+ */
+ private fun isFirstCheckFromAppStart(ignore: Boolean): Boolean {
+ val isFirstCheck = isFirstCheckSinceAppStart
+ isFirstCheckSinceAppStart = false
+ return ignore || isFirstCheck
}
/**
- * Called from the [org.mozilla.fenix.HomeActivity]'s onStart. Used to track the first check
+ * Called from the [org.mozilla.fenix.HomeActivity]'s onStart. Used to track the first check
* since starting the app.
*/
fun onStart() {
- isFirstCheckSinceStartingApp = true
+ isFirstCheckSinceAppStart = true
}
}
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptRepository.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptRepository.kt
@@ -6,40 +6,33 @@ package org.mozilla.fenix.termsofuse.store
import org.mozilla.fenix.termsofuse.TOU_VERSION
import org.mozilla.fenix.utils.Settings
+import org.mozilla.fenix.utils.Settings.Companion.FIVE_DAYS_MS
+import org.mozilla.fenix.utils.Settings.Companion.THIRTY_SECONDS_MS
/**
* Repository for preferences related to the terms of use bottom sheet.
*/
interface TermsOfUsePromptRepository {
/**
- * Whether the user has accepted the Terms of Use.
- */
- val hasAcceptedTermsOfUse: Boolean
-
- /**
- * Whether the Terms of Use prompt feature is enabled.
- */
- val isTermsOfUsePromptEnabled: Boolean
-
- /**
- * Whether the user exceeded the maximum number of times the Terms of Use prompt has been displayed.
- */
- val hasExceededMaxDisplayCount: Boolean
-
- /**
- * Whether the debug Terms of Use trigger time is enabled.
- */
- val isDebugTermsOfUseTriggerTimeEnabled: Boolean
-
- /**
- * The last time the Terms of Use prompt was displayed.
+ * Determines whether the Terms of Use prompt can be shown.
+ *
+ * @return `true` if the following conditions are met:
+ *
+ * - The user has not accepted the Terms of Use.
+ * - The terms of use prompt feature flag is enabled.
+ * - The prompt has not already been displayed the maximum number of times.
*/
- val lastTermsOfUsePromptTimeInMillis: Long
+ fun canShowTermsOfUsePrompt(): Boolean
/**
- * Whether the user has postponed accepting the Terms of Use.
+ * Determines whether the user postponed accepting the Terms of Use and is within the cooldown
+ * period.
+ *
+ * **Do not show the Terms of Use prompt if `true`.**
+ *
+ * @return `true` if the user postponed accepting the Terms of Use and is within the cooldown period.
*/
- val hasPostponedAcceptingTermsOfUse: Boolean
+ fun userPostponedAndWithinCooldownPeriod(currentTimeMillis: Long): Boolean
/**
* Updates the Terms of Use related preferences when the user accepts the ToU.
@@ -74,23 +67,22 @@ interface TermsOfUsePromptRepository {
class DefaultTermsOfUsePromptRepository(
private val settings: Settings,
) : TermsOfUsePromptRepository {
- override val hasAcceptedTermsOfUse: Boolean
- get() = settings.hasAcceptedTermsOfService
-
- override val isTermsOfUsePromptEnabled: Boolean
- get() = settings.isTermsOfUsePromptEnabled
-
- override val hasExceededMaxDisplayCount: Boolean
- get() = settings.termsOfUsePromptDisplayedCount > settings.getTermsOfUseMaxDisplayCount()
-
- override val isDebugTermsOfUseTriggerTimeEnabled: Boolean
- get() = settings.isDebugTermsOfServiceTriggerTimeEnabled
-
- override val lastTermsOfUsePromptTimeInMillis: Long
- get() = settings.lastTermsOfUsePromptTimeInMillis
+ override fun canShowTermsOfUsePrompt(): Boolean =
+ !settings.hasAcceptedTermsOfService && settings.isTermsOfUsePromptEnabled && !hasExceededMaxDisplayCount()
+
+ override fun userPostponedAndWithinCooldownPeriod(currentTimeMillis: Long): Boolean {
+ val durationSinceLastPrompt = currentTimeMillis - settings.lastTermsOfUsePromptTimeInMillis
+ val durationBetweenPrompts = if (settings.isDebugTermsOfServiceTriggerTimeEnabled) {
+ THIRTY_SECONDS_MS
+ } else {
+ FIVE_DAYS_MS
+ }
+
+ return settings.hasPostponedAcceptingTermsOfUse && (durationSinceLastPrompt < durationBetweenPrompts)
+ }
- override val hasPostponedAcceptingTermsOfUse: Boolean
- get() = settings.hasPostponedAcceptingTermsOfUse
+ private fun hasExceededMaxDisplayCount() =
+ settings.termsOfUsePromptDisplayedCount > settings.getTermsOfUseMaxDisplayCount()
override fun updateHasAcceptedTermsOfUsePreference(nowMillis: Long) {
settings.hasAcceptedTermsOfService = true
diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/FakeTermsOfUsePromptRepository.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/FakeTermsOfUsePromptRepository.kt
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.termsofuse
+
+import org.mozilla.fenix.termsofuse.store.TermsOfUsePromptRepository
+
+class FakeTermsOfUsePromptRepository(
+ private val canShowTermsOfUsePrompt: Boolean = true,
+ private val userPostponedAndWithinCooldownPeriod: Boolean = false,
+) : TermsOfUsePromptRepository {
+ override fun canShowTermsOfUsePrompt() = canShowTermsOfUsePrompt
+
+ override fun userPostponedAndWithinCooldownPeriod(currentTimeMillis: Long) =
+ userPostponedAndWithinCooldownPeriod
+
+ override fun updateHasAcceptedTermsOfUsePreference(nowMillis: Long) {}
+ override fun updateHasPostponedAcceptingTermsOfUsePreference() {}
+ override fun updateLastTermsOfUsePromptTimeInMillis(currentTimeInMillis: Long) {}
+ override fun incrementTermsOfUsePromptDisplayedCount() {}
+}
diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/MockTermsOfUsePromptRepository.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/MockTermsOfUsePromptRepository.kt
@@ -1,21 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-package org.mozilla.fenix.termsofuse
-
-import org.mozilla.fenix.termsofuse.store.TermsOfUsePromptRepository
-
-class MockTermsOfUsePromptRepository(
- override var hasAcceptedTermsOfUse: Boolean = false,
- override val isTermsOfUsePromptEnabled: Boolean = true, // enable the feature by default for testing
- override val hasExceededMaxDisplayCount: Boolean = false,
- override val isDebugTermsOfUseTriggerTimeEnabled: Boolean = false,
- override val lastTermsOfUsePromptTimeInMillis: Long = 0L,
- override val hasPostponedAcceptingTermsOfUse: Boolean = false,
-) : TermsOfUsePromptRepository {
- override fun updateHasAcceptedTermsOfUsePreference(nowMillis: Long) {}
- override fun updateHasPostponedAcceptingTermsOfUsePreference() {}
- override fun updateLastTermsOfUsePromptTimeInMillis(currentTimeInMillis: Long) {}
- override fun incrementTermsOfUsePromptDisplayedCount() {}
-}
diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/TermsOfUseManagerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/TermsOfUseManagerTest.kt
@@ -7,72 +7,38 @@ package org.mozilla.fenix.termsofuse
import junit.framework.TestCase.assertFalse
import junit.framework.TestCase.assertTrue
import org.junit.Test
-import org.mozilla.fenix.utils.Settings.Companion.FIVE_DAYS_MS
class TermsOfUseManagerTest {
@Test
fun `WHEN all conditions satisfied AND we ignore the first check THEN shouldShowTermsOfUsePrompt returns true`() {
- val repository = MockTermsOfUsePromptRepository()
+ val repository = FakeTermsOfUsePromptRepository()
val termsOfUseManager = TermsOfUseManager(repository)
- assertTrue(termsOfUseManager.shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceStartingApp = true))
+ assertTrue(termsOfUseManager.shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceAppStart = true))
}
@Test
- fun `GIVEN other conditions satisfied WHEN user has already accepted the Terms of Use THEN shouldShowTermsOfUsePrompt returns false`() {
- val repository = MockTermsOfUsePromptRepository(hasAcceptedTermsOfUse = true)
+ fun `GIVEN other conditions satisfied WHEN canShowTermsOfUsePrompt returns false THEN shouldShowTermsOfUsePrompt returns false`() {
+ val repository = FakeTermsOfUsePromptRepository(canShowTermsOfUsePrompt = false)
val termsOfUseManager = TermsOfUseManager(repository)
- assertFalse(termsOfUseManager.shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceStartingApp = true))
+ assertFalse(termsOfUseManager.shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceAppStart = true))
}
@Test
- fun `GIVEN other conditions satisfied WHEN the Terms of Use feature flag is disabled THEN shouldShowTermsOfUsePrompt returns false`() {
- val repository = MockTermsOfUsePromptRepository(isTermsOfUsePromptEnabled = false)
+ fun `GIVEN other conditions satisfied WHEN userPostponedAndWithinCooldownPeriod returns true THEN shouldShowTermsOfUsePrompt returns false`() {
+ val repository = FakeTermsOfUsePromptRepository(userPostponedAndWithinCooldownPeriod = true)
val termsOfUseManager = TermsOfUseManager(repository)
- assertFalse(termsOfUseManager.shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceStartingApp = true))
- }
-
- @Test
- fun `GIVEN other conditions satisfied WHEN prompt display count exceeded the max number of times to display THEN shouldShowTermsOfUsePrompt returns false`() {
- val repository = MockTermsOfUsePromptRepository(hasExceededMaxDisplayCount = true)
-
- val termsOfUseManager = TermsOfUseManager(repository)
-
- assertFalse(termsOfUseManager.shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceStartingApp = true))
- }
-
- @Test
- fun `GIVEN other conditions satisfied WHEN the user has postponed accepting and it has been 5 days since THEN shouldShowTermsOfUsePrompt returns true`() {
- val repository = MockTermsOfUsePromptRepository(
- hasPostponedAcceptingTermsOfUse = true,
- lastTermsOfUsePromptTimeInMillis = System.currentTimeMillis() - FIVE_DAYS_MS,
- )
-
- val termsOfUseManager = TermsOfUseManager(repository)
-
- assertTrue(termsOfUseManager.shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceStartingApp = true))
- }
-
- @Test
- fun `GIVEN other conditions satisfied WHEN the user has postponed accepting and it has not been 5 days since THEN shouldShowTermsOfUsePrompt returns false`() {
- val repository = MockTermsOfUsePromptRepository(
- hasPostponedAcceptingTermsOfUse = true,
- lastTermsOfUsePromptTimeInMillis = System.currentTimeMillis(),
- )
-
- val termsOfUseManager = TermsOfUseManager(repository)
-
- assertFalse(termsOfUseManager.shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceStartingApp = true))
+ assertFalse(termsOfUseManager.shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceAppStart = true))
}
@Test
fun `GIVEN other conditions satisfied WHEN this is not first check of the session and don't ignore first check THEN shouldShowTermsOfUsePrompt returns false`() {
- val repository = MockTermsOfUsePromptRepository()
+ val repository = FakeTermsOfUsePromptRepository()
val termsOfUseManager = TermsOfUseManager(repository)
@@ -81,7 +47,7 @@ class TermsOfUseManagerTest {
@Test
fun `GIVEN other conditions satisfied WHEN this is first check of the session and don't ignore first check THEN shouldShowTermsOfUsePrompt returns true`() {
- val repository = MockTermsOfUsePromptRepository()
+ val repository = FakeTermsOfUsePromptRepository()
val termsOfUseManager = TermsOfUseManager(repository)
termsOfUseManager.onStart()
@@ -91,17 +57,17 @@ class TermsOfUseManagerTest {
@Test
fun `GIVEN other conditions satisfied WHEN this is not the first check of the session and we ignore the first check THEN shouldShowTermsOfUsePrompt returns true`() {
- val repository = MockTermsOfUsePromptRepository()
+ val repository = FakeTermsOfUsePromptRepository()
val termsOfUseManager = TermsOfUseManager(repository)
termsOfUseManager.shouldShowTermsOfUsePrompt()
- assertTrue(termsOfUseManager.shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceStartingApp = true))
+ assertTrue(termsOfUseManager.shouldShowTermsOfUsePrompt(ignoreFirstCheckSinceAppStart = true))
}
@Test
fun `GIVEN other conditions satisfied WHEN this is not the first check of the session and we don't ignore the first check THEN shouldShowTermsOfUsePrompt returns false`() {
- val repository = MockTermsOfUsePromptRepository()
+ val repository = FakeTermsOfUsePromptRepository()
val termsOfUseManager = TermsOfUseManager(repository)
termsOfUseManager.shouldShowTermsOfUsePrompt()
diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptRepositoryTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptRepositoryTest.kt
@@ -12,6 +12,8 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.utils.Settings
+import org.mozilla.fenix.utils.Settings.Companion.FIVE_DAYS_MS
+import org.mozilla.fenix.utils.Settings.Companion.THIRTY_SECONDS_MS
import org.robolectric.RobolectricTestRunner
private const val TIME_IN_MILLIS = 1759926358L
@@ -34,103 +36,134 @@ class TermsOfUsePromptRepositoryTest {
}
@Test
- fun `WHEN settings hasAcceptedTermsOfService is false THEN hasAcceptedTermsOfUse returns false`() {
+ fun `WHEN all conditions satisfied THEN show the prompt`() {
settings.hasAcceptedTermsOfService = false
+ settings.isTermsOfUsePromptEnabled = true
+ settings.termsOfUsePromptDisplayedCount = MAX_DISPLAY_COUNT
assertFalse(settings.hasAcceptedTermsOfService)
- assertFalse(repository.hasAcceptedTermsOfUse)
+ assertTrue(settings.isTermsOfUsePromptEnabled)
+ assertEquals(MAX_DISPLAY_COUNT, settings.termsOfUsePromptDisplayedCount)
+
+ assertTrue(repository.canShowTermsOfUsePrompt())
}
@Test
- fun `WHEN settings hasAcceptedTermsOfService is true THEN hasAcceptedTermsOfUse returns true`() {
+ fun `WHEN user has already accepted the ToU THEN don't show the prompt`() {
settings.hasAcceptedTermsOfService = true
+ settings.isTermsOfUsePromptEnabled = true
+ settings.termsOfUsePromptDisplayedCount = MAX_DISPLAY_COUNT
assertTrue(settings.hasAcceptedTermsOfService)
- assertTrue(repository.hasAcceptedTermsOfUse)
+ assertTrue(settings.isTermsOfUsePromptEnabled)
+ assertEquals(MAX_DISPLAY_COUNT, settings.termsOfUsePromptDisplayedCount)
+
+ assertFalse(repository.canShowTermsOfUsePrompt())
}
@Test
- fun `WHEN settings isTermsOfUsePromptEnabled is false THEN isTermsOfUsePromptEnabled returns false`() {
+ fun `WHEN the prompt feature is disabled THEN don't show the prompt`() {
+ settings.hasAcceptedTermsOfService = false
settings.isTermsOfUsePromptEnabled = false
+ settings.termsOfUsePromptDisplayedCount = MAX_DISPLAY_COUNT
+ assertFalse(settings.hasAcceptedTermsOfService)
assertFalse(settings.isTermsOfUsePromptEnabled)
- assertFalse(repository.isTermsOfUsePromptEnabled)
+ assertEquals(MAX_DISPLAY_COUNT, settings.termsOfUsePromptDisplayedCount)
+
+ assertFalse(repository.canShowTermsOfUsePrompt())
}
@Test
- fun `WHEN settings isTermsOfUsePromptEnabled is true THEN isTermsOfUsePromptEnabled returns true`() {
+ fun `WHEN user has already seen the maximum number of prompts THEN don't show the prompt`() {
+ val excessiveDisplayCount = MAX_DISPLAY_COUNT + 1
+ settings.hasAcceptedTermsOfService = false
settings.isTermsOfUsePromptEnabled = true
+ settings.termsOfUsePromptDisplayedCount = excessiveDisplayCount
+ assertFalse(settings.hasAcceptedTermsOfService)
assertTrue(settings.isTermsOfUsePromptEnabled)
- assertTrue(repository.isTermsOfUsePromptEnabled)
- }
+ assertEquals(excessiveDisplayCount, settings.termsOfUsePromptDisplayedCount)
- @Test
- fun `WHEN settings ToU prompt count is more than the max display count THEN hasExceededMaxDisplayCount returns true`() {
- val count = MAX_DISPLAY_COUNT + 1
- settings.termsOfUsePromptDisplayedCount = count
-
- assertEquals(count, settings.termsOfUsePromptDisplayedCount)
- assertTrue(repository.hasExceededMaxDisplayCount)
+ assertFalse(repository.canShowTermsOfUsePrompt())
}
@Test
- fun `WHEN settings ToU prompt count is the max display count THEN hasExceededMaxDisplayCount returns false`() {
- val count = MAX_DISPLAY_COUNT
- settings.termsOfUsePromptDisplayedCount = count
+ fun `WHEN user was last prompted less than 5 days ago and postponed accepting ToU THEN userPostponedAndWithinCooldownPeriod returns true`() {
+ val lastPromptTimeMs = TIME_IN_MILLIS - (FIVE_DAYS_MS - 1)
+ settings.lastTermsOfUsePromptTimeInMillis = lastPromptTimeMs
+ settings.hasPostponedAcceptingTermsOfUse = true
- assertEquals(count, settings.termsOfUsePromptDisplayedCount)
- assertFalse(repository.hasExceededMaxDisplayCount)
+ assertEquals(lastPromptTimeMs, settings.lastTermsOfUsePromptTimeInMillis)
+ assertTrue(settings.hasPostponedAcceptingTermsOfUse)
+
+ assertTrue(repository.userPostponedAndWithinCooldownPeriod(TIME_IN_MILLIS))
}
@Test
- fun `WHEN settings ToU prompt count is less than the max display count THEN hasExceededMaxDisplayCount returns false`() {
- val count = MAX_DISPLAY_COUNT - 1
- settings.termsOfUsePromptDisplayedCount = count
+ fun `WHEN user was last prompted 5 days ago and postponed accepting ToU THEN userPostponedAndWithinCooldownPeriod returns false`() {
+ val lastPromptTimeMs = TIME_IN_MILLIS - FIVE_DAYS_MS
+ settings.lastTermsOfUsePromptTimeInMillis = lastPromptTimeMs
+ settings.hasPostponedAcceptingTermsOfUse = true
- assertEquals(count, settings.termsOfUsePromptDisplayedCount)
- assertFalse(repository.hasExceededMaxDisplayCount)
+ assertEquals(lastPromptTimeMs, settings.lastTermsOfUsePromptTimeInMillis)
+ assertTrue(settings.hasPostponedAcceptingTermsOfUse)
+
+ assertFalse(repository.userPostponedAndWithinCooldownPeriod(TIME_IN_MILLIS))
}
@Test
- fun `WHEN settings isDebugTermsOfServiceTriggerTimeEnabled is false THEN isDebugTermsOfUseTriggerTimeEnabled returns false`() {
- settings.isDebugTermsOfServiceTriggerTimeEnabled = false
+ fun `WHEN user was last prompted over 5 days ago and postponed accepting ToU THEN userPostponedAndWithinCooldownPeriod returns false`() {
+ val lastPromptTimeMs = TIME_IN_MILLIS - (FIVE_DAYS_MS + 1)
+ settings.lastTermsOfUsePromptTimeInMillis = lastPromptTimeMs
+ settings.hasPostponedAcceptingTermsOfUse = true
- assertFalse(settings.isDebugTermsOfServiceTriggerTimeEnabled)
- assertFalse(repository.isDebugTermsOfUseTriggerTimeEnabled)
+ assertEquals(lastPromptTimeMs, settings.lastTermsOfUsePromptTimeInMillis)
+ assertTrue(settings.hasPostponedAcceptingTermsOfUse)
+
+ assertFalse(repository.userPostponedAndWithinCooldownPeriod(TIME_IN_MILLIS))
}
@Test
- fun `WHEN settings isDebugTermsOfServiceTriggerTimeEnabled is true THEN isDebugTermsOfUseTriggerTimeEnabled returns true`() {
+ fun `GIVEN debug mode WHEN user was last prompted less than 30 seconds ago and postponed accepting ToU THEN userPostponedAndWithinCooldownPeriod returns true`() {
+ val lastPromptTimeMs = TIME_IN_MILLIS - (THIRTY_SECONDS_MS - 1)
+ settings.lastTermsOfUsePromptTimeInMillis = lastPromptTimeMs
settings.isDebugTermsOfServiceTriggerTimeEnabled = true
+ settings.hasPostponedAcceptingTermsOfUse = true
+ assertEquals(lastPromptTimeMs, settings.lastTermsOfUsePromptTimeInMillis)
assertTrue(settings.isDebugTermsOfServiceTriggerTimeEnabled)
- assertTrue(repository.isDebugTermsOfUseTriggerTimeEnabled)
- }
-
- @Test
- fun `WHEN settings lastTermsOfUsePromptTimeInMillis is set THEN lastTermsOfUsePromptTimeInMillis returns the same value`() {
- val time = 12345L
- settings.lastTermsOfUsePromptTimeInMillis = time
+ assertTrue(settings.hasPostponedAcceptingTermsOfUse)
- assertEquals(time, settings.lastTermsOfUsePromptTimeInMillis)
- assertEquals(time, repository.lastTermsOfUsePromptTimeInMillis)
+ assertTrue(repository.userPostponedAndWithinCooldownPeriod(TIME_IN_MILLIS))
}
@Test
- fun `WHEN settings hasPostponedAcceptingTermsOfUse is false THEN hasPostponedAcceptingTermsOfUse returns false`() {
- settings.hasPostponedAcceptingTermsOfUse = false
+ fun `GIVEN debug mode WHEN user was last prompted 30 seconds ago and postponed accepting ToU THEN userPostponedAndWithinCooldownPeriod returns false`() {
+ val lastPromptTimeMs = TIME_IN_MILLIS - THIRTY_SECONDS_MS
+ settings.lastTermsOfUsePromptTimeInMillis = lastPromptTimeMs
+ settings.isDebugTermsOfServiceTriggerTimeEnabled = true
+ settings.hasPostponedAcceptingTermsOfUse = true
- assertFalse(settings.hasPostponedAcceptingTermsOfUse)
- assertFalse(repository.hasPostponedAcceptingTermsOfUse)
+ assertEquals(lastPromptTimeMs, settings.lastTermsOfUsePromptTimeInMillis)
+ assertTrue(settings.isDebugTermsOfServiceTriggerTimeEnabled)
+ assertTrue(settings.hasPostponedAcceptingTermsOfUse)
+
+ assertFalse(repository.userPostponedAndWithinCooldownPeriod(TIME_IN_MILLIS))
}
@Test
- fun `WHEN settings hasPostponedAcceptingTermsOfUse is true THEN hasPostponedAcceptingTermsOfUse returns true`() {
+ fun `GIVEN debug mode WHEN user was last prompted over 30 seconds ago and postponed accepting ToU THEN userPostponedAndWithinCooldownPeriod returns false`() {
+ val lastPromptTimeMs = TIME_IN_MILLIS - (THIRTY_SECONDS_MS + 1)
+ settings.lastTermsOfUsePromptTimeInMillis = lastPromptTimeMs
+ settings.isDebugTermsOfServiceTriggerTimeEnabled = true
settings.hasPostponedAcceptingTermsOfUse = true
+ assertEquals(lastPromptTimeMs, settings.lastTermsOfUsePromptTimeInMillis)
+ assertTrue(settings.isDebugTermsOfServiceTriggerTimeEnabled)
assertTrue(settings.hasPostponedAcceptingTermsOfUse)
- assertTrue(repository.hasPostponedAcceptingTermsOfUse)
+
+ assertFalse(repository.userPostponedAndWithinCooldownPeriod(TIME_IN_MILLIS))
}
@Test