Skip to content

Commit 2beccdf

Browse files
authored
Streamlined use case stubbing using extension functions. (#386)
1 parent 7c0fb8a commit 2beccdf

3 files changed

Lines changed: 17 additions & 38 deletions

File tree

  • architecture/presentation-test/src/main/java/com/mitteloupe/whoami/architecture/presentation/viewmodel
  • history/presentation/src/test/java/com/mitteloupe/whoami/history/presentation/viewmodel
  • home/presentation/src/test/java/com/mitteloupe/whoami/home/presentation/viewmodel

architecture/presentation-test/src/main/java/com/mitteloupe/whoami/architecture/presentation/viewmodel/BaseViewModelTest.kt

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ abstract class BaseViewModelTest<
4747
Dispatchers.resetMain()
4848
}
4949

50-
protected fun <REQUEST> givenFailedUseCaseExecution(
51-
useCase: UseCase<REQUEST, *>,
50+
protected fun <REQUEST> UseCase<REQUEST, *>.givenFailedExecution(
5251
input: REQUEST,
5352
domainException: DomainException
5453
) {
@@ -59,57 +58,52 @@ abstract class BaseViewModelTest<
5958
onException(domainException)
6059
}.given(useCaseExecutor)
6160
.execute(
62-
useCase = eq(useCase),
61+
useCase = eq(this@givenFailedExecution),
6362
value = eq(input),
6463
onResult = any(),
6564
onException = any()
6665
)
6766
}
6867
}
6968

70-
protected fun <REQUEST, RESULT> givenSuccessfulUseCaseExecution(
71-
useCase: UseCase<REQUEST, RESULT>,
69+
protected fun <REQUEST, RESULT> UseCase<REQUEST, RESULT>.givenSuccessfulExecution(
7270
input: REQUEST,
7371
result: RESULT
7472
) {
7573
willAnswer { invocationOnMock ->
7674
val onResult: (RESULT) -> Unit = invocationOnMock.getArgument(2)
7775
onResult(result)
7876
}.given(useCaseExecutor).execute(
79-
useCase = eq(useCase),
77+
useCase = eq(this@givenSuccessfulExecution),
8078
value = eq(input),
8179
onResult = any(),
8280
onException = any()
8381
)
8482
}
8583

86-
protected fun <REQUEST> givenSuccessfulNoResultUseCaseExecution(
87-
useCase: UseCase<REQUEST, Unit>,
84+
protected fun <REQUEST> UseCase<REQUEST, Unit>.givenSuccessfulNoResultExecution(
8885
input: REQUEST
8986
) {
90-
givenSuccessfulUseCaseExecution(useCase, input, Unit)
87+
givenSuccessfulExecution(input, Unit)
9188
}
9289

93-
protected fun <RESULT> givenSuccessfulUseCaseExecution(
94-
useCase: UseCase<Unit, RESULT>,
95-
result: RESULT
96-
) {
90+
protected fun <RESULT> UseCase<Unit, RESULT>.givenSuccessfulExecution(result: RESULT) {
9791
willAnswer { invocationOnMock ->
9892
val onResult: (RESULT) -> Unit = invocationOnMock.getArgument(1)
9993
onResult(result)
10094
}.given(useCaseExecutor).execute(
101-
useCase = eq(useCase),
95+
useCase = eq(this@givenSuccessfulExecution),
10296
onResult = any(),
10397
onException = any()
10498
)
10599
}
106100

107-
protected fun givenSuccessfulNoArgumentNoResultUseCaseExecution(useCase: UseCase<Unit, Unit>) {
101+
protected fun UseCase<Unit, Unit>.givenSuccessfulNoArgumentNoResultExecution() {
108102
willAnswer { invocationOnMock ->
109103
val onResult: (Unit) -> Unit = invocationOnMock.getArgument(2)
110104
onResult(Unit)
111105
}.given(useCaseExecutor).execute(
112-
useCase = eq(useCase),
106+
useCase = eq(this@givenSuccessfulNoArgumentNoResultExecution),
113107
onResult = any(),
114108
onException = any()
115109
)

history/presentation/src/test/java/com/mitteloupe/whoami/history/presentation/viewmodel/HistoryViewModelTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class HistoryViewModelTest :
7373
givenIpAddressRecord2 = givenIpAddressRecord2
7474
)
7575
val givenHistory = setOf(givenIpAddressRecord1, givenIpAddressRecord2)
76-
givenSuccessfulUseCaseExecution(getHistoryUseCase, givenHistory)
76+
getHistoryUseCase.givenSuccessfulExecution(givenHistory)
7777
val highlightedIpAddress: String? = null
7878

7979
val deferredViewState = async(start = UNDISPATCHED) {
@@ -108,7 +108,7 @@ class HistoryViewModelTest :
108108
val givenIpAddressRecord1 = domainHistoryRecord("0.0.0.0")
109109
val givenIpAddressRecord2 = domainHistoryRecord("1.1.1.1")
110110
val givenHistory = setOf(givenIpAddressRecord1, givenIpAddressRecord2)
111-
givenSuccessfulUseCaseExecution(getHistoryUseCase, givenHistory)
111+
getHistoryUseCase.givenSuccessfulExecution(givenHistory)
112112
val highlightedIpAddress = "0.0.0.0"
113113
val deferredViewState = async(start = UNDISPATCHED) {
114114
classUnderTest.viewState.take(2).toList()

home/presentation/src/test/java/com/mitteloupe/whoami/home/presentation/viewmodel/HomeViewModelTest.kt

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,7 @@ class HomeViewModelTest :
6565
fun `Given disconnected when onEnter then presents disconnected state`() = runTest {
6666
// Given
6767
val givenConnectionState = Disconnected
68-
givenSuccessfulUseCaseExecution(
69-
getConnectionDetailsUseCase,
70-
givenConnectionState
71-
)
68+
getConnectionDetailsUseCase.givenSuccessfulExecution(givenConnectionState)
7269
val expectedViewState = HomeViewState.Disconnected
7370
given { connectionDetailsPresentationMapper.toPresentation(givenConnectionState) }
7471
.willReturn(expectedViewState)
@@ -93,10 +90,7 @@ class HomeViewModelTest :
9390
val domainConnectionDetails = domainConnectionDetails(ipAddress)
9491
given { connectionDetailsDomainMapper.toDomain(givenConnectionDetails) }
9592
.willReturn(domainConnectionDetails)
96-
givenSuccessfulNoResultUseCaseExecution(
97-
saveConnectionDetailsUseCase,
98-
domainConnectionDetails
99-
)
93+
saveConnectionDetailsUseCase.givenSuccessfulNoResultExecution(domainConnectionDetails)
10094
val deferredNotification = async(start = UNDISPATCHED) {
10195
classUnderTest.notification.first()
10296
}
@@ -123,10 +117,7 @@ class HomeViewModelTest :
123117
val domainConnectionDetails = domainConnectionDetails(ipAddress)
124118
given { connectionDetailsDomainMapper.toDomain(givenConnectionDetails) }
125119
.willReturn(domainConnectionDetails)
126-
givenSuccessfulNoResultUseCaseExecution(
127-
saveConnectionDetailsUseCase,
128-
domainConnectionDetails
129-
)
120+
saveConnectionDetailsUseCase.givenSuccessfulNoResultExecution(domainConnectionDetails)
130121

131122
// When
132123
classUnderTest.onSaveDetailsAction(givenConnectionDetails)
@@ -147,10 +138,7 @@ class HomeViewModelTest :
147138
val domainConnectionDetails = domainConnectionDetails(ipAddress)
148139
given { connectionDetailsDomainMapper.toDomain(givenConnectionDetails) }
149140
.willReturn(domainConnectionDetails)
150-
givenSuccessfulNoResultUseCaseExecution(
151-
saveConnectionDetailsUseCase,
152-
domainConnectionDetails
153-
)
141+
saveConnectionDetailsUseCase.givenSuccessfulNoResultExecution(domainConnectionDetails)
154142
val deferredNotification = async(start = UNDISPATCHED) {
155143
classUnderTest.notification.first()
156144
}
@@ -172,10 +160,7 @@ class HomeViewModelTest :
172160
val domainConnectionDetails = domainConnectionDetails(ipAddress)
173161
given { connectionDetailsDomainMapper.toDomain(givenConnectionDetails) }
174162
.willReturn(domainConnectionDetails)
175-
givenSuccessfulNoResultUseCaseExecution(
176-
saveConnectionDetailsUseCase,
177-
domainConnectionDetails
178-
)
163+
saveConnectionDetailsUseCase.givenSuccessfulNoResultExecution(domainConnectionDetails)
179164
val deferredNavigationEvent = async(start = UNDISPATCHED) {
180165
classUnderTest.navigationEvent.first()
181166
}

0 commit comments

Comments
 (0)