fix: resolve semantic mismatch between UseCase naming and ViewModel usage

This commit is contained in:
ali
2026-03-07 19:40:47 +01:00
committed by Affaan Mustafa
parent ab693f7b8a
commit f6a470de63
4 changed files with 13 additions and 6 deletions

View File

@@ -15,14 +15,14 @@ Prefer constructor injection. Use Koin (KMP) or Hilt (Android-only):
// Koin — declare modules // Koin — declare modules
val dataModule = module { val dataModule = module {
single<ItemRepository> { ItemRepositoryImpl(get(), get()) } single<ItemRepository> { ItemRepositoryImpl(get(), get()) }
factory { GetItemUseCase(get()) } factory { GetItemsUseCase(get()) }
viewModelOf(::ItemListViewModel) viewModelOf(::ItemListViewModel)
} }
// Hilt — annotations // Hilt — annotations
@HiltViewModel @HiltViewModel
class ItemListViewModel @Inject constructor( class ItemListViewModel @Inject constructor(
private val getItem: GetItemUseCase private val getItems: GetItemsUseCase
) : ViewModel() ) : ViewModel()
``` ```
@@ -36,7 +36,7 @@ data class ScreenState(
val isLoading: Boolean = false val isLoading: Boolean = false
) )
class ScreenViewModel(private val useCase: GetItemUseCase) : ViewModel() { class ScreenViewModel(private val useCase: GetItemsUseCase) : ViewModel() {
private val _state = MutableStateFlow(ScreenState()) private val _state = MutableStateFlow(ScreenState())
val state = _state.asStateFlow() val state = _state.asStateFlow()
@@ -58,6 +58,7 @@ class ScreenViewModel(private val useCase: GetItemUseCase) : ViewModel() {
```kotlin ```kotlin
interface ItemRepository { interface ItemRepository {
suspend fun getById(id: String): Result<Item> suspend fun getById(id: String): Result<Item>
suspend fun getAll(): Result<List<Item>>
fun observeAll(): Flow<List<Item>> fun observeAll(): Flow<List<Item>>
} }
``` ```
@@ -72,6 +73,12 @@ class GetItemUseCase(private val repository: ItemRepository) {
return repository.getById(id) return repository.getById(id)
} }
} }
class GetItemsUseCase(private val repository: ItemRepository) {
suspend operator fun invoke(): Result<List<Item>> {
return repository.getAll()
}
}
``` ```
## expect/actual (KMP) ## expect/actual (KMP)

View File

@@ -21,7 +21,7 @@ paths:
fun `loading state emitted then data`() = runTest { fun `loading state emitted then data`() = runTest {
val repo = FakeItemRepository() val repo = FakeItemRepository()
repo.addItem(testItem) repo.addItem(testItem)
val viewModel = ItemListViewModel(GetItemUseCase(repo)) val viewModel = ItemListViewModel(GetItemsUseCase(repo))
viewModel.state.test { viewModel.state.test {
assertEquals(ItemListState(), awaitItem()) // initial state assertEquals(ItemListState(), awaitItem()) // initial state

View File

@@ -31,7 +31,7 @@ data class ItemListState(
) )
class ItemListViewModel( class ItemListViewModel(
private val getItems: GetItemUseCase private val getItems: GetItemsUseCase
) : ViewModel() { ) : ViewModel() {
private val _state = MutableStateFlow(ItemListState()) private val _state = MutableStateFlow(ItemListState())
val state: StateFlow<ItemListState> = _state.asStateFlow() val state: StateFlow<ItemListState> = _state.asStateFlow()

View File

@@ -218,7 +218,7 @@ viewModelScope.launch {
@Test @Test
fun `search updates item list`() = runTest { fun `search updates item list`() = runTest {
val fakeRepository = FakeItemRepository(items = testItems) val fakeRepository = FakeItemRepository(items = testItems)
val viewModel = ItemListViewModel(GetItemUseCase(fakeRepository)) val viewModel = ItemListViewModel(GetItemsUseCase(fakeRepository))
viewModel.state.test { viewModel.state.test {
assertEquals(ItemListState(), awaitItem()) // initial assertEquals(ItemListState(), awaitItem()) // initial