Skip to content

Commit cfd1a6e

Browse files
committed
Refactor: extract UploadFixtures to dry test code
1 parent 09727c2 commit cfd1a6e

File tree

3 files changed

+87
-90
lines changed

3 files changed

+87
-90
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.wordpress.android.ui.uploads
2+
3+
import androidx.lifecycle.Lifecycle
4+
import androidx.lifecycle.MutableLiveData
5+
import androidx.lifecycle.ProcessLifecycleOwner
6+
import org.mockito.kotlin.any
7+
import org.mockito.kotlin.doReturn
8+
import org.mockito.kotlin.mock
9+
import org.wordpress.android.fluxc.model.PostModel
10+
import org.wordpress.android.fluxc.model.SiteModel
11+
import org.wordpress.android.fluxc.model.post.PostStatus
12+
import org.wordpress.android.fluxc.store.UploadStore
13+
import org.wordpress.android.ui.posts.PostUtilsWrapper
14+
import org.wordpress.android.util.DateTimeUtils
15+
import org.wordpress.android.util.NetworkUtilsWrapper
16+
import org.wordpress.android.viewmodel.helpers.ConnectionStatus
17+
import java.util.Date
18+
19+
internal object UploadFixtures {
20+
private var postIdIndex = 0
21+
22+
private fun makePostTitleFromId() = postIdIndex.toString().padStart(2, '0')
23+
24+
fun resetTestPostIdIndex() { postIdIndex = 0 }
25+
26+
fun createMockedNetworkUtilsWrapper() = mock<NetworkUtilsWrapper> { on { isNetworkAvailable() } doReturn true }
27+
28+
fun createConnectionStatusLiveData(initialValue: ConnectionStatus?): MutableLiveData<ConnectionStatus> {
29+
return MutableLiveData<ConnectionStatus>().apply { value = initialValue }
30+
}
31+
32+
fun createMockedPostUtilsWrapper() = mock<PostUtilsWrapper> {
33+
on { isPublishable(any()) } doReturn true
34+
on { isPostInConflictWithRemote(any()) } doReturn false
35+
}
36+
37+
fun createMockedUploadStore(numberOfAutoUploadAttempts: Int) = mock<UploadStore> {
38+
on { getNumberOfPostAutoUploadAttempts(any()) } doReturn numberOfAutoUploadAttempts
39+
}
40+
41+
fun createMockedUploadServiceFacade() = mock<UploadServiceFacade> {
42+
on { isPostUploadingOrQueued(any()) } doReturn false
43+
}
44+
45+
fun createMockedProcessLifecycleOwner(lifecycle: Lifecycle = mock()) = mock<ProcessLifecycleOwner> {
46+
on { this.lifecycle } doReturn lifecycle
47+
}
48+
49+
fun createLocallyChangedPostModel(postStatus: PostStatus = PostStatus.DRAFT, page: Boolean = false) =
50+
PostModel().apply {
51+
setId(++postIdIndex)
52+
setTitle(makePostTitleFromId())
53+
setStatus(postStatus.toString())
54+
setIsLocallyChanged(true)
55+
setDateLocallyChanged(DateTimeUtils.iso8601FromTimestamp(Date().time / 1000))
56+
setIsPage(page)
57+
}
58+
59+
fun createSimpleLocallyChangedPostModel() = PostModel().apply {
60+
setStatus(PostStatus.DRAFT.toString())
61+
setIsLocallyChanged(true)
62+
setDateLocallyChanged(DateTimeUtils.iso8601FromTimestamp(Date().time / 1000))
63+
}
64+
65+
fun createSiteModel(isWpCom: Boolean = true) = SiteModel().apply { setIsWPCom(isWpCom) }
66+
}

WordPress/src/test/java/org/wordpress/android/ui/uploads/UploadStarterConcurrentTest.kt

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,13 @@ import org.mockito.kotlin.mock
1111
import org.mockito.kotlin.times
1212
import org.mockito.kotlin.verify
1313
import org.wordpress.android.BaseUnitTest
14-
import org.wordpress.android.fluxc.model.PostModel
15-
import org.wordpress.android.fluxc.model.SiteModel
16-
import org.wordpress.android.fluxc.model.post.PostStatus
1714
import org.wordpress.android.fluxc.store.PageStore
1815
import org.wordpress.android.fluxc.store.PostStore
19-
import org.wordpress.android.ui.posts.PostUtilsWrapper
20-
import org.wordpress.android.util.DateTimeUtils
21-
import org.wordpress.android.util.NetworkUtilsWrapper
22-
import java.util.Date
16+
import org.wordpress.android.ui.uploads.UploadFixtures.createSimpleLocallyChangedPostModel
17+
import org.wordpress.android.ui.uploads.UploadFixtures.createMockedNetworkUtilsWrapper
18+
import org.wordpress.android.ui.uploads.UploadFixtures.createMockedPostUtilsWrapper
19+
import org.wordpress.android.ui.uploads.UploadFixtures.createSiteModel
20+
import org.wordpress.android.ui.uploads.UploadFixtures.createMockedUploadServiceFacade
2321

