Skip to content

Commit 207068a

Browse files
committed
Refactor: Introduce CrashlyticsHelper for testability and add ShowDetailRepository tests
1 parent c66f020 commit 207068a

File tree

5 files changed

+49
-43
lines changed

5 files changed

+49
-43
lines changed

app/src/main/java/com/theupnextapp/di/FirebaseCrashlyticsModule.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,18 @@ import javax.inject.Singleton
3434
@Module
3535
abstract class FirebaseCrashlyticsModule {
3636

37-
companion object { // Added companion object
37+
@Binds
38+
@Singleton
39+
abstract fun bindCrashlyticsHelper(
40+
appCrashlyticsHelper: AppCrashlyticsHelper
41+
): CrashlyticsHelper
42+
43+
companion object {
3844
@Singleton
3945
@Provides
4046
fun provideFirebaseCrashlytics(): FirebaseCrashlytics {
4147
return FirebaseCrashlytics.getInstance()
4248
}
4349
}
4450

45-
@Binds
46-
@Singleton
47-
abstract fun bindCrashlyticsHelper(
48-
appCrashlyticsHelper: AppCrashlyticsHelper
49-
): CrashlyticsHelper
5051
}

app/src/main/java/com/theupnextapp/domain/Result.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121

2222
package com.theupnextapp.domain
2323

24-
import android.util.Log
2524
import com.squareup.moshi.Moshi
2625
import kotlinx.coroutines.CoroutineDispatcher
2726
import kotlinx.coroutines.withContext

app/src/main/java/com/theupnextapp/repository/ShowDetailRepository.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121

2222
package com.theupnextapp.repository
2323

24-
import androidx.lifecycle.LiveData
25-
import androidx.lifecycle.MutableLiveData
2624
import com.theupnextapp.common.CrashlyticsHelper
2725
import com.theupnextapp.database.UpnextDao
2826
import com.theupnextapp.domain.Result
@@ -47,7 +45,7 @@ class ShowDetailRepository(
4745
private val crashlytics: CrashlyticsHelper
4846
) : BaseRepository(upnextDao = upnextDao, tvMazeService = tvMazeService) {
4947

50-
suspend fun getShowSummary(showId: Int): Flow<Result<ShowDetailSummary>> {
48+
fun getShowSummary(showId: Int): Flow<Result<ShowDetailSummary>> {
5149
return flow {
5250
emit(Result.Loading(true))
5351
val response =
@@ -73,7 +71,7 @@ class ShowDetailRepository(
7371
.flowOn(Dispatchers.IO)
7472
}
7573

76-
suspend fun getPreviousEpisode(episodeRef: String?): Flow<Result<ShowPreviousEpisode>> {
74+
fun getPreviousEpisode(episodeRef: String?): Flow<Result<ShowPreviousEpisode>> {
7775
return flow {
7876
emit(Result.Loading(true))
7977
val previousEpisodeLink = episodeRef?.substring(
@@ -109,7 +107,7 @@ class ShowDetailRepository(
109107
.flowOn(Dispatchers.IO)
110108
}
111109

112-
suspend fun getNextEpisode(episodeRef: String?): Flow<Result<ShowNextEpisode>> {
110+
fun getNextEpisode(episodeRef: String?): Flow<Result<ShowNextEpisode>> {
113111
return flow {
114112
emit(Result.Loading(true))
115113
val nextEpisodeLink = episodeRef?.substring(
@@ -145,7 +143,7 @@ class ShowDetailRepository(
145143
.flowOn(Dispatchers.IO)
146144
}
147145

148-
suspend fun getShowCast(showId: Int): Flow<Result<List<ShowCast>>> {
146+
fun getShowCast(showId: Int): Flow<Result<List<ShowCast>>> {
149147
return flow {
150148
emit(Result.Loading(true))
151149
val response = safeApiCall(Dispatchers.IO) {
@@ -170,7 +168,7 @@ class ShowDetailRepository(
170168
.flowOn(Dispatchers.IO)
171169
}
172170

173-
suspend fun getShowSeasons(showId: Int): Flow<Result<List<ShowSeason>>> {
171+
fun getShowSeasons(showId: Int): Flow<Result<List<ShowSeason>>> {
174172
return flow {
175173
emit(Result.Loading(true))
176174
val response = safeApiCall(Dispatchers.IO) {
@@ -195,7 +193,7 @@ class ShowDetailRepository(
195193
.flowOn(Dispatchers.IO)
196194
}
197195

198-
suspend fun getShowSeasonEpisodes(
196+
fun getShowSeasonEpisodes(
199197
showId: Int,
200198
seasonNumber: Int
201199
): Flow<Result<List<ShowSeasonEpisode>>> {

app/src/test/java/com/theupnextapp/fake/FakeTvMazeService.kt

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -137,41 +137,59 @@ class FakeTvMazeService : TvMazeService {
137137
if (shouldThrowGetShowSummaryError) {
138138
throw IOException("Fake network error for getShowSummary")
139139
}
140-
mockShowInfoResponse?.let {
141-
return CompletableDeferred(it)
142-
} ?: throw NotImplementedError("mockShowInfoResponse not set for this test")
140+
val currentMock = mockShowInfoResponse
141+
if (currentMock != null) {
142+
return CompletableDeferred(currentMock)
143+
} else {
144+
throw NotImplementedError("mockShowInfoResponse not set for this test")
145+
}
143146
}
144147

145148
override fun getNextEpisodeAsync(name: String?): Deferred<NetworkShowNextEpisodeResponse> {
146-
mockNextEpisodeResponse?.let {
147-
return CompletableDeferred(it)
148-
} ?: throw NotImplementedError("mockNextEpisodeResponse not set for this test")
149+
val currentMock = mockNextEpisodeResponse
150+
if (currentMock != null) {
151+
return CompletableDeferred(currentMock)
152+
} else {
153+
throw NotImplementedError("mockNextEpisodeResponse not set for this test")
154+
}
149155
}
150156

151157
override fun getPreviousEpisodeAsync(name: String?): Deferred<NetworkShowPreviousEpisodeResponse> {
152158
if (shouldThrowGetPreviousEpisodeError) {
153159
throw IOException("Fake network error for getPreviousEpisode")
154160
}
155-
mockPreviousEpisodeResponse?.let {
156-
return CompletableDeferred(it)
157-
} ?: throw NotImplementedError("mockPreviousEpisodeResponse not set for this test")
161+
val currentMock = mockPreviousEpisodeResponse
162+
if (currentMock != null) {
163+
return CompletableDeferred(currentMock)
164+
} else {
165+
throw NotImplementedError("mockPreviousEpisodeResponse not set for this test")
166+
}
158167
}
159168

160169
override fun getShowCastAsync(id: String?): Deferred<NetworkShowCastResponse> {
161-
mockShowCastResponse?.let {
162-
return CompletableDeferred(it)
163-
} ?: throw NotImplementedError("mockShowCastResponse not set for this test")
170+
val currentMock = mockShowCastResponse
171+
if (currentMock != null) {
172+
return CompletableDeferred(currentMock)
173+
} else {
174+
throw NotImplementedError("mockShowCastResponse not set for this test")
175+
}
164176
}
165177

166178
override fun getShowSeasonsAsync(id: String?): Deferred<NetworkShowSeasonsResponse> {
167-
mockShowSeasonsResponse?.let {
168-
return CompletableDeferred(it)
169-
} ?: throw NotImplementedError("mockShowSeasonsResponse not set for this test")
179+
val currentMock = mockShowSeasonsResponse
180+
if (currentMock != null) {
181+
return CompletableDeferred(currentMock)
182+
} else {
183+
throw NotImplementedError("mockShowSeasonsResponse not set for this test")
184+
}
170185
}
171186

172187
override fun getSeasonEpisodesAsync(id: String?): Deferred<NetworkTvMazeEpisodesResponse> {
173-
mockTvMazeEpisodesResponse?.let {
174-
return CompletableDeferred(it)
175-
} ?: throw NotImplementedError("mockTvMazeEpisodesResponse not set for this test")
188+
val currentMock = mockTvMazeEpisodesResponse
189+
if (currentMock != null) {
190+
return CompletableDeferred(currentMock)
191+
} else {
192+
throw NotImplementedError("mockTvMazeEpisodesResponse not set for this test")
193+
}
176194
}
177195
}

app/src/test/java/com/theupnextapp/fake/FakeUpnextDao.kt

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,4 @@ class FakeUpnextDao : UpnextDao {
4242
tableUpdates.remove(tableName)
4343
tableUpdatesFlow.value = HashMap(tableUpdates) // Emit new state
4444
}
45-
46-
// Helper for tests
47-
fun clearAll() {
48-
tableUpdates.clear()
49-
tableUpdatesFlow.value = emptyMap()
50-
}
51-
52-
fun addTableUpdate(update: DatabaseTableUpdate) {
53-
insertTableUpdateLog(update)
54-
}
5545
}

0 commit comments

Comments
 (0)