filter polls (#1496)
parent
ec145eefb1
commit
18702da998
@ -0,0 +1,238 @@ |
|||||||
|
package com.keylesspalace.tusky |
||||||
|
|
||||||
|
import android.os.Bundle |
||||||
|
import android.text.SpannedString |
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4 |
||||||
|
import com.keylesspalace.tusky.entity.Filter |
||||||
|
import com.keylesspalace.tusky.entity.Poll |
||||||
|
import com.keylesspalace.tusky.entity.PollOption |
||||||
|
import com.keylesspalace.tusky.entity.Status |
||||||
|
import com.keylesspalace.tusky.fragment.SFragment |
||||||
|
import com.keylesspalace.tusky.network.MastodonApi |
||||||
|
import com.nhaarman.mockitokotlin2.mock |
||||||
|
import okhttp3.Request |
||||||
|
import org.junit.Assert.assertFalse |
||||||
|
import org.junit.Assert.assertTrue |
||||||
|
import org.junit.Before |
||||||
|
import org.junit.Test |
||||||
|
import org.junit.runner.RunWith |
||||||
|
import org.mockito.Mockito |
||||||
|
import org.robolectric.Robolectric |
||||||
|
import org.robolectric.annotation.Config |
||||||
|
import retrofit2.Call |
||||||
|
import retrofit2.Callback |
||||||
|
import retrofit2.Response |
||||||
|
import java.util.* |
||||||
|
|
||||||
|
@Config(application = FakeTuskyApplication::class) |
||||||
|
@RunWith(AndroidJUnit4::class) |
||||||
|
class FilterTest { |
||||||
|
|
||||||
|
private val fragment = FakeFragment() |
||||||
|
|
||||||
|
@Before |
||||||
|
fun setup() { |
||||||
|
|
||||||
|
val controller = Robolectric.buildActivity(FakeActivity::class.java) |
||||||
|
val activity = controller.get() |
||||||
|
|
||||||
|
activity.accountManager = mock() |
||||||
|
activity.themeUtils = mock() |
||||||
|
val apiMock = Mockito.mock(MastodonApi::class.java) |
||||||
|
Mockito.`when`(apiMock.getFilters()).thenReturn(object: Call<List<Filter>> { |
||||||
|
override fun isExecuted(): Boolean { |
||||||
|
return false |
||||||
|
} |
||||||
|
override fun clone(): Call<List<Filter>> { |
||||||
|
throw Error("not implemented") |
||||||
|
} |
||||||
|
override fun isCanceled(): Boolean { |
||||||
|
throw Error("not implemented") |
||||||
|
} |
||||||
|
override fun cancel() { |
||||||
|
throw Error("not implemented") |
||||||
|
} |
||||||
|
override fun execute(): Response<List<Filter>> { |
||||||
|
throw Error("not implemented") |
||||||
|
} |
||||||
|
override fun request(): Request { |
||||||
|
throw Error("not implemented") |
||||||
|
} |
||||||
|
|
||||||
|
override fun enqueue(callback: Callback<List<Filter>>) { |
||||||
|
callback.onResponse( |
||||||
|
this, |
||||||
|
Response.success( |
||||||
|
listOf( |
||||||
|
Filter( |
||||||
|
id = "123", |
||||||
|
phrase = "badWord", |
||||||
|
context = listOf(Filter.HOME), |
||||||
|
expiresAt = null, |
||||||
|
irreversible = false, |
||||||
|
wholeWord = false |
||||||
|
), |
||||||
|
Filter( |
||||||
|
id = "123", |
||||||
|
phrase = "badWholeWord", |
||||||
|
context = listOf(Filter.HOME, Filter.PUBLIC), |
||||||
|
expiresAt = null, |
||||||
|
irreversible = false, |
||||||
|
wholeWord = true |
||||||
|
), |
||||||
|
Filter( |
||||||
|
id = "123", |
||||||
|
phrase = "wrongContext", |
||||||
|
context = listOf(Filter.PUBLIC), |
||||||
|
expiresAt = null, |
||||||
|
irreversible = false, |
||||||
|
wholeWord = true |
||||||
|
) |
||||||
|
) |
||||||
|
) |
||||||
|
) |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
activity.mastodonApi = apiMock |
||||||
|
|
||||||
|
|
||||||
|
controller.create().start() |
||||||
|
|
||||||
|
fragment.mastodonApi = apiMock |
||||||
|
|
||||||
|
|
||||||
|
activity.supportFragmentManager.beginTransaction() |
||||||
|
.replace(R.id.activity_main, fragment, "fragment") |
||||||
|
.commit() |
||||||
|
|
||||||
|
fragment.reloadFilters(false) |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun shouldNotFilter() { |
||||||
|
assertFalse(fragment.shouldFilterStatus( |
||||||
|
mockStatus(content = "should not be filtered") |
||||||
|
)) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun shouldNotFilter_whenContextDoesNotMatch() { |
||||||
|
assertFalse(fragment.shouldFilterStatus( |
||||||
|
mockStatus(content = "one two wrongContext three") |
||||||
|
)) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun shouldFilter_whenContentMatchesBadWord() { |
||||||
|
assertTrue(fragment.shouldFilterStatus( |
||||||
|
mockStatus(content = "one two badWord three") |
||||||
|
)) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun shouldFilter_whenContentMatchesBadWordPart() { |
||||||
|
assertTrue(fragment.shouldFilterStatus( |
||||||
|
mockStatus(content = "one two badWordPart three") |
||||||
|
)) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun shouldFilter_whenContentMatchesBadWholeWord() { |
||||||
|
assertTrue(fragment.shouldFilterStatus( |
||||||
|
mockStatus(content = "one two badWholeWord three") |
||||||
|
)) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun shouldNotFilter_whenContentDoesNotMAtchWholeWord() { |
||||||
|
assertFalse(fragment.shouldFilterStatus( |
||||||
|
mockStatus(content = "one two badWholeWordTest three") |
||||||
|
)) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun shouldFilter_whenSpoilerTextDoesMatch() { |
||||||
|
assertTrue(fragment.shouldFilterStatus( |
||||||
|
mockStatus( |
||||||
|
content = "should not be filtered", |
||||||
|
spoilerText = "badWord should be filtered" |
||||||
|
) |
||||||
|
)) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun shouldFilter_whenPollTextDoesMatch() { |
||||||
|
assertTrue(fragment.shouldFilterStatus( |
||||||
|
mockStatus( |
||||||
|
content = "should not be filtered", |
||||||
|
spoilerText = "should not be filtered", |
||||||
|
pollOptions = listOf("should not be filtered", "badWord") |
||||||
|
) |
||||||
|
)) |
||||||
|
} |
||||||
|
|
||||||
|
private fun mockStatus( |
||||||
|
content: String = "", |
||||||
|
spoilerText: String = "", |
||||||
|
pollOptions: List<String>? = null |
||||||
|
): Status { |
||||||
|
return Status( |
||||||
|
id = "123", |
||||||
|
url = "https://mastodon.social/@Tusky/100571663297225812", |
||||||
|
account = mock(), |
||||||
|
inReplyToId = null, |
||||||
|
inReplyToAccountId = null, |
||||||
|
reblog = null, |
||||||
|
content = SpannedString(content), |
||||||
|
createdAt = Date(), |
||||||
|
emojis = emptyList(), |
||||||
|
reblogsCount = 0, |
||||||
|
favouritesCount = 0, |
||||||
|
reblogged = false, |
||||||
|
favourited = false, |
||||||
|
sensitive = false, |
||||||
|
spoilerText = spoilerText, |
||||||
|
visibility = Status.Visibility.PUBLIC, |
||||||
|
attachments = arrayListOf(), |
||||||
|
mentions = emptyArray(), |
||||||
|
application = null, |
||||||
|
pinned = false, |
||||||
|
poll = if (pollOptions != null) { |
||||||
|
Poll( |
||||||
|
id = "1234", |
||||||
|
expiresAt = null, |
||||||
|
expired = false, |
||||||
|
multiple = false, |
||||||
|
votesCount = 0, |
||||||
|
options = pollOptions.map { |
||||||
|
PollOption(it, 0) |
||||||
|
}, |
||||||
|
voted = false |
||||||
|
) |
||||||
|
} else null, |
||||||
|
card = null |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
class FakeActivity: BottomSheetActivity() { |
||||||
|
override fun onCreate(savedInstanceState: Bundle?) { |
||||||
|
super.onCreate(savedInstanceState) |
||||||
|
setContentView(R.layout.activity_main) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class FakeFragment: SFragment() { |
||||||
|
override fun removeItem(position: Int) { |
||||||
|
} |
||||||
|
|
||||||
|
override fun onReblog(reblog: Boolean, position: Int) { |
||||||
|
} |
||||||
|
|
||||||
|
override fun filterIsRelevant(filter: Filter): Boolean { |
||||||
|
return filter.context.contains(Filter.HOME) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue