modernize tests (#4777)

- use `runTest` instead of `runBlocking`, where possible
- run all Robolectric tests on Api 34 (where we have most users)
- some new testcase for `TimestampUtilsTest`
- move our only instrumented Android Test, `MigrationsTest`, to unit
test so it runs in CI and expand it to test all migrations
- upgrade Robolectric
- removed truth and espresso as they are no longer needed
This commit is contained in:
Konrad Pozniak 2024-12-03 18:46:29 +01:00 committed by GitHub
commit 29914f8fd9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
29 changed files with 553 additions and 359 deletions

View file

@ -1,29 +1,78 @@
package com.keylesspalace.tusky.util
import android.content.Context
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.keylesspalace.tusky.R
import androidx.test.platform.app.InstrumentationRegistry
import java.util.Locale
import kotlin.time.Duration.Companion.days
import kotlin.time.Duration.Companion.hours
import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds
import org.junit.AfterClass
import org.junit.Assert.assertEquals
import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.robolectric.annotation.Config
private const val STATUS_CREATED_AT_NOW = "test"
@Config(sdk = [28])
@Config(sdk = [34])
@RunWith(AndroidJUnit4::class)
class TimestampUtilsTest {
private val ctx: Context = mock {
on { getString(R.string.status_created_at_now) } doReturn STATUS_CREATED_AT_NOW
companion object {
private lateinit var locale: Locale
@BeforeClass
@JvmStatic
fun beforeClass() {
locale = Locale.getDefault()
Locale.setDefault(Locale.ENGLISH)
}
@AfterClass
@JvmStatic
fun afterClass() {
Locale.setDefault(locale)
}
}
val context = InstrumentationRegistry.getInstrumentation().targetContext
@Test
fun `should return 'now' for small timespans`() {
assertEquals("now", getRelativeTimeSpanString(context, 0, 300))
assertEquals("now", getRelativeTimeSpanString(context, 300, 0))
assertEquals("now", getRelativeTimeSpanString(context, 501, 0))
assertEquals("now", getRelativeTimeSpanString(context, 0, 999))
}
@Test
fun shouldShowNowForSmallTimeSpans() {
assertEquals(STATUS_CREATED_AT_NOW, getRelativeTimeSpanString(ctx, 0, 300))
assertEquals(STATUS_CREATED_AT_NOW, getRelativeTimeSpanString(ctx, 300, 0))
assertEquals(STATUS_CREATED_AT_NOW, getRelativeTimeSpanString(ctx, 501, 0))
assertEquals(STATUS_CREATED_AT_NOW, getRelativeTimeSpanString(ctx, 0, 999))
fun `should return 'in --' when then is after now`() {
assertEquals("in 49s", getRelativeTimeSpanString(context, 49.seconds.inWholeMilliseconds, 0))
assertEquals("in 34m", getRelativeTimeSpanString(context, 37.minutes.inWholeMilliseconds, 3.minutes.inWholeMilliseconds))
assertEquals("in 7h", getRelativeTimeSpanString(context, 10.hours.inWholeMilliseconds, 3.hours.inWholeMilliseconds))
assertEquals("in 10d", getRelativeTimeSpanString(context, 10.days.inWholeMilliseconds, 0))
assertEquals("in 4y", getRelativeTimeSpanString(context, 800.days.inWholeMilliseconds + (4 * 365).days.inWholeMilliseconds, 800.days.inWholeMilliseconds))
}
@Test
fun `should return correct timespans`() {
assertEquals("49s", getRelativeTimeSpanString(context, 0, 49.seconds.inWholeMilliseconds))
assertEquals("34m", getRelativeTimeSpanString(context, 3.minutes.inWholeMilliseconds, 37.minutes.inWholeMilliseconds))
assertEquals("7h", getRelativeTimeSpanString(context, 3.hours.inWholeMilliseconds, 10.hours.inWholeMilliseconds))
assertEquals("10d", getRelativeTimeSpanString(context, 0, 10.days.inWholeMilliseconds))
assertEquals("4y", getRelativeTimeSpanString(context, 800.days.inWholeMilliseconds, 800.days.inWholeMilliseconds + (4 * 365).days.inWholeMilliseconds))
}
@Test
fun `should return correct poll duration`() {
assertEquals("1 second left", formatPollDuration(context, 1.seconds.inWholeMilliseconds, 0))
assertEquals("49 seconds left", formatPollDuration(context, 49.seconds.inWholeMilliseconds, 0))
assertEquals("1 minute left", formatPollDuration(context, 37.minutes.inWholeMilliseconds, 36.minutes.inWholeMilliseconds))
assertEquals("34 minutes left", formatPollDuration(context, 37.minutes.inWholeMilliseconds, 3.minutes.inWholeMilliseconds))
assertEquals("1 hour left", formatPollDuration(context, 10.hours.inWholeMilliseconds, 9.hours.inWholeMilliseconds))
assertEquals("7 hours left", formatPollDuration(context, 10.hours.inWholeMilliseconds, 3.hours.inWholeMilliseconds))
assertEquals("1 day left", formatPollDuration(context, 1.days.inWholeMilliseconds, 0))
assertEquals("10 days left", formatPollDuration(context, 10.days.inWholeMilliseconds, 0))
assertEquals("1460 days left", formatPollDuration(context, 800.days.inWholeMilliseconds + (4 * 365).days.inWholeMilliseconds, 800.days.inWholeMilliseconds))
}
}