Skip to content

Commit cbb8b25

Browse files
committed
Fix OPMLDataSourceTest with a different injectable
1 parent 573fead commit cbb8b25

File tree

3 files changed

+54
-19
lines changed

3 files changed

+54
-19
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package me.ash.reader.infrastructure.preference
2+
3+
import android.content.Context
4+
import androidx.datastore.core.DataStore
5+
import androidx.datastore.preferences.core.Preferences
6+
import dagger.hilt.android.qualifiers.ApplicationContext
7+
import me.ash.reader.ui.ext.DataStoreKey
8+
import me.ash.reader.ui.ext.dataStore
9+
import me.ash.reader.ui.ext.get
10+
import javax.inject.Inject
11+
12+
/**
13+
* An injectable Preferences wrapper object,
14+
* so that consumers can receive a mock during tests
15+
*/
16+
class PreferencesReader @Inject constructor(
17+
@ApplicationContext
18+
appContext: Context
19+
) {
20+
private val dataStore: DataStore<Preferences> = appContext.dataStore
21+
22+
val skipVersionNumber: String
23+
get() = this.dataStore.get(DataStoreKey.skipVersionNumber) ?: ""
24+
val isFirstLaunch: Boolean
25+
get() = this.dataStore.get(DataStoreKey.isFirstLaunch) ?: true
26+
val currentAccountId: Int
27+
get() = this.dataStore.get(DataStoreKey.currentAccountId) ?: 1
28+
val currentAccountType: Int
29+
get() = this.dataStore.get(DataStoreKey.currentAccountType) ?: 1
30+
31+
val initialPage: Int
32+
get() = this.dataStore.get(DataStoreKey.initialPage) ?: 0
33+
val initialFilter: Int
34+
get() = this.dataStore.get(DataStoreKey.initialFilter) ?: 2
35+
36+
val languages: Int
37+
get() = this.dataStore.get(DataStoreKey.languages) ?: 0
38+
}

app/src/main/java/me/ash/reader/infrastructure/rss/OPMLDataSource.kt

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
11
package me.ash.reader.infrastructure.rss
22

3-
import android.content.Context
43
import be.ceau.opml.OpmlParser
5-
import dagger.hilt.android.qualifiers.ApplicationContext
64
import kotlinx.coroutines.CoroutineDispatcher
75
import me.ash.reader.domain.model.feed.Feed
86
import me.ash.reader.domain.model.group.Group
97
import me.ash.reader.domain.model.group.GroupWithFeed
108
import me.ash.reader.infrastructure.di.IODispatcher
11-
import me.ash.reader.ui.ext.currentAccountId
9+
import me.ash.reader.infrastructure.preference.PreferencesReader
1210
import me.ash.reader.ui.ext.extractDomain
1311
import me.ash.reader.ui.ext.spacerDollar
1412
import java.io.InputStream
1513
import java.util.*
1614
import javax.inject.Inject
1715

1816
class OPMLDataSource @Inject constructor(
19-
@ApplicationContext
20-
private val context: Context,
17+
private val preferences: PreferencesReader,
2118
@IODispatcher
2219
private val ioDispatcher: CoroutineDispatcher,
2320
) {
@@ -27,7 +24,7 @@ class OPMLDataSource @Inject constructor(
2724
inputStream: InputStream,
2825
defaultGroup: Group,
2926
): List<GroupWithFeed> {
30-
val accountId = context.currentAccountId
27+
val accountId = preferences.currentAccountId
3128
val opml = OpmlParser().parse(inputStream)
3229
val groupWithFeedList = mutableListOf<GroupWithFeed>().also {
3330
it.addGroup(defaultGroup)
@@ -41,7 +38,7 @@ class OPMLDataSource @Inject constructor(
4138
if (!it.attributes.getOrDefault("isDefault", null).toBoolean()) {
4239
groupWithFeedList.addGroup(
4340
Group(
44-
id = context.currentAccountId.spacerDollar(
41+
id = preferences.currentAccountId.spacerDollar(
4542
UUID.randomUUID().toString()
4643
),
4744
name = it.attributes.getOrDefault("title", null) ?: it.text!!,
@@ -52,7 +49,7 @@ class OPMLDataSource @Inject constructor(
5249
} else {
5350
groupWithFeedList.addFeedToDefault(
5451
Feed(
55-
id = context.currentAccountId.spacerDollar(
52+
id = preferences.currentAccountId.spacerDollar(
5653
UUID.randomUUID().toString()
5754
),
5855
name = it.attributes.getOrDefault("title", null) ?: it.text!!,
@@ -71,7 +68,7 @@ class OPMLDataSource @Inject constructor(
7168
var groupId = defaultGroup.id
7269
if (!it.attributes.getOrDefault("isDefault", null).toBoolean()) {
7370
groupId =
74-
context.currentAccountId.spacerDollar(UUID.randomUUID().toString())
71+
preferences.currentAccountId.spacerDollar(UUID.randomUUID().toString())
7572
groupWithFeedList.addGroup(
7673
Group(
7774
id = groupId,
@@ -86,7 +83,7 @@ class OPMLDataSource @Inject constructor(
8683
?: throw IllegalArgumentException("${outline.attributes} xmlUrl is null")
8784
groupWithFeedList.addFeed(
8885
Feed(
89-
id = context.currentAccountId.spacerDollar(
86+
id = preferences.currentAccountId.spacerDollar(
9087
UUID.randomUUID().toString()
9188
),
9289
name = outline.attributes.getOrDefault("title", null)

app/src/test/java/me/ash/reader/infrastructure/rss/OPMLDataSourceTest.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package me.ash.reader.infrastructure.rss
22

3-
import android.content.Context
43
import kotlinx.coroutines.CoroutineDispatcher
54
import kotlinx.coroutines.runBlocking
65
import me.ash.reader.domain.model.group.Group
76
import me.ash.reader.domain.model.group.GroupWithFeed
8-
import me.ash.reader.ui.ext.currentAccountId
7+
import me.ash.reader.infrastructure.preference.PreferencesReader
98
import org.junit.Assert
109
import org.junit.Before
1110
import org.junit.Test
1211
import org.junit.runner.RunWith
1312
import org.mockito.Mock
14-
import org.mockito.Mockito.`when`
1513
import org.mockito.junit.MockitoJUnitRunner
14+
import org.mockito.kotlin.doReturn
1615
import org.mockito.kotlin.mock
1716

1817
internal const val OPML_TEMPLATE: String = """
@@ -33,7 +32,7 @@ internal const val OPML_TEMPLATE: String = """
3332
class OPMLDataSourceTest {
3433

3534
@Mock
36-
private lateinit var mockContext: Context
35+
private lateinit var mockPreferences: PreferencesReader
3736

3837
@Mock
3938
private lateinit var mockIODispatcher: CoroutineDispatcher
@@ -46,10 +45,11 @@ class OPMLDataSourceTest {
4645

4746
@Before
4847
fun setUp() {
49-
mockContext = mock<Context> { }
48+
mockPreferences = mock<PreferencesReader> {
49+
on { currentAccountId } doReturn 1
50+
}
5051
mockIODispatcher = mock<CoroutineDispatcher> {}
51-
`when`(mockContext.currentAccountId).thenReturn(1)
52-
opmlDataSource = OPMLDataSource(mockContext, mockIODispatcher)
52+
opmlDataSource = OPMLDataSource(mockPreferences, mockIODispatcher)
5353
}
5454

5555
@Test
@@ -63,9 +63,9 @@ class OPMLDataSourceTest {
6363
inputStream = opml.byteInputStream(Charsets.UTF_8),
6464
defaultGroup = defaultGroup
6565
)
66-
Assert.assertTrue("", result.size == 1)
66+
Assert.assertEquals(2, result.size) // includes the defaultGroup and the outline group
6767
}
6868
}
6969
}
7070

71-
private fun fill(str: String): String = OPML_TEMPLATE.replace("{{var}}", str)
71+
private fun fill(str: String): String = OPML_TEMPLATE.replace("{{var}}", str).trim()

0 commit comments

Comments
 (0)