Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions core/data/src/main/kotlin/com/acon/core/data/stream/DataStream.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.acon.core.data.stream

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.FlowCollector
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.transformLatest
import javax.inject.Inject

interface DataStream {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 DataStream을 사용하는 곳을 몇개 봤는데 (프로필? , 인증동네 확인 뷰모델, 온보딩) 왜 이걸 새로 만드셨는지 궁금합니다ㅏ

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

데이터 변화 알려주는거에요
간단하게, 데이터를 새로 저장하면, 원래 그 데이터를 쓰던곳에선 변화를 감지해야 하잖아요? 그걸 기능화 한것입니다.

suspend fun notifyDataChanged()
fun <T> subscribe(block: suspend FlowCollector<T>.() -> Unit): Flow<T>
}

class DataStreamImpl @Inject constructor() : DataStream {
private val trigger = MutableSharedFlow<Unit>(replay = 1)

init {
trigger.tryEmit(Unit)
}

override suspend fun notifyDataChanged() {
trigger.emit(Unit)
}

override fun <T> subscribe(block: suspend FlowCollector<T>.() -> Unit): Flow<T> {
return trigger.transformLatest { this.block() }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.acon.core.data.stream

import app.cash.turbine.test
import io.mockk.junit5.MockKExtension
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith

@ExtendWith(MockKExtension::class)
class DataStreamImplTest {

private lateinit var dataStream: DataStream

@BeforeEach
fun setUp() {
dataStream = DataStreamImpl()
}

@Test
fun `초기 방출 테스트`() = runTest {
var value = 0
val flow = dataStream.subscribe {
emit(++value)
}

flow.test {
assertEquals(1, awaitItem())
}
}

@Test
fun `notifyDataChanged가 flow를 트리거하는지 테스트`() = runTest {
var value = 0
val flow = dataStream.subscribe {
emit(++value)
}

flow.test {
assertEquals(1, awaitItem())
dataStream.notifyDataChanged()
assertEquals(2, awaitItem())
dataStream.notifyDataChanged()
assertEquals(3, awaitItem())
}
}

@Test
fun `여러 구독이 생겼을 때, 한 번의 notify는 모든 구독자에게 전파되어야 한다`() = runTest {
var value1 = 0
val flow1 = dataStream.subscribe<Int> {
emit(++value1)
}

var value2 = 10
val flow2 = dataStream.subscribe<Int> {
emit(++value2)
}

flow1.test {
val f1 = this
flow2.test {
val f2 = this
assertEquals(1, f1.awaitItem()) // flow1의 첫 번째 값은 1
assertEquals(11, f2.awaitItem()) // flow2의 첫 번째 값은 11

dataStream.notifyDataChanged()

assertEquals(2, f1.awaitItem()) // flow1의 두 번째 값은 2
assertEquals(12, f2.awaitItem()) // flow2의 두 번째 값은 12
}
}
}
}