Yuito-app-android/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt

216 lines
6.2 KiB
Kotlin
Raw Normal View History

2019-09-24 20:33:29 +02:00
package com.keylesspalace.tusky
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.keylesspalace.tusky.entity.Attachment
2019-09-24 20:33:29 +02:00
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.network.FilterModel
2019-09-24 20:33:29 +02:00
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.kotlin.mock
2019-09-24 20:33:29 +02:00
import org.robolectric.annotation.Config
import java.util.ArrayList
import java.util.Date
2019-09-24 20:33:29 +02:00
@Config(sdk = [28])
2019-09-24 20:33:29 +02:00
@RunWith(AndroidJUnit4::class)
class FilterTest {
private lateinit var filterModel: FilterModel
2019-09-24 20:33:29 +02:00
@Before
fun setup() {
filterModel = FilterModel()
val filters = 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 = "@twitter.com",
context = listOf(Filter.HOME),
expiresAt = null,
irreversible = false,
wholeWord = true
)
)
2019-09-24 20:33:29 +02:00
filterModel.initWithFilters(filters)
2019-09-24 20:33:29 +02:00
}
@Test
fun shouldNotFilter() {
assertFalse(
filterModel.shouldFilterStatus(
2019-09-24 20:33:29 +02:00
mockStatus(content = "should not be filtered")
)
)
2019-09-24 20:33:29 +02:00
}
@Test
fun shouldFilter_whenContentMatchesBadWord() {
assertTrue(
filterModel.shouldFilterStatus(
2019-09-24 20:33:29 +02:00
mockStatus(content = "one two badWord three")
)
)
2019-09-24 20:33:29 +02:00
}
@Test
fun shouldFilter_whenContentMatchesBadWordPart() {
assertTrue(
filterModel.shouldFilterStatus(
2019-09-24 20:33:29 +02:00
mockStatus(content = "one two badWordPart three")
)
)
2019-09-24 20:33:29 +02:00
}
@Test
fun shouldFilter_whenContentMatchesBadWholeWord() {
assertTrue(
filterModel.shouldFilterStatus(
2019-09-24 20:33:29 +02:00
mockStatus(content = "one two badWholeWord three")
)
)
2019-09-24 20:33:29 +02:00
}
@Test
fun shouldNotFilter_whenContentDoesNotMatchWholeWord() {
assertFalse(
filterModel.shouldFilterStatus(
2019-09-24 20:33:29 +02:00
mockStatus(content = "one two badWholeWordTest three")
)
)
2019-09-24 20:33:29 +02:00
}
@Test
fun shouldFilter_whenSpoilerTextDoesMatch() {
assertTrue(
filterModel.shouldFilterStatus(
2019-09-24 20:33:29 +02:00
mockStatus(
content = "should not be filtered",
spoilerText = "badWord should be filtered"
2019-09-24 20:33:29 +02:00
)
)
)
2019-09-24 20:33:29 +02:00
}
@Test
fun shouldFilter_whenPollTextDoesMatch() {
assertTrue(
filterModel.shouldFilterStatus(
2019-09-24 20:33:29 +02:00
mockStatus(
content = "should not be filtered",
spoilerText = "should not be filtered",
pollOptions = listOf("should not be filtered", "badWord")
2019-09-24 20:33:29 +02:00
)
)
)
2019-09-24 20:33:29 +02:00
}
@Test
fun shouldFilter_whenMediaDescriptionDoesMatch() {
assertTrue(
filterModel.shouldFilterStatus(
mockStatus(
content = "should not be filtered",
spoilerText = "should not be filtered",
attachmentsDescriptions = listOf("should not be filtered", "badWord"),
)
)
)
}
@Test
fun shouldFilterPartialWord_whenWholeWordFilterContainsNonAlphanumericCharacters() {
assertTrue(
filterModel.shouldFilterStatus(
mockStatus(content = "one two someone@twitter.com three")
)
)
}
2019-09-24 20:33:29 +02:00
private fun mockStatus(
content: String = "",
spoilerText: String = "",
pollOptions: List<String>? = null,
attachmentsDescriptions: List<String>? = null
2019-09-24 20:33:29 +02:00
): Status {
return Status(
id = "123",
url = "https://mastodon.social/@Tusky/100571663297225812",
account = mock(),
inReplyToId = null,
inReplyToAccountId = null,
reblog = null,
content = content,
createdAt = Date(),
emojis = emptyList(),
reblogsCount = 0,
favouritesCount = 0,
repliesCount = 0,
reblogged = false,
favourited = false,
bookmarked = false,
sensitive = false,
spoilerText = spoilerText,
visibility = Status.Visibility.PUBLIC,
attachments = if (attachmentsDescriptions != null) {
ArrayList(
attachmentsDescriptions.map {
Attachment(
id = "1234",
url = "",
previewUrl = null,
meta = null,
type = Attachment.Type.IMAGE,
description = it,
blurhash = null
)
}
)
} else arrayListOf(),
mentions = listOf(),
tags = listOf(),
application = null,
pinned = false,
muted = false,
poll = if (pollOptions != null) {
Poll(
id = "1234",
expiresAt = null,
expired = false,
multiple = false,
votesCount = 0,
votersCount = 0,
options = pollOptions.map {
PollOption(it, 0)
},
voted = false,
ownVotes = null
)
} else null,
card = null,
quote = null
2019-09-24 20:33:29 +02:00
)
}
}