Skip to content

Commit 6037ca4

Browse files
committed
Unit Testing | Patch 19
1 parent 9e785a1 commit 6037ca4

10 files changed

+1060
-2
lines changed

data/src/main/java/com/shifthackz/aisdv1/data/repository/HuggingFaceModelsRepositoryImpl.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ internal class HuggingFaceModelsRepositoryImpl(
1313
.concatMapCompletable(localDataSource::save)
1414

1515
override fun fetchAndGetHuggingFaceModels() = fetchHuggingFaceModels()
16+
.onErrorComplete()
1617
.andThen(getHuggingFaceModels())
1718

1819
override fun getHuggingFaceModels() = localDataSource.getAll()

data/src/main/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ internal class LocalDiffusionGenerationRepositoryImpl(
3636
.getSelected()
3737
.flatMap { model ->
3838
if (model.downloaded) generate(payload)
39-
else Single.error(Throwable("Model not downloaded"))
39+
else Single.error(IllegalStateException("Model not downloaded."))
4040
}
4141

4242
override fun interruptGeneration() = localDiffusion.interrupt()

data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImpl.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,6 @@ internal class StabilityAiGenerationRepositoryImpl(
6161
private fun refreshCredits(ai: AiGenerationResult) = creditsRds
6262
.fetch()
6363
.flatMapCompletable(creditsLds::save)
64+
.onErrorComplete()
6465
.andThen(Single.just(ai))
6566
}
Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
package com.shifthackz.aisdv1.data.repository
2+
3+
import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter
4+
import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult
5+
import com.shifthackz.aisdv1.data.mocks.mockImageToImagePayload
6+
import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload
7+
import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource
8+
import com.shifthackz.aisdv1.domain.datasource.HordeGenerationDataSource
9+
import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus
10+
import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway
11+
import com.shifthackz.aisdv1.domain.preference.PreferenceManager
12+
import io.mockk.every
13+
import io.mockk.mockk
14+
import io.reactivex.rxjava3.core.BackpressureStrategy
15+
import io.reactivex.rxjava3.core.Completable
16+
import io.reactivex.rxjava3.core.Flowable
17+
import io.reactivex.rxjava3.core.Single
18+
import io.reactivex.rxjava3.subjects.BehaviorSubject
19+
import org.junit.Before
20+
import org.junit.Test
21+
22+
class HordeGenerationRepositoryImplTest {
23+
24+
private val stubException = Throwable("Something went wrong.")
25+
private val stubStatus = BehaviorSubject.create<HordeProcessStatus>()
26+
private val stubMediaStoreGateway = mockk<MediaStoreGateway>()
27+
private val stubBase64ToBitmapConverter = mockk<Base64ToBitmapConverter>()
28+
private val stubLocalDataSource = mockk<GenerationResultDataSource.Local>()
29+
private val stubPreferenceManager = mockk<PreferenceManager>()
30+
private val stubRemoteDataSource = mockk<HordeGenerationDataSource.Remote>()
31+
private val stubStatusSource = mockk<HordeGenerationDataSource.StatusSource>()
32+
33+
private val repository = HordeGenerationRepositoryImpl(
34+
mediaStoreGateway = stubMediaStoreGateway,
35+
base64ToBitmapConverter = stubBase64ToBitmapConverter,
36+
localDataSource = stubLocalDataSource,
37+
preferenceManager = stubPreferenceManager,
38+
remoteDataSource = stubRemoteDataSource,
39+
statusSource = stubStatusSource,
40+
)
41+
42+
@Before
43+
fun initialize() {
44+
every {
45+
stubStatusSource.observe()
46+
} returns stubStatus.toFlowable(BackpressureStrategy.LATEST)
47+
48+
every {
49+
stubPreferenceManager.autoSaveAiResults
50+
} returns false
51+
}
52+
53+
@Test
54+
fun `given attempt to observe status, status source emits two values, expected valid values in same order`() {
55+
val stubObserver = repository.observeStatus().test()
56+
57+
stubStatus.onNext(HordeProcessStatus(5598, 1504))
58+
59+
stubObserver
60+
.assertNoErrors()
61+
.assertValueAt(0, HordeProcessStatus(5598, 1504))
62+
63+
stubStatus.onNext(HordeProcessStatus(0, 0))
64+
65+
stubObserver
66+
.assertNoErrors()
67+
.assertValueAt(1, HordeProcessStatus(0, 0))
68+
}
69+
70+
@Test
71+
fun `given attempt to observe status, status source throws exception, expected error value`() {
72+
every {
73+
stubStatusSource.observe()
74+
} returns Flowable.error(stubException)
75+
76+
repository
77+
.observeStatus()
78+
.test()
79+
.assertError(stubException)
80+
.assertNoValues()
81+
.await()
82+
.assertNotComplete()
83+
}
84+
85+
@Test
86+
fun `given attempt to validate api key, remote returns true, expected true value`() {
87+
every {
88+
stubRemoteDataSource.validateApiKey()
89+
} returns Single.just(true)
90+
91+
repository
92+
.validateApiKey()
93+
.test()
94+
.assertNoErrors()
95+
.assertValue(true)
96+
.await()
97+
.assertComplete()
98+
}
99+
100+
@Test
101+
fun `given attempt to validate api key, remote returns false, expected false value`() {
102+
every {
103+
stubRemoteDataSource.validateApiKey()
104+
} returns Single.just(false)
105+
106+
repository
107+
.validateApiKey()
108+
.test()
109+
.assertNoErrors()
110+
.assertValue(false)
111+
.await()
112+
.assertComplete()
113+
}
114+
115+
@Test
116+
fun `given attempt to validate api key, remote throws exception, expected error value`() {
117+
every {
118+
stubRemoteDataSource.validateApiKey()
119+
} returns Single.error(stubException)
120+
121+
repository
122+
.validateApiKey()
123+
.test()
124+
.assertError(stubException)
125+
.assertNoValues()
126+
.await()
127+
.assertNotComplete()
128+
}
129+
130+
@Test
131+
fun `given attempt to generate from text, remote returns result, expected valid domain model value`() {
132+
every {
133+
stubRemoteDataSource.textToImage(any())
134+
} returns Single.just(mockAiGenerationResult)
135+
136+
repository
137+
.generateFromText(mockTextToImagePayload)
138+
.test()
139+
.assertNoErrors()
140+
.assertValue(mockAiGenerationResult)
141+
.await()
142+
.assertComplete()
143+
}
144+
145+
@Test
146+
fun `given attempt to generate from text, remote throws exception, expected error value`() {
147+
every {
148+
stubRemoteDataSource.textToImage(any())
149+
} returns Single.error(stubException)
150+
151+
repository
152+
.generateFromText(mockTextToImagePayload)
153+
.test()
154+
.assertError(stubException)
155+
.assertNoValues()
156+
.await()
157+
.assertNotComplete()
158+
}
159+
160+
@Test
161+
fun `given attempt to generate from image, remote returns result, expected valid domain model value`() {
162+
every {
163+
stubRemoteDataSource.imageToImage(any())
164+
} returns Single.just(mockAiGenerationResult)
165+
166+
repository
167+
.generateFromImage(mockImageToImagePayload)
168+
.test()
169+
.assertNoErrors()
170+
.assertValue(mockAiGenerationResult)
171+
.await()
172+
.assertComplete()
173+
}
174+
175+
@Test
176+
fun `given attempt to generate from image, remote throws exception, expected error value`() {
177+
every {
178+
stubRemoteDataSource.imageToImage(any())
179+
} returns Single.error(stubException)
180+
181+
repository
182+
.generateFromImage(mockImageToImagePayload)
183+
.test()
184+
.assertError(stubException)
185+
.assertNoValues()
186+
.await()
187+
.assertNotComplete()
188+
}
189+
190+
@Test
191+
fun `given attempt to interrupt generation, remote completes, expected complete value`() {
192+
every {
193+
stubRemoteDataSource.interruptGeneration()
194+
} returns Completable.complete()
195+
196+
repository
197+
.interruptGeneration()
198+
.test()
199+
.assertNoErrors()
200+
.await()
201+
.assertComplete()
202+
}
203+
204+
@Test
205+
fun `given attempt to interrupt generation, remote throws exception, expected error value`() {
206+
every {
207+
stubRemoteDataSource.interruptGeneration()
208+
} returns Completable.error(stubException)
209+
210+
repository
211+
.interruptGeneration()
212+
.test()
213+
.assertError(stubException)
214+
.await()
215+
.assertNotComplete()
216+
}
217+
}
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package com.shifthackz.aisdv1.data.repository
2+
3+
import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter
4+
import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult
5+
import com.shifthackz.aisdv1.data.mocks.mockImageToImagePayload
6+
import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload
7+
import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource
8+
import com.shifthackz.aisdv1.domain.datasource.HuggingFaceGenerationDataSource
9+
import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway
10+
import com.shifthackz.aisdv1.domain.preference.PreferenceManager
11+
import io.mockk.every
12+
import io.mockk.mockk
13+
import io.reactivex.rxjava3.core.Single
14+
import org.junit.Before
15+
import org.junit.Test
16+
17+
class HuggingFaceGenerationRepositoryImplTest {
18+
19+
private val stubException = Throwable("Something went wrong.")
20+
private val stubMediaStoreGateway = mockk<MediaStoreGateway>()
21+
private val stubBase64ToBitmapConverter = mockk<Base64ToBitmapConverter>()
22+
private val stubLocalDataSource = mockk<GenerationResultDataSource.Local>()
23+
private val stubPreferenceManager = mockk<PreferenceManager>()
24+
private val stubRemoteDataSource = mockk<HuggingFaceGenerationDataSource.Remote>()
25+
26+
private val repository = HuggingFaceGenerationRepositoryImpl(
27+
mediaStoreGateway = stubMediaStoreGateway,
28+
base64ToBitmapConverter = stubBase64ToBitmapConverter,
29+
localDataSource = stubLocalDataSource,
30+
preferenceManager = stubPreferenceManager,
31+
remoteDataSource = stubRemoteDataSource,
32+
)
33+
34+
@Before
35+
fun initialize() {
36+
every {
37+
stubPreferenceManager.autoSaveAiResults
38+
} returns false
39+
40+
every {
41+
stubPreferenceManager.huggingFaceModel
42+
} returns "hf_5598"
43+
}
44+
45+
@Test
46+
fun `given attempt to validate api key, remote returns true, expected true value`() {
47+
every {
48+
stubRemoteDataSource.validateApiKey()
49+
} returns Single.just(true)
50+
51+
repository
52+
.validateApiKey()
53+
.test()
54+
.assertNoErrors()
55+
.assertValue(true)
56+
.await()
57+
.assertComplete()
58+
}
59+
60+
@Test
61+
fun `given attempt to validate api key, remote returns false, expected false value`() {
62+
every {
63+
stubRemoteDataSource.validateApiKey()
64+
} returns Single.just(false)
65+
66+
repository
67+
.validateApiKey()
68+
.test()
69+
.assertNoErrors()
70+
.assertValue(false)
71+
.await()
72+
.assertComplete()
73+
}
74+
75+
@Test
76+
fun `given attempt to validate api key, remote throws exception, expected error value`() {
77+
every {
78+
stubRemoteDataSource.validateApiKey()
79+
} returns Single.error(stubException)
80+
81+
repository
82+
.validateApiKey()
83+
.test()
84+
.assertError(stubException)
85+
.assertNoValues()
86+
.await()
87+
.assertNotComplete()
88+
}
89+
90+
@Test
91+
fun `given attempt to generate from text, remote returns result, expected valid domain model value`() {
92+
every {
93+
stubRemoteDataSource.textToImage(any(), any())
94+
} returns Single.just(mockAiGenerationResult)
95+
96+
repository
97+
.generateFromText(mockTextToImagePayload)
98+
.test()
99+
.assertNoErrors()
100+
.assertValue(mockAiGenerationResult)
101+
.await()
102+
.assertComplete()
103+
}
104+
105+
@Test
106+
fun `given attempt to generate from text, remote throws exception, expected error value`() {
107+
every {
108+
stubRemoteDataSource.textToImage(any(), any())
109+
} returns Single.error(stubException)
110+
111+
repository
112+
.generateFromText(mockTextToImagePayload)
113+
.test()
114+
.assertError(stubException)
115+
.assertNoValues()
116+
.await()
117+
.assertNotComplete()
118+
}
119+
120+
@Test
121+
fun `given attempt to generate from image, remote returns result, expected valid domain model value`() {
122+
every {
123+
stubRemoteDataSource.imageToImage(any(), any())
124+
} returns Single.just(mockAiGenerationResult)
125+
126+
repository
127+
.generateFromImage(mockImageToImagePayload)
128+
.test()
129+
.assertNoErrors()
130+
.assertValue(mockAiGenerationResult)
131+
.await()
132+
.assertComplete()
133+
}
134+
135+
@Test
136+
fun `given attempt to generate from image, remote throws exception, expected error value`() {
137+
every {
138+
stubRemoteDataSource.imageToImage(any(), any())
139+
} returns Single.error(stubException)
140+
141+
repository
142+
.generateFromImage(mockImageToImagePayload)
143+
.test()
144+
.assertError(stubException)
145+
.assertNoValues()
146+
.await()
147+
.assertNotComplete()
148+
}
149+
}

0 commit comments

Comments
 (0)