P0.1: extract IDataManager interface + LocalDataManager ambient
Adds a narrow IDataManager contract covering the 5 DataManager members referenced from ui/screens/** (currentUser, residences, totalSummary, featureBenefits, subscription) and a staticCompositionLocalOf ambient (LocalDataManager) that defaults to the DataManager singleton. No screen call-sites change in this commit — screens migrate in P0.2. ViewModels, APILayer, and PersistenceManager continue to depend on the concrete DataManager singleton directly; the interface is deliberately scoped to the screen surface the parity-gallery needs to substitute. Includes IDataManagerTest (DataManager is IDataManager) and LocalDataManagerTest (ambient val is exposed + default type-checks to the real singleton). runComposeUiTest intentionally avoided — consistent with ThemeSelectionScreenTest's convention, since commonTest composition runtime is flaky on iosSimulator. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
package com.tt.honeyDue.data
|
||||
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
/**
|
||||
* Compile + runtime guard that the production [DataManager] singleton still
|
||||
* satisfies the [IDataManager] contract. If a future refactor drops a member
|
||||
* from the interface — or worse, drops the `: IDataManager` supertype from
|
||||
* DataManager — this test fails loud, before any screen loses its data source.
|
||||
*/
|
||||
class IDataManagerTest {
|
||||
|
||||
// The `is IDataManager` check is statically `true` today — the compiler
|
||||
// warning confirms DataManager satisfies the interface. If either side
|
||||
// ever drifts, that status changes (or the file fails to compile), so
|
||||
// this test acts as a compile-time + runtime guard.
|
||||
@Suppress("USELESS_IS_CHECK")
|
||||
@Test
|
||||
fun dataManagerSingletonImplementsIDataManager() {
|
||||
assertTrue(
|
||||
DataManager is IDataManager,
|
||||
"DataManager must implement IDataManager so screens can resolve it through LocalDataManager."
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.tt.honeyDue.data
|
||||
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertNotNull
|
||||
|
||||
/**
|
||||
* P0 — LocalDataManager ambient.
|
||||
*
|
||||
* We deliberately avoid `runComposeUiTest { }` here (same reasoning as
|
||||
* [com.tt.honeyDue.ui.screens.theme.ThemeSelectionScreenTest] — Compose UI
|
||||
* testing in commonTest is flaky on iosSimulator for this project).
|
||||
*
|
||||
* Instead this asserts the two invariants the parity-gallery plan relies on:
|
||||
* 1. [LocalDataManager] itself is a non-null reference exposed from the
|
||||
* `com.tt.honeyDue.data` package (so screens can import it).
|
||||
* 2. The default value the ambient resolves to in production is the real
|
||||
* [DataManager] singleton — verified indirectly by the fact that
|
||||
* [DataManager] satisfies [IDataManager] (see [IDataManagerTest]).
|
||||
*
|
||||
* The override behavior via `CompositionLocalProvider(LocalDataManager provides fake)`
|
||||
* is exercised by the parity-gallery screens in a later phase. We don't
|
||||
* duplicate the Compose-runtime machinery here.
|
||||
*/
|
||||
class LocalDataManagerTest {
|
||||
|
||||
@Test
|
||||
fun ambientIsExposedForScreens() {
|
||||
// Sanity: the val exists and is resolvable at the package path screens import from.
|
||||
assertNotNull(LocalDataManager, "LocalDataManager must be a top-level val in com.tt.honeyDue.data")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun defaultResolvesToRealDataManagerSingleton() {
|
||||
// If someone swaps the default factory to a fake by accident, this test
|
||||
// won't catch the runtime value (we can't invoke the factory without a
|
||||
// Composer), but we CAN guarantee the type contract holds — DataManager
|
||||
// must implement IDataManager so the default factory `{ DataManager }`
|
||||
// in LocalDataManager.kt type-checks.
|
||||
val manager: IDataManager = DataManager
|
||||
assertNotNull(manager)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user