Add some tests to NextcloudNewsDataSource

This commit is contained in:
Shinokuni 2024-10-09 13:23:08 +02:00
parent 968516e891
commit d21ac178c3
4 changed files with 131 additions and 30 deletions

View File

@ -33,7 +33,7 @@ class FeverDataSource(private val service: FeverService) {
if (syncType == SyncType.INITIAL_SYNC) { if (syncType == SyncType.INITIAL_SYNC) {
return FeverSyncResult().apply { return FeverSyncResult().apply {
listOf( awaitAll(
async { feverFeeds = service.getFeeds(body) }, async { feverFeeds = service.getFeeds(body) },
async { folders = service.getFolders(body) }, async { folders = service.getFolders(body) },
async { async {
@ -58,11 +58,10 @@ class FeverDataSource(private val service: FeverService) {
async { starredIds = service.getStarredItemsIds(body) }, async { starredIds = service.getStarredItemsIds(body) },
async { favicons = service.getFavicons(body) } async { favicons = service.getFavicons(body) }
) )
.awaitAll()
} }
} else { } else {
return FeverSyncResult().apply { return FeverSyncResult().apply {
listOf( awaitAll(
async { folders = service.getFolders(body) }, async { folders = service.getFolders(body) },
async { feverFeeds = service.getFeeds(body) }, async { feverFeeds = service.getFeeds(body) },
async { unreadIds = service.getUnreadItemsIds(body) }, async { unreadIds = service.getUnreadItemsIds(body) },
@ -90,7 +89,6 @@ class FeverDataSource(private val service: FeverService) {
} }
} }
) )
.awaitAll()
} }
} }
} }

View File

