only check once for filters v2 availability (#4539)
Instead of calling the endpoint every time filters are needed, it will be called only once and the result cached. This will result in quite some requests less on instances supporting v2. I also tested v1 filters and made some small improvements. We should [remove filters v1 support](https://github.com/tuskyapp/Tusky/issues/4538) some time in the future though.
This commit is contained in:
parent
859ffd121e
commit
8a57bcc3f4
13 changed files with 1470 additions and 127 deletions
|
|
@ -18,7 +18,9 @@
|
|||
package com.keylesspalace.tusky
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import at.connyduck.calladapter.networkresult.NetworkResult
|
||||
import com.keylesspalace.tusky.components.filters.EditFilterActivity
|
||||
import com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository
|
||||
import com.keylesspalace.tusky.entity.Attachment
|
||||
import com.keylesspalace.tusky.entity.Filter
|
||||
import com.keylesspalace.tusky.entity.FilterV1
|
||||
|
|
@ -26,14 +28,20 @@ import com.keylesspalace.tusky.entity.Poll
|
|||
import com.keylesspalace.tusky.entity.PollOption
|
||||
import com.keylesspalace.tusky.entity.Status
|
||||
import com.keylesspalace.tusky.network.FilterModel
|
||||
import com.keylesspalace.tusky.network.MastodonApi
|
||||
import java.time.Instant
|
||||
import java.util.Date
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import okhttp3.ResponseBody.Companion.toResponseBody
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mockito.kotlin.doReturn
|
||||
import org.mockito.kotlin.mock
|
||||
import org.robolectric.annotation.Config
|
||||
import retrofit2.HttpException
|
||||
import retrofit2.Response
|
||||
|
||||
@Config(sdk = [28])
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
|
|
@ -43,12 +51,11 @@ class FilterV1Test {
|
|||
|
||||
@Before
|
||||
fun setup() {
|
||||
filterModel = FilterModel()
|
||||
val filters = listOf(
|
||||
FilterV1(
|
||||
id = "123",
|
||||
phrase = "badWord",
|
||||
context = listOf(FilterV1.HOME),
|
||||
context = listOf(Filter.Kind.HOME.kind),
|
||||
expiresAt = null,
|
||||
irreversible = false,
|
||||
wholeWord = false
|
||||
|
|
@ -56,7 +63,7 @@ class FilterV1Test {
|
|||
FilterV1(
|
||||
id = "123",
|
||||
phrase = "badWholeWord",
|
||||
context = listOf(FilterV1.HOME, FilterV1.PUBLIC),
|
||||
context = listOf(Filter.Kind.HOME.kind, Filter.Kind.PUBLIC.kind),
|
||||
expiresAt = null,
|
||||
irreversible = false,
|
||||
wholeWord = true
|
||||
|
|
@ -64,7 +71,7 @@ class FilterV1Test {
|
|||
FilterV1(
|
||||
id = "123",
|
||||
phrase = "@twitter.com",
|
||||
context = listOf(FilterV1.HOME),
|
||||
context = listOf(Filter.Kind.HOME.kind),
|
||||
expiresAt = null,
|
||||
irreversible = false,
|
||||
wholeWord = true
|
||||
|
|
@ -72,7 +79,7 @@ class FilterV1Test {
|
|||
FilterV1(
|
||||
id = "123",
|
||||
phrase = "#hashtag",
|
||||
context = listOf(FilterV1.HOME),
|
||||
context = listOf(Filter.Kind.HOME.kind),
|
||||
expiresAt = null,
|
||||
irreversible = false,
|
||||
wholeWord = true
|
||||
|
|
@ -80,7 +87,7 @@ class FilterV1Test {
|
|||
FilterV1(
|
||||
id = "123",
|
||||
phrase = "expired",
|
||||
context = listOf(FilterV1.HOME),
|
||||
context = listOf(Filter.Kind.HOME.kind),
|
||||
expiresAt = Date.from(Instant.now().minusSeconds(10)),
|
||||
irreversible = false,
|
||||
wholeWord = true
|
||||
|
|
@ -88,7 +95,7 @@ class FilterV1Test {
|
|||
FilterV1(
|
||||
id = "123",
|
||||
phrase = "unexpired",
|
||||
context = listOf(FilterV1.HOME),
|
||||
context = listOf(Filter.Kind.HOME.kind),
|
||||
expiresAt = Date.from(Instant.now().plusSeconds(3600)),
|
||||
irreversible = false,
|
||||
wholeWord = true
|
||||
|
|
@ -96,14 +103,27 @@ class FilterV1Test {
|
|||
FilterV1(
|
||||
id = "123",
|
||||
phrase = "href",
|
||||
context = listOf(FilterV1.HOME),
|
||||
context = listOf(Filter.Kind.HOME.kind),
|
||||
expiresAt = null,
|
||||
irreversible = false,
|
||||
wholeWord = false
|
||||
)
|
||||
)
|
||||
|
||||
filterModel.initWithFilters(filters)
|
||||
val api: MastodonApi = mock {
|
||||
onBlocking { getFiltersV1() } doReturn NetworkResult.success(filters)
|
||||
onBlocking { getFilters() } doReturn NetworkResult.failure(
|
||||
HttpException(Response.error<Any>(404, "".toResponseBody()))
|
||||
)
|
||||
}
|
||||
val instanceInfoRepo: InstanceInfoRepository = mock {
|
||||
onBlocking { isFilterV2Supported() } doReturn false
|
||||
}
|
||||
|
||||
filterModel = FilterModel(instanceInfoRepo, api)
|
||||
runBlocking {
|
||||
filterModel.init(Filter.Kind.HOME)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import androidx.test.platform.app.InstrumentationRegistry
|
|||
import at.connyduck.calladapter.networkresult.NetworkResult
|
||||
import com.keylesspalace.tusky.appstore.EventHub
|
||||
import com.keylesspalace.tusky.appstore.StatusChangedEvent
|
||||
import com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository
|
||||
import com.keylesspalace.tusky.components.timeline.fakeStatus
|
||||
import com.keylesspalace.tusky.components.timeline.fakeStatusViewData
|
||||
import com.keylesspalace.tusky.db.AccountManager
|
||||
|
|
@ -81,8 +82,11 @@ class ViewThreadViewModelTest {
|
|||
api = mock {
|
||||
onBlocking { getFilters() } doReturn NetworkResult.success(emptyList())
|
||||
}
|
||||
val instanceInfoRepo: InstanceInfoRepository = mock {
|
||||
onBlocking { isFilterV2Supported() } doReturn false
|
||||
}
|
||||
eventHub = EventHub()
|
||||
val filterModel = FilterModel()
|
||||
val filterModel = FilterModel(instanceInfoRepo, api)
|
||||
val timelineCases = TimelineCases(api, eventHub)
|
||||
val accountManager: AccountManager = mock {
|
||||
on { activeAccount } doReturn AccountEntity(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue