Skip to content

Commit 6ba0767

Browse files
frettclaude
andcommitted
Wire LessonsPresenter to LessonsFlowProducer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent fe8dbd9 commit 6ba0767

2 files changed

Lines changed: 29 additions & 48 deletions

File tree

app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,12 @@ import org.cru.godtools.ui.tools.ToolCardPresenter.ToolCardEvent
5353
import org.cru.godtools.util.createToolIntent
5454
import org.greenrobot.eventbus.EventBus
5555

56-
class LessonsPresenter @AssistedInject constructor(
56+
class LessonsPresenter @AssistedInject internal constructor(
5757
@param:ApplicationContext
5858
private val context: Context,
5959
private val eventBus: EventBus,
6060
private val languagesRepository: LanguagesRepository,
61+
private val lessonsFlowProducer: LessonsFlowProducer,
6162
private val remoteConfig: FirebaseRemoteConfig,
6263
private val settings: Settings,
6364
private val toolCardPresenter: ToolCardPresenter,
@@ -98,7 +99,7 @@ class LessonsPresenter @AssistedInject constructor(
9899
mode = mode,
99100
isPersonalizationEnabled = isPersonalizationEnabled,
100101
languageFilter = languageFilter,
101-
lessons = rememberLessons(languageFilter.selectedItem?.code ?: appLanguage),
102+
lessons = rememberLessons(mode, languageFilter.selectedItem?.code ?: appLanguage),
102103
) {
103104
when (it) {
104105
is UiEvent.ChangeMode -> mode = it.mode
@@ -166,12 +167,8 @@ class LessonsPresenter @AssistedInject constructor(
166167
}
167168

168169
@Composable
169-
private fun rememberLessons(locale: Locale): List<ToolCardPresenter.UiState> {
170-
val lessons by remember(locale) {
171-
toolsRepository.getLessonsFlowByLanguage(locale)
172-
.map { it.filterNot { it.isHidden }.sortedBy { it.defaultOrder } }
173-
}.collectAsState(emptyList())
174-
170+
private fun rememberLessons(mode: UiState.Mode, locale: Locale): List<ToolCardPresenter.UiState> {
171+
val lessons by remember(mode, locale) { lessonsFlowProducer.getFlow(mode, locale) }.collectAsState(emptyList())
175172
return lessons.map { tool ->
176173
key(tool.code) {
177174
lateinit var toolState: ToolCardPresenter.UiState

app/src/test/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenterTest.kt

Lines changed: 24 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,12 @@ class LessonsPresenterTest {
8484
private val settings: Settings = mockk {
8585
every { appLanguageFlow } returns appLangFlow
8686
}
87+
private val lessonsFlowProducer: LessonsFlowProducer = mockk {
88+
every { getFlow(any(), any()) } returns flowOf(emptyList())
89+
every { getFlow(any(), Locale.ENGLISH) } returns enLessonsFlow
90+
}
8791
private val toolsRepository: ToolsRepository = mockk {
8892
every { getLessonsFlow() } returns lessonsFlow
89-
90-
every { getLessonsFlowByLanguage(any()) } returns flowOf(emptyList())
91-
every { getLessonsFlowByLanguage(Locale.ENGLISH) } returns enLessonsFlow
9293
}
9394
private val translationsRepository: TranslationsRepository = mockk {
9495
every { getTranslationsFlowForTools(any()) } returns translationsFlow
@@ -101,6 +102,7 @@ class LessonsPresenterTest {
101102
context = context,
102103
eventBus = eventBus,
103104
languagesRepository = languagesRepository,
105+
lessonsFlowProducer = lessonsFlowProducer,
104106
remoteConfig = remoteConfig,
105107
settings = settings,
106108
toolCardPresenter = FakeToolCardPresenter(),
@@ -337,8 +339,6 @@ class LessonsPresenterTest {
337339
// region State.languageFilter Event.SelectItem
338340
@Test
339341
fun `State - languageFilter - Event - SelectItem`() = testScope.runTest {
340-
every { toolsRepository.getLessonsFlowByLanguage(any()) } returns flowOf(emptyList())
341-
342342
presenter.test {
343343
expectMostRecentItem().languageFilter
344344
.also { assertEquals(appLangFlow.value, it.selectedItem?.code) }
@@ -352,35 +352,7 @@ class LessonsPresenterTest {
352352
// region State.lessons
353353
@Test
354354
fun `State - lessons`() = testScope.runTest {
355-
enLessonsFlow.value = listOf(
356-
randomTool("lesson1", isHidden = false, defaultOrder = 0),
357-
randomTool("lesson2", isHidden = false, defaultOrder = 1),
358-
)
359-
360-
presenter.test {
361-
assertEquals(listOf("lesson1", "lesson2"), expectMostRecentItem().lessons.map { it.toolCode })
362-
}
363-
}
364-
365-
@Test
366-
fun `State - lessons - hide hidden lessons`() = testScope.runTest {
367-
enLessonsFlow.value = listOf(
368-
randomTool("lesson1", isHidden = false, defaultOrder = 0),
369-
randomTool("lesson2", isHidden = true, defaultOrder = 1),
370-
randomTool("lesson3", isHidden = false, defaultOrder = 2),
371-
)
372-
373-
presenter.test {
374-
assertEquals(listOf("lesson1", "lesson3"), expectMostRecentItem().lessons.map { it.toolCode })
375-
}
376-
}
377-
378-
@Test
379-
fun `State - lessons - sorted by defaultOrder`() = testScope.runTest {
380-
enLessonsFlow.value = listOf(
381-
randomTool("lesson2", isHidden = false, defaultOrder = 1),
382-
randomTool("lesson1", isHidden = false, defaultOrder = 0),
383-
)
355+
enLessonsFlow.value = listOf(randomTool("lesson1"), randomTool("lesson2"))
384356

385357
presenter.test {
386358
assertEquals(listOf("lesson1", "lesson2"), expectMostRecentItem().lessons.map { it.toolCode })
@@ -389,27 +361,39 @@ class LessonsPresenterTest {
389361

390362
@Test
391363
fun `State - lessons - Filtered by selected language`() = testScope.runTest {
392-
every { toolsRepository.getLessonsFlowByLanguage(Locale.FRENCH) }
393-
.returns(flowOf(listOf(randomTool("lesson", isHidden = false))))
364+
every { lessonsFlowProducer.getFlow(any(), Locale.FRENCH) } returns flowOf(listOf(randomTool("lesson")))
394365

395366
presenter.test {
396367
with(expectMostRecentItem()) {
397368
assertEquals(emptyList(), lessons)
398-
verify(exactly = 0) { toolsRepository.getLessonsFlowByLanguage(Locale.FRENCH) }
369+
verify(exactly = 0) { lessonsFlowProducer.getFlow(any(), Locale.FRENCH) }
399370

400371
languageFilter.eventSink(FilterMenu.Event.SelectItem(Language(Locale.FRENCH)))
401372
}
402373

403374
assertEquals(listOf("lesson"), expectMostRecentItem().lessons.map { it.toolCode })
404-
verify { toolsRepository.getLessonsFlowByLanguage(Locale.FRENCH) }
375+
verify { lessonsFlowProducer.getFlow(any(), Locale.FRENCH) }
376+
}
377+
}
378+
379+
@Test
380+
fun `State - lessons - passes mode to lessonsFlowProducer`() = testScope.runTest {
381+
presenter.test {
382+
val state = expectMostRecentItem()
383+
assertEquals(UiState.Mode.PERSONALIZATION, state.mode)
384+
verify { lessonsFlowProducer.getFlow(UiState.Mode.PERSONALIZATION, any()) }
385+
386+
state.eventSink(UiEvent.ChangeMode(UiState.Mode.ALL_LESSONS))
387+
awaitItem()
388+
verify { lessonsFlowProducer.getFlow(UiState.Mode.ALL_LESSONS, any()) }
405389
}
406390
}
407391

408392
@Test
409393
fun `State - lessons - Event - Click`() = testScope.runTest {
410394
enLessonsFlow.value = listOf(
411-
randomTool("lesson1", isHidden = false, defaultOrder = 0),
412-
randomTool("lesson2", type = Tool.Type.LESSON, isHidden = false, defaultOrder = 1),
395+
randomTool("lesson1"),
396+
randomTool("lesson2", type = Tool.Type.LESSON),
413397
)
414398

415399
presenter.test {

0 commit comments

Comments
 (0)