Merge pull request #2193 from element-hq/feature/bma/sxcludePreviewFromCodeCoverage

Exclude preview from code coverage
This commit is contained in:
Benoit Marty 2024-01-11 16:47:07 +01:00 committed by GitHub
commit 57b2a0d17b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
35 changed files with 88 additions and 111 deletions

View file

@ -288,6 +288,8 @@ koverReport {
"io.element.android.libraries.designsystem.theme.components.bottomsheet.*",
)
annotatedBy(
"androidx.compose.ui.tooling.preview.Preview",
"io.element.android.libraries.architecture.coverage.ExcludeFromCoverage",
"io.element.android.libraries.designsystem.preview.PreviewsDayNight",
"io.element.android.libraries.designsystem.preview.PreviewWithLargeHeight",
)

View file

@ -57,10 +57,7 @@ fun SearchMultipleUsersResultItem(
@Preview
@Composable
internal fun SearchMultipleUsersResultItemPreview() = ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun SearchMultipleUsersResultItemPreview() = ElementThemedPreview {
Column {
SearchMultipleUsersResultItem(
searchResult = UserSearchResult(

View file

@ -53,10 +53,7 @@ fun SearchSingleUserResultItem(
@Preview
@Composable
internal fun SearchSingleUserResultItemPreview() = ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun SearchSingleUserResultItemPreview() = ElementThemedPreview {
Column {
SearchSingleUserResultItem(
searchResult = UserSearchResult(aMatrixUser(), isUnresolved = false),

View file

@ -20,6 +20,7 @@ import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.testtags.TestTags
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.tests.testutils.EnsureNeverCalled
import io.element.android.tests.testutils.EnsureNeverCalledWithParam
@ -28,6 +29,7 @@ import io.element.android.tests.testutils.clickOn
import io.element.android.tests.testutils.ensureCalledOnce
import io.element.android.tests.testutils.ensureCalledOnceWithParam
import io.element.android.tests.testutils.pressBack
import io.element.android.tests.testutils.pressTag
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@ -53,6 +55,24 @@ class LogoutViewTest {
eventsRecorder.assertSingle(LogoutEvents.Logout(false))
}
@Test
fun `confirming logout sends a LogoutEvents`() {
val eventsRecorder = EventsRecorder<LogoutEvents>()
rule.setContent {
LogoutView(
aLogoutState(
logoutAction = AsyncAction.Confirming,
eventSink = eventsRecorder
),
onChangeRecoveryKeyClicked = EnsureNeverCalled(),
onBackClicked = EnsureNeverCalled(),
onSuccessLogout = EnsureNeverCalledWithParam(),
)
}
rule.pressTag(TestTags.dialogPositive.value)
eventsRecorder.assertSingle(LogoutEvents.Logout(false))
}
@Test
fun `clicking on back invoke back callback`() {
val eventsRecorder = EventsRecorder<LogoutEvents>(expectEvents = false)

View file

@ -0,0 +1,21 @@
/*
* Copyright (c) 2023 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.libraries.architecture.coverage
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
annotation class ExcludeFromCoverage

View file

@ -171,11 +171,7 @@ fun AnnotatedString.linkify(linkStyle: SpanStyle): AnnotatedString {
@Preview(group = PreviewGroup.Text)
@Composable
internal fun ClickableLinkTextPreview() =
ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun ClickableLinkTextPreview() = ElementThemedPreview {
ClickableLinkText(
annotatedString = AnnotatedString("Hello", ParagraphStyle()),
linkAnnotationTag = "",

View file

@ -54,10 +54,7 @@ fun LabelledCheckbox(
@Preview(group = PreviewGroup.Toggles)
@Composable
internal fun LabelledCheckboxPreview() = ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun LabelledCheckboxPreview() = ElementThemedPreview {
LabelledCheckbox(
checked = true,
onCheckedChange = {},

View file

@ -141,10 +141,7 @@ private fun ProgressDialogContent(
@Preview(group = PreviewGroup.Dialogs)
@Composable
internal fun ProgressDialogPreview() = ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun ProgressDialogPreview() = ElementThemedPreview {
DialogPreview {
ProgressDialogContent(text = "test dialog content", isCancellable = true)
}

View file

@ -68,10 +68,7 @@ private fun PreferenceCategoryTitle(title: String, modifier: Modifier = Modifier
@Preview(group = PreviewGroup.Preferences)
@Composable
internal fun PreferenceCategoryPreview() = ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun PreferenceCategoryPreview() = ElementThemedPreview {
PreferenceCategory(
title = "Category title",
) {

View file

@ -95,10 +95,7 @@ fun PreferenceCheckbox(
@Preview(group = PreviewGroup.Preferences)
@Composable
internal fun PreferenceCheckboxPreview() = ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun PreferenceCheckboxPreview() = ElementThemedPreview {
Column {
PreferenceCheckbox(
title = "Checkbox",

View file

@ -36,9 +36,6 @@ fun PreferenceDivider(
@Preview(group = PreviewGroup.Preferences)
@Composable
internal fun PreferenceDividerPreview() = ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun PreferenceDividerPreview() = ElementThemedPreview {
PreferenceDivider()
}

View file

@ -50,10 +50,7 @@ fun PreferenceRow(
@Preview(group = PreviewGroup.Preferences)
@Composable
internal fun PreferenceRowPreview() = ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun PreferenceRowPreview() = ElementThemedPreview {
PreferenceRow {
Text(text = "Content")
}

View file

@ -90,10 +90,7 @@ fun PreferenceSlide(
@Preview(group = PreviewGroup.Preferences)
@Composable
internal fun PreferenceSlidePreview() = ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun PreferenceSlidePreview() = ElementThemedPreview {
PreferenceSlide(
iconResourceId = CompoundDrawables.ic_user_profile,
title = "Slide",

View file

@ -102,10 +102,7 @@ fun PreferenceSwitch(
@Preview(group = PreviewGroup.Preferences)
@Composable
internal fun PreferenceSwitchPreview() = ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun PreferenceSwitchPreview() = ElementThemedPreview {
PreferenceSwitch(
title = "Switch",
subtitle = "Subtitle Switch",

View file

@ -90,10 +90,7 @@ private fun compoundErrorCheckBoxColors(): CheckboxColors {
@Preview(group = PreviewGroup.Toggles)
@Composable
internal fun CheckboxesPreview() = ElementThemedPreview(vertical = false) { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun CheckboxesPreview() = ElementThemedPreview(vertical = false) {
Column {
// Unchecked
Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) {

View file

@ -69,10 +69,7 @@ fun CircularProgressIndicator(
@Preview(group = PreviewGroup.Progress)
@Composable
internal fun CircularProgressIndicatorPreview() = ElementThemedPreview(vertical = false) { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun CircularProgressIndicatorPreview() = ElementThemedPreview(vertical = false) {
Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
// Indeterminate progress
CircularProgressIndicator()

View file

@ -78,10 +78,7 @@ internal object DropDownMenuItemDefaults {
@Preview(group = PreviewGroup.Menus)
@Composable
internal fun DropdownMenuItemPreview() = ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun DropdownMenuItemPreview() = ElementThemedPreview {
Column {
DropdownMenuItem(
text = { Text(text = "Item") },

View file

@ -60,11 +60,7 @@ fun FloatingActionButton(
@Preview(group = PreviewGroup.FABs)
@Composable
internal fun FloatingActionButtonPreview() =
ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun FloatingActionButtonPreview() = ElementThemedPreview {
Box(modifier = Modifier.padding(8.dp)) {
FloatingActionButton(onClick = {}) {
Icon(imageVector = CompoundIcons.Close, contentDescription = null)

View file

@ -50,11 +50,6 @@ object ElementDividerDefaults {
@Composable
internal fun HorizontalDividerPreview() = ElementThemedPreview {
Box(Modifier.padding(vertical = 10.dp), contentAlignment = Alignment.Center) {
ContentToPreview()
HorizontalDivider()
}
}
@Composable
private fun ContentToPreview() {
HorizontalDivider()
}

View file

@ -140,10 +140,6 @@ fun Icon(
@Preview(group = PreviewGroup.Icons)
@Composable
internal fun IconImageVectorPreview() =
ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun IconImageVectorPreview() = ElementThemedPreview {
Icon(imageVector = CompoundIcons.Close, contentDescription = null)
}

View file

@ -58,11 +58,7 @@ fun IconButton(
@Preview(group = PreviewGroup.Buttons)
@Composable
internal fun IconButtonPreview() =
ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun IconButtonPreview() = ElementThemedPreview {
Column {
CompositionLocalProvider(LocalContentColor provides ElementTheme.colors.iconPrimary) {
Row {

View file

@ -59,10 +59,7 @@ fun IconToggleButton(
@Preview(group = PreviewGroup.Toggles)
@Composable
internal fun IconToggleButtonPreview() = ElementThemedPreview(vertical = false) { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun IconToggleButtonPreview() = ElementThemedPreview(vertical = false) {
var checked by remember { mutableStateOf(false) }
Column {
Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) {

View file

@ -74,10 +74,7 @@ fun LinearProgressIndicator(
@Preview(group = PreviewGroup.Progress)
@Composable
internal fun LinearProgressIndicatorPreview() = ElementThemedPreview(vertical = false) { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun LinearProgressIndicatorPreview() = ElementThemedPreview(vertical = false) {
Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
// Indeterminate progress
LinearProgressIndicator()

View file

@ -59,14 +59,10 @@ fun MediumTopAppBar(
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Preview(group = PreviewGroup.AppBars)
@Composable
internal fun MediumTopAppBarPreview() =
ElementThemedPreview { ContentToPreview() }
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun ContentToPreview() {
internal fun MediumTopAppBarPreview() = ElementThemedPreview {
MediumTopAppBar(
title = { Text(text = "Title") },
navigationIcon = { BackButton(onClick = {}) },

View file

@ -35,6 +35,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.architecture.coverage.ExcludeFromCoverage
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.designsystem.preview.PreviewGroup
@ -93,6 +94,7 @@ internal fun ModalBottomSheetDarkPreview() =
ElementPreviewDark { ContentToPreview() }
@OptIn(ExperimentalMaterial3Api::class)
@ExcludeFromCoverage
@Composable
private fun ContentToPreview() {
Box(

View file

@ -47,6 +47,7 @@ import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import io.element.android.libraries.architecture.coverage.ExcludeFromCoverage
import io.element.android.libraries.designsystem.modifiers.applyIf
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
@ -110,6 +111,7 @@ internal fun ModalBottomSheetLayoutDarkPreview() =
ElementPreviewDark { ContentToPreview() }
@OptIn(ExperimentalMaterialApi::class)
@ExcludeFromCoverage
@Composable
private fun ContentToPreview() {
ModalBottomSheetLayout(

View file

@ -43,6 +43,7 @@ import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import io.element.android.libraries.architecture.coverage.ExcludeFromCoverage
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.designsystem.preview.PreviewGroup
@ -166,6 +167,7 @@ internal fun OutlinedTextFieldsPreview() = ElementPreviewLight { ContentToPrevie
internal fun OutlinedTextFieldsDarkPreview() = ElementPreviewDark { ContentToPreview() }
@Composable
@ExcludeFromCoverage
private fun ContentToPreview() {
Column(modifier = Modifier.padding(4.dp)) {
allBooleans.forEach { isError ->

View file

@ -66,10 +66,7 @@ internal fun compoundRadioButtonColors(): RadioButtonColors {
@Preview(group = PreviewGroup.Toggles)
@Composable
internal fun RadioButtonPreview() = ElementThemedPreview(vertical = false) { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun RadioButtonPreview() = ElementThemedPreview(vertical = false) {
var checked by remember { mutableStateOf(false) }
Column {
Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) {

View file

@ -58,10 +58,7 @@ fun Slider(
@Preview(group = PreviewGroup.Sliders)
@Composable
internal fun SlidersPreview() = ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun SlidersPreview() = ElementThemedPreview {
var value by remember { mutableFloatStateOf(0.33f) }
Column {
Slider(onValueChange = { value = it }, value = value, enabled = true)

View file

@ -56,11 +56,7 @@ fun Surface(
@Preview
@Composable
internal fun SurfacePreview() =
ElementThemedPreview { ContentToPreview() }
@Composable
private fun ContentToPreview() {
internal fun SurfacePreview() = ElementThemedPreview {
Surface {
Spacer(modifier = Modifier.size(64.dp))
}

View file

@ -42,6 +42,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import io.element.android.compound.utils.toHrf
import io.element.android.libraries.architecture.coverage.ExcludeFromCoverage
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.designsystem.preview.PreviewGroup
@ -120,6 +121,7 @@ internal fun TextLightPreview() = ElementPreviewLight { ContentToPreview() }
@Composable
internal fun TextDarkPreview() = ElementPreviewDark { ContentToPreview() }
@ExcludeFromCoverage
@Composable
private fun ContentToPreview() {
val colors = mapOf(

View file

@ -44,6 +44,7 @@ import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import io.element.android.libraries.architecture.coverage.ExcludeFromCoverage
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.designsystem.preview.PreviewGroup
@ -154,6 +155,7 @@ internal fun TextFieldLightPreview() =
internal fun TextFieldDarkPreview() =
ElementPreviewDark { ContentToPreview() }
@ExcludeFromCoverage
@Composable
private fun ContentToPreview() {
Column(modifier = Modifier.padding(4.dp)) {

View file

@ -59,14 +59,10 @@ fun TopAppBar(
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Preview(group = PreviewGroup.AppBars)
@Composable
internal fun TopAppBarPreview() =
ElementThemedPreview { ContentToPreview() }
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun ContentToPreview() {
internal fun TopAppBarPreview() = ElementThemedPreview {
TopAppBar(
title = { Text(text = "Title") },
navigationIcon = { BackButton(onClick = {}) },

View file

@ -23,6 +23,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.rememberDatePickerState
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import io.element.android.libraries.architecture.coverage.ExcludeFromCoverage
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.designsystem.preview.PreviewGroup
@ -41,6 +42,7 @@ internal fun DatePickerDarkPreview() {
}
@OptIn(ExperimentalMaterial3Api::class)
@ExcludeFromCoverage
@Composable
private fun ContentToPreview() {
val state = rememberDatePickerState(

View file

@ -18,8 +18,10 @@ package io.element.android.tests.testutils
import androidx.activity.ComponentActivity
import androidx.annotation.StringRes
import androidx.compose.ui.test.SemanticsNodeInteractionsProvider
import androidx.compose.ui.test.hasClickAction
import androidx.compose.ui.test.hasContentDescription
import androidx.compose.ui.test.hasTestTag
import androidx.compose.ui.test.hasText
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.performClick
@ -36,3 +38,7 @@ fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.pressBack() {
val text = activity.getString(CommonStrings.action_back)
onNode(hasContentDescription(text)).performClick()
}
fun SemanticsNodeInteractionsProvider.pressTag(tag: String) {
onNode(hasTestTag(tag)).performClick()
}