mirror of https://github.com/tuskyapp/Tusky.git
Browse Source
* Show toast if pin fails Fixes #2229 * Swtich to snackbar * Show generic error message if no server error is available * Fix pin error loggingpull/2795/head
4 changed files with 123 additions and 0 deletions
@ -0,0 +1,101 @@ |
|||||||
|
package com.keylesspalace.tusky.usecase |
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4 |
||||||
|
import com.keylesspalace.tusky.appstore.EventHub |
||||||
|
import com.keylesspalace.tusky.appstore.PinEvent |
||||||
|
import com.keylesspalace.tusky.entity.Status |
||||||
|
import com.keylesspalace.tusky.network.MastodonApi |
||||||
|
import io.reactivex.rxjava3.core.Single |
||||||
|
import okhttp3.ResponseBody.Companion.toResponseBody |
||||||
|
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 |
||||||
|
import java.util.Date |
||||||
|
|
||||||
|
@Config(sdk = [28]) |
||||||
|
@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 PinEvent`() { |
||||||
|
api.stub { |
||||||
|
onBlocking { pinStatus(statusId) } doReturn Single.just(mockStatus(pinned = true)) |
||||||
|
} |
||||||
|
|
||||||
|
val events = eventHub.events.test() |
||||||
|
timelineCases.pin(statusId, true) |
||||||
|
.test() |
||||||
|
.assertComplete() |
||||||
|
|
||||||
|
events.assertValue(PinEvent(statusId, true)) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `pin failure with server error throws TimelineError with server message`() { |
||||||
|
api.stub { |
||||||
|
onBlocking { pinStatus(statusId) } doReturn Single.error( |
||||||
|
HttpException( |
||||||
|
Response.error<Status>( |
||||||
|
422, |
||||||
|
"{\"error\":\"Validation Failed: You have already pinned the maximum number of toots\"}".toResponseBody() |
||||||
|
) |
||||||
|
) |
||||||
|
) |
||||||
|
} |
||||||
|
timelineCases.pin(statusId, true) |
||||||
|
.test() |
||||||
|
.assertError { it.message == "Validation Failed: You have already pinned the maximum number of toots" } |
||||||
|
} |
||||||
|
|
||||||
|
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(), |
||||||
|
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, |
||||||
|
) |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue