# Conflicts: # README.md # app/build.gradle # app/src/main/java/com/keylesspalace/tusky/ListsActivity.kt # app/src/main/java/com/keylesspalace/tusky/adapter/NotificationsAdapter.java # app/src/main/java/com/keylesspalace/tusky/components/account/AccountActivity.kt # app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaFragment.kt # app/src/main/java/com/keylesspalace/tusky/components/accountlist/AccountListFragment.kt # app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementsActivity.kt # app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt # app/src/main/java/com/keylesspalace/tusky/components/compose/view/ProgressImageView.kt # app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsFragment.kt # app/src/main/java/com/keylesspalace/tusky/components/filters/FiltersActivity.kt # app/src/main/java/com/keylesspalace/tusky/components/login/LoginActivity.kt # app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportStatusesFragment.kt # app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledStatusActivity.kt # app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchFragment.kt # app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt # app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagsFragment.kt # app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadFragment.kt # app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsFragment.kt # app/src/main/java/com/keylesspalace/tusky/view/GraphView.kt # app/src/main/res/color/compound_button_color.xml # app/src/main/res/color/text_input_layout_box_stroke_color.xml # app/src/main/res/drawable/ic_check_circle.xml # app/src/main/res/drawable/ic_flag_24dp.xml # app/src/main/res/drawable/ic_person_add_24dp.xml # app/src/main/res/drawable/ic_play_indicator.xml # app/src/main/res/drawable/ic_poll_24dp.xml # app/src/main/res/drawable/ic_reblog_active_24dp.xml # app/src/main/res/drawable/ic_reblog_private_active_24dp.xml # app/src/main/res/drawable/report_success_background.xml # app/src/main/res/layout-land/item_trending_cell.xml # app/src/main/res/layout/activity_account.xml # app/src/main/res/layout/activity_edit_filter.xml # app/src/main/res/layout/card_license.xml # app/src/main/res/layout/item_announcement.xml # app/src/main/res/layout/item_status.xml # app/src/main/res/layout/item_status_detailed.xml # app/src/main/res/layout/item_tab_preference.xml # app/src/main/res/layout/item_trending_cell.xml # app/src/main/res/values-cs/strings.xml # app/src/main/res/values-de/strings.xml # app/src/main/res/values-es/strings.xml # app/src/main/res/values-eu/strings.xml # app/src/main/res/values-fr/strings.xml # app/src/main/res/values-kab/strings.xml # app/src/main/res/values-lv/strings.xml # app/src/main/res/values-nb-rNO/strings.xml # app/src/main/res/values-night/theme_colors.xml # app/src/main/res/values/colors.xml # app/src/main/res/values/strings.xml # app/src/main/res/values/styles.xml # app/src/main/res/values/theme_colors.xml
106 lines
3.3 KiB
Kotlin
106 lines
3.3 KiB
Kotlin
package com.keylesspalace.tusky.usecase
|
|
|
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
|
import app.cash.turbine.test
|
|
import at.connyduck.calladapter.networkresult.NetworkResult
|
|
import com.keylesspalace.tusky.appstore.EventHub
|
|
import com.keylesspalace.tusky.appstore.StatusChangedEvent
|
|
import com.keylesspalace.tusky.entity.Status
|
|
import com.keylesspalace.tusky.network.MastodonApi
|
|
import java.util.Date
|
|
import kotlinx.coroutines.test.runTest
|
|
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.mockito.kotlin.stub
|
|
import org.robolectric.annotation.Config
|
|
import retrofit2.HttpException
|
|
import retrofit2.Response
|
|
|
|
@Config(sdk = [34])
|
|
@RunWith(AndroidJUnit4::class)
|
|
class TimelineCasesTest {
|
|
|
|
private lateinit var api: MastodonApi
|
|
private lateinit var eventHub: EventHub
|
|
private lateinit var timelineCases: TimelineCases
|
|
|
|
private val statusId = "1234"
|
|
|
|
@Before
|
|
fun setup() {
|
|
api = mock()
|
|
eventHub = EventHub()
|
|
timelineCases = TimelineCases(api, eventHub)
|
|
}
|
|
|
|
@Test
|
|
fun `pin success emits StatusChangedEvent`() = runTest {
|
|
val pinnedStatus = mockStatus(pinned = true)
|
|
|
|
api.stub {
|
|
onBlocking { pinStatus(statusId) } doReturn NetworkResult.success(pinnedStatus)
|
|
}
|
|
|
|
eventHub.events.test {
|
|
timelineCases.pin(statusId, true)
|
|
assertEquals(StatusChangedEvent(pinnedStatus), awaitItem())
|
|
}
|
|
}
|
|
|
|
@Test
|
|
fun `pin failure with server error throws TimelineError with server message`() = runTest {
|
|
api.stub {
|
|
onBlocking { pinStatus(statusId) } doReturn NetworkResult.failure(
|
|
HttpException(
|
|
Response.error<Status>(
|
|
422,
|
|
"{\"error\":\"Validation Failed: You have already pinned the maximum number of toots\"}".toResponseBody()
|
|
)
|
|
)
|
|
)
|
|
}
|
|
assertEquals(
|
|
"Validation Failed: You have already pinned the maximum number of toots",
|
|
timelineCases.pin(statusId, true).exceptionOrNull()?.message
|
|
)
|
|
}
|
|
|
|
private fun mockStatus(pinned: Boolean = false): Status {
|
|
return Status(
|
|
id = "123",
|
|
url = "https://mastodon.social/@Tusky/100571663297225812",
|
|
account = mock(),
|
|
inReplyToId = null,
|
|
inReplyToAccountId = null,
|
|
reblog = null,
|
|
content = "",
|
|
createdAt = Date(),
|
|
editedAt = null,
|
|
emojis = emptyList(),
|
|
reblogsCount = 0,
|
|
favouritesCount = 0,
|
|
repliesCount = 0,
|
|
reblogged = false,
|
|
favourited = false,
|
|
bookmarked = false,
|
|
sensitive = false,
|
|
spoilerText = "",
|
|
visibility = Status.Visibility.PUBLIC,
|
|
attachments = arrayListOf(),
|
|
mentions = listOf(),
|
|
tags = listOf(),
|
|
application = null,
|
|
pinned = pinned,
|
|
muted = false,
|
|
poll = null,
|
|
card = null,
|
|
language = null,
|
|
filtered = emptyList()
|
|
)
|
|
}
|
|
}
|