Meshtastic-Android/docs/archive/kmp-feature-migration-plan.md
James Rich 84bb6d24e4
docs: summarize KMP migration progress and architectural decisions (#4770)
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
2026-03-13 02:23:25 +00:00

188 lines
4.5 KiB
Markdown

# KMP Feature Migration Slice - Plan
**Objective:** Establish standardized patterns for migrating feature modules to full KMP + comprehensive test coverage.
**Status:** Planning
## Current State
**Core Infrastructure Ready:**
- core:testing module with shared test doubles
- All feature modules have KMP structure (jvm() target)
- All features have commonMain UI (Compose Multiplatform)
**Gaps to Address:**
- Incomplete commonTest coverage (only feature:messaging has bootstrap)
- Inconsistent test patterns across features
- No systematic approach for adding ViewModel tests
- Desktop module not fully integrated with all features
## Migration Phases
### Phase 1: Feature commonTest Bootstrap (THIS SLICE)
**Scope:** Establish patterns and add bootstrap tests to key features
Features to bootstrap:
1. feature:settings
2. feature:node
3. feature:intro
4. feature:firmware
5. feature:map
**What constitutes a bootstrap test:**
- ViewModel initialization test
- Simple state flow emission test
- Demonstration of using FakeNodeRepository/FakeRadioController
- Clear path for future expansion
**Effort:** Low (pattern-driven, minimal logic tests)
### Phase 2: Feature-Specific Integration Tests
**Scope:** Add domain-specific test doubles and integration scenarios
Example: feature:messaging might have:
- FakeMessageRepository
- FakeContactRepository
- Message send/receive simulation
**Effort:** Medium (requires understanding feature logic)
### Phase 3: Desktop Feature Completion
**Scope:** Wire all features fully into desktop app
Current status:
- ✅ Settings (~35 screens)
- ✅ Node (adaptive list-detail)
- ✅ Messaging (adaptive contacts)
- ❌ Map (needs implementation)
- ❌ Firmware (needs implementation)
**Effort:** Medium-High
### Phase 4: Remaining Transports
**Scope:** Complete transport layer (Serial/USB, MQTT)
Current:
- ✅ TCP (JVM)
- ❌ Serial/USB
- ❌ MQTT (KMP version)
**Effort:** High
## Standards to Establish
### 1. ViewModel Test Structure
```kotlin
// In src/commonTest/kotlin/
class MyViewModelTest {
private val fakeRepo = FakeNodeRepository()
private fun createViewModel(): MyViewModel {
// Create with fakes
}
@Test
fun testInitialization() = runTest {
// Verify ViewModel initializes without errors
}
@Test
fun testStateFlowEmissions() = runTest {
// Test primary state emissions
}
}
```
### 2. UseCase Test Structure
```kotlin
class MyUseCaseTest {
private val fakeRadio = FakeRadioController()
private fun createUseCase(): MyUseCase {
// Create with fakes
}
@Test
fun testHappyPath() = runTest {
// Test normal operation
}
@Test
fun testErrorHandling() = runTest {
// Test error scenarios
}
}
```
### 3. Feature-Specific Fakes Template
```kotlin
// In core:testing/src/commonMain if reusable
// Otherwise in feature/*/src/commonTest
class FakeMyRepository : MyRepository {
val callHistory = mutableListOf<String>()
override suspend fun doSomething() {
callHistory.add("doSomething")
}
}
```
## Files to Create
### Core:Testing Extensions
- FakeContactRepository (for feature:messaging)
- FakeMessageRepository (for feature:messaging)
- (Others as needed)
### Feature:Settings Tests
- SettingsViewModelTest.kt
- Build.gradle.kts update (commonTest block if needed)
### Feature:Node Tests
- NodeListViewModelTest.kt
- NodeDetailViewModelTest.kt
### Feature:Intro Tests
- IntroViewModelTest.kt
### Feature:Firmware Tests
- FirmwareViewModelTest.kt
### Feature:Map Tests
- MapViewModelTest.kt
## Success Criteria
✅ All feature modules have commonTest with:
- At least one ViewModel bootstrap test
- Using FakeNodeRepository or similar
- Pattern clear for future expansion
✅ All tests compile cleanly on all targets (JVM, Android)
✅ Documentation updated with examples
✅ Developer guide for adding new tests
## Next Steps After This Slice
1. Measure test coverage (current baseline)
2. Create integration test patterns
3. Add feature-specific fakes to core:testing
4. Complete Desktop feature wiring
5. Address remaining transport layers
## Estimated Effort
- Phase 1: 2-3 hours (pattern establishment + bootstrap)
- Phase 2: 4-6 hours (feature-specific integration)
- Phase 3: 6-8 hours (desktop completion)
- Phase 4: 8-12 hours (transport layer)
**Total:** ~20-30 hours for complete KMP + test coverage
---
**Status:** Ready to implement Phase 1
**Next Action:** Create SettingsViewModelTest pattern and replicate across features