Fix UI Tests

This commit is contained in:
Phillip Thelen 2022-03-21 19:37:27 +01:00 committed by Phillip Thelen
parent d3375ab2be
commit f038f6109d
6 changed files with 47 additions and 7 deletions

View file

@ -61,7 +61,7 @@ jobs:
- name: Run with Gradle
uses: gradle/gradle-build-action
with:
arguments: testProdDebugUnitTest
arguments: connectedProdDebugAndroidTest
lint:
runs-on: ubuntu-latest

View file

@ -91,7 +91,9 @@ dependencies {
testImplementation "io.mockk:mockk-android:1.12.2"
testImplementation 'io.kotest:kotest-assertions-core:5.0.3'
testImplementation 'io.kotest:kotest-framework-datatest:4.6.2'
androidTestImplementation 'com.kaspersky.android-components:kaspresso:1.4.0'
androidTestImplementation ('com.kaspersky.android-components:kaspresso:1.4.0') {
exclude module: "protobuf-lite"
}
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test:rules:1.4.0'
@ -186,7 +188,7 @@ android {
// Disable fabric build ID generation for debug builds
ext.enableCrashlytics = false
ext.alwaysUpdateBuildId = false
testCoverageEnabled = true
testCoverageEnabled = false
resValue "string", "content_provider", "com.habitrpg.android.habitica.debug.fileprovider"
resValue "string", "app_name", "Habitica Debug"
}
@ -250,6 +252,9 @@ android {
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
test {
java.srcDir("src/test/java")
}
debugIAP { java.srcDirs = ['src/debug/java'] }
release { java.srcDirs = ['src/release/java'] }
}
@ -283,11 +288,21 @@ android {
android.testOptions {
unitTests.all {
useJUnitPlatform()
unitTests.returnDefaultValues = true
testLogging {
events "passed", "skipped", "failed", "standardError"
outputs.upToDateWhen {false}
afterSuite { desc, result ->
if (!desc.parent) { // will match the outermost suite
def output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} passed, ${result.failedTestCount} failed, ${result.skippedTestCount} skipped)"
def startItem = '| ', endItem = ' |'
def repeatLength = startItem.length() + output.length() + endItem.length()
println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength))
}
}
}
}
unitTests.returnDefaultValues = true
execution 'ANDROIDX_TEST_ORCHESTRATOR'
}
Properties props = new Properties()

View file

@ -7,16 +7,24 @@ import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.TutorialRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.BaseObject
import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import io.github.kakaocup.kakao.screen.Screen
import io.mockk.called
import io.mockk.clearAllMocks
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.slot
import io.reactivex.rxjava3.core.BackpressureStrategy
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.subjects.PublishSubject
import io.realm.RealmObject
import org.junit.After
import org.junit.Before
abstract class FragmentTestCase<F : BaseFragment<VB>, VB : ViewBinding, S : Screen<S>> : TestCase() {
@ -29,6 +37,7 @@ abstract class FragmentTestCase<F : BaseFragment<VB>, VB : ViewBinding, S : Scre
val socialRepository: SocialRepository = mockk(relaxed = true)
val tutorialRepository: TutorialRepository = mockk(relaxed = true)
val appConfigManager: AppConfigManager = mockk(relaxed = true)
val userViewModel: MainUserViewModel = mockk(relaxed = true)
abstract fun makeFragment()
abstract val screen: S
@ -37,6 +46,9 @@ abstract class FragmentTestCase<F : BaseFragment<VB>, VB : ViewBinding, S : Scre
val userEvents: Flowable<User> = userSubject.toFlowable(BackpressureStrategy.DROP)
var user = User()
val errorSlot = slot<Throwable>()
val unmanagedSlot = slot<BaseObject>()
@Before
fun setUpFragment() {
clearAllMocks()
@ -46,6 +58,11 @@ abstract class FragmentTestCase<F : BaseFragment<VB>, VB : ViewBinding, S : Scre
user.stats?.lvl = 20
user.stats?.points = 30
every { userRepository.getUser() } returns userEvents
mockkObject(RxErrorHandler.Companion)
every { RxErrorHandler.Companion.reportError(capture(errorSlot)) } answers {
throw errorSlot.captured
}
every { socialRepository.getUnmanagedCopy(capture(unmanagedSlot)) } answers { unmanagedSlot.captured }
makeFragment()
}
}

View file

@ -41,6 +41,7 @@ class PartyDetailFragmentTest : FragmentTestCase<PartyDetailFragment, FragmentPa
viewModel = PartyViewModel(false)
viewModel.socialRepository = socialRepository
viewModel.userRepository = userRepository
viewModel.userViewModel = userViewModel
viewModel.notificationsManager = mockk(relaxed = true)
scenario = launchFragmentInContainer(null, R.style.MainAppTheme) {
fragment = spyk()

View file

@ -9,8 +9,10 @@ import com.habitrpg.android.habitica.models.tasks.Attribute
import io.github.kakaocup.kakao.common.views.KView
import io.github.kakaocup.kakao.screen.Screen
import io.github.kakaocup.kakao.text.KButton
import io.mockk.every
import io.mockk.spyk
import io.mockk.verify
import io.reactivex.rxjava3.core.Flowable
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@ -61,6 +63,8 @@ class StatsFragmentTest : FragmentTestCase<StatsFragment, FragmentStatsBinding,
user.stats?.lvl = 20
user.stats?.points = 30
userSubject.onNext(user)
every { inventoryRepository.getEquipment(listOf()) } returns Flowable.just(listOf())
}
@Test

View file

@ -21,6 +21,7 @@ import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.stats.BulkAllocateStatsDialog
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import javax.inject.Inject
import kotlin.math.min
@ -83,7 +84,9 @@ class StatsFragment : BaseMainFragment<FragmentStatsBinding>() {
}
compositeSubscription.add(
userRepository.getUser().subscribe(
userRepository.getUser()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ user ->
canAllocatePoints = user.stats?.lvl ?: 0 >= 10 && user.stats?.points ?: 0 > 0
binding?.unlockAtLevel?.visibility = if (user.stats?.lvl ?: 0 < 10) View.VISIBLE else View.GONE