@ -41,7 +41,7 @@ class FreshRSSDataSource(private val service: FreshRSSService) {
): DataSourceResult = with(CoroutineScope(Dispatchers.IO)) { ): DataSourceResult = with(CoroutineScope(Dispatchers.IO)) {
return if (syncType == SyncType.INITIAL_SYNC) { return if (syncType == SyncType.INITIAL_SYNC) {
DataSourceResult().apply { DataSourceResult().apply {
listOf( awaitAll(
async { folders = getFolders() }, async { folders = getFolders() },
async { feeds = getFeeds() }, async { feeds = getFeeds() },
async { async {
@ -50,17 +50,17 @@ class FreshRSSDataSource(private val service: FreshRSSService) {
async { starredItems = getStarredItems(MAX_STARRED_ITEMS) }, async { starredItems = getStarredItems(MAX_STARRED_ITEMS) },
async { unreadIds = getItemsIds(GOOGLE_READ, GOOGLE_READING_LIST, MAX_ITEMS) }, async { unreadIds = getItemsIds(GOOGLE_READ, GOOGLE_READING_LIST, MAX_ITEMS) },
async { starredIds = getItemsIds(null, GOOGLE_STARRED, MAX_STARRED_ITEMS) } async { starredIds = getItemsIds(null, GOOGLE_STARRED, MAX_STARRED_ITEMS) }
).awaitAll() )
} }
} else { } else {
DataSourceResult().apply { DataSourceResult().apply {
listOf( awaitAll(
async { setItemsReadState(syncData, writeToken) }, async { setItemsReadState(syncData, writeToken) },
async { setItemsStarState(syncData, writeToken) }, async { setItemsStarState(syncData, writeToken) },
).awaitAll() )
listOf( awaitAll(
async { folders = getFolders() }, async { folders = getFolders() },
async { feeds = getFeeds() }, async { feeds = getFeeds() },
async { items = getItems(null, MAX_ITEMS, syncData.lastModified) }, async { items = getItems(null, MAX_ITEMS, syncData.lastModified) },
@ -69,7 +69,7 @@ class FreshRSSDataSource(private val service: FreshRSSService) {
readIds = getItemsIds(GOOGLE_UNREAD, GOOGLE_READING_LIST, MAX_ITEMS) readIds = getItemsIds(GOOGLE_UNREAD, GOOGLE_READING_LIST, MAX_ITEMS)
}, },
async { starredIds = getItemsIds(null, GOOGLE_STARRED, MAX_STARRED_ITEMS) } async { starredIds = getItemsIds(null, GOOGLE_STARRED, MAX_STARRED_ITEMS) }
).awaitAll() )
} }
} }

View File

@ -36,7 +36,7 @@ class NextcloudNewsDataSource(private val service: NextcloudNewsService) {
with(CoroutineScope(Dispatchers.IO)) { with(CoroutineScope(Dispatchers.IO)) {
return if (syncType == SyncType.INITIAL_SYNC) { return if (syncType == SyncType.INITIAL_SYNC) {
DataSourceResult().apply { DataSourceResult().apply {
listOf( awaitAll(
async { folders = getFolders() }, async { folders = getFolders() },
async { feeds = getFeeds() }, async { feeds = getFeeds() },
async { items = getItems(ItemQueryType.ALL.value, false, MAX_ITEMS) }, async { items = getItems(ItemQueryType.ALL.value, false, MAX_ITEMS) },
@ -44,20 +44,20 @@ class NextcloudNewsDataSource(private val service: NextcloudNewsService) {
starredItems = starredItems =
getItems(ItemQueryType.STARRED.value, true, MAX_STARRED_ITEMS) getItems(ItemQueryType.STARRED.value, true, MAX_STARRED_ITEMS)
} }
).awaitAll() )
} }
} else { } else {
listOf( awaitAll(
async { setItemsReadState(syncData) }, async { setItemsReadState(syncData) },
async { setItemsStarState(syncData) }, async { setItemsStarState(syncData) },
).awaitAll() )
DataSourceResult().apply { DataSourceResult().apply {
listOf( awaitAll(
async { folders = getFolders() }, async { folders = getFolders() },
async { feeds = getFeeds() }, async { feeds = getFeeds() },
async { items = getNewItems(syncData.lastModified, ItemQueryType.ALL) } async { items = getNewItems(syncData.lastModified, ItemQueryType.ALL) }
).awaitAll() )
} }
} }
} }

View File

@ -4,11 +4,16 @@ import com.readrops.api.TestUtils
import com.readrops.api.apiModule import com.readrops.api.apiModule
import com.readrops.api.enqueueOK import com.readrops.api.enqueueOK
import com.readrops.api.enqueueOKStream import com.readrops.api.enqueueOKStream
import com.readrops.api.okResponseWithBody
import com.readrops.api.services.SyncType
import com.readrops.db.entities.account.Account import com.readrops.db.entities.account.Account
import com.squareup.moshi.Moshi import com.squareup.moshi.Moshi
import com.squareup.moshi.Types import com.squareup.moshi.Types
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import okhttp3.mockwebserver.Dispatcher
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer import okhttp3.mockwebserver.MockWebServer
import okhttp3.mockwebserver.RecordedRequest
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
import org.junit.Rule import org.junit.Rule
@ -93,12 +98,18 @@ class NextcloudNewsDataSourceTest : KoinTest {
val stream = TestUtils.loadResource("services/nextcloudnews/adapters/items.json") val stream = TestUtils.loadResource("services/nextcloudnews/adapters/items.json")
mockServer.enqueueOKStream(stream) mockServer.enqueueOKStream(stream)
val items = nextcloudNewsDataSource.getItems(NextcloudNewsDataSource.ItemQueryType.ALL.value, false, 10) val type = NextcloudNewsDataSource.ItemQueryType.ALL.value
val items = nextcloudNewsDataSource.getItems(
type = type,
read = false,
batchSize = 10
)
val request = mockServer.takeRequest() val request = mockServer.takeRequest()
assertTrue { items.size == 3 } assertTrue { items.size == 3 }
with(request.requestUrl!!) { with(request.requestUrl!!) {
assertEquals("3", queryParameter("type")) assertEquals("$type", queryParameter("type"))
assertEquals("false", queryParameter("getRead")) assertEquals("false", queryParameter("getRead"))
assertEquals("10", queryParameter("batchSize")) assertEquals("10", queryParameter("batchSize"))
} }
@ -152,12 +163,11 @@ class NextcloudNewsDataSourceTest : KoinTest {
nextcloudNewsDataSource.changeFeedFolder(15, 18) nextcloudNewsDataSource.changeFeedFolder(15, 18)
val request = mockServer.takeRequest() val request = mockServer.takeRequest()
val type = val type = Types.newParameterizedType(
Types.newParameterizedType( Map::class.java,
Map::class.java, String::class.java,
String::class.java, Int::class.javaObjectType
Int::class.javaObjectType )
)
val adapter = moshi.adapter<Map<String, Int>>(type) val adapter = moshi.adapter<Map<String, Int>>(type)
val body = adapter.fromJson(request.body)!! val body = adapter.fromJson(request.body)!!
@ -267,12 +277,11 @@ class NextcloudNewsDataSourceTest : KoinTest {
val starRequest = mockServer.takeRequest() val starRequest = mockServer.takeRequest()
val unstarRequest = mockServer.takeRequest() val unstarRequest = mockServer.takeRequest()
val type = val type = Types.newParameterizedType(
Types.newParameterizedType( Map::class.java,
Map::class.java, String::class.java,
String::class.java, Types.newParameterizedType(List::class.java, Int::class.javaObjectType)
Types.newParameterizedType(List::class.java, Int::class.javaObjectType) )
)
val adapter = moshi.adapter<Map<String, List<Int>>>(type) val adapter = moshi.adapter<Map<String, List<Int>>>(type)
val starBody = adapter.fromJson(starRequest.body)!! val starBody = adapter.fromJson(starRequest.body)!!
@ -281,4 +290,98 @@ class NextcloudNewsDataSourceTest : KoinTest {
assertEquals(data.starredIds, starBody["itemIds"]) assertEquals(data.starredIds, starBody["itemIds"])
assertEquals(data.unstarredIds, unstarBody["itemIds"]) assertEquals(data.unstarredIds, unstarBody["itemIds"])
} }
@Test
fun initialSyncTest() = runTest {
mockServer.dispatcher = object : Dispatcher() {
override fun dispatch(request: RecordedRequest): MockResponse {
with(request.path!!) {
return when {
this == "/folders" -> {
MockResponse.okResponseWithBody(TestUtils.loadResource("services/nextcloudnews/adapters/valid_folder.json"))
}
this == "/feeds" -> {
MockResponse.okResponseWithBody(TestUtils.loadResource("services/nextcloudnews/adapters/feeds.json"))
}
contains("/items") -> {
MockResponse.okResponseWithBody(TestUtils.loadResource("services/nextcloudnews/adapters/items.json"))
}
else -> MockResponse().setResponseCode(404)
}
}
}
}
val result =
nextcloudNewsDataSource.synchronize(SyncType.INITIAL_SYNC, NextcloudNewsSyncData())
with(result) {
assertEquals(1, folders.size)
assertEquals(3, feeds.size)
assertEquals(3, items.size)
assertEquals(3, starredItems.size)
}
}
@Test
fun classicSyncTest() = runTest {
var setItemState = 0
val lastModified = 10L
val ids = listOf(1, 2, 3, 4)
mockServer.dispatcher = object : Dispatcher() {
override fun dispatch(request: RecordedRequest): MockResponse {
with(request.path!!) {
return when {
this == "/folders" -> {
MockResponse.okResponseWithBody(TestUtils.loadResource("services/nextcloudnews/adapters/valid_folder.json"))
}
this == "/feeds" -> {
MockResponse.okResponseWithBody(TestUtils.loadResource("services/nextcloudnews/adapters/feeds.json"))
}
contains("/items/updated") -> {
assertEquals(
"$lastModified",
request.requestUrl!!.queryParameter("lastModified")
)
MockResponse.okResponseWithBody(TestUtils.loadResource("services/nextcloudnews/adapters/items.json"))
}
this.matches(Regex("/items/(read|unread|star|unstar)/multiple")) -> {
setItemState++
MockResponse().setResponseCode(200)
}
else -> MockResponse().setResponseCode(404)
}
}
}
}
val result = nextcloudNewsDataSource.synchronize(
SyncType.CLASSIC_SYNC,
NextcloudNewsSyncData(
lastModified = lastModified,
readIds = ids,
unreadIds = ids,
starredIds = ids,
unstarredIds = ids
)
)
with(result) {
assertEquals(4, setItemState)
assertEquals(1, folders.size)
assertEquals(3, feeds.size)
assertEquals(3, items.size)
}
}
} }