From 009cb9a7ccb4a5e2d2e6eb58e9a7a9858cb2559a Mon Sep 17 00:00:00 2001 From: Sprite Date: Thu, 17 Sep 2026 02:54:41 +0000 Subject: [PATCH] Wave 11 (M-authexpiry): refresh auth token every sync; recover rows lost to the expired-token sync Committed by tasks/wave-chain.sh after its mechanical gate passed (assembleDebug, testDebugUnitTest = 355 tests, verifyPaparazziDebug, no build files touched, no "always 'false'"). ORCHESTRATOR REVIEW STILL PENDING. Prompt: tasks/M-authexpiry.txt. Worker: $4.886013000000001, 123 turns. Co-Authored-By: Claude Opus 5 --- .../bookshelf/data/prefs/SettingsStore.kt | 40 ++++++ .../bookshelf/data/remote/PocketBaseApi.kt | 13 ++ .../bookshelf/data/repo/AuthRepository.kt | 9 ++ .../modg/bookshelf/data/repo/SyncEngine.kt | 73 ++++++++++ .../bookshelf/ui/components/SyncStatusBar.kt | 11 +- .../bookshelf/ui/library/LibraryScreen.kt | 10 +- .../ui/library/LibrarySyncPresenter.kt | 4 + .../bookshelf/ui/library/LibraryViewModel.kt | 5 +- .../modg/bookshelf/ui/nav/BookshelfNavHost.kt | 5 + .../bookshelf/ui/settings/SettingsScreen.kt | 31 ++++- .../ui/settings/SettingsViewModel.kt | 10 +- .../modg/bookshelf/ui/setup/SetupViewModel.kt | 11 ++ .../bookshelf/data/repo/AuthRepositoryTest.kt | 18 +++ .../bookshelf/data/repo/FakePocketBaseApi.kt | 23 ++++ .../bookshelf/data/repo/SyncEngineTest.kt | 130 ++++++++++++++++++ .../ui/library/LibrarySyncPresenterTest.kt | 7 + .../ui/library/LibraryViewModelTest.kt | 32 ++++- .../ui/screens/LibraryScreenPaparazziTest.kt | 11 ++ .../ui/screens/SettingsScreenPaparazziTest.kt | 35 ++++- .../ui/settings/SettingsViewModelTest.kt | 116 ++++++++++++++++ .../bookshelf/ui/setup/SetupViewModelTest.kt | 63 +++++++++ ...ExpiredLight_library-auth-expired-dark.png | Bin 0 -> 54738 bytes ...xpiredLight_library-auth-expired-light.png | Bin 0 -> 58570 bytes ...xpiredLight_settings-auth-expired-dark.png | Bin 0 -> 47295 bytes ...piredLight_settings-auth-expired-light.png | Bin 0 -> 46519 bytes logs/M-authexpiry-fix.sid | 1 + logs/M-authexpiry-fix.summary | 18 +++ logs/M-authexpiry.sid | 1 + logs/M-authexpiry.summary | 13 ++ tasks/M-authexpiry-fix.txt | 14 ++ 30 files changed, 687 insertions(+), 17 deletions(-) create mode 100644 app/app/src/test/java/org/modg/bookshelf/ui/settings/SettingsViewModelTest.kt create mode 100644 app/app/src/test/java/org/modg/bookshelf/ui/setup/SetupViewModelTest.kt create mode 100644 app/app/src/test/snapshots/images/org.modg.bookshelf.ui.screens_LibraryScreenPaparazziTest_libraryAuthExpiredLight_library-auth-expired-dark.png create mode 100644 app/app/src/test/snapshots/images/org.modg.bookshelf.ui.screens_LibraryScreenPaparazziTest_libraryAuthExpiredLight_library-auth-expired-light.png create mode 100644 app/app/src/test/snapshots/images/org.modg.bookshelf.ui.screens_SettingsScreenPaparazziTest_settingsAuthExpiredLight_settings-auth-expired-dark.png create mode 100644 app/app/src/test/snapshots/images/org.modg.bookshelf.ui.screens_SettingsScreenPaparazziTest_settingsAuthExpiredLight_settings-auth-expired-light.png create mode 100644 logs/M-authexpiry-fix.sid create mode 100644 logs/M-authexpiry-fix.summary create mode 100644 logs/M-authexpiry.sid create mode 100644 logs/M-authexpiry.summary create mode 100644 tasks/M-authexpiry-fix.txt diff --git a/app/app/src/main/java/org/modg/bookshelf/data/prefs/SettingsStore.kt b/app/app/src/main/java/org/modg/bookshelf/data/prefs/SettingsStore.kt index 35ef865..9a04dfe 100644 --- a/app/app/src/main/java/org/modg/bookshelf/data/prefs/SettingsStore.kt +++ b/app/app/src/main/java/org/modg/bookshelf/data/prefs/SettingsStore.kt @@ -3,6 +3,7 @@ package org.modg.bookshelf.data.prefs import android.content.Context import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.longPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey @@ -27,6 +28,10 @@ class SettingsStore(private val context: Context) { val USER_EMAIL = stringPreferencesKey("user_email") val LAST_SYNC_TIME = longPreferencesKey("last_sync_time") val LAST_SHELF_ID = stringPreferencesKey("last_shelf_id") + // Named for the incident, not the feature: a generic "did the full repull + // run" flag would invite reuse for some future, unrelated repull with + // different safety requirements. See SyncEngine.sync(). + val FULL_REPULL_2026_09_17_DONE = booleanPreferencesKey("full_repull_2026_09_17_done") fun cursor(collection: String) = stringPreferencesKey("cursor_$collection") } @@ -36,6 +41,9 @@ class SettingsStore(private val context: Context) { val userEmail: Flow = context.dataStore.data.map { it[Keys.USER_EMAIL] } val lastSyncTime: Flow = context.dataStore.data.map { it[Keys.LAST_SYNC_TIME] } + /** See [Keys.FULL_REPULL_2026_09_17_DONE] and [setFullRepullDone]. */ + val fullRepullDone: Flow = context.dataStore.data.map { it[Keys.FULL_REPULL_2026_09_17_DONE] ?: false } + /** * The shelf most recently assigned to a book — SPEC "remember the most recently * used shelf" (shelving a box of books usually means one shelf, over and over). @@ -66,10 +74,30 @@ class SettingsStore(private val context: Context) { context.dataStore.edit { it[Keys.cursor(collection)] = cursor } } + /** Forces the next sync's pull to fetch that collection from scratch. */ + suspend fun clearCursor(collection: String) { + context.dataStore.edit { it.remove(Keys.cursor(collection)) } + } + suspend fun setLastSyncTime(epochMillis: Long) { context.dataStore.edit { it[Keys.LAST_SYNC_TIME] = epochMillis } } + /** One-way: production code never needs to un-set this once a full re-pull has landed. */ + suspend fun setFullRepullDone() { + context.dataStore.edit { it[Keys.FULL_REPULL_2026_09_17_DONE] = true } + } + + /** + * Test-only seam (internal, not private) — DataStore's on-disk state + * otherwise leaks across Robolectric test methods within a class; see + * [org.modg.bookshelf.data.prefs.SettingsStoreTest]'s [clearLastShelfId] + * call in its own setUp for the same reason. + */ + internal suspend fun resetFullRepullDoneForTesting() { + context.dataStore.edit { it.remove(Keys.FULL_REPULL_2026_09_17_DONE) } + } + suspend fun setLastShelfId(shelfId: String) { context.dataStore.edit { it[Keys.LAST_SHELF_ID] = shelfId } } @@ -92,6 +120,18 @@ class SettingsStore(private val context: Context) { } } + /** + * Auth EXPIRY, not sign-out: the 2026-09-17 incident (server logged + * `auth: ""` on every request — a 5-day-old token PocketBase silently + * treated as anonymous rather than rejecting) means the token can go bad + * on its own. Unlike [clearAuth], this keeps server URL, user id AND + * email so the setup screen can pre-fill everything but the password — + * re-signing-in after an expiry should be one field, not three. + */ + suspend fun clearAuthToken() { + context.dataStore.edit { it.remove(Keys.AUTH_TOKEN) } + } + companion object { const val COLLECTION_BOOKS = "books" const val COLLECTION_SHELVES = "shelves" diff --git a/app/app/src/main/java/org/modg/bookshelf/data/remote/PocketBaseApi.kt b/app/app/src/main/java/org/modg/bookshelf/data/remote/PocketBaseApi.kt index e2824d4..9ae3518 100644 --- a/app/app/src/main/java/org/modg/bookshelf/data/remote/PocketBaseApi.kt +++ b/app/app/src/main/java/org/modg/bookshelf/data/remote/PocketBaseApi.kt @@ -20,6 +20,19 @@ interface PocketBaseApi { @POST("api/collections/users/auth-with-password") suspend fun authWithPassword(@Body body: AuthWithPasswordRequest): AuthResponse + /** + * Re-issues a fresh token for the currently-attached one (see + * [PbAuthInterceptor]) — same response shape as [authWithPassword]. Called + * at the start of every [org.modg.bookshelf.data.repo.SyncEngine.sync]: a + * PocketBase user token that has quietly expired is NOT rejected by the + * server, it's just treated as anonymous, and an anonymous request 404s + * on records the rules hide instead of 401ing — see + * [org.modg.bookshelf.data.repo.SyncEngine]'s 404 hard-delete helpers for + * the 2026-09-17 incident that caused. + */ + @POST("api/collections/users/auth-refresh") + suspend fun authRefresh(): AuthResponse + // ---- books ---- @GET("api/collections/books/records") diff --git a/app/app/src/main/java/org/modg/bookshelf/data/repo/AuthRepository.kt b/app/app/src/main/java/org/modg/bookshelf/data/repo/AuthRepository.kt index 366c33c..aed0b63 100644 --- a/app/app/src/main/java/org/modg/bookshelf/data/repo/AuthRepository.kt +++ b/app/app/src/main/java/org/modg/bookshelf/data/repo/AuthRepository.kt @@ -18,6 +18,9 @@ class AuthRepository( val isLoggedIn: Flow = settingsStore.authToken.map { !it.isNullOrBlank() } val serverUrl: Flow = settingsStore.serverUrl + /** Read by the setup screen to pre-fill re-sign-in after an auth expiry (SettingsStore.clearAuthToken keeps this). */ + val userEmail: Flow = settingsStore.userEmail + /** Normalizes per SPEC: requires https, strips a trailing slash. */ suspend fun setServerUrl(rawUrl: String): Result { val trimmed = rawUrl.trim().trimEnd('/') @@ -36,6 +39,12 @@ class AuthRepository( settingsStore.setAuthToken(response.token) settingsStore.setUserId(response.record.id) settingsStore.setUserEmail(email) + // Every fresh sign-in reconciles fully, not just the one after the + // 2026-09-17 incident's stuck cursors — the same backstop for any + // future cause we haven't thought of yet. + settingsStore.clearCursor(SettingsStore.COLLECTION_BOOKCASES) + settingsStore.clearCursor(SettingsStore.COLLECTION_SHELVES) + settingsStore.clearCursor(SettingsStore.COLLECTION_BOOKS) Result.success(Unit) } catch (e: Exception) { Result.failure(e) diff --git a/app/app/src/main/java/org/modg/bookshelf/data/repo/SyncEngine.kt b/app/app/src/main/java/org/modg/bookshelf/data/repo/SyncEngine.kt index c71fa81..3c19d39 100644 --- a/app/app/src/main/java/org/modg/bookshelf/data/repo/SyncEngine.kt +++ b/app/app/src/main/java/org/modg/bookshelf/data/repo/SyncEngine.kt @@ -1,5 +1,6 @@ package org.modg.bookshelf.data.repo +import kotlinx.coroutines.CancellationException import kotlinx.coroutines.flow.first import okhttp3.MultipartBody import okhttp3.RequestBody.Companion.asRequestBody @@ -26,6 +27,13 @@ sealed class SyncResult { object Success : SyncResult() object Skipped : SyncResult() data class Failure(val error: Throwable) : SyncResult() + + /** + * The session is gone (auth-refresh, or any push/pull mid-sync, came back + * 401/403). Distinct from [Failure]: the fix isn't "retry later", it's + * "sign in again" — see the 2026-09-17 incident in SyncEngine's KDoc. + */ + object AuthExpired : SyncResult() } /** @@ -35,6 +43,18 @@ sealed class SyncResult { * is bookcases -> shelves -> books both ways, so relations resolve cleanly * even though Room does not enforce foreign keys between them (sync would * otherwise have to special-case out-of-order pages). + * + * 2026-09-17 incident: user auth tokens lasted PocketBase's default 5 days, + * the app logged in once on the setup screen and never refreshed, and + * PocketBase does NOT reject an expired/invalid `Authorization` header — it + * silently treats the request as anonymous. The `@request.auth.id != ""` + * collection rules then turned every write anonymous-404/400, and this + * class's own 404-means-deleted handling (see the update* helpers below) + * hard-deleted five books that were still intact on the server. Server + * tokens now last 180 days (commit ab1d294) as a backstop, but the real fix + * is here: refresh the token at the top of every sync, before any push/pull, + * so a stale token surfaces as [SyncResult.AuthExpired] instead of silently + * degrading into anonymous requests that 404 on records the rules are hiding. */ class SyncEngine( private val apiProvider: ApiProvider, @@ -46,6 +66,25 @@ class SyncEngine( suspend fun sync(): SyncResult { val api = apiProvider.api() ?: return SyncResult.Skipped return try { + val refreshed = api.authRefresh() + settingsStore.setAuthToken(refreshed.token) + settingsStore.setUserId(refreshed.record.id) + + // One-time recovery for the 2026-09-17 incident: rows hard-deleted + // locally by an anonymous-404 during the outage are still on the + // server, but the pull cursor has already moved past their + // `updated`, so an ordinary incremental pull will never see them + // again. Re-pulling everything once is safe — see + // applyIncomingBook/shouldApplyRemote below: a row missing + // locally is always inserted, and a locally-dirty row only ever + // loses to a strictly newer remote copy. + val recovering = !settingsStore.fullRepullDone.first() + if (recovering) { + settingsStore.clearCursor(SettingsStore.COLLECTION_BOOKCASES) + settingsStore.clearCursor(SettingsStore.COLLECTION_SHELVES) + settingsStore.clearCursor(SettingsStore.COLLECTION_BOOKS) + } + pushBookcases(api) pushShelves(api) pushBooks(api) @@ -53,7 +92,24 @@ class SyncEngine( pullShelves(api) pullBooks(api) settingsStore.setLastSyncTime(System.currentTimeMillis()) + // Only after the whole sync succeeds — a sync that fails partway + // through (e.g. pull throws) must retry the full re-pull next time. + if (recovering) settingsStore.setFullRepullDone() SyncResult.Success + } catch (e: CancellationException) { + throw e + } catch (e: HttpException) { + if (e.code() == 401 || e.code() == 403) { + // Belt and braces: this catches both authRefresh's own 401/403 + // and one from any push/pull call later in this same sync + // (e.g. the token was revoked mid-sync). The 404 handling in + // the update* helpers below only matches code 404, so it can + // never swallow this. + settingsStore.clearAuthToken() + SyncResult.AuthExpired + } else { + SyncResult.Failure(e) + } } catch (e: IOException) { SyncResult.Failure(e) } catch (e: Exception) { @@ -85,6 +141,15 @@ class SyncEngine( } } + /** + * A 404 here is trusted as "deleted on the server" ONLY because [sync] + * proved the attached token valid, moments earlier, by refreshing it. On + * 2026-09-17 a request that carried a quietly-expired token 404'd on a + * bookcase that still existed — PocketBase's create/update rules hide a + * record from an unauthenticated caller rather than 401ing it, so an + * anonymous PATCH to an existing id looks identical to one to a deleted + * id. Do not call this without a fresh refresh in the same [sync] run. + */ private suspend fun updateBookcase(api: PocketBaseApi, entity: BookcaseEntity) { try { val response = api.updateBookcase(entity.id, entity.toDto()) @@ -115,6 +180,7 @@ class SyncEngine( } } + /** Same trust argument as [updateBookcase]'s KDoc — see it for the 2026-09-17 incident. */ private suspend fun updateShelf(api: PocketBaseApi, entity: ShelfEntity) { try { val response = api.updateShelf(entity.id, entity.toDto()) @@ -145,6 +211,13 @@ class SyncEngine( } } + /** + * Same trust argument as [updateBookcase]'s KDoc — see it for the + * 2026-09-17 incident. This is the helper that actually lost the user's + * books that day: five records hard-deleted locally while fully intact + * on the server, because the request that 404'd on them carried no valid + * auth and PocketBase's rules hid rather than rejected them. + */ private suspend fun updateBook(api: PocketBaseApi, entity: BookEntity) { try { val response = api.updateBook(entity.id, entity.toDto()) diff --git a/app/app/src/main/java/org/modg/bookshelf/ui/components/SyncStatusBar.kt b/app/app/src/main/java/org/modg/bookshelf/ui/components/SyncStatusBar.kt index e935b94..8060bb5 100644 --- a/app/app/src/main/java/org/modg/bookshelf/ui/components/SyncStatusBar.kt +++ b/app/app/src/main/java/org/modg/bookshelf/ui/components/SyncStatusBar.kt @@ -7,6 +7,7 @@ import androidx.compose.animation.core.infiniteRepeatable import androidx.compose.animation.core.rememberInfiniteTransition import androidx.compose.animation.core.tween import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row @@ -36,6 +37,9 @@ enum class SyncStatus { Syncing, Offline, Error, + + /** The session expired (see SyncEngine's 2026-09-17 incident KDoc) — distinct from [Error] so the bar is tappable to re-sign-in. */ + AuthExpired, } /** @@ -52,11 +56,16 @@ fun SyncStatusBar( status: SyncStatus, label: String, modifier: Modifier = Modifier, + // Only [SyncStatus.AuthExpired] wires this up today (SPEC: sync failure is + // a quiet status line, never a dialog — but "sign in again" needs SOME + // affordance, and this bar is what the user is already looking at). + onClick: (() -> Unit)? = null, ) { Row( modifier = modifier .fillMaxWidth() .background(MaterialTheme.colorScheme.surfaceContainerLow) + .let { if (onClick != null) it.clickable(onClick = onClick) else it } .navigationBarsPadding() .padding(horizontal = 28.dp, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically, @@ -77,7 +86,7 @@ private fun StatusDot(status: SyncStatus) { SyncStatus.Synced -> MaterialTheme.colorScheme.secondary SyncStatus.Syncing -> MaterialTheme.colorScheme.secondary SyncStatus.Offline -> MaterialTheme.colorScheme.onSurfaceVariant - SyncStatus.Error -> MaterialTheme.colorScheme.error + SyncStatus.Error, SyncStatus.AuthExpired -> MaterialTheme.colorScheme.error } if (status == SyncStatus.Syncing) { val transition = rememberInfiniteTransition(label = "sync-pulse") diff --git a/app/app/src/main/java/org/modg/bookshelf/ui/library/LibraryScreen.kt b/app/app/src/main/java/org/modg/bookshelf/ui/library/LibraryScreen.kt index 2275236..c058589 100644 --- a/app/app/src/main/java/org/modg/bookshelf/ui/library/LibraryScreen.kt +++ b/app/app/src/main/java/org/modg/bookshelf/ui/library/LibraryScreen.kt @@ -105,6 +105,10 @@ fun LibraryScreen( container: AppContainer, onEnterByHandWithQuery: (String) -> Unit = { onAddByHandClick() }, onEditOnlineResult: (OnlineBook, BookMetadata?) -> Unit = { _, _ -> }, + // 2026-09-17 incident: the user is looking at THIS screen when the + // session expires, not the setup screen — MainActivity's start-destination + // check only runs on a fresh launch. Defaults to a no-op for previews/tests. + onAuthExpired: () -> Unit = {}, ) { val viewModel: LibraryViewModel = viewModel( // A fresh VM per distinct shelf filter, so tapping a different shelf @@ -161,7 +165,11 @@ fun LibraryScreen( } }, syncStatusBar = { - SyncStatusBar(status = uiState.syncBar.status, label = uiState.syncBar.label) + SyncStatusBar( + status = uiState.syncBar.status, + label = uiState.syncBar.label, + onClick = if (uiState.syncBar.status == SyncStatus.AuthExpired) onAuthExpired else null, + ) }, ) { innerPadding -> PullToRefreshBox( diff --git a/app/app/src/main/java/org/modg/bookshelf/ui/library/LibrarySyncPresenter.kt b/app/app/src/main/java/org/modg/bookshelf/ui/library/LibrarySyncPresenter.kt index 532f06d..945e6b6 100644 --- a/app/app/src/main/java/org/modg/bookshelf/ui/library/LibrarySyncPresenter.kt +++ b/app/app/src/main/java/org/modg/bookshelf/ui/library/LibrarySyncPresenter.kt @@ -8,6 +8,9 @@ enum class SyncOutcome { SUCCESS, FAILURE, NO_SERVER, + + /** See [org.modg.bookshelf.data.repo.SyncResult.AuthExpired] — the fix is "sign in again", not "retry". */ + AUTH_EXPIRED, } data class SyncBarState(val status: SyncStatus, val label: String) @@ -29,6 +32,7 @@ object LibrarySyncPresenter { return when (lastOutcome) { SyncOutcome.FAILURE -> SyncBarState(SyncStatus.Error, "Sync failed — showing local library") SyncOutcome.NO_SERVER -> SyncBarState(SyncStatus.Offline, "No server configured") + SyncOutcome.AUTH_EXPIRED -> SyncBarState(SyncStatus.AuthExpired, "Signed out — sign in again to sync") SyncOutcome.SUCCESS, SyncOutcome.NONE -> if (lastSyncMillis != null) { SyncBarState(SyncStatus.Synced, "Synced ${elapsedPhrase(nowMillis - lastSyncMillis)}") } else { diff --git a/app/app/src/main/java/org/modg/bookshelf/ui/library/LibraryViewModel.kt b/app/app/src/main/java/org/modg/bookshelf/ui/library/LibraryViewModel.kt index 91e1dad..988089f 100644 --- a/app/app/src/main/java/org/modg/bookshelf/ui/library/LibraryViewModel.kt +++ b/app/app/src/main/java/org/modg/bookshelf/ui/library/LibraryViewModel.kt @@ -137,7 +137,9 @@ class LibraryViewModel( ) private val _onlineSearchPhase = MutableStateFlow(OnlineSearchPhase.NotSearched) - private var onlineSearchJob: Job? = null + + /** Internal (not private) so tests can join it to deterministically wait out a cancelled search. */ + internal var onlineSearchJob: Job? = null /** * Recomputed from [allBooks] on every change, not frozen at search time — so a @@ -425,6 +427,7 @@ class LibraryViewModel( is SyncResult.Success -> _lastSyncOutcome.value = SyncOutcome.SUCCESS is SyncResult.Failure -> _lastSyncOutcome.value = SyncOutcome.FAILURE is SyncResult.Skipped -> _lastSyncOutcome.value = SyncOutcome.NO_SERVER + is SyncResult.AuthExpired -> _lastSyncOutcome.value = SyncOutcome.AUTH_EXPIRED } _isSyncing.value = false } diff --git a/app/app/src/main/java/org/modg/bookshelf/ui/nav/BookshelfNavHost.kt b/app/app/src/main/java/org/modg/bookshelf/ui/nav/BookshelfNavHost.kt index 6b64b56..b839a71 100644 --- a/app/app/src/main/java/org/modg/bookshelf/ui/nav/BookshelfNavHost.kt +++ b/app/app/src/main/java/org/modg/bookshelf/ui/nav/BookshelfNavHost.kt @@ -57,6 +57,11 @@ fun BookshelfNavHost( onAddByHandClick = { navController.navigate(Routes.addBook()) }, onLocationsClick = { navController.navigate(Routes.LOCATIONS) }, onSettingsClick = { navController.navigate(Routes.SETTINGS) }, + onAuthExpired = { + navController.navigate(Routes.SETUP) { + popUpTo(navController.graph.id) { inclusive = true } + } + }, container = container, // Wave 10: "Can't find it? Enter it by hand" under the online results — // pre-fills the add-by-hand form's title with the search query. diff --git a/app/app/src/main/java/org/modg/bookshelf/ui/settings/SettingsScreen.kt b/app/app/src/main/java/org/modg/bookshelf/ui/settings/SettingsScreen.kt index 4330be9..5a7ba35 100644 --- a/app/app/src/main/java/org/modg/bookshelf/ui/settings/SettingsScreen.kt +++ b/app/app/src/main/java/org/modg/bookshelf/ui/settings/SettingsScreen.kt @@ -104,12 +104,30 @@ fun SettingsScreen( SectionHeading("Sync") InfoRow(label = "Last synced", value = formatLastSync(state.lastSyncTime)) - PrimaryButton( - text = if (state.isSyncing) "Syncing…" else "Sync now", - onClick = viewModel::syncNow, - enabled = !state.isSyncing, - modifier = Modifier.padding(top = 8.dp), - ) + if (state.syncAuthExpired) { + // Not a "Sync failed" dead end: the fix is signing in again, so the + // button goes straight to setup instead of retrying the same sync. + // Goes through onSignedOut directly, NOT viewModel.signOut(onSignedOut) + // — that also clears the stored email/user id, and setup pre-fills those. + Text( + text = "Your session expired. Sign in again.", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.error, + modifier = Modifier.padding(top = 8.dp), + ) + PrimaryButton( + text = "Sign in", + onClick = onSignedOut, + modifier = Modifier.padding(top = 8.dp), + ) + } else { + PrimaryButton( + text = if (state.isSyncing) "Syncing…" else "Sync now", + onClick = viewModel::syncNow, + enabled = !state.isSyncing, + modifier = Modifier.padding(top = 8.dp), + ) + } GoldDivider(modifier = Modifier.padding(vertical = 16.dp)) @@ -239,6 +257,7 @@ internal fun InfoRow(label: String, value: String) { private fun syncLabel(state: SettingsUiState): String = when { state.isSyncing -> "Syncing…" + state.syncAuthExpired -> "Signed out — sign in again to sync" state.syncError != null -> "Sync failed: ${state.syncError}" state.lastSyncTime != null -> "Synced • ${formatLastSync(state.lastSyncTime)}" else -> "Not synced yet" diff --git a/app/app/src/main/java/org/modg/bookshelf/ui/settings/SettingsViewModel.kt b/app/app/src/main/java/org/modg/bookshelf/ui/settings/SettingsViewModel.kt index 6c4edc7..177dbb0 100644 --- a/app/app/src/main/java/org/modg/bookshelf/ui/settings/SettingsViewModel.kt +++ b/app/app/src/main/java/org/modg/bookshelf/ui/settings/SettingsViewModel.kt @@ -26,11 +26,13 @@ data class SettingsUiState( val lastSyncTime: Long? = null, val isSyncing: Boolean = false, val syncError: String? = null, + val syncAuthExpired: Boolean = false, val latestCrash: CrashReport? = null, ) { val syncStatus: SyncStatus get() = when { isSyncing -> SyncStatus.Syncing + syncAuthExpired -> SyncStatus.AuthExpired syncError != null -> SyncStatus.Error lastSyncTime != null -> SyncStatus.Synced else -> SyncStatus.Offline @@ -56,6 +58,7 @@ class SettingsViewModel( private val isSyncing = MutableStateFlow(false) private val syncError = MutableStateFlow(null) + private val syncAuthExpired = MutableStateFlow(false) // Read only when this screen is opened (never at app startup) and off the // main thread — CrashReporter.list() reads files. See its KDoc. @@ -83,7 +86,7 @@ class SettingsViewModel( } val uiState: StateFlow = - combine(baseInfo, isSyncing, syncError, latestCrash) { base, syncing, error, crash -> + combine(baseInfo, isSyncing, syncError, syncAuthExpired, latestCrash) { base, syncing, error, authExpired, crash -> SettingsUiState( serverUrl = base.serverUrl, userEmail = base.userEmail, @@ -92,6 +95,7 @@ class SettingsViewModel( lastSyncTime = base.lastSyncTime, isSyncing = syncing, syncError = error, + syncAuthExpired = authExpired, latestCrash = crash, ) }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), SettingsUiState()) @@ -101,6 +105,7 @@ class SettingsViewModel( viewModelScope.launch { isSyncing.value = true syncError.value = null + syncAuthExpired.value = false // SyncEngine never throws (SPEC: sync failure is a quiet status // line, never a crash or a blocking dialog) — surface its result // as that quiet line, nothing more. @@ -108,6 +113,9 @@ class SettingsViewModel( is SyncResult.Success -> Unit is SyncResult.Skipped -> syncError.value = "No server configured yet." is SyncResult.Failure -> syncError.value = result.error.message ?: "Sync failed." + // Not a generic failure: "Sync failed: HTTP 401" would tell the user + // to retry, when what actually fixes this is signing in again. + is SyncResult.AuthExpired -> syncAuthExpired.value = true } isSyncing.value = false } diff --git a/app/app/src/main/java/org/modg/bookshelf/ui/setup/SetupViewModel.kt b/app/app/src/main/java/org/modg/bookshelf/ui/setup/SetupViewModel.kt index eed0e5b..78cc8e9 100644 --- a/app/app/src/main/java/org/modg/bookshelf/ui/setup/SetupViewModel.kt +++ b/app/app/src/main/java/org/modg/bookshelf/ui/setup/SetupViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -46,6 +47,16 @@ class SetupViewModel(private val authRepository: AuthRepository) : ViewModel() { .readTimeout(6, TimeUnit.SECONDS) .build() + init { + // Re-signing-in after an auth expiry (SettingsStore.clearAuthToken keeps + // server URL, user id and email) should be typing the password only. + viewModelScope.launch { + val url = authRepository.serverUrl.first() + val email = authRepository.userEmail.first() + _uiState.update { it.copy(serverUrl = url ?: it.serverUrl, email = email ?: it.email) } + } + } + fun onServerUrlChanged(value: String) { _uiState.update { it.copy(serverUrl = value, urlError = null) } } diff --git a/app/app/src/test/java/org/modg/bookshelf/data/repo/AuthRepositoryTest.kt b/app/app/src/test/java/org/modg/bookshelf/data/repo/AuthRepositoryTest.kt index b16eebd..69ca183 100644 --- a/app/app/src/test/java/org/modg/bookshelf/data/repo/AuthRepositoryTest.kt +++ b/app/app/src/test/java/org/modg/bookshelf/data/repo/AuthRepositoryTest.kt @@ -49,4 +49,22 @@ class AuthRepositoryTest { assertNull(settingsStore.userEmail.first()) } + + /** + * Backstop for causes of stuck cursors we haven't thought of yet (see the + * 2026-09-17 incident's one-time re-pull in SyncEngine.sync()): every fresh + * sign-in reconciles fully, not just the specific recovery path. + */ + @Test + fun `login success clears all three pull cursors so a fresh sign-in reconciles fully`() = runTest { + settingsStore.setCursor(SettingsStore.COLLECTION_BOOKS, "2024-01-01 00:00:00.000Z") + settingsStore.setCursor(SettingsStore.COLLECTION_SHELVES, "2024-01-01 00:00:00.000Z") + settingsStore.setCursor(SettingsStore.COLLECTION_BOOKCASES, "2024-01-01 00:00:00.000Z") + + repository.login(email = "reader@example.com", password = "hunter2") + + assertNull(settingsStore.cursorFor(SettingsStore.COLLECTION_BOOKS).first()) + assertNull(settingsStore.cursorFor(SettingsStore.COLLECTION_SHELVES).first()) + assertNull(settingsStore.cursorFor(SettingsStore.COLLECTION_BOOKCASES).first()) + } } diff --git a/app/app/src/test/java/org/modg/bookshelf/data/repo/FakePocketBaseApi.kt b/app/app/src/test/java/org/modg/bookshelf/data/repo/FakePocketBaseApi.kt index 1cf297b..c40ab92 100644 --- a/app/app/src/test/java/org/modg/bookshelf/data/repo/FakePocketBaseApi.kt +++ b/app/app/src/test/java/org/modg/bookshelf/data/repo/FakePocketBaseApi.kt @@ -1,5 +1,6 @@ package org.modg.bookshelf.data.repo +import kotlinx.coroutines.CancellationException import okhttp3.MediaType.Companion.toMediaType import okhttp3.MultipartBody import okhttp3.ResponseBody.Companion.toResponseBody @@ -10,8 +11,10 @@ import org.modg.bookshelf.data.remote.BookcaseDto import org.modg.bookshelf.data.remote.PbListResponse import org.modg.bookshelf.data.remote.PocketBaseApi import org.modg.bookshelf.data.remote.ShelfDto +import org.modg.bookshelf.data.remote.UserRecordDto import retrofit2.HttpException import retrofit2.Response +import java.io.IOException fun httpError(code: Int): HttpException { val body = "{}".toResponseBody("application/json".toMediaType()) @@ -37,6 +40,16 @@ class FakePocketBaseApi : PocketBaseApi { val updateShelfErrors = mutableMapOf() val updateBookErrors = mutableMapOf() + /** Defaults to a normal, successful refresh — most tests aren't exercising the auth-expiry path. */ + var authRefreshHttpError: HttpException? = null + var authRefreshIOException: IOException? = null + var authRefreshCancellation: CancellationException? = null + var refreshedToken: String = "refreshed-fake-token" + var refreshedUserId: String = "fake-user-id" + + /** One-shot: exercises the "a sync whose pull fails leaves the one-time-repull flag unset" case. */ + var nextListBooksError: HttpException? = null + fun seedBook(dto: BookDto) { books[dto.id] = dto } @@ -44,9 +57,19 @@ class FakePocketBaseApi : PocketBaseApi { override suspend fun authWithPassword(body: AuthWithPasswordRequest): AuthResponse = AuthResponse(token = "fake-token") + override suspend fun authRefresh(): AuthResponse { + callLog += "authRefresh" + authRefreshCancellation?.let { throw it } + authRefreshIOException?.let { throw it } + authRefreshHttpError?.let { throw it } + return AuthResponse(token = refreshedToken, record = UserRecordDto(id = refreshedUserId)) + } + // ---- books ---- override suspend fun listBooks(filter: String?, sort: String, perPage: Int, page: Int): PbListResponse { + callLog += "listBooks" + nextListBooksError?.let { nextListBooksError = null; throw it } val cursor = filter?.substringAfter("'")?.substringBefore("'") val items = books.values.filter { cursor == null || it.updated > cursor }.sortedBy { it.updated } return PbListResponse(page = 1, totalPages = 1, totalItems = items.size, items = items) diff --git a/app/app/src/test/java/org/modg/bookshelf/data/repo/SyncEngineTest.kt b/app/app/src/test/java/org/modg/bookshelf/data/repo/SyncEngineTest.kt index a048fc6..08ecd92 100644 --- a/app/app/src/test/java/org/modg/bookshelf/data/repo/SyncEngineTest.kt +++ b/app/app/src/test/java/org/modg/bookshelf/data/repo/SyncEngineTest.kt @@ -2,11 +2,16 @@ package org.modg.bookshelf.data.repo import androidx.room.Room import androidx.test.core.app.ApplicationProvider +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.After import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull import org.junit.Assert.assertTrue +import org.junit.Assert.fail import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -36,6 +41,11 @@ class SyncEngineTest { .build() settingsStore = SettingsStore(ApplicationProvider.getApplicationContext()) settingsStore.setServerUrl("https://example.test") + // DataStore's on-disk state leaks across Robolectric test methods in + // this class (see SettingsStoreTest's setUp for the same issue) — the + // one-time-repull flag being true from an earlier test would silently + // change the repull tests' behavior. + settingsStore.resetFullRepullDoneForTesting() api = FakePocketBaseApi() engine = SyncEngine( apiProvider = { api }, @@ -198,4 +208,124 @@ class SyncEngineTest { assertEquals("My local edit", db.bookDao().getByIdIncludingDeleted("book1")?.title) assertEquals(SyncState.PENDING_UPDATE, db.bookDao().getByIdIncludingDeleted("book1")?.syncState) } + + // ---------------------------------------------------------- auth refresh (2026-09-17) + + @Test + fun `sync refreshes the token before any push or pull, and persists the refreshed token`() = runTest { + db.bookcaseDao().upsert(bookcase("case1")) + api.refreshedToken = "brand-new-token" + api.refreshedUserId = "user-42" + + val result = engine.sync() + + assertTrue(result is SyncResult.Success) + val refreshIdx = api.callLog.indexOf("authRefresh") + val pushIdx = api.callLog.indexOf("createBookcase:case1") + assertTrue("expected authRefresh before any push, got ${api.callLog}", refreshIdx == 0 && refreshIdx < pushIdx) + assertEquals("brand-new-token", settingsStore.authToken.first()) + assertEquals("user-42", settingsStore.userId.first()) + } + + @Test + fun `a 401 on refresh is the 2026-09-17 incident's regression test - AuthExpired, token cleared, nothing else touched`() = runTest { + settingsStore.setAuthToken("stale-5-day-old-token") + settingsStore.setUserEmail("reader@example.com") + db.bookDao().upsert(book("book1", state = SyncState.PENDING_UPDATE).copy(title = "unsynced edit")) + api.authRefreshHttpError = httpError(401) + + val result = engine.sync() + + assertTrue(result is SyncResult.AuthExpired) + assertNull("token must be cleared so the app doesn't keep hammering the server with it", settingsStore.authToken.first()) + assertEquals("https://example.test", settingsStore.serverUrl.first()) + assertEquals("reader@example.com", settingsStore.userEmail.first()) + assertEquals("no push/pull call may have been made", listOf("authRefresh"), api.callLog) + val stillLocal = db.bookDao().getByIdIncludingDeleted("book1") + assertEquals("the PENDING_UPDATE book must survive an unauthenticated sync attempt intact", "unsynced edit", stillLocal?.title) + assertEquals(SyncState.PENDING_UPDATE, stillLocal?.syncState) + } + + @Test + fun `a 403 on refresh also reports AuthExpired`() = runTest { + api.authRefreshHttpError = httpError(403) + + assertTrue(engine.sync() is SyncResult.AuthExpired) + } + + @Test + fun `an IOException on refresh is a plain Failure and does not clear the token`() = runTest { + settingsStore.setAuthToken("still-good-token") + api.authRefreshIOException = java.io.IOException("no network") + + val result = engine.sync() + + assertTrue(result is SyncResult.Failure) + assertEquals("still-good-token", settingsStore.authToken.first()) + } + + @Test + fun `a 401 from a push call mid-sync reports AuthExpired and does not hard-delete the record`() = runTest { + db.bookDao().upsert(book("book1", state = SyncState.PENDING_UPDATE).copy(title = "keep me")) + api.updateBookErrors["book1"] = httpError(401) + + val result = engine.sync() + + assertTrue(result is SyncResult.AuthExpired) + val stillLocal = db.bookDao().getByIdIncludingDeleted("book1") + assertNotNull("a 401 must never be mistaken for the 404-means-deleted case", stillLocal) + assertEquals("keep me", stillLocal?.title) + assertEquals(SyncState.PENDING_UPDATE, stillLocal?.syncState) + } + + @Test + fun `CancellationException thrown during sync propagates instead of becoming a Failure`() = runTest { + api.authRefreshCancellation = CancellationException("scope cancelled") + + try { + engine.sync() + fail("expected CancellationException to propagate") + } catch (e: CancellationException) { + // expected + } + } + + // ---------------------------------------------------------- one-time full re-pull (2026-09-17) + + @Test + fun `first sync after the fix restores a book the incident hard-deleted, and marks the repull done`() = runTest { + // Mirrors the incident: the pull cursor is already past the lost row's + // `updated`, and the row is gone locally, but it is still intact on the server. + settingsStore.setCursor(SettingsStore.COLLECTION_BOOKS, "2024-06-01 00:00:00.000Z") + api.seedBook(BookDto(id = "lost-book", title = "Recovered", updated = "2024-01-01 00:00:00.000Z", created = "2024-01-01 00:00:00.000Z")) + assertNull(db.bookDao().getByIdIncludingDeleted("lost-book")) + + val result = engine.sync() + + assertTrue(result is SyncResult.Success) + assertEquals("Recovered", db.bookDao().getById("lost-book")?.title) + assertTrue(settingsStore.fullRepullDone.first()) + } + + @Test + fun `a sync whose pull fails leaves the one-time-repull flag unset so the next sync retries it`() = runTest { + api.nextListBooksError = httpError(500) + + val result = engine.sync() + + assertTrue(result is SyncResult.Failure) + assertFalse(settingsStore.fullRepullDone.first()) + } + + @Test + fun `once the repull flag is set, a normal sync no longer clears cursors`() = runTest { + settingsStore.setFullRepullDone() + settingsStore.setCursor(SettingsStore.COLLECTION_BOOKS, "2024-06-01 00:00:00.000Z") + // Older than the cursor: an incremental pull must NOT see this one. + api.seedBook(BookDto(id = "old-book", title = "Too old", updated = "2024-01-01 00:00:00.000Z", created = "2024-01-01 00:00:00.000Z")) + + engine.sync() + + assertNull(db.bookDao().getByIdIncludingDeleted("old-book")) + } } diff --git a/app/app/src/test/java/org/modg/bookshelf/ui/library/LibrarySyncPresenterTest.kt b/app/app/src/test/java/org/modg/bookshelf/ui/library/LibrarySyncPresenterTest.kt index 8c1729b..dce48ba 100644 --- a/app/app/src/test/java/org/modg/bookshelf/ui/library/LibrarySyncPresenterTest.kt +++ b/app/app/src/test/java/org/modg/bookshelf/ui/library/LibrarySyncPresenterTest.kt @@ -20,6 +20,13 @@ class LibrarySyncPresenterTest { assertEquals("Sync failed — showing local library", state.label) } + @Test + fun `an expired session is a distinct status from a plain failure, not "Sync failed"`() { + val state = LibrarySyncPresenter.present(nowMillis = 1_000L, lastSyncMillis = null, isSyncing = false, lastOutcome = SyncOutcome.AUTH_EXPIRED) + assertEquals(SyncStatus.AuthExpired, state.status) + assertEquals("Signed out — sign in again to sync", state.label) + } + @Test fun `no server configured is offline, not an error`() { val state = LibrarySyncPresenter.present(nowMillis = 1_000L, lastSyncMillis = null, isSyncing = false, lastOutcome = SyncOutcome.NO_SERVER) diff --git a/app/app/src/test/java/org/modg/bookshelf/ui/library/LibraryViewModelTest.kt b/app/app/src/test/java/org/modg/bookshelf/ui/library/LibraryViewModelTest.kt index c41df80..09bbb4a 100644 --- a/app/app/src/test/java/org/modg/bookshelf/ui/library/LibraryViewModelTest.kt +++ b/app/app/src/test/java/org/modg/bookshelf/ui/library/LibraryViewModelTest.kt @@ -97,6 +97,31 @@ class LibraryViewModelTest { initialShelfId = null, ) + // --- sync (2026-09-17 auth-expiry incident) --- + + @Test + fun `an expired session maps to the AuthExpired sync bar state, not a generic failure`() = runTest { + settingsStore.setServerUrl("https://example.test") + val api = org.modg.bookshelf.data.repo.FakePocketBaseApi() + api.authRefreshHttpError = org.modg.bookshelf.data.repo.httpError(401) + val vm = LibraryViewModel( + coverDownloader = coverHost.downloader(java.io.File(context.cacheDir, "cover-preload")), + computeDispatcher = Dispatchers.Main, + bookRepository = bookRepository, + locationRepository = locationRepository, + syncEngine = SyncEngine(ApiProvider { api }, db.bookDao(), db.bookcaseDao(), db.shelfDao(), settingsStore), + settingsStore = settingsStore, + bookSearchRepository = BookSearchRepository(OkHttpClient(), Json { ignoreUnknownKeys = true }), + metadataRepository = MetadataRepository(OkHttpClient(), Json { ignoreUnknownKeys = true }), + initialShelfId = null, + ) + + val bar = vm.uiState.first { it.syncBar.status == org.modg.bookshelf.ui.components.SyncStatus.AuthExpired }.syncBar + + assertEquals(org.modg.bookshelf.ui.components.SyncStatus.AuthExpired, bar.status) + assertEquals("Signed out — sign in again to sync", bar.label) + } + // --- typing vs submit --- @Test @@ -150,7 +175,12 @@ class LibraryViewModelTest { vm.onQueryChange("something else") assertEquals(OnlineSearchState.NotSearched, vm.onlineSearch.first()) - gate.countDown() // release the blocked background call so its thread isn't leaked + gate.countDown() // release the blocked background call + // Wait for the cancelled job to actually finish unwinding on its own thread before + // this test returns -- otherwise it can still be dispatching onto Dispatchers.Main + // after tearDown() (or even the next test's setUp()) touches it, which fails with + // "Dispatchers.Main is used concurrently with setting it" in whatever test runs next. + vm.onlineSearchJob?.join() } // --- partial and total source failure --- diff --git a/app/app/src/test/java/org/modg/bookshelf/ui/screens/LibraryScreenPaparazziTest.kt b/app/app/src/test/java/org/modg/bookshelf/ui/screens/LibraryScreenPaparazziTest.kt index e52d144..680a7d2 100644 --- a/app/app/src/test/java/org/modg/bookshelf/ui/screens/LibraryScreenPaparazziTest.kt +++ b/app/app/src/test/java/org/modg/bookshelf/ui/screens/LibraryScreenPaparazziTest.kt @@ -71,6 +71,10 @@ class LibraryScreenPaparazziTest { @Test fun libraryEmptyLight() = snapshotBoth("library-empty") { Empty() } + /** 2026-09-17 incident: the sync bar's distinct "session expired" state — never "Sync failed". */ + @Test + fun libraryAuthExpiredLight() = snapshotBoth("library-auth-expired") { AuthExpired() } + @Test fun librarySearchBothSectionsLight() = snapshotBoth("library-search-both-sections") { SearchShell( @@ -170,6 +174,13 @@ class LibraryScreenPaparazziTest { @Composable private fun Empty() = Shell(books = emptyList(), syncStatus = SyncStatus.Offline, syncLabel = "Not synced yet") + @Composable + private fun AuthExpired() = Shell( + books = ScreenFixtures.books, + syncStatus = SyncStatus.AuthExpired, + syncLabel = "Signed out — sign in again to sync", + ) + /** Same chrome as [Shell] but with a non-blank query, so [LibraryScreen] shows the sectioned search-results view instead of the grid. */ @Composable private fun SearchShell(localMatches: List, onlineSearch: OnlineSearchState) { diff --git a/app/app/src/test/java/org/modg/bookshelf/ui/screens/SettingsScreenPaparazziTest.kt b/app/app/src/test/java/org/modg/bookshelf/ui/screens/SettingsScreenPaparazziTest.kt index 633c3f1..36b92ec 100644 --- a/app/app/src/test/java/org/modg/bookshelf/ui/screens/SettingsScreenPaparazziTest.kt +++ b/app/app/src/test/java/org/modg/bookshelf/ui/screens/SettingsScreenPaparazziTest.kt @@ -7,6 +7,8 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @@ -49,14 +51,21 @@ class SettingsScreenPaparazziTest { @Test fun settingsDiagnosticsEmptyLight() = snapshotBoth("settings-diagnostics-empty") { DiagnosticsEmpty() } - @Composable - private fun Populated() = Shell(crash = sampleCrash) + /** 2026-09-17 incident: "Your session expired. Sign in again." — never "Sync failed: HTTP 401". */ + @Test + fun settingsAuthExpiredLight() = snapshotBoth("settings-auth-expired") { AuthExpired() } @Composable - private fun DiagnosticsEmpty() = Shell(crash = null) + private fun Populated() = Shell(crash = sampleCrash, authExpired = false) @Composable - private fun Shell(crash: CrashReport?) { + private fun DiagnosticsEmpty() = Shell(crash = null, authExpired = false) + + @Composable + private fun AuthExpired() = Shell(crash = null, authExpired = true) + + @Composable + private fun Shell(crash: CrashReport?, authExpired: Boolean) { val lastSync = System.currentTimeMillis() - 2 * 60 * 1000L BookshelfScaffold( title = "Settings", @@ -64,7 +73,11 @@ class SettingsScreenPaparazziTest { IconButton(onClick = {}) { Icon(Icons.Filled.ArrowBack, contentDescription = "Back") } }, syncStatusBar = { - SyncStatusBar(status = SyncStatus.Synced, label = "Synced • ${formatLastSync(lastSync)}") + if (authExpired) { + SyncStatusBar(status = SyncStatus.AuthExpired, label = "Signed out — sign in again to sync") + } else { + SyncStatusBar(status = SyncStatus.Synced, label = "Synced • ${formatLastSync(lastSync)}") + } }, ) { innerPadding -> PaperSurface(modifier = Modifier.fillMaxWidth()) { @@ -82,7 +95,17 @@ class SettingsScreenPaparazziTest { SectionHeading("Sync") InfoRow(label = "Last synced", value = formatLastSync(lastSync)) - PrimaryButton(text = "Sync now", onClick = {}, modifier = Modifier.padding(top = 8.dp)) + if (authExpired) { + Text( + text = "Your session expired. Sign in again.", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.error, + modifier = Modifier.padding(top = 8.dp), + ) + PrimaryButton(text = "Sign in", onClick = {}, modifier = Modifier.padding(top = 8.dp)) + } else { + PrimaryButton(text = "Sync now", onClick = {}, modifier = Modifier.padding(top = 8.dp)) + } GoldDivider(modifier = Modifier.padding(vertical = 16.dp)) diff --git a/app/app/src/test/java/org/modg/bookshelf/ui/settings/SettingsViewModelTest.kt b/app/app/src/test/java/org/modg/bookshelf/ui/settings/SettingsViewModelTest.kt new file mode 100644 index 0000000..a64c3de --- /dev/null +++ b/app/app/src/test/java/org/modg/bookshelf/ui/settings/SettingsViewModelTest.kt @@ -0,0 +1,116 @@ +package org.modg.bookshelf.ui.settings + +import androidx.room.Room +import androidx.test.core.app.ApplicationProvider +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.modg.bookshelf.data.local.BookshelfDatabase +import org.modg.bookshelf.data.prefs.SettingsStore +import org.modg.bookshelf.data.remote.ApiProvider +import org.modg.bookshelf.data.repo.AuthRepository +import org.modg.bookshelf.data.repo.BookRepository +import org.modg.bookshelf.data.repo.FakePocketBaseApi +import org.modg.bookshelf.data.repo.SyncEngine +import org.modg.bookshelf.data.repo.httpError +import org.modg.bookshelf.diagnostics.CrashReporter +import org.modg.bookshelf.ui.components.SyncStatus +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * 2026-09-17 incident: [SettingsViewModel.syncNow] used to surface an expired + * session as "Sync failed: HTTP 401", which reads as "try again later" rather + * than "you must sign in again". Covers the distinct [SyncResult.AuthExpired] + * mapping this class's SPEC section adds. + */ +@OptIn(ExperimentalCoroutinesApi::class) +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [34]) +class SettingsViewModelTest { + + private lateinit var db: BookshelfDatabase + private lateinit var settingsStore: SettingsStore + private lateinit var api: FakePocketBaseApi + private lateinit var context: android.content.Context + + @Before + fun setUp() { + Dispatchers.setMain(UnconfinedTestDispatcher()) + context = ApplicationProvider.getApplicationContext() + db = Room.inMemoryDatabaseBuilder(context, BookshelfDatabase::class.java) + .allowMainThreadQueries() + .build() + settingsStore = SettingsStore(context) + api = FakePocketBaseApi() + } + + @After + fun tearDown() { + db.close() + Dispatchers.resetMain() + } + + private fun viewModel(): SettingsViewModel = SettingsViewModel( + authRepository = AuthRepository(ApiProvider { api }, settingsStore), + settingsStore = settingsStore, + bookRepository = BookRepository(db.bookDao(), context), + syncEngine = SyncEngine(ApiProvider { api }, db.bookDao(), db.bookcaseDao(), db.shelfDao(), settingsStore), + crashReporter = CrashReporter(context), + ) + + @Test + fun `a plain sync failure keeps the generic error message`() = runTest { + settingsStore.setServerUrl("https://example.test") + api.authRefreshIOException = java.io.IOException("no network") + val vm = viewModel() + + vm.syncNow() + + // Not "!isSyncing" — that's also (trivially) true of the very first + // combined emission, before this sync's failure has landed. + val state = vm.uiState.first { it.syncError != null } + assertFalse(state.syncAuthExpired) + assertEquals(SyncStatus.Error, state.syncStatus) + } + + @Test + fun `an expired session maps to syncAuthExpired, not a generic sync error`() = runTest { + settingsStore.setServerUrl("https://example.test") + api.authRefreshHttpError = httpError(401) + val vm = viewModel() + + vm.syncNow() + + val state = vm.uiState.first { it.syncAuthExpired } + assertTrue(state.syncAuthExpired) + assertEquals(SyncStatus.AuthExpired, state.syncStatus) + assertEquals(null, state.syncError) + } + + @Test + fun `a later successful sync clears a previous auth-expired state`() = runTest { + settingsStore.setServerUrl("https://example.test") + api.authRefreshHttpError = httpError(401) + val vm = viewModel() + vm.syncNow() + vm.uiState.first { it.syncAuthExpired } + + api.authRefreshHttpError = null + vm.syncNow() + + val state = vm.uiState.first { !it.isSyncing && !it.syncAuthExpired } + assertFalse(state.syncAuthExpired) + } +} diff --git a/app/app/src/test/java/org/modg/bookshelf/ui/setup/SetupViewModelTest.kt b/app/app/src/test/java/org/modg/bookshelf/ui/setup/SetupViewModelTest.kt new file mode 100644 index 0000000..63cd4a3 --- /dev/null +++ b/app/app/src/test/java/org/modg/bookshelf/ui/setup/SetupViewModelTest.kt @@ -0,0 +1,63 @@ +package org.modg.bookshelf.ui.setup + +import androidx.test.core.app.ApplicationProvider +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.modg.bookshelf.data.prefs.SettingsStore +import org.modg.bookshelf.data.remote.ApiProvider +import org.modg.bookshelf.data.repo.AuthRepository +import org.modg.bookshelf.data.repo.FakePocketBaseApi +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +/** + * 2026-09-17 incident: after an auth expiry clears only the token (see + * SettingsStore.clearAuthToken), re-signing-in should be typing the password + * only. Covers that the setup screen's ViewModel pre-fills what's already + * stored, whether that's from a first-run-in-progress or a post-expiry return trip. + */ +@OptIn(ExperimentalCoroutinesApi::class) +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [34]) +class SetupViewModelTest { + + private lateinit var settingsStore: SettingsStore + private lateinit var authRepository: AuthRepository + + @Before + fun setUp() { + Dispatchers.setMain(UnconfinedTestDispatcher()) + settingsStore = SettingsStore(ApplicationProvider.getApplicationContext()) + authRepository = AuthRepository(ApiProvider { FakePocketBaseApi() }, settingsStore) + } + + @After + fun tearDown() { + Dispatchers.resetMain() + } + + @Test + fun `pre-fills the stored server URL and email when present`() = runTest { + settingsStore.setServerUrl("https://library.montanaro.home") + settingsStore.setUserEmail("reader@example.com") + + val viewModel = SetupViewModel(authRepository) + + val state = viewModel.uiState.first { + it.serverUrl == "https://library.montanaro.home" && it.email == "reader@example.com" + } + assertEquals("https://library.montanaro.home", state.serverUrl) + assertEquals("reader@example.com", state.email) + assertEquals("", state.password) // never pre-filled — SPEC "typing the password only" + } +} diff --git a/app/app/src/test/snapshots/images/org.modg.bookshelf.ui.screens_LibraryScreenPaparazziTest_libraryAuthExpiredLight_library-auth-expired-dark.png b/app/app/src/test/snapshots/images/org.modg.bookshelf.ui.screens_LibraryScreenPaparazziTest_libraryAuthExpiredLight_library-auth-expired-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..eda257053a160f6cdeb27b0d801d79603f76749f GIT binary patch literal 54738 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 n^GK^v`p-5q|9uD%tQYV%fvjE literal 0 HcmV?d00001 diff --git a/app/app/src/test/snapshots/images/org.modg.bookshelf.ui.screens_LibraryScreenPaparazziTest_libraryAuthExpiredLight_library-auth-expired-light.png b/app/app/src/test/snapshots/images/org.modg.bookshelf.ui.screens_LibraryScreenPaparazziTest_libraryAuthExpiredLight_library-auth-expired-light.png new file mode 100644 index 0000000000000000000000000000000000000000..606f8df8a2391fd630f814b4a2092f9a3ca7f89b GIT binary patch literal 58570 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�sT?jYKdCFh0)}S$XOszbbx<8fm+ez= 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 literal 0 HcmV?d00001 diff --git a/app/app/src/test/snapshots/images/org.modg.bookshelf.ui.screens_SettingsScreenPaparazziTest_settingsAuthExpiredLight_settings-auth-expired-light.png b/app/app/src/test/snapshots/images/org.modg.bookshelf.ui.screens_SettingsScreenPaparazziTest_settingsAuthExpiredLight_settings-auth-expired-light.png new file mode 100644 index 0000000000000000000000000000000000000000..2d70c383b5fc1b68293aeec1bd79a86fac6d3d41 GIT binary patch literal 46519 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 F`!7q=bix1t literal 0 HcmV?d00001 diff --git a/logs/M-authexpiry-fix.sid b/logs/M-authexpiry-fix.sid new file mode 100644 index 0000000..5003bfb --- /dev/null +++ b/logs/M-authexpiry-fix.sid @@ -0,0 +1 @@ +d109abe5-9e54-4496-912d-b200c51d373e diff --git a/logs/M-authexpiry-fix.summary b/logs/M-authexpiry-fix.summary new file mode 100644 index 0000000..234eec6 --- /dev/null +++ b/logs/M-authexpiry-fix.summary @@ -0,0 +1,18 @@ +=== M-authexpiry-fix attempts=1 quota_waits=0 hard_fails=0 === +cost=$1.3351339999999998 turns=44 err=? +--- result (tail) --- +ar onlineSearchJob` to `internal var onlineSearchJob`, matching the file's existing convention (same reasoning already documented on `performOnlineSearch`) of loosening visibility so tests can synchronize on it directly. +- `app/app/src/test/java/org/modg/bookshelf/ui/library/LibraryViewModelTest.kt`: after `gate.countDown()`, added `vm.onlineSearchJob?.join()` so the test genuinely waits for the cancelled job to finish before returning, with a comment explaining why. + +No changes to the feature logic, SPEC, build files, or anything else — nothing else in the gate's failure pointed at the auth-expiry implementation itself. + +**Verification:** +- `assembleDebug` → exit 0. +- `testDebugUnitTest` → exit 0, reran 4 more times with `--rerun` after the fix, all clean (previously failed on run 2 of 2 before the fix). +- Test count: 355 passed, 2 skipped, 0 failures (baseline was 337) — via summed XML. +- `verifyPaparazziDebug` → exit 0. +- Recorded the 4 new Paparazzi snapshots (`library-auth-expired-{light,dark}`, `settings-auth-expired-{light,dark}`) and viewed all four PNGs: library grid shows the "Signed out — sign in again to sync" sync bar; settings shows "Your session expired. Sign in again." with a "Sign in" button. Both match spec's design language in light and dark, and `git status` confirmed no other snapshots were touched by the record run. +- Grepped a forced recompile for Kotlin warnings in touched files: none. +- Final full sequence run in order (assembleDebug → testDebugUnitTest → verifyPaparazziDebug): all exit 0. + +I did not re-review the original worker's auth-expiry design/logic (token refresh, full re-pull, AuthExpired propagation) since none of that was implicated by the gate failure — per instructions, I only touched what was making the gate red. diff --git a/logs/M-authexpiry.sid b/logs/M-authexpiry.sid new file mode 100644 index 0000000..c22419b --- /dev/null +++ b/logs/M-authexpiry.sid @@ -0,0 +1 @@ +6bcc6e7a-a2a5-449e-b75a-a62eea1cc657 diff --git a/logs/M-authexpiry.summary b/logs/M-authexpiry.summary new file mode 100644 index 0000000..97893ef --- /dev/null +++ b/logs/M-authexpiry.summary @@ -0,0 +1,13 @@ +=== M-authexpiry attempts=1 quota_waits=0 hard_fails=0 === +cost=$4.886013000000001 turns=123 err=? +--- result (tail) --- +ption` handler before it can reach a `code() == 404` branch, so it can never be misread as "deleted." A local dirty (`PENDING_*`) record is never touched by an `AuthExpired` result — the exception aborts the whole `sync()` before the offending DAO write and before any subsequent push/pull calls run. + +**Full re-pull safety:** relied on `SyncEngine.shouldApplyRemote` (SyncEngine.kt, in the `applyIncomingBook`/`Shelf`/`Bookcase` helpers) — no local record → always inserted; a `SYNCED` local record only loses to a remote that's `>=` its own `updated`; a dirty (`PENDING_*`) local record only loses to a remote strictly newer than its own `updated`. So a full re-pull can only ever add back rows or apply genuinely newer server state — it can't clobber an unsynced local edit. + +**Deviations:** +- I did not re-run baseline `testDebugUnitTest` before touching code — I trusted the prompt's stated 337/2-skipped baseline. I did do the required post-change runs. +- Added a small `internal` test-only method (`SettingsStore.resetFullRepullDoneForTesting`) purely to prevent DataStore's known cross-test-method state leak (the same issue `SettingsStoreTest` already documents) from corrupting the new repull tests. No production caller. +- Dropped one planned SetupViewModel test ("starts blank on first run") because it wasn't required and was fragile against the same cross-test DataStore leak; kept only the required pre-fill test, which is self-contained. + +**Out of scope but noticed:** several pre-existing Kotlin deprecation warnings (`Icons.Filled.ArrowBack`, `Icons.Outlined.Sort`, `centerAlignedTopAppBarColors`, `Modifier.menuAnchor()`, `LocalLifecycleOwner`) and a nullable-`ClassLoader` warning in some metadata client tests — none in files I touched, all pre-existing, left alone. diff --git a/tasks/M-authexpiry-fix.txt b/tasks/M-authexpiry-fix.txt new file mode 100644 index 0000000..659fe40 --- /dev/null +++ b/tasks/M-authexpiry-fix.txt @@ -0,0 +1,14 @@ +A previous worker implemented the task in ~/bookshelf/tasks/M-authexpiry.txt and left the +working tree FAILING its acceptance gate. Read, in order: ~/bookshelf/docs/SPEC.md, +~/bookshelf/tasks/M-authexpiry.txt (the original instructions — every constraint in it binds +you too), ~/bookshelf/logs/M-authexpiry.summary (that worker's report), then the gate output at +~/bookshelf/logs/gate-M-authexpiry.log. Lines starting "GATE:" and non-zero exits are the failures. + +Fix ONLY what makes the gate red. Do not redesign or re-implement the feature. The +test count must end ABOVE 337 with zero failures; do not delete or @Ignore tests to +get there. If a Paparazzi verify failed because snapshots were never recorded, record +them and LOOK at the PNGs before accepting them. + +Run in the FOREGROUND (never background a build): ./tasks/gw assembleDebug, +./tasks/gw testDebugUnitTest, ./tasks/gw verifyPaparazziDebug. Do not git commit/add/push. +Report what was wrong, what you changed, and the verbatim output tails.