2422
/**
2523
* Tests for structured concurrency in [UploadStarter].
@@ -31,11 +29,11 @@ import java.util.Date
3129
class UploadStarterConcurrentTest : BaseUnitTest() {
3230
private val site = createSiteModel()
3331
private val draftPosts = listOf(
34-
createLocallyChangedPostModel(),
35-
createLocallyChangedPostModel(),
36-
createLocallyChangedPostModel(),
37-
createLocallyChangedPostModel(),
38-
createLocallyChangedPostModel()
32+
createSimpleLocallyChangedPostModel(),
33+
createSimpleLocallyChangedPostModel(),
34+
createSimpleLocallyChangedPostModel(),
35+
createSimpleLocallyChangedPostModel(),
36+
createSimpleLocallyChangedPostModel()
3937
)
4038

4139
private val postStore = mock<PostStore> {
@@ -78,27 +76,4 @@ class UploadStarterConcurrentTest : BaseUnitTest() {
7876
tracker = mock(),
7977
dispatcher = mock()
8078
)
81-
82-
private companion object Fixtures {
83-
fun createMockedNetworkUtilsWrapper() = mock<NetworkUtilsWrapper> {
84-
on { isNetworkAvailable() } doReturn true
85-
}
86-
87-
fun createMockedUploadServiceFacade() = mock<UploadServiceFacade> {
88-
on { isPostUploadingOrQueued(any()) } doReturn false
89-
}
90-
91-
fun createMockedPostUtilsWrapper() = mock<PostUtilsWrapper> {
92-
on { isPublishable(any()) } doReturn true
93-
on { isPostInConflictWithRemote(any()) } doReturn false
94-
}
95-
96-
fun createLocallyChangedPostModel() = PostModel().apply {
97-
setStatus(PostStatus.DRAFT.toString())
98-
setIsLocallyChanged(true)
99-
setDateLocallyChanged(DateTimeUtils.iso8601FromTimestamp(Date().time / 1000))
100-
}
101-
102-
fun createSiteModel(): SiteModel = SiteModel().apply { setIsWPCom(true) }
103-
}
10479
}

WordPress/src/test/java/org/wordpress/android/ui/uploads/UploadStarterTest.kt

Lines changed: 11 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package org.wordpress.android.ui.uploads
22

3-
import androidx.lifecycle.Lifecycle
43
import androidx.lifecycle.Lifecycle.Event
54
import androidx.lifecycle.LifecycleRegistry
65
import androidx.lifecycle.LiveData
7-
import androidx.lifecycle.MutableLiveData
8-
import androidx.lifecycle.ProcessLifecycleOwner
96
import kotlinx.coroutines.CancellationException
107
import kotlinx.coroutines.ExperimentalCoroutinesApi
118
import org.assertj.core.api.Assertions
@@ -31,7 +28,6 @@ import org.wordpress.android.fluxc.action.UploadAction
3128
import org.wordpress.android.fluxc.annotations.action.Action
3229
import org.wordpress.android.fluxc.model.PostModel
3330
import org.wordpress.android.fluxc.model.SiteModel
34-
import org.wordpress.android.fluxc.model.post.PostStatus
3531
import org.wordpress.android.fluxc.model.post.PostStatus.DRAFT
3632
import org.wordpress.android.fluxc.model.post.PostStatus.PENDING
3733
import org.wordpress.android.fluxc.model.post.PostStatus.PRIVATE
@@ -43,14 +39,20 @@ import org.wordpress.android.fluxc.store.PostStore
4339
import org.wordpress.android.fluxc.store.SiteStore
4440
import org.wordpress.android.fluxc.store.UploadStore
4541
import org.wordpress.android.ui.posts.PostUtilsWrapper
42+
import org.wordpress.android.ui.uploads.UploadFixtures.createConnectionStatusLiveData
43+
import org.wordpress.android.ui.uploads.UploadFixtures.createLocallyChangedPostModel
44+
import org.wordpress.android.ui.uploads.UploadFixtures.createMockedNetworkUtilsWrapper
45+
import org.wordpress.android.ui.uploads.UploadFixtures.createMockedPostUtilsWrapper
46+
import org.wordpress.android.ui.uploads.UploadFixtures.createMockedProcessLifecycleOwner
47+
import org.wordpress.android.ui.uploads.UploadFixtures.createMockedUploadServiceFacade
48+
import org.wordpress.android.ui.uploads.UploadFixtures.createMockedUploadStore
49+
import org.wordpress.android.ui.uploads.UploadFixtures.createSiteModel
50+
import org.wordpress.android.ui.uploads.UploadFixtures.resetTestPostIdIndex
4651
import org.wordpress.android.util.DateTimeUtils
47-
import org.wordpress.android.util.NetworkUtilsWrapper
4852
import org.wordpress.android.viewmodel.helpers.ConnectionStatus
4953
import org.wordpress.android.viewmodel.helpers.ConnectionStatus.AVAILABLE
5054
import org.wordpress.android.viewmodel.helpers.ConnectionStatus.UNAVAILABLE
5155
import java.util.Date
52-
import java.util.UUID
53-
import kotlin.random.Random
5456

5557
@ExperimentalCoroutinesApi
5658
@RunWith(MockitoJUnitRunner::class)
@@ -480,7 +482,7 @@ class UploadStarterTest : BaseUnitTest() {
480482
val postModel = createLocallyChangedPostModel()
481483
defaultSetup(siteModel, postModel)
482484

483-
// Set autosaveModified to a newer date than dateLocallyChanged to indicate the changes were remotely-auto-saved
485+
// Set autoSaveModified to a newer date than dateLocallyChanged to indicate the changes were remotely-auto-saved
484486
postModel.setAutoSaveModified(
485487
DateTimeUtils.iso8601FromTimestamp(
486488
DateTimeUtils.timestampFromIso8601(
@@ -543,51 +545,5 @@ class UploadStarterTest : BaseUnitTest() {
543545
uploadActionUseCase = UploadActionUseCase(uploadStore, postUtilsWrapper, uploadServiceFacade),
544546
tracker = mock(),
545547
dispatcher = dispatcher
546-
)
547-
548-
private companion object Fixtures {
549-
550-
var postIdIndex = 0
551-
fun makePostTitleFromId() = postIdIndex.toString().padStart(2, '0')
552-
553-
fun createMockedNetworkUtilsWrapper() = mock<NetworkUtilsWrapper> {
554-
on { isNetworkAvailable() } doReturn true
555-
}
556-
557-
fun createConnectionStatusLiveData(initialValue: ConnectionStatus?): MutableLiveData<ConnectionStatus> {
558-
return MutableLiveData<ConnectionStatus>().apply {
559-
value = initialValue
560-
}
561-
}
562-
563-
fun createMockedPostUtilsWrapper() = mock<PostUtilsWrapper> {
564-
on { isPublishable(any()) } doReturn true
565-
on { isPostInConflictWithRemote(any()) } doReturn false
566-
}
567-
568-
fun createMockedUploadStore(numberOfAutoUploadAttempts: Int) = mock<UploadStore> {
569-
on { getNumberOfPostAutoUploadAttempts(any()) } doReturn numberOfAutoUploadAttempts
570-
}
571-
572-
fun createMockedUploadServiceFacade() = mock<UploadServiceFacade> {
573-
on { isPostUploadingOrQueued(any()) } doReturn false
574-
}
575-
576-
fun createMockedProcessLifecycleOwner(lifecycle: Lifecycle = mock()) = mock<ProcessLifecycleOwner> {
577-
on { this.lifecycle } doReturn lifecycle
578-
}
579-
580-
fun createLocallyChangedPostModel(postStatus: PostStatus = DRAFT, page: Boolean = false) = PostModel().apply {
581-
setId(++postIdIndex)
582-
setTitle(makePostTitleFromId())
583-
setStatus(postStatus.toString())
584-
setIsLocallyChanged(true)
585-
setDateLocallyChanged(DateTimeUtils.iso8601FromTimestamp(Date().time / 1000))
586-
setIsPage(page)
587-
}
588-
589-
fun createSiteModel(isWpCom: Boolean = true) = SiteModel().apply {
590-
setIsWPCom(isWpCom)
591-
}
592-
}
548+
).also { resetTestPostIdIndex() }
593549
}

0 commit comments

Comments
 (0)