mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-04-14 19:56:32 +00:00
Fix UI Tests
This commit is contained in:
parent
d3375ab2be
commit
f038f6109d
6 changed files with 47 additions and 7 deletions
2
.github/workflows/android.yml
vendored
2
.github/workflows/android.yml
vendored
|
|
@ -61,7 +61,7 @@ jobs:
|
|||
- name: Run with Gradle
|
||||
uses: gradle/gradle-build-action
|
||||
with:
|
||||
arguments: testProdDebugUnitTest
|
||||
arguments: connectedProdDebugAndroidTest
|
||||
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue