Build household requests under Settings

This commit is contained in:
justinzeus 2026-11-05 17:35:42 +01:00
parent 7a878b2d81
commit 5b0703aec5
58 changed files with 1575 additions and 23 deletions

View file

@ -0,0 +1,52 @@
// SPDX-License-Identifier: GPL-2.0-only
package org.justinvisser.wolfskin.tv
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.advanceTimeBy
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertEquals
import org.junit.Test
import org.justinvisser.wolfskin.design.ComingInRequest
import org.justinvisser.wolfskin.design.ComingInSnapshot
import org.justinvisser.wolfskin.design.ComingInStage
import org.justinvisser.wolfskin.design.ComingInStatus
import org.justinvisser.wolfskin.design.ShellPerson
import org.justinvisser.wolfskin.design.ShellState
/** The fake clock checks refresh boundaries and cancellation without a server or a real wait. */
@OptIn(ExperimentalCoroutinesApi::class)
class RequestsRefreshTest {
@Test fun foregroundOpenUnsettledSettledAndStoppedTransitions() = runTest {
val state = ShellState(listOf(ShellPerson("justin", "Justin", "J", false)), "justin")
val request = ComingInRequest("one", "movie", 1, "One", "justin", "Justin", "shared", "Shared", ComingInStage.Waiting)
state.requests.update(ComingInSnapshot(status = ComingInStatus.Ready, signedIn = true))
var reads = 0
val active = launch { refreshRequestsWhileStarted(state) { reads++ } }
runCurrent()
assertEquals(1, reads)
advanceTimeBy(30_000); runCurrent()
assertEquals("Closed and settled does not poll", 1, reads)
state.openRequests()
advanceTimeBy(29_999); runCurrent()
assertEquals(1, reads)
advanceTimeBy(1); runCurrent()
assertEquals("An open empty sheet still refreshes at 30 seconds", 2, reads)
state.closeRequests()
state.requests.update(ComingInSnapshot(listOf(request), ComingInStatus.Ready, signedIn = true))
advanceTimeBy(30_000); runCurrent()
assertEquals("An unsettled request refreshes after the sheet closes", 3, reads)
state.requests.update(ComingInSnapshot(listOf(request.copy(stage = ComingInStage.Ready)), ComingInStatus.Ready, signedIn = true))
advanceTimeBy(30_000); runCurrent()
assertEquals("Ready requests stop polling", 3, reads)
active.cancel(); runCurrent()
state.openRequests()
advanceTimeBy(60_000); runCurrent()
assertEquals("A stopped lifecycle cannot poll", 3, reads)
val resumed = launch { refreshRequestsWhileStarted(state) { reads++ } }
runCurrent()
assertEquals("Returning to the foreground refreshes immediately", 4, reads)
resumed.cancel()
}
}