tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/TermsOfUseManager.kt | 56+++++++++++++++++++-------------------------------------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptRepository.kt | 72++++++++++++++++++++++++++++++++----------------------------------------
Amobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/FakeTermsOfUsePromptRepository.kt | 22++++++++++++++++++++++
Dmobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/MockTermsOfUsePromptRepository.kt | 21---------------------
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/TermsOfUseManagerTest.kt | 60+++++++++++++-----------------------------------------------
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptRepositoryTest.kt | 125++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
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