Skip to content
Snippets Groups Projects
Commit 4a3703a0 authored by Mohamed Metwalli's avatar Mohamed Metwalli
Browse files

Merge branch 'release/1.11.x' into feature/4559-contact-journal-screenshot

# Conflicts:
#	Corona-Warn-App/src/androidTest/java/testhelpers/TestExtensions.kt
parents 9b910806 e21f13b7
No related branches found
No related tags found
No related merge requests found
Showing
with 418 additions and 68 deletions
......@@ -64,6 +64,7 @@ android {
arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
vectorDrawables.useSupportLibrary = true
}
def signingPropFile = file("../keystore.properties")
......
package de.rki.coronawarnapp.ui.main.home
import de.rki.coronawarnapp.risk.RiskState
import de.rki.coronawarnapp.submission.ui.homecards.FetchingResult
import de.rki.coronawarnapp.submission.ui.homecards.NoTest
import de.rki.coronawarnapp.submission.ui.homecards.SubmissionDone
import de.rki.coronawarnapp.submission.ui.homecards.TestError
import de.rki.coronawarnapp.submission.ui.homecards.TestErrorCard
import de.rki.coronawarnapp.submission.ui.homecards.TestFetchingCard
import de.rki.coronawarnapp.submission.ui.homecards.TestInvalid
import de.rki.coronawarnapp.submission.ui.homecards.TestInvalidCard
import de.rki.coronawarnapp.submission.ui.homecards.TestNegative
import de.rki.coronawarnapp.submission.ui.homecards.TestNegativeCard
import de.rki.coronawarnapp.submission.ui.homecards.TestPending
import de.rki.coronawarnapp.submission.ui.homecards.TestPendingCard
import de.rki.coronawarnapp.submission.ui.homecards.TestPositive
import de.rki.coronawarnapp.submission.ui.homecards.TestPositiveCard
import de.rki.coronawarnapp.submission.ui.homecards.TestSubmissionDoneCard
import de.rki.coronawarnapp.submission.ui.homecards.TestUnregisteredCard
import de.rki.coronawarnapp.tracing.TracingProgress
import de.rki.coronawarnapp.tracing.states.IncreasedRisk
import de.rki.coronawarnapp.tracing.states.LowRisk
import de.rki.coronawarnapp.tracing.states.TracingDisabled
import de.rki.coronawarnapp.tracing.states.TracingFailed
import de.rki.coronawarnapp.tracing.states.TracingInProgress
import de.rki.coronawarnapp.tracing.ui.homecards.IncreasedRiskCard
import de.rki.coronawarnapp.tracing.ui.homecards.LowRiskCard
import de.rki.coronawarnapp.tracing.ui.homecards.TracingDisabledCard
import de.rki.coronawarnapp.tracing.ui.homecards.TracingFailedCard
import de.rki.coronawarnapp.tracing.ui.homecards.TracingProgressCard
import org.joda.time.Instant
object HomeData {
object Tracing {
val LOW_RISK_ITEM = LowRiskCard.Item(
state = LowRisk(
riskState = RiskState.LOW_RISK,
isInDetailsMode = false,
lastExposureDetectionTime = Instant.now(),
allowManualUpdate = false,
daysWithEncounters = 1,
activeTracingDays = 1
),
onCardClick = {},
onUpdateClick = {}
)
val INCREASED_RISK_ITEM = IncreasedRiskCard.Item(
state = IncreasedRisk(
riskState = RiskState.INCREASED_RISK,
isInDetailsMode = false,
lastExposureDetectionTime = Instant.now(),
allowManualUpdate = false,
daysWithEncounters = 1,
activeTracingDays = 1,
lastEncounterAt = Instant.now()
),
onCardClick = {},
onUpdateClick = {}
)
val TRACING_DISABLED_ITEM = TracingDisabledCard.Item(
state = TracingDisabled(
riskState = RiskState.LOW_RISK,
isInDetailsMode = false,
lastExposureDetectionTime = Instant.now()
),
onCardClick = {},
onEnableTracingClick = {}
)
val TRACING_PROGRESS_ITEM = TracingProgressCard.Item(
state = TracingInProgress(
riskState = RiskState.LOW_RISK,
isInDetailsMode = false,
tracingProgress = TracingProgress.Downloading
),
onCardClick = {}
)
val TRACING_FAILED_ITEM = TracingFailedCard.Item(
state = TracingFailed(
riskState = RiskState.CALCULATION_FAILED,
isInDetailsMode = false,
lastExposureDetectionTime = Instant.now()
),
onCardClick = {},
onRetryClick = {}
)
}
object Submission {
val TEST_UNREGISTERED_ITEM = TestUnregisteredCard.Item(
state = NoTest,
onClickAction = {}
)
val TEST_FETCHING_ITEM = TestFetchingCard.Item(
state = FetchingResult
)
val TEST_POSITIVE_ITEM = TestPositiveCard.Item(
state = TestPositive,
onClickAction = {}
)
val TEST_NEGATIVE_ITEM = TestNegativeCard.Item(
state = TestNegative,
onClickAction = {}
)
val TEST_INVALID_ITEM = TestInvalidCard.Item(
state = TestInvalid,
onDeleteTest = {}
)
val TEST_ERROR_ITEM = TestErrorCard.Item(
state = TestError,
onDeleteTest = {}
)
val TEST_PENDING_ITEM = TestPendingCard.Item(
state = TestPending,
onClickAction = {}
)
val TEST_SUBMISSION_DONE_ITEM = TestSubmissionDoneCard.Item(
state = SubmissionDone
)
}
}
package de.rki.coronawarnapp.ui.main.home
import androidx.fragment.app.testing.launchFragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.appconfig.AppConfigProvider
import de.rki.coronawarnapp.main.CWASettings
import de.rki.coronawarnapp.notification.TestResultNotificationService
import de.rki.coronawarnapp.storage.TracingRepository
import de.rki.coronawarnapp.submission.SubmissionRepository
import de.rki.coronawarnapp.submission.ui.homecards.SubmissionStateProvider
import de.rki.coronawarnapp.submission.ui.homecards.TestPositiveCard
import de.rki.coronawarnapp.submission.ui.homecards.TestResultItem
import de.rki.coronawarnapp.submission.ui.homecards.TestSubmissionDoneCard
import de.rki.coronawarnapp.tracing.GeneralTracingStatus
import de.rki.coronawarnapp.tracing.states.TracingStateProvider
import de.rki.coronawarnapp.tracing.ui.homecards.TracingStateItem
import de.rki.coronawarnapp.tracing.ui.statusbar.TracingHeaderState
import de.rki.coronawarnapp.ui.main.home.items.DiaryCard
import de.rki.coronawarnapp.ui.main.home.items.FAQCard
import de.rki.coronawarnapp.ui.main.home.items.HomeItem
import de.rki.coronawarnapp.util.security.EncryptionErrorResetTool
import de.rki.coronawarnapp.util.ui.SingleLiveEvent
import io.mockk.MockKAnnotations
import io.mockk.Runs
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.just
import io.mockk.spyk
import io.mockk.verify
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import testhelpers.BaseUITest
import testhelpers.SCREENSHOT_DELAY_TIME
import testhelpers.Screenshot
import testhelpers.SystemUIDemoModeRule
import testhelpers.TestDispatcherProvider
import testhelpers.launchFragmentInContainer2
import testhelpers.recyclerScrollTo
import timber.log.Timber
import tools.fastlane.screengrab.Screengrab
import tools.fastlane.screengrab.locale.LocaleTestRule
@RunWith(AndroidJUnit4::class)
class HomeFragmentTest : BaseUITest() {
@MockK lateinit var viewModel: HomeFragmentViewModel
@MockK lateinit var errorResetTool: EncryptionErrorResetTool
@MockK lateinit var tracingStatus: GeneralTracingStatus
@MockK lateinit var tracingStateProviderFactory: TracingStateProvider.Factory
@MockK lateinit var submissionStateProvider: SubmissionStateProvider
@MockK lateinit var tracingRepository: TracingRepository
@MockK lateinit var testResultNotificationService: TestResultNotificationService
@MockK lateinit var submissionRepository: SubmissionRepository
@MockK lateinit var cwaSettings: CWASettings
@MockK lateinit var appConfigProvider: AppConfigProvider
private lateinit var viewModel: HomeFragmentViewModel
@Rule
@JvmField
val localeTestRule = LocaleTestRule()
@get:Rule
val systemUIDemoModeRule = SystemUIDemoModeRule()
@Before
fun setup() {
MockKAnnotations.init(this, relaxed = true)
viewModel = homeFragmentViewModelSpy()
with(viewModel) {
every { observeTestResultToSchedulePositiveTestResultReminder() } just Runs
every { refreshRequiredData() } just Runs
every { tracingHeaderState } returns MutableLiveData(TracingHeaderState.TracingActive)
every { showLoweredRiskLevelDialog } returns MutableLiveData()
every { homeItems } returns MutableLiveData(emptyList())
every { popupEvents } returns SingleLiveEvent()
}
every { viewModel.tracingHeaderState } returns MutableLiveData()
every { viewModel.homeItems } returns MutableLiveData(emptyList())
every { viewModel.refreshRequiredData() } just Runs
setupMockViewModel(object : HomeFragmentViewModel.Factory {
// override fun create(handle: SavedStateHandle){} HomeFragmentViewModel = viewModel}
override fun create(): HomeFragmentViewModel = viewModel
})
setupMockViewModel(
object : HomeFragmentViewModel.Factory {
override fun create(): HomeFragmentViewModel = viewModel
}
)
}
@After
......@@ -44,11 +99,165 @@ class HomeFragmentTest : BaseUITest() {
@Test
fun onResumeCallsRefresh() {
launchFragment<HomeFragment>().apply {
moveToState(Lifecycle.State.RESUMED)
verify(exactly = 1) { viewModel.refreshRequiredData() }
}
// AppTheme is required here to prevent xml inflation crash
launchFragment<HomeFragment>(themeResId = R.style.AppTheme)
verify(exactly = 1) { viewModel.refreshRequiredData() }
}
@Screenshot
@Test
fun capture_screenshot_low_risk() {
every { viewModel.homeItems } returns itemsLiveData(
HomeData.Tracing.LOW_RISK_ITEM
)
captureScreenshot("low_risk")
onView(withId(R.id.recycler_view)).perform(recyclerScrollTo())
Thread.sleep(SCREENSHOT_DELAY_TIME)
Screengrab.screenshot(HomeFragment::class.simpleName.plus("low_risk_2"))
}
@Screenshot
@Test
fun capture_screenshot_increased_risk() {
every { viewModel.homeItems } returns itemsLiveData(
HomeData.Tracing.INCREASED_RISK_ITEM
)
captureScreenshot("increased_risk")
}
@Screenshot
@Test
fun capture_screenshot_tracing_disabled() {
every { viewModel.tracingHeaderState } returns MutableLiveData(TracingHeaderState.TracingInActive)
every { viewModel.homeItems } returns itemsLiveData(
HomeData.Tracing.TRACING_DISABLED_ITEM
)
captureScreenshot("tracing_disabled")
}
@Screenshot
@Test
fun capture_screenshot_tracing_progress_downloading() {
every { viewModel.homeItems } returns itemsLiveData(
HomeData.Tracing.TRACING_PROGRESS_ITEM
)
captureScreenshot("progress_downloading")
}
@Screenshot
@Test
fun capture_screenshot_tracing_failed() {
every { viewModel.homeItems } returns itemsLiveData(
HomeData.Tracing.TRACING_FAILED_ITEM
)
captureScreenshot("tracing_failed")
}
@Screenshot
@Test
fun capture_screenshot_test_submission_done() {
every { viewModel.homeItems } returns itemsLiveData(
submissionTestResultItem = HomeData.Submission.TEST_SUBMISSION_DONE_ITEM
)
captureScreenshot("submission_done")
}
@Screenshot
@Test
fun capture_screenshot_test_error() {
every { viewModel.homeItems } returns itemsLiveData(
submissionTestResultItem = HomeData.Submission.TEST_ERROR_ITEM
)
captureScreenshot("test_error")
}
@Screenshot
@Test
fun capture_screenshot_test_fetching() {
every { viewModel.homeItems } returns itemsLiveData(
submissionTestResultItem = HomeData.Submission.TEST_FETCHING_ITEM
)
captureScreenshot("test_fetching")
}
@Screenshot
@Test
fun capture_screenshot_test_invalid() {
every { viewModel.homeItems } returns itemsLiveData(
submissionTestResultItem = HomeData.Submission.TEST_INVALID_ITEM
)
captureScreenshot("test_invalid")
}
@Screenshot
@Test
fun capture_screenshot_test_negative() {
every { viewModel.homeItems } returns itemsLiveData(
submissionTestResultItem = HomeData.Submission.TEST_NEGATIVE_ITEM
)
captureScreenshot("test_negative")
}
@Screenshot
@Test
fun capture_screenshot_test_positive() {
every { viewModel.homeItems } returns itemsLiveData(
submissionTestResultItem = HomeData.Submission.TEST_POSITIVE_ITEM
)
captureScreenshot("test_positive")
}
@Screenshot
@Test
fun capture_screenshot_test_pending() {
every { viewModel.homeItems } returns itemsLiveData(
submissionTestResultItem = HomeData.Submission.TEST_PENDING_ITEM
)
captureScreenshot("test_pending")
}
private fun captureScreenshot(nameSuffix: String) {
val name = HomeFragment::class.simpleName + "_" + nameSuffix
launchFragmentInContainer2<HomeFragment>()
Thread.sleep(SCREENSHOT_DELAY_TIME)
Screengrab.screenshot(name)
}
private fun itemsLiveData(
tracingStateItem: TracingStateItem = HomeData.Tracing.LOW_RISK_ITEM,
submissionTestResultItem: TestResultItem = HomeData.Submission.TEST_UNREGISTERED_ITEM
): LiveData<List<HomeItem>> =
MutableLiveData(
mutableListOf<HomeItem>().apply {
when (submissionTestResultItem) {
is TestSubmissionDoneCard.Item,
is TestPositiveCard.Item -> {
Timber.d("Tracing item is not added, submission:$submissionTestResultItem")
}
else -> add(tracingStateItem)
}
add(submissionTestResultItem)
add(DiaryCard.Item {})
add(FAQCard.Item {})
}
)
private fun homeFragmentViewModelSpy() = spyk(
HomeFragmentViewModel(
dispatcherProvider = TestDispatcherProvider,
errorResetTool = errorResetTool,
tracingRepository = tracingRepository,
tracingStateProviderFactory = tracingStateProviderFactory,
testResultNotificationService = testResultNotificationService,
appConfigProvider = appConfigProvider,
tracingStatus = tracingStatus,
submissionRepository = submissionRepository,
submissionStateProvider = submissionStateProvider,
cwaSettings = cwaSettings
)
)
}
@Module
......
package de.rki.coronawarnapp.ui.onboarding
import androidx.fragment.app.testing.launchFragment
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.storage.interoperability.InteroperabilityRepository
import io.mockk.MockKAnnotations
import io.mockk.impl.annotations.MockK
......@@ -24,6 +19,7 @@ import testhelpers.TestDispatcherProvider
import testhelpers.launchFragmentInContainer2
import tools.fastlane.screengrab.Screengrab
import tools.fastlane.screengrab.locale.LocaleTestRule
import testhelpers.SCREENSHOT_DELAY_TIME
@RunWith(AndroidJUnit4::class)
class OnboardingDeltaInteroperabilityFragmentTest : BaseUITest() {
......@@ -64,8 +60,7 @@ class OnboardingDeltaInteroperabilityFragmentTest : BaseUITest() {
@Test
fun capture_screenshot() {
launchFragmentInContainer2<OnboardingDeltaInteroperabilityFragment>()
// Check any view to make sure screenshot is not blank
onView(withId(R.id.onboarding_button_next)).check(matches(isDisplayed()))
Thread.sleep(SCREENSHOT_DELAY_TIME)
Screengrab.screenshot(OnboardingDeltaInteroperabilityFragment::class.simpleName)
}
}
......
......@@ -4,8 +4,6 @@ import androidx.fragment.app.testing.launchFragment
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.action.ViewActions.scrollTo
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
......@@ -17,6 +15,7 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import testhelpers.BaseUITest
import testhelpers.SCREENSHOT_DELAY_TIME
import testhelpers.Screenshot
import testhelpers.SystemUIDemoModeRule
import testhelpers.launchFragmentInContainer2
......@@ -54,8 +53,7 @@ class OnboardingFragmentTest : BaseUITest() {
@Test
fun capture_screenshot() {
launchFragmentInContainer2<OnboardingFragment>()
// Check any view to make sure screenshot is not blank
onView(withId(R.id.onboarding_button_next)).check(matches(isDisplayed()))
Thread.sleep(SCREENSHOT_DELAY_TIME)
Screengrab.screenshot(OnboardingFragment::class.simpleName)
onView(withId(R.id.onboarding_easy_language)).perform(scrollTo(), click())
......
package de.rki.coronawarnapp.ui.onboarding
import androidx.fragment.app.testing.launchFragment
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.R
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import testhelpers.BaseUITest
import testhelpers.SCREENSHOT_DELAY_TIME
import testhelpers.Screenshot
import testhelpers.SystemUIDemoModeRule
import testhelpers.launchFragmentInContainer2
......@@ -52,8 +48,7 @@ class OnboardingNotificationsFragmentTest : BaseUITest() {
@Test
fun capture_screenshot() {
launchFragmentInContainer2<OnboardingNotificationsFragment>()
// Check any view to make sure screenshot is not blank
onView(withId(R.id.onboarding_button_next)).check(matches(isDisplayed()))
Thread.sleep(SCREENSHOT_DELAY_TIME)
Screengrab.screenshot(OnboardingNotificationsFragment::class.simpleName)
}
}
......
package de.rki.coronawarnapp.ui.onboarding
import androidx.fragment.app.testing.launchFragment
import androidx.test.espresso.Espresso
import androidx.test.espresso.assertion.ViewAssertions
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.R
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import testhelpers.BaseUITest
import testhelpers.SCREENSHOT_DELAY_TIME
import testhelpers.Screenshot
import testhelpers.SystemUIDemoModeRule
import testhelpers.launchFragmentInContainer2
......@@ -51,9 +48,7 @@ class OnboardingPrivacyFragmentTest : BaseUITest() {
@Test
fun capture_screenshot() {
launchFragmentInContainer2<OnboardingPrivacyFragment>()
// Check any view to make sure screenshot is not blank
Espresso.onView(ViewMatchers.withId(R.id.onboarding_button_next))
.check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
Thread.sleep(SCREENSHOT_DELAY_TIME)
Screengrab.screenshot(OnboardingPrivacyFragment::class.simpleName)
}
}
......
package de.rki.coronawarnapp.ui.onboarding
import androidx.fragment.app.testing.launchFragment
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.R
import org.junit.After
import org.junit.Before
import org.junit.Rule
......@@ -20,6 +15,7 @@ import testhelpers.SystemUIDemoModeRule
import testhelpers.launchFragmentInContainer2
import tools.fastlane.screengrab.Screengrab
import tools.fastlane.screengrab.locale.LocaleTestRule
import testhelpers.SCREENSHOT_DELAY_TIME
@RunWith(AndroidJUnit4::class)
class OnboardingTestFragmentTest : BaseUITest() {
......@@ -52,8 +48,7 @@ class OnboardingTestFragmentTest : BaseUITest() {
@Test
fun capture_screenshot() {
launchFragmentInContainer2<OnboardingTestFragment>()
// Check any view to make sure screenshot is not blank
onView(withId(R.id.onboarding_button_next)).check(matches(isDisplayed()))
Thread.sleep(SCREENSHOT_DELAY_TIME)
Screengrab.screenshot(OnboardingTestFragment::class.simpleName)
}
}
......
package de.rki.coronawarnapp.ui.onboarding
import androidx.fragment.app.testing.launchFragment
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.nearby.TracingPermissionHelper
import de.rki.coronawarnapp.storage.interoperability.InteroperabilityRepository
import io.mockk.MockKAnnotations
......@@ -17,12 +12,14 @@ import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.just
import io.mockk.spyk
import kotlinx.coroutines.flow.flowOf
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import testhelpers.BaseUITest
import testhelpers.SCREENSHOT_DELAY_TIME
import testhelpers.Screenshot
import testhelpers.SystemUIDemoModeRule
import testhelpers.TestDispatcherProvider
......@@ -56,6 +53,7 @@ class OnboardingTracingFragmentTest : BaseUITest() {
)
every { viewModelSpy.resetTracing() } just Runs
every { interopRepo.countryList } returns flowOf()
setupMockViewModel(object : OnboardingTracingFragmentViewModel.Factory {
override fun create(): OnboardingTracingFragmentViewModel = viewModelSpy
......@@ -77,8 +75,7 @@ class OnboardingTracingFragmentTest : BaseUITest() {
fun capture_screenshot() {
val simpleName = OnboardingTracingFragment::class.simpleName
launchFragmentInContainer2<OnboardingTracingFragment>()
// Check any view to make sure screenshot is not blank
onView(withId(R.id.onboarding_button_next)).check(matches(isDisplayed()))
Thread.sleep(SCREENSHOT_DELAY_TIME)
Screengrab.screenshot(simpleName)
}
}
......
package testhelpers
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.UiController
import androidx.test.espresso.ViewAction
import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import org.hamcrest.CoreMatchers.allOf
import org.hamcrest.Matcher
fun recyclerScrollTo(position: Int? = null): ViewAction = RecyclerViewScrollAction(position)
private class RecyclerViewScrollAction(private val position: Int? = null) : ViewAction {
override fun getDescription(): String {
return "scroll RecyclerView to bottom"
}
override fun getConstraints(): Matcher<View> {
return allOf(isAssignableFrom(RecyclerView::class.java), isDisplayed())
}
override fun perform(uiController: UiController?, view: View?) {
val recyclerView = view as RecyclerView
val itemCount = recyclerView.adapter?.itemCount
val itemPosition = position ?: itemCount?.minus(1) ?: 0
recyclerView.scrollToPosition(itemPosition)
uiController?.loopMainThreadUntilIdle()
}
}
......@@ -30,12 +30,14 @@ class TestApplication : Application(), HasAndroidInjector {
private fun setupActivityHook() {
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
override fun onActivityPreCreated(activity: Activity, savedInstanceState: Bundle?) {
override fun onActivityPreCreated(activity: Activity, savedInstanceState: Bundle?) = Unit
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
Timber.d("onActivityCreated")
setupFragmentHook(activity)
Timber.d("FragmentHook injection is called")
}
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) = Unit
override fun onActivityStarted(activity: Activity) = Unit
override fun onActivityResumed(activity: Activity) = Unit
......@@ -44,7 +46,7 @@ class TestApplication : Application(), HasAndroidInjector {
override fun onActivityStopped(activity: Activity) = Unit
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle?) = Unit
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) = Unit
override fun onActivityDestroyed(activity: Activity) = Unit
})
......
......@@ -7,6 +7,8 @@ import androidx.fragment.app.FragmentFactory
import androidx.fragment.app.testing.FragmentScenario
import de.rki.coronawarnapp.R
/** Delay time before taking screenshot
*/
const val SCREENSHOT_DELAY_TIME = 2000L
/**
......
......@@ -11,7 +11,6 @@ import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieDrawable
import com.airbnb.lottie.LottieProperty
import com.airbnb.lottie.model.KeyPath
import de.rki.coronawarnapp.CoronaWarnApplication
import de.rki.coronawarnapp.util.ContextExtensions.getDrawableCompat
const val IGNORE_CHANGE_TAG = "ignore"
......@@ -29,11 +28,11 @@ fun setChecked(switch: Switch, status: Boolean?) {
@BindingAdapter("animation")
fun setAnimation(view: LottieAnimationView, animation: Int?) {
if (animation != null) {
val appContext = CoronaWarnApplication.getAppContext()
val type = appContext.resources.getResourceTypeName(animation)
val context = view.context
val type = context.resources.getResourceTypeName(animation)
if (type == DRAWABLE_TYPE) {
view.setImageDrawable(appContext.getDrawableCompat(animation))
view.setImageDrawable(context.getDrawableCompat(animation))
} else {
view.setAnimation(animation)
view.repeatCount = LottieDrawable.INFINITE
......
......@@ -34,7 +34,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/contact_diary_card_homescreen_title" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/contact_diary_card_homescreen_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......
......@@ -52,7 +52,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/subtitle" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......
......@@ -36,7 +36,7 @@
app:layout_constraintStart_toStartOf="@+id/title"
app:layout_constraintTop_toBottomOf="@+id/title" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......
......@@ -52,7 +52,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/subtitle" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......
......@@ -37,7 +37,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/title" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......
......@@ -37,7 +37,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/title" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......
......@@ -26,7 +26,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
<androidx.appcompat.widget.AppCompatImageView
style="@style/icon"
android:layout_width="@dimen/icon_size_risk_details_behavior"
android:layout_height="@dimen/icon_size_risk_details_behavior"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment