From c3b1dbe1c4ee9ccdaf773c73f3cdabc6ec2b25af Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 20 Jan 2023 10:15:46 +0100 Subject: [PATCH] testtags --- features/login/build.gradle.kts | 1 + .../login/changeserver/ChangeServerView.kt | 4 ++ .../x/features/login/root/LoginRootScreen.kt | 6 +++ features/onboarding/build.gradle.kts | 1 + .../x/features/onboarding/OnBoardingScreen.kt | 3 ++ libraries/testtags/build.gradle.kts | 23 ++++++++++ .../testtags/src/main/AndroidManifest.xml | 17 ++++++++ .../io/element/android/x/testtags/Compose.kt | 34 +++++++++++++++ .../io/element/android/x/testtags/TestTags.kt | 43 +++++++++++++++++++ settings.gradle.kts | 1 + 10 files changed, 133 insertions(+) create mode 100644 libraries/testtags/build.gradle.kts create mode 100644 libraries/testtags/src/main/AndroidManifest.xml create mode 100644 libraries/testtags/src/main/kotlin/io/element/android/x/testtags/Compose.kt create mode 100644 libraries/testtags/src/main/kotlin/io/element/android/x/testtags/TestTags.kt diff --git a/features/login/build.gradle.kts b/features/login/build.gradle.kts index 623477f727..4b979827d7 100644 --- a/features/login/build.gradle.kts +++ b/features/login/build.gradle.kts @@ -40,6 +40,7 @@ dependencies { implementation(project(":libraries:matrix")) implementation(project(":libraries:designsystem")) implementation(project(":libraries:elementresources")) + implementation(project(":libraries:testtags")) implementation(libs.appyx.core) implementation(project(":libraries:ui-strings")) ksp(libs.showkase.processor) diff --git a/features/login/src/main/kotlin/io/element/android/x/features/login/changeserver/ChangeServerView.kt b/features/login/src/main/kotlin/io/element/android/x/features/login/changeserver/ChangeServerView.kt index 1ac77b16b8..0b67980f09 100644 --- a/features/login/src/main/kotlin/io/element/android/x/features/login/changeserver/ChangeServerView.kt +++ b/features/login/src/main/kotlin/io/element/android/x/features/login/changeserver/ChangeServerView.kt @@ -57,6 +57,8 @@ import io.element.android.x.core.compose.textFieldState import io.element.android.x.designsystem.components.VectorIcon import io.element.android.x.features.login.R import io.element.android.x.features.login.error.changeServerError +import io.element.android.x.testtags.TestTags +import io.element.android.x.testtags.testTag @Composable fun ChangeServerView( @@ -129,6 +131,7 @@ fun ChangeServerView( value = homeserverFieldState, modifier = Modifier .fillMaxWidth() + .testTag(TestTags.changeServerServer) .padding(top = 200.dp), onValueChange = { homeserverFieldState = it @@ -162,6 +165,7 @@ fun ChangeServerView( enabled = state.submitEnabled, modifier = Modifier .fillMaxWidth() + .testTag(TestTags.changeServerContinue) .padding(top = 44.dp) ) { Text(text = "Continue") diff --git a/features/login/src/main/kotlin/io/element/android/x/features/login/root/LoginRootScreen.kt b/features/login/src/main/kotlin/io/element/android/x/features/login/root/LoginRootScreen.kt index 665064f270..f5ed8f0883 100644 --- a/features/login/src/main/kotlin/io/element/android/x/features/login/root/LoginRootScreen.kt +++ b/features/login/src/main/kotlin/io/element/android/x/features/login/root/LoginRootScreen.kt @@ -61,6 +61,8 @@ import androidx.compose.ui.unit.sp import io.element.android.x.core.compose.textFieldState import io.element.android.x.features.login.error.loginError import io.element.android.x.matrix.core.SessionId +import io.element.android.x.testtags.TestTags +import io.element.android.x.testtags.testTag import io.element.android.x.ui.strings.R as StringR @OptIn(ExperimentalMaterial3Api::class) @@ -127,6 +129,7 @@ fun LoginRootScreen( onClick = onChangeServer, modifier = Modifier .align(Alignment.CenterEnd) + .testTag(TestTags.loginChangeServer) .padding(top = 8.dp, end = 8.dp), content = { Text(text = "Change") @@ -137,6 +140,7 @@ fun LoginRootScreen( value = loginFieldState, modifier = Modifier .fillMaxWidth() + .testTag(TestTags.loginEmailUsername) .padding(top = 60.dp), label = { Text(text = stringResource(id = StringR.string.login_signin_username_hint)) @@ -159,6 +163,7 @@ fun LoginRootScreen( value = passwordFieldState, modifier = Modifier .fillMaxWidth() + .testTag(TestTags.loginPassword) .padding(top = 24.dp), onValueChange = { passwordFieldState = it @@ -202,6 +207,7 @@ fun LoginRootScreen( enabled = state.submitEnabled, modifier = Modifier .fillMaxWidth() + .testTag(TestTags.loginContinue) .padding(vertical = 32.dp) ) { Text(text = "Continue") diff --git a/features/onboarding/build.gradle.kts b/features/onboarding/build.gradle.kts index cdb646417a..e002cfb7d7 100644 --- a/features/onboarding/build.gradle.kts +++ b/features/onboarding/build.gradle.kts @@ -31,6 +31,7 @@ dependencies { implementation(project(":libraries:ui-strings")) implementation(project(":libraries:designsystem")) implementation(project(":libraries:architecture")) + implementation(project(":libraries:testtags")) implementation(libs.accompanist.pager) implementation(libs.accompanist.pagerindicator) implementation(libs.appyx.core) diff --git a/features/onboarding/src/main/kotlin/io/element/android/x/features/onboarding/OnBoardingScreen.kt b/features/onboarding/src/main/kotlin/io/element/android/x/features/onboarding/OnBoardingScreen.kt index fb88a76db0..740598ed69 100644 --- a/features/onboarding/src/main/kotlin/io/element/android/x/features/onboarding/OnBoardingScreen.kt +++ b/features/onboarding/src/main/kotlin/io/element/android/x/features/onboarding/OnBoardingScreen.kt @@ -50,6 +50,8 @@ import com.google.accompanist.pager.HorizontalPager import com.google.accompanist.pager.HorizontalPagerIndicator import com.google.accompanist.pager.rememberPagerState import io.element.android.x.designsystem.components.VectorButton +import io.element.android.x.testtags.TestTags +import io.element.android.x.testtags.testTag import kotlinx.coroutines.delay import kotlinx.coroutines.launch import io.element.android.x.ui.strings.R as StringR @@ -127,6 +129,7 @@ fun OnBoardingScreen( enabled = true, modifier = Modifier .align(CenterHorizontally) + .testTag(TestTags.onBoardingSignIn) .padding(top = 16.dp) ) } diff --git a/libraries/testtags/build.gradle.kts b/libraries/testtags/build.gradle.kts new file mode 100644 index 0000000000..8f62664002 --- /dev/null +++ b/libraries/testtags/build.gradle.kts @@ -0,0 +1,23 @@ +/* + * 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. + */ + +plugins { + id("io.element.android-compose-library") +} + +android { + namespace = "io.element.android.x.testtags" +} diff --git a/libraries/testtags/src/main/AndroidManifest.xml b/libraries/testtags/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..ab34d2c3dd --- /dev/null +++ b/libraries/testtags/src/main/AndroidManifest.xml @@ -0,0 +1,17 @@ + + + diff --git a/libraries/testtags/src/main/kotlin/io/element/android/x/testtags/Compose.kt b/libraries/testtags/src/main/kotlin/io/element/android/x/testtags/Compose.kt new file mode 100644 index 0000000000..fa35045439 --- /dev/null +++ b/libraries/testtags/src/main/kotlin/io/element/android/x/testtags/Compose.kt @@ -0,0 +1,34 @@ +/* + * 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.x.testtags + +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.testTag +import androidx.compose.ui.semantics.testTagsAsResourceId + +/** + * Add a testTag to a Modifier, to be used by external tool, like TrafficLight for instance. + */ +@OptIn(ExperimentalComposeUiApi::class) +fun Modifier.testTag(id: TestTag) = this.then( + semantics { + testTag = id.value + testTagsAsResourceId = true + } +) diff --git a/libraries/testtags/src/main/kotlin/io/element/android/x/testtags/TestTags.kt b/libraries/testtags/src/main/kotlin/io/element/android/x/testtags/TestTags.kt new file mode 100644 index 0000000000..40d70bc3ce --- /dev/null +++ b/libraries/testtags/src/main/kotlin/io/element/android/x/testtags/TestTags.kt @@ -0,0 +1,43 @@ +/* + * 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.x.testtags + +@JvmInline +value class TestTag internal constructor(val value: String) + +object TestTags { + /** + * OnBoarding screen + */ + val onBoardingSignIn = TestTag("onboarding-sign_in") + + /** + * Login screen + */ + val loginChangeServer = TestTag("login-change_server") + val loginEmailUsername = TestTag("login-email_username") + val loginPassword = TestTag("login-password") + val loginContinue = TestTag("login-continue") + + /** + * Change server screen + */ + val changeServerServer = TestTag("change_server-server") + val changeServerContinue = TestTag("change_server-continue") +} + + diff --git a/settings.gradle.kts b/settings.gradle.kts index 2971994ca8..1ac5971dc7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -41,6 +41,7 @@ include(":libraries:matrixui") include(":libraries:textcomposer") include(":libraries:elementresources") include(":libraries:ui-strings") +include(":libraries:testtags") include(":features:onboarding") include(":features:login") include(":features:logout")