From 2837b44b694f522967902088225890c1395a1cbc Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 09:25:39 -0500 Subject: [PATCH 01/45] chore(tools): bump maestro from v1.30.4 to v1.31.0 --- .tool-versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tool-versions b/.tool-versions index 81ce6a3a5..faaa850b8 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ direnv 2.32.3 -maestro 1.30.4 +maestro 1.31.0 From 29cf92e0e013cfcc06dff8a81eabad8bccad3b4b Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 09:26:21 -0500 Subject: [PATCH 02/45] chore(tools): set java version to adoptopenjdk-17.0.8+7 in tool-versions --- .tool-versions | 1 + 1 file changed, 1 insertion(+) diff --git a/.tool-versions b/.tool-versions index faaa850b8..32479b157 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,3 @@ +java adoptopenjdk-17.0.8+7 direnv 2.32.3 maestro 1.31.0 From d90b848e8adde804b6e107e16d6a8e4745193944 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 13:50:53 -0500 Subject: [PATCH 03/45] feat(designsystem): add testTag on OutlinedObfuscatingTextField based on isObfuscating property --- .../com/crisiscleanup/core/designsystem/component/TextField.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/TextField.kt b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/TextField.kt index 6da5bb91c..1526e22cc 100644 --- a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/TextField.kt +++ b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/TextField.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardCapitalization @@ -301,11 +302,13 @@ fun OutlinedObfuscatingTextField( else CrisisCleanupIcons.VisibilityOff val translateKey = if (isObfuscating) "actions.show" else "actions.hide" + val iconTestTag = if (isObfuscating) "textFieldShowIcon" else "textFieldHideIcon" val translator = LocalAppTranslator.current Icon( icon, contentDescription = translator(translateKey), tint = MaterialTheme.colorScheme.primary, + modifier = Modifier.testTag(iconTestTag), ) } } From facd8dda5089259d91aa996363a82bc5b97f7560 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 13:52:12 -0500 Subject: [PATCH 04/45] chore(env): don't set MAESTRO_DRIVER_STARTUP optional env var in .envrc --- .envrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.envrc b/.envrc index dfe5ebe46..56e5fc765 100644 --- a/.envrc +++ b/.envrc @@ -33,4 +33,4 @@ export MAESTRO_APP_PASSWORD=${MAESTRO_APP_PASSWORD:-} # Optional Env Vars -export MAESTRO_DRIVER_STARTUP_TIMEOUT=${MAESTRO_DRIVER_STARTUP_TIMEOUT:-15000} +# export MAESTRO_DRIVER_STARTUP_TIMEOUT=${MAESTRO_DRIVER_STARTUP_TIMEOUT:-15000} From 210eda869bf45a8832a10dec4f591855f0876736 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 13:53:03 -0500 Subject: [PATCH 05/45] refactor(e2e): use testTags for e2e test ops in login-password-toggle.yaml --- .../auth-tests/login-password-toggle.yaml | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/.maestro/auth-tests/login-password-toggle.yaml b/.maestro/auth-tests/login-password-toggle.yaml index 46a24746b..318f46824 100644 --- a/.maestro/auth-tests/login-password-toggle.yaml +++ b/.maestro/auth-tests/login-password-toggle.yaml @@ -11,19 +11,25 @@ env: --- - clearState - launchApp -- assertVisible: "Crisis Cleanup" - assertVisible: - text: "Login" - index: 0 -- assertVisible: "Email" -- assertVisible: "Password" -- tapOn: "Password" + id: ccuLogo +- assertVisible: + id: loginHeaderText +- assertVisible: + id: loginEmailTextField +- assertVisible: + id: loginPasswordTextField +- tapOn: + id: loginPasswordTextField - inputText: ${TEST_PASSWORD} # Password should be hidden initially - assertNotVisible: ${TEST_PASSWORD} -- assertVisible: "Show" -- tapOn: "Show" +- assertVisible: + id: textFieldShowIcon +- tapOn: + id: textFieldShowIcon - assertVisible: ${TEST_PASSWORD} -- tapOn: "Hide" +- tapOn: + id: textFieldHideIcon - assertNotVisible: ${TEST_PASSWORD} From 4b267b689a53453d0f865f3cd8770a3f8dd3f1fc Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 15:22:52 -0500 Subject: [PATCH 06/45] fix(designsystem): remove setting testTag inside `CrisisCleanupNavigationBarItem` as it generates invalid testTag --- .../crisiscleanup/core/designsystem/component/Navigation.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/Navigation.kt b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/Navigation.kt index 51641885f..ad55ca80d 100644 --- a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/Navigation.kt +++ b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/Navigation.kt @@ -47,12 +47,11 @@ fun RowScope.CrisisCleanupNavigationBarItem( ) { val selectedColor = CrisisCleanupNavigationDefaults.navigationSelectedItemColor() val unselectedColor = selectedColor.copy(0.5f) - val navBarItemTestTag = label.toString() NavigationBarItem( selected = selected, onClick = onClick, icon = if (selected) selectedIcon else icon, - modifier = modifier.testTag("navItem_$navBarItemTestTag"), + modifier = modifier, enabled = enabled, label = label, alwaysShowLabel = alwaysShowLabel, From f6c6dcefca849cb2b10c9ccfb3b695a9e4928587 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 15:23:43 -0500 Subject: [PATCH 07/45] feat(app): set testTag for bottom nav bar item using title in CrisisCleanupBottomBar --- app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt b/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt index 86a594ed2..1ff46702c 100644 --- a/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt +++ b/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt @@ -484,6 +484,7 @@ private fun CrisisCleanupBottomBar( selected = selected, onClick = { onNavigateToDestination(destination) }, icon = { destination.Icon(selected, title) }, + modifier = Modifier.testTag("navItem_${title}"), label = { Text( title, From 210f0ff05628089785cdea7fd657ac1239bfde84 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 15:24:28 -0500 Subject: [PATCH 08/45] feat(cases): set testTag for dialog header on SelectIncidentDialog in SelectIncidentScreen --- .../com/crisiscleanup/feature/cases/ui/SelectIncidentScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/SelectIncidentScreen.kt b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/SelectIncidentScreen.kt index 2a313f86b..22054781f 100644 --- a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/SelectIncidentScreen.kt +++ b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/SelectIncidentScreen.kt @@ -79,7 +79,7 @@ fun SelectIncidentDialog( is IncidentsData.Incidents -> { Column { Text( - modifier = Modifier.padding(textPadding), + modifier = Modifier.testTag("selectIncidentHeader").padding(textPadding), text = LocalAppTranslator.current("nav.change_incident"), style = LocalFontStyles.current.header3, ) From f4be522ba56058bfbefe55e02968a708d97e2c91 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 15:48:57 -0500 Subject: [PATCH 09/45] feat(designsystem): add testTag on user avatar icon btn in TopAppBar > AvatarAttentionBadge --- .../crisiscleanup/core/designsystem/component/TopAppBar.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/TopAppBar.kt b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/TopAppBar.kt index b7bf2760f..7509dc1db 100644 --- a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/TopAppBar.kt +++ b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/TopAppBar.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextOverflow @@ -345,7 +346,10 @@ fun TopAppBarDefault( } val actionsContent: (@Composable (RowScope.() -> Unit)) = @Composable { AvatarAttentionBadge(isActionAttention) { - IconButton(onClick = onActionClick) { + IconButton( + onClick = onActionClick, + modifier = Modifier.testTag("topBarAvatarIconBtn"), + ) { if (profilePictureUri.isEmpty()) { Icon( imageVector = actionIcon, From 1461f6e267fc637afdcd1c297f8b53b1fbf57842 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 16:10:00 -0500 Subject: [PATCH 10/45] refactor(e2e): replace raw text with testTags in login-view.yaml e2e flow --- .maestro/auth-tests/login-view.yaml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.maestro/auth-tests/login-view.yaml b/.maestro/auth-tests/login-view.yaml index 0df3bc9d1..2f74240c9 100644 --- a/.maestro/auth-tests/login-view.yaml +++ b/.maestro/auth-tests/login-view.yaml @@ -9,12 +9,13 @@ tags: --- - clearState - launchApp -- assertVisible: "Crisis Cleanup" - assertVisible: - text: "Login" - index: 0 -- assertVisible: ".*Email.*" -- assertVisible: ".*Password.*" + id: ccuLogo - assertVisible: - text: "Login" - index: 1 + id: loginHeaderText +- assertVisible: + id: loginEmailTextField +- assertVisible: + id: loginPasswordTextField +- assertVisible: + id: loginLoginBtn From db1e005565ab417e97f045f5bc4374df09a90d4a Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 16:10:19 -0500 Subject: [PATCH 11/45] refactor(e2e): replace text with testTag in login.yaml e2e flow --- .maestro/auth-tests/login.yaml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.maestro/auth-tests/login.yaml b/.maestro/auth-tests/login.yaml index 6f19d35d9..8761157b0 100644 --- a/.maestro/auth-tests/login.yaml +++ b/.maestro/auth-tests/login.yaml @@ -9,12 +9,15 @@ tags: --- - clearState - launchApp -- tapOn: "Email" +- tapOn: + id: loginEmailTextField - inputText: ${MAESTRO_APP_EMAIL} -- tapOn: "Password" +- tapOn: + id: loginPasswordTextField - inputText: ${MAESTRO_APP_PASSWORD} - tapOn: - text: "Login" - index: 1 -- assertVisible: "Work" -- assertVisible: "Menu" + id: loginLoginBtn +- assertVisible: + id: navItem_Work +- assertVisible: + id: navItem_Menu From d7383d2b2628c233ac1c5526f3f77465964c11d1 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 16:10:37 -0500 Subject: [PATCH 12/45] refactor(e2e): replace text with testTag in logout.yaml e2e flow --- .maestro/auth-tests/logout.yaml | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/.maestro/auth-tests/logout.yaml b/.maestro/auth-tests/logout.yaml index 83ed67a42..529e166d5 100644 --- a/.maestro/auth-tests/logout.yaml +++ b/.maestro/auth-tests/logout.yaml @@ -10,12 +10,17 @@ onFlowStart: - runFlow: login.yaml --- - launchApp -- assertVisible: "Work" -- assertVisible: "Menu" -- tapOn: "Menu" -- tapOn: "Account" -- tapOn: "Logout" -- assertVisible: "Crisis Cleanup" - assertVisible: - text: "Login" - index: 0 + id: navItem_Work +- assertVisible: + id: navItem_Menu +- tapOn: + id: navItem_Menu +- tapOn: + id: topBarAvatarIconBtn +- tapOn: + id: authedProfileLogoutBtn +- assertVisible: + id: ccuLogo +- assertVisible: + id: loginHeaderText From f348169493aa9af7b3a6b35b41f99ecbfcecbc4e Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 16:10:57 -0500 Subject: [PATCH 13/45] refactor(e2e): replace text with testTag id in profile-view.yaml e2e flow --- .maestro/auth-tests/profile-view.yaml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.maestro/auth-tests/profile-view.yaml b/.maestro/auth-tests/profile-view.yaml index 3faf5da99..7eff03f57 100644 --- a/.maestro/auth-tests/profile-view.yaml +++ b/.maestro/auth-tests/profile-view.yaml @@ -10,11 +10,16 @@ onFlowStart: - runFlow: login.yaml --- - launchApp -- tapOn: "Menu" -- tapOn: "Account" -- assertVisible: .*crisis.*cleanup.* +- tapOn: + id: navItem_Menu +- tapOn: + id: topBarAvatarIconBtn +- assertVisible: + id: ccuLogo # Currently logged in user's email should be visible on profile page - assertVisible: .*${MAESTRO_APP_EMAIL}.* -- assertVisible: .*logout.* -- assertVisible: .*dismiss.* +- assertVisible: + id: authedProfileLogoutBtn +- assertVisible: + id: authedProfileDismissBtn From 348e52a272fe3920cab8c9c25e441f4e5a3cb058 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 16:51:40 -0500 Subject: [PATCH 14/45] feat(commoncase): add testTag for every worksite result item based on worksite id in ExistingWorksitesList --- .../crisiscleanup/core/commoncase/ui/ExistingWorksitesList.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/commoncase/src/main/java/com/crisiscleanup/core/commoncase/ui/ExistingWorksitesList.kt b/core/commoncase/src/main/java/com/crisiscleanup/core/commoncase/ui/ExistingWorksitesList.kt index 243aa0349..d9bad2b3c 100644 --- a/core/commoncase/src/main/java/com/crisiscleanup/core/commoncase/ui/ExistingWorksitesList.kt +++ b/core/commoncase/src/main/java/com/crisiscleanup/core/commoncase/ui/ExistingWorksitesList.kt @@ -13,6 +13,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.platform.testTag import com.crisiscleanup.core.common.combineTrimText import com.crisiscleanup.core.commoncase.model.CaseSummaryResult import com.crisiscleanup.core.designsystem.theme.listItemOptionPadding @@ -63,6 +64,7 @@ fun LazyListScope.listCaseResults( CaseView( it, Modifier + .testTag("workSearchResultItem_${it.listItemKey}") .clickable( enabled = isEditable, onClick = { onCaseSelect(it) } From 7a5e86c3cfe20be15b2c3579fdbae89ec1082dd1 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 16:52:10 -0500 Subject: [PATCH 15/45] feat(commoncase): add testTag for loading indicator in IncidentDropdownSelect --- .../crisiscleanup/core/commoncase/ui/IncidentDropdownSelect.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/commoncase/src/main/java/com/crisiscleanup/core/commoncase/ui/IncidentDropdownSelect.kt b/core/commoncase/src/main/java/com/crisiscleanup/core/commoncase/ui/IncidentDropdownSelect.kt index 14b4b13d8..63fe15152 100644 --- a/core/commoncase/src/main/java/com/crisiscleanup/core/commoncase/ui/IncidentDropdownSelect.kt +++ b/core/commoncase/src/main/java/com/crisiscleanup/core/commoncase/ui/IncidentDropdownSelect.kt @@ -15,6 +15,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.dp import com.crisiscleanup.core.commonassets.DisasterIcon import com.crisiscleanup.core.designsystem.component.TruncatedAppBarText @@ -58,6 +59,7 @@ fun IncidentDropdownSelect( ) { CircularProgressIndicator( modifier + .testTag("incidentSelectLoadingIndicator") .size(48.dp) .padding(8.dp) ) From 333b1ade190350676f0f2faa58d556b095164af3 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 16:52:44 -0500 Subject: [PATCH 16/45] feat(cases): add testTag for incident search popup items in CasesSearchScreen --- .../com/crisiscleanup/feature/cases/ui/CasesSearchScreen.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesSearchScreen.kt b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesSearchScreen.kt index 382bbcbc7..a3107496d 100644 --- a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesSearchScreen.kt +++ b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesSearchScreen.kt @@ -16,6 +16,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp @@ -80,9 +81,10 @@ internal fun CasesSearchRoute( imageVector = CrisisCleanupIcons.ArrowBack, onClick = onBackClick, contentDescription = translator("actions.back"), + modifier = Modifier.testTag("workIncidentSearchGoBackBtn"), ) ClearableTextField( - modifier = Modifier.weight(1f), + modifier = Modifier.testTag("workIncidentSearchTextField").weight(1f), labelResId = 0, label = "", placeholder = translator("actions.search"), @@ -158,7 +160,7 @@ private fun LazyListScope.recentCases( item("section-title") { Text( text = LocalAppTranslator.current("casesVue.recently_viewed"), - modifier = Modifier.listItemPadding(), + modifier = Modifier.testTag("workIncidentSearchRecentHeaderText").listItemPadding(), ) } } From ed23aafe93074930332bc4f27f4b0b7f35885e71 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Tue, 15 Aug 2023 16:53:06 -0500 Subject: [PATCH 17/45] feat(cases): add testTags for cases count view loading indicator in CasesScreen --- .../main/java/com/crisiscleanup/feature/cases/ui/CasesScreen.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesScreen.kt b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesScreen.kt index e18952f12..74c36ad07 100644 --- a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesScreen.kt +++ b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesScreen.kt @@ -713,6 +713,7 @@ private fun CasesCountView( ) { CircularProgressIndicator( Modifier + .testTag("workIncidentsLoadingIndicator") .wrapContentSize() .size(24.dp), color = Color.White, From 41289530ff4ded1c416d9385bced799c9fec6bda Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 10:26:54 -0500 Subject: [PATCH 18/45] feat(caseeditor): add testTags in `CaseIncidentView` --- .../crisiscleanup/feature/caseeditor/ui/CaseIncidentView.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/CaseIncidentView.kt b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/CaseIncidentView.kt index 7c52888d6..66ed4ec60 100644 --- a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/CaseIncidentView.kt +++ b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/CaseIncidentView.kt @@ -9,6 +9,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.crisiscleanup.core.commonassets.DisasterIcon @@ -45,7 +46,7 @@ internal fun CaseIncidentView( DisasterIcon(disasterResId, incidentName) Text( incidentName, - Modifier.weight(1f), + Modifier.testTag("caseViewIncidentName").weight(1f), style = LocalFontStyles.current.header1, ) @@ -59,6 +60,7 @@ internal fun CaseIncidentView( Icon( imageVector = CrisisCleanupIcons.CloudSync, contentDescription = translator("info.is_syncing"), + modifier = Modifier.testTag("caseViewIsSyncingIcon") ) } } else if (isPendingSync) { @@ -67,6 +69,7 @@ internal fun CaseIncidentView( imageVector = CrisisCleanupIcons.Cloud, contentDescription = translator("info.is_pending_sync"), tint = primaryOrangeColor, + modifier = Modifier.testTag("caseViewIsPendingSyncIconBtn") ) } } From 6063f329ede59525b03eadb96b0e4b79a5821671 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 10:27:41 -0500 Subject: [PATCH 19/45] feat(caseeeditor): add static and dynamic testTags on all `EditExistingCaseScreen` elements --- .../caseeditor/ui/EditExistingCaseScreen.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/EditExistingCaseScreen.kt b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/EditExistingCaseScreen.kt index 2b21a1c72..37d343aaa 100644 --- a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/EditExistingCaseScreen.kt +++ b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/EditExistingCaseScreen.kt @@ -57,6 +57,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role @@ -197,6 +198,7 @@ internal fun EditExistingCaseRoute( Text( updatedAtText, Modifier + .testTag("editCaseUpdatedAtText") .background(Color.White) .then(listItemModifier), style = MaterialTheme.typography.bodySmall, @@ -293,19 +295,21 @@ private fun TopBar( Text( title, style = LocalFontStyles.current.header3, + modifier = Modifier.testTag("editCaseHeaderText") ) if (subTitle.isNotBlank()) { Text( subTitle, style = MaterialTheme.typography.bodySmall, + modifier = Modifier.testTag("editCaseSubHeaderText") ) } } } val navigationContent = @Composable { - TopBarBackAction(action = onBack) + TopBarBackAction(action = onBack, modifier = Modifier.testTag("topBarBackAction")) } val actionsContent: (@Composable (RowScope.() -> Unit)) = if (isLoading) { @Composable {} @@ -322,6 +326,7 @@ private fun TopBar( onClick = toggleHighPriority, enabled = isEditable, tint = highPriorityTint, + modifier = Modifier.testTag("editCaseHighPriorityToggleBtn") ) val iconResId = if (isFavorite) R.drawable.ic_heart_filled @@ -336,6 +341,7 @@ private fun TopBar( onClick = toggleFavorite, enabled = isEditable, tint = favoriteTint, + modifier = Modifier.testTag("editCaseFavoriteToggleBtn") ) } } @@ -386,6 +392,7 @@ private fun ColumnScope.ExistingCaseContent( pagerState.animateScrollToPage(index) } }, + modifier = Modifier.testTag("caseInfoTab_${title}") ) } } @@ -447,6 +454,7 @@ private fun BottomActions( } NavigationBarItem( + modifier = Modifier.testTag("editCaseNavItem_${label}"), selected = false, onClick = { when (index) { @@ -696,6 +704,7 @@ private fun LazyListScope.propertyInfoItems( CrisisCleanupIcons.Person, worksite.name, Modifier + .testTag("editCasePropertyInfoWorksiteNameRow") .combinedClickable( onClick = {}, onLongClick = { copyToClipboard(worksite.name) } @@ -709,6 +718,7 @@ private fun LazyListScope.propertyInfoItems( CrisisCleanupIcons.Phone, phoneNumbers, Modifier + .testTag("editCasePropertyInfoPhoneRow") .combinedClickable( onClick = {}, onLongClick = { copyToClipboard(phoneNumbers) } @@ -723,6 +733,7 @@ private fun LazyListScope.propertyInfoItems( CrisisCleanupIcons.Mail, it, Modifier + .testTag("editCasePropertyInfoEmailRow") .combinedClickable( onClick = {}, onLongClick = { copyToClipboard(worksite.email) } @@ -739,6 +750,7 @@ private fun LazyListScope.propertyInfoItems( CrisisCleanupIcons.Location, fullAddress, Modifier + .testTag("editCasePropertyInfoLocationRow") .combinedClickable( onClick = {}, onLongClick = { copyToClipboard(fullAddress) } @@ -753,6 +765,7 @@ private fun LazyListScope.propertyInfoItems( worksite.coordinates, // TODO Common dimensions Modifier + .testTag("editCasePropertyInfoMapView") .height(192.dp) .padding(top = edgeSpacingHalf), mapMarkerIcon = mapMarkerIcon, From f84023eaeb1718ed201fade6fda08292e9a0a695 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 10:43:56 -0500 Subject: [PATCH 20/45] feat(designsystem): add testTag on `WorkTypeAction` in Button.kt --- .../com/crisiscleanup/core/designsystem/component/Button.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/Button.kt b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/Button.kt index 46c50831a..5a4c2b293 100644 --- a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/Button.kt +++ b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/Button.kt @@ -270,7 +270,7 @@ fun WorkTypeAction( onClick: () -> Unit = {}, ) = CrisisCleanupOutlinedButton( // TODO Common dimensions - modifier = Modifier.widthIn(100.dp), + modifier = Modifier.testTag("workTypeAction_${text}").widthIn(100.dp), text = text, onClick = onClick, enabled = enabled, From 3b8d864bdd032ea794bcb265577a5bd67c413627 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 11:16:16 -0500 Subject: [PATCH 21/45] feat(caseeditor): add testTags for header and subheader in `WorkTypeSummaryView` --- .../feature/caseeditor/ui/ExistingWorkTypeViews.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/ExistingWorkTypeViews.kt b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/ExistingWorkTypeViews.kt index 3461ff47d..d52760de6 100644 --- a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/ExistingWorkTypeViews.kt +++ b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/ExistingWorkTypeViews.kt @@ -14,6 +14,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.crisiscleanup.core.designsystem.LocalAppTranslator @@ -96,13 +97,13 @@ private fun WorkTypeSummaryView( Column { Text( name, - modifier.padding(top = edgeSpacing), + modifier.testTag("workTypeSummaryHeaderText").padding(top = edgeSpacing), style = MaterialTheme.typography.bodyLarge, ) if (jobSummary.isNotBlank()) { Text( jobSummary, - modifier.padding(top = edgeSpacingHalf), + modifier.testTag("workTypeSummarySubHeaderText").padding(top = edgeSpacingHalf), style = MaterialTheme.typography.bodySmall, ) } From 18f74b7a118bf0d06bc00d24fa16405bbb5d9f93 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 11:17:18 -0500 Subject: [PATCH 22/45] feat(caseeditor): add testTag on `SectionHeader` using section index + title --- .../crisiscleanup/feature/caseeditor/ui/SectionHeader.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/SectionHeader.kt b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/SectionHeader.kt index 90c25912b..99970f533 100644 --- a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/SectionHeader.kt +++ b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/SectionHeader.kt @@ -12,6 +12,7 @@ import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.drawBehind +import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview @@ -108,13 +109,14 @@ internal fun SectionHeader( .listItemPadding(), verticalAlignment = Alignment.CenterVertically, ) { + val sIndex = sectionIndex + 1 CircleNumber( - sectionIndex + 1, + sIndex, style = textStyle, ) Text( sectionTitle, - Modifier.listRowItemStartPadding(), + Modifier.testTag("sectionHeaderTitle_${sIndex}_${sectionTitle}").listRowItemStartPadding(), style = textStyle, ) trailingContent?.let { From 84897daab2b22ee84279f3907b7cb599201e4310 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 11:29:05 -0500 Subject: [PATCH 23/45] test(e2e): add e2e flow for searching and selecting incident w/ assertions for case view page --- .../incident-search-and-select.yaml | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 .maestro/work-tests/incident-search-and-select.yaml diff --git a/.maestro/work-tests/incident-search-and-select.yaml b/.maestro/work-tests/incident-search-and-select.yaml new file mode 100644 index 000000000..a36850c66 --- /dev/null +++ b/.maestro/work-tests/incident-search-and-select.yaml @@ -0,0 +1,79 @@ +name: Incident Search with valid query and select +appId: ${MAESTRO_APP_ID} +tags: + - development + - staging + - production + - pull-request +env: + SEARCH_QUERY: '11' +onFlowStart: + - runFlow: ../auth-tests/login.yaml +--- +# wait for incidents to load +- waitForAnimationToEnd: + timeout: 5000 +# start searching after loading spinner is invisible +- assertNotVisible: + id: workIncidentsLoadingIndicator +- tapOn: + id: workIncidentSearchBtn +- assertVisible: "Search" +- tapOn: + id: workIncidentSearchTextField +- inputText: ${SEARCH_QUERY} +- tapOn: + id: workSearchResultItem_.* + index: 0 + +# Header +- assertVisible: + id: "editCaseHeaderText" +- assertVisible: + id: "editCaseSubHeaderText" + +# Actions +- assertVisible: + id: "editCaseHighPriorityToggleBtn" +- assertVisible: + id: "editCaseFavoriteToggleBtn" + +# Tabs +- assertVisible: + id: "caseInfoTab_Info" +- assertVisible: + id: "caseInfoTab_Photos.*" # Tab title can be "caseInfoTab_Photos (2)", therefore use regex for assertion +- assertVisible: + id: "caseInfoTab_Notes.*" # Tab title can be "caseInfoTab_Notes (3)", therefore use regex for assertion + +# Property Info +- assertVisible: + id: "sectionHeaderTitle_1_Property Information" +- assertVisible: + id: "caseViewIncidentName" +- assertVisible: + id: "editCasePropertyInfoWorksiteNameRow" +- assertVisible: + id: "editCasePropertyInfoPhoneRow" +# Email is optional +# - assertVisible: +# id: "editCasePropertyInfoEmailRow" +- assertVisible: + id: "editCasePropertyInfoLocationRow" +- assertVisible: "Google Map" + +# Work +- scrollUntilVisible: + element: + id: "sectionHeaderTitle_3_Work" + direction: DOWN + +# Bottom Bar Actions +- assertVisible: + id: "editCaseNavItem_Share" +- assertVisible: + id: "editCaseNavItem_Flag" +- assertVisible: + id: "editCaseNavItem_History" +- assertVisible: + id: "editCaseNavItem_Edit" From 23162280739af421910a32cbb9880a2154bdc0a6 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 11:34:03 -0500 Subject: [PATCH 24/45] feat(cases): add testTags for actions in `CasesFilterScreen` --- .../com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt index 11cb00974..83291120e 100644 --- a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt +++ b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt @@ -957,7 +957,7 @@ fun BottomActionBar( val filterCount = filters.changeCount val hasFilters = filterCount > 0 BusyButton( - Modifier.weight(1f), + Modifier.testTag("filterClearFiltersBtn").weight(1f), text = translator("actions.clear_filters"), enabled = hasFilters, onClick = viewModel::clearFilters, @@ -966,7 +966,7 @@ fun BottomActionBar( val applyFilters = translator("actions.apply_filters") val applyText = if (hasFilters) "$applyFilters ($filterCount)" else applyFilters BusyButton( - Modifier.weight(1f), + Modifier.testTag("filterApplyFiltersBtn").weight(1f), text = applyText, onClick = { viewModel.applyFilters(filters) From 8e55191e68473227675a03c7efd07f583f7c80d3 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 13:24:53 -0500 Subject: [PATCH 25/45] feat(designsystem): add testTag on `CollapsibleIcon` with sectionTitle --- .../core/designsystem/component/CollapsibleIcon.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/CollapsibleIcon.kt b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/CollapsibleIcon.kt index 259db755c..79870eb33 100644 --- a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/CollapsibleIcon.kt +++ b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/CollapsibleIcon.kt @@ -2,7 +2,9 @@ package com.crisiscleanup.core.designsystem.component import androidx.compose.material3.Icon import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.testTag import com.crisiscleanup.core.designsystem.LocalAppTranslator @@ -20,5 +22,6 @@ fun CollapsibleIcon( Icon( imageVector = iconVector, contentDescription = description, + modifier = Modifier.testTag("collapsibleIcon_${sectionTitle}"), ) } From 5667d2defa984d16109b00171046ddcba0c6d59b Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 13:31:31 -0500 Subject: [PATCH 26/45] feat(cases): add testTags on all dynamically generated form field in `CasesFilterScreen` --- .../feature/cases/ui/CasesFilterScreen.kt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt index 83291120e..c8a7063e2 100644 --- a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt +++ b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt @@ -439,6 +439,7 @@ private fun LazyListScope.sviSlider( helpTranslateKey = "svi.svi_more_info_link", isHelpHtml = true, currentValueDisplay = sviValueDisplay, + modifier = Modifier.testTag("filterSVISlider") // Survivors Vulnerability Index (SVI) ) } @@ -455,6 +456,7 @@ private fun LazyListScope.daysUpdatedSlider( value = filters.daysAgoNormalized, onUpdate = { f: Float -> onUpdateFilter(filters.expandDaysAgo(f)) }, currentValueDisplay = daysUpdatedDisplay, + modifier = Modifier.testTag("filterDaysUpdatedSlider") ) } @@ -474,6 +476,7 @@ private fun FilterHeaderCollapsible( ) { Text( sectionTitle, + modifier = Modifier.testTag("filterHeaderCollapsibleTitle_${sectionTitle}"), style = LocalFontStyles.current.header3, ) val iconVector = @@ -517,6 +520,7 @@ private fun LazyListScope.collapsibleSectionHeader( ) { FilterHeaderCollapsible( sectionTitle = LocalAppTranslator.current(translationKey), + modifier = Modifier.testTag("filterHeaderCollapsible_${translationKey}"), isCollapsed = !isSectionExpanded, toggleCollapse = toggleSection, ) @@ -549,10 +553,11 @@ private fun LazyListScope.distanceOptions( listItemModifier, verticalArrangement = listItemSpacedBy, ) { - Text(translator(messageKey)) + Text(translator(messageKey), modifier = Modifier.testTag("filterText_${messageKey}")) CrisisCleanupButton( text = translator(actionKey), + modifier = Modifier.testTag("filterCCUBtn_${actionKey}"), onClick = requestLocationPermission, ) } @@ -562,7 +567,7 @@ private fun LazyListScope.distanceOptions( item { options.forEach { CrisisCleanupRadioButton( - listItemModifier, + listItemModifier.testTag("filterRadioBtn_${it.second}"), selected = filters.distance == it.first, text = it.second, onSelect = { updateDistance(it.first) }, @@ -578,7 +583,7 @@ private fun LazyListScope.subsectionHeader( item(contentType = "subsection-header") { Text( text = LocalAppTranslator.current(translateKey), - modifier = listItemModifier, + modifier = listItemModifier.testTag("filterSubSectionHeader_${translateKey}"), style = LocalFontStyles.current.header4, ) } @@ -592,7 +597,7 @@ private fun LazyListScope.checkboxItem( ) { item(contentType = "filter-checkbox") { CrisisCleanupTextCheckbox( - listItemModifier, + listItemModifier.testTag("filterCheckbox_${textTranslateKey}"), text = LocalAppTranslator.current(textTranslateKey), checked = isChecked, onCheckChange = onCheckChange, @@ -840,12 +845,12 @@ private fun LazyListScope.dateItem( val label = translator(textTranslateKey) Text( label, - Modifier.listItemHorizontalPadding(), + Modifier.testTag("dateItemLabel_${label}").listItemHorizontalPadding(), style = MaterialTheme.typography.bodyLarge, ) FilterDatePicker( label, - listItemModifier, + listItemModifier.testTag("dateItemDatePicker_${label}"), dateRange = dateRange, onDateChange = onDateChange, ) From 1b78d751ccbf2242dc6b5c9482c0b0d20d9892a0 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 13:49:02 -0500 Subject: [PATCH 27/45] test(e2e): add e2e flow which checks for change in worksite filters --- .maestro/work-tests/filters-change.yaml | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .maestro/work-tests/filters-change.yaml diff --git a/.maestro/work-tests/filters-change.yaml b/.maestro/work-tests/filters-change.yaml new file mode 100644 index 000000000..50b1bca8e --- /dev/null +++ b/.maestro/work-tests/filters-change.yaml @@ -0,0 +1,35 @@ +name: Work filter changes +appId: ${MAESTRO_APP_ID} +tags: + - development + - staging + - production + - pull-request +onFlowStart: + - runFlow: ../auth-tests/login.yaml +--- +- tapOn: + id: "workIncidentFilterBtn" +- assertVisible: "Filters" + +- assertVisible: + id: "filterClearFiltersBtn" +- assertVisible: + id: "filterApplyFiltersBtn" + +- assertVisible: + text: "Apply filters" + +- scrollUntilVisible: + element: + id: "filterCheckbox_worksiteFilters.open" + direction: DOWN +- tapOn: + id: "filterCheckbox_worksiteFilters.open" +- assertVisible: + text: "Apply filters (1)" +- tapOn: + id: "filterClearFiltersBtn" +- assertVisible: + text: "Apply filters" + From e043308c0307b5c5e4a8e065522f95fdc0dfa8c2 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 14:02:07 -0500 Subject: [PATCH 28/45] test(e2e): add more assertions and filters selection cmds to filters-change e2e flow, use env vars for common texts --- .maestro/work-tests/filters-change.yaml | 55 +++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/.maestro/work-tests/filters-change.yaml b/.maestro/work-tests/filters-change.yaml index 50b1bca8e..f71195271 100644 --- a/.maestro/work-tests/filters-change.yaml +++ b/.maestro/work-tests/filters-change.yaml @@ -5,6 +5,9 @@ tags: - staging - production - pull-request +env: + APPLY_FILTERS_BTN_TEXT: "Apply filters" + CLEAR_FILTERS_BTN_TEXT: "Clear filters" onFlowStart: - runFlow: ../auth-tests/login.yaml --- @@ -18,7 +21,25 @@ onFlowStart: id: "filterApplyFiltersBtn" - assertVisible: - text: "Apply filters" + text: "${APPLY_FILTERS_BTN_TEXT}" + +- scrollUntilVisible: + element: + id: "filterRadioBtn_5 miles" + direction: DOWN +- tapOn: + id: "filterRadioBtn_5 miles" +- assertVisible: + text: "${APPLY_FILTERS_BTN_TEXT} (1)" + +- scrollUntilVisible: + element: + id: "filterCheckbox_worksiteFilters.unclaimed" + direction: DOWN +- tapOn: + id: "filterCheckbox_worksiteFilters.unclaimed" +- assertVisible: + text: "${APPLY_FILTERS_BTN_TEXT} (2)" - scrollUntilVisible: element: @@ -27,9 +48,37 @@ onFlowStart: - tapOn: id: "filterCheckbox_worksiteFilters.open" - assertVisible: - text: "Apply filters (1)" + text: "${APPLY_FILTERS_BTN_TEXT} (3)" + +- scrollUntilVisible: + element: + id: "filterCheckbox_open_assigned" + direction: DOWN +- tapOn: + id: "filterCheckbox_open_assigned" +- assertVisible: + text: "${APPLY_FILTERS_BTN_TEXT} (4)" + +- scrollUntilVisible: + element: + id: "filterCheckbox_formLabels.older_than_60" + direction: DOWN +- tapOn: + id: "filterCheckbox_formLabels.older_than_60" +- assertVisible: + text: "${APPLY_FILTERS_BTN_TEXT} (5)" + +- scrollUntilVisible: + element: + id: "filterCheckbox_flag.worksite_high_priority" + direction: DOWN +- tapOn: + id: "filterCheckbox_flag.worksite_high_priority" +- assertVisible: + text: "${APPLY_FILTERS_BTN_TEXT} (6)" + - tapOn: id: "filterClearFiltersBtn" - assertVisible: - text: "Apply filters" + text: "${APPLY_FILTERS_BTN_TEXT}" From 7e3910a4f25c699ecf2d7f64d735673d6dfe66d9 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 14:14:20 -0500 Subject: [PATCH 29/45] feat(caseeditor): set testTag on `CircleNumber` composable with passed in number --- .../com/crisiscleanup/feature/caseeditor/ui/SectionHeader.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/SectionHeader.kt b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/SectionHeader.kt index 99970f533..058e3c714 100644 --- a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/SectionHeader.kt +++ b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/SectionHeader.kt @@ -45,7 +45,7 @@ private fun CircleNumber( ) { Text( "$number", - Modifier.align(Alignment.Center), + Modifier.testTag("circleNumberText_${number}").align(Alignment.Center), style = style, textAlign = TextAlign.Center, ) From 1bffe72b642fec47c0d3a50de1a6e349aa401834 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 14:14:39 -0500 Subject: [PATCH 30/45] feat(cases): set testTag on `FilterButtonBadge` with filtersCount --- .../com/crisiscleanup/feature/cases/ui/FilterButtonBadge.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/FilterButtonBadge.kt b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/FilterButtonBadge.kt index 9b88aeebb..fb00f2efc 100644 --- a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/FilterButtonBadge.kt +++ b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/FilterButtonBadge.kt @@ -8,6 +8,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.dp @OptIn(ExperimentalMaterial3Api::class) @@ -25,7 +26,10 @@ internal fun FilterButtonBadge( .offset(((-8)).dp, 8.dp), containerColor = MaterialTheme.colorScheme.primaryContainer, ) { - Text("$filtersCount") + Text( + "$filtersCount", + modifier = Modifier.testTag("filterButtonBadge_${filtersCount}"), + ) } }, ) { From 1927502afbb522665f7d616bb7ee2c3009fb504e Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 14:19:15 -0500 Subject: [PATCH 31/45] fix(e2e): wait for all worksites to load before selecting filters in filters-change e2e flow --- .maestro/work-tests/filters-change.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.maestro/work-tests/filters-change.yaml b/.maestro/work-tests/filters-change.yaml index f71195271..e40b802ef 100644 --- a/.maestro/work-tests/filters-change.yaml +++ b/.maestro/work-tests/filters-change.yaml @@ -11,6 +11,12 @@ env: onFlowStart: - runFlow: ../auth-tests/login.yaml --- +# wait for incidents to load +- waitForAnimationToEnd: + timeout: 5000 +# wait till spinner is invisible +- assertNotVisible: + id: workIncidentsLoadingIndicator - tapOn: id: "workIncidentFilterBtn" - assertVisible: "Filters" From 40e3840d7ce7b9cf8de0e5f4b0f5962febab556d Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 14:20:08 -0500 Subject: [PATCH 32/45] test(e2e): extend filters-change by applying selected filters & asserting filter changes --- .maestro/work-tests/filters-change.yaml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.maestro/work-tests/filters-change.yaml b/.maestro/work-tests/filters-change.yaml index e40b802ef..6ca4aa815 100644 --- a/.maestro/work-tests/filters-change.yaml +++ b/.maestro/work-tests/filters-change.yaml @@ -83,8 +83,32 @@ onFlowStart: - assertVisible: text: "${APPLY_FILTERS_BTN_TEXT} (6)" +# Apply selected filters +- tapOn: + id: "filterApplyFiltersBtn" + +# Small indicator number beside filters button +- assertVisible: + id: "filterButtonBadge_6" + +# Reopen filters popup +- tapOn: + id: "workIncidentFilterBtn" + +# Originally selected filters should be selected +- assertVisible: + text: "${APPLY_FILTERS_BTN_TEXT} (6)" + +# Clear filters - tapOn: id: "filterClearFiltersBtn" - assertVisible: text: "${APPLY_FILTERS_BTN_TEXT}" +# Apply cleared filters +- tapOn: + id: "filterApplyFiltersBtn" + +# Small indicator number beside filters button should not be visible +- assertNotVisible: + id: "filterButtonBadge_6" From ce8944ed0003eb120c1453dfd6780edb3372cd07 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 14:59:02 -0500 Subject: [PATCH 33/45] feat(cases): set dynamic testTag based on incident id on `SelectIncidentScreen` > `IncidentSelectContent` --- .../crisiscleanup/feature/cases/ui/SelectIncidentScreen.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/SelectIncidentScreen.kt b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/SelectIncidentScreen.kt index 22054781f..fb9bad232 100644 --- a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/SelectIncidentScreen.kt +++ b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/SelectIncidentScreen.kt @@ -128,8 +128,7 @@ private fun ColumnScope.IncidentSelectContent( val listState = rememberLazyListState() LazyColumn( state = listState, - modifier = modifier - .testTag("cases:incidents"), + modifier = modifier, ) { items( incidents.size, @@ -141,6 +140,7 @@ private fun ColumnScope.IncidentSelectContent( val fontWeight = if (isSelected) FontWeight.Bold else null Text( modifier = modifier + .testTag("selectIncidentItem_${id}") .fillParentMaxWidth() .clickable(enabled = enableInput) { onSelectIncident(incident) From 9126587ac226187046378bc27e11103df77d0c54 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 15:25:39 -0500 Subject: [PATCH 34/45] feat(cases): set testTag for filter section header & help row in `CasesFilterScreen` --- .../com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt index c8a7063e2..2d8a66fc6 100644 --- a/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt +++ b/feature/cases/src/main/java/com/crisiscleanup/feature/cases/ui/CasesFilterScreen.kt @@ -378,7 +378,7 @@ private fun LazyListScope.rangeSliderItem( val text = if (currentValue.isBlank()) label else "$label ($currentValue)" Text( text, - modifier = Modifier.listItemVerticalPadding(), + modifier = Modifier.testTag("filterSectionHeader_${text}").listItemVerticalPadding(), style = LocalFontStyles.current.header3, fontWeight = FontWeight.Bold, ) @@ -394,6 +394,7 @@ private fun LazyListScope.rangeSliderItem( ) { HelpRow( text = label, + modifier = Modifier.testTag("filterSectionHeaderHelpRow_${label}"), iconContentDescription = label, showHelp = showHelp, isBold = true, From 96cb343d3b0ec5e9e8900748dfb13697d605ae03 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 15:26:02 -0500 Subject: [PATCH 35/45] feat(designsystem): add testTag for `HelpRow` text in `HelpDialog` --- .../com/crisiscleanup/core/designsystem/component/HelpDialog.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/HelpDialog.kt b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/HelpDialog.kt index cf25b45f7..8b6a0a219 100644 --- a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/HelpDialog.kt +++ b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/HelpDialog.kt @@ -9,6 +9,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontWeight import com.crisiscleanup.core.designsystem.LocalAppTranslator import com.crisiscleanup.core.designsystem.icon.CrisisCleanupIcons @@ -27,6 +28,7 @@ fun HelpRow( ) { Text( text, + modifier = Modifier.testTag("helpRowText_${text}"), fontWeight = if (isBold) FontWeight.Bold else null ) HelpAction(iconContentDescription, showHelp) From a7f1d63219730ab6d414b16312df45b663d96c54 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 15:55:29 -0500 Subject: [PATCH 36/45] feat(app): remove `CrisisCleanupAppHeader` testTag, add `appIncidentSelector` testTag --- app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt b/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt index 1ff46702c..401f61c42 100644 --- a/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt +++ b/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt @@ -273,7 +273,7 @@ private fun NavigableContent( } val onOpenIncidents = if (appState.isMenuRoute) openIncidentsSelect else null AppHeader( - modifier = Modifier.testTag("CrisisCleanupAppHeader"), + modifier = Modifier, title = title, isAppHeaderLoading = isHeaderLoading, profilePictureUri = profilePictureUri, @@ -412,7 +412,7 @@ private fun AppHeader( TruncatedAppBarText(title = title) } else { IncidentDropdownSelect( - modifier, + modifier = Modifier.testTag("appIncidentSelector"), onOpenIncidents, disasterIconResId, title = title, From 25914ea8b60bd38b17fe6778f09fd7ccaddf355d Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 16:01:53 -0500 Subject: [PATCH 37/45] feat(e2e): improve incident-change e2e flow --- .maestro/work-tests/incident-change.yaml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.maestro/work-tests/incident-change.yaml b/.maestro/work-tests/incident-change.yaml index 38ce72cf3..49823dd39 100644 --- a/.maestro/work-tests/incident-change.yaml +++ b/.maestro/work-tests/incident-change.yaml @@ -8,15 +8,21 @@ tags: onFlowStart: - runFlow: ../auth-tests/login.yaml env: - INCIDENT_SELECTOR_COORDS: "9%,9%" + INCIDENT_SELECTOR_ID: appIncidentSelector FIRST_INCIDENT: ".*(flood|tornado).*" SECOND_INCIDENT: ".*(storm|hurricane|fire).*" --- +# wait for incidents to load +- waitForAnimationToEnd: + timeout: 5000 +# wait till spinner is invisible +- assertNotVisible: + id: workIncidentsLoadingIndicator - tapOn: "Menu" # Find first type incident and select it - tapOn: - point: ${INCIDENT_SELECTOR_COORDS} + id: ${INCIDENT_SELECTOR_ID} - assertVisible: "Change Incident" - scrollUntilVisible: @@ -30,7 +36,7 @@ env: # Find second type of incident and select it - tapOn: - point: ${INCIDENT_SELECTOR_COORDS} + id: ${INCIDENT_SELECTOR_ID} - assertVisible: "Change Incident" - scrollUntilVisible: @@ -44,7 +50,7 @@ env: # Find first type of incident again and select it - tapOn: - point: ${INCIDENT_SELECTOR_COORDS} + id: ${INCIDENT_SELECTOR_ID} - assertVisible: "Change Incident" - scrollUntilVisible: From d9ff4533855253a374cc38bed6078922ebfd20cf Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 16:03:37 -0500 Subject: [PATCH 38/45] feat(e2e): improve filter-headers e2e flow --- .maestro/work-tests/filters-headers.yaml | 50 ++++++++++++++---------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/.maestro/work-tests/filters-headers.yaml b/.maestro/work-tests/filters-headers.yaml index 749590784..ed1c64b33 100644 --- a/.maestro/work-tests/filters-headers.yaml +++ b/.maestro/work-tests/filters-headers.yaml @@ -8,44 +8,54 @@ tags: onFlowStart: - runFlow: ../auth-tests/login.yaml --- -- tapOn: "Filters" +# wait for incidents to load +- waitForAnimationToEnd: + timeout: 5000 +# wait till spinner is invisible +- assertNotVisible: + id: workIncidentsLoadingIndicator +- tapOn: + id: "workIncidentFilterBtn" - assertVisible: "Filters" - scrollUntilVisible: - element: "Vulnerability" + element: + id: filterHeaderCollapsibleTitle_Distance direction: DOWN - assertVisible: - text: "Vulnerability" - index: 1 + id: "filterHeaderCollapsibleTitle_Distance" - scrollUntilVisible: - element: "Distance" + element: + id: filterHeaderCollapsibleTitle_General direction: DOWN -- assertVisible: "Distance" - -- scrollUntilVisible: - element: "General" - direction: DOWN -- assertVisible: "General" +- assertVisible: + id: "filterHeaderCollapsibleTitle_General" - scrollUntilVisible: - element: "Personal Info" + element: + id: "filterHeaderCollapsibleTitle_Personal Info" direction: DOWN - assertVisible: - text: "Personal Info" - index: 0 + id: "filterHeaderCollapsibleTitle_Personal Info" - scrollUntilVisible: - element: "Flags" + element: + id: "filterHeaderCollapsibleTitle_Flags" direction: DOWN -- assertVisible: "Flags" +- assertVisible: + id: "filterHeaderCollapsibleTitle_Flags" - scrollUntilVisible: - element: "Work" + element: + id: "filterHeaderCollapsibleTitle_Work" direction: DOWN -- assertVisible: "Work" +- assertVisible: + id: "filterHeaderCollapsibleTitle_Work" - scrollUntilVisible: - element: "Dates" + element: + id: "filterHeaderCollapsibleTitle_Dates" direction: DOWN -- assertVisible: "Dates" +- assertVisible: + id: "filterHeaderCollapsibleTitle_Dates" From cb19a576b10435793244e61aabb55804eb99e273 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 16:08:50 -0500 Subject: [PATCH 39/45] feat(e2e) improve incident-search-invalid e2e flow by using testTags --- .maestro/work-tests/incident-search-invalid.yaml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.maestro/work-tests/incident-search-invalid.yaml b/.maestro/work-tests/incident-search-invalid.yaml index 1e3d449b6..2647e4a7c 100644 --- a/.maestro/work-tests/incident-search-invalid.yaml +++ b/.maestro/work-tests/incident-search-invalid.yaml @@ -10,9 +10,17 @@ env: onFlowStart: - runFlow: ../auth-tests/login.yaml --- -- tapOn: "Search" +# wait for incidents to load +- waitForAnimationToEnd: + timeout: 5000 +# start searching after loading spinner is invisible +- assertNotVisible: + id: workIncidentsLoadingIndicator +- tapOn: + id: "workIncidentSearchBtn" - assertVisible: "Search" -- tapOn: "Search" +- tapOn: + id: "workIncidentSearchTextField" - inputText: ${SEARCH_QUERY} - assertVisible: "No cases found matching ${SEARCH_QUERY}." - assertVisible: "Clear" From 22222f09531675eea6a6509b06fd02ea09fd1c77 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 16:11:24 -0500 Subject: [PATCH 40/45] feat(e2e): make improvements to incident-selector e2e flow by using testTags --- .maestro/work-tests/incident-selector.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.maestro/work-tests/incident-selector.yaml b/.maestro/work-tests/incident-selector.yaml index 9562bf572..b07b32649 100644 --- a/.maestro/work-tests/incident-selector.yaml +++ b/.maestro/work-tests/incident-selector.yaml @@ -8,12 +8,11 @@ tags: onFlowStart: - runFlow: ../auth-tests/login.yaml --- -- tapOn: "Change Incident" +- tapOn: + id: "workIncidentSelectorFab" - assertVisible: "Change Incident" - assertVisible: "Close" - "scroll" -- assertVisible: - id: "android:id/content" - assertNotVisible: "Menu" - tapOn: "Close" - assertNotVisible: "Close" From b33937732fcf47fa092b9a78d772d962219afa09 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 16:18:11 -0500 Subject: [PATCH 41/45] feat(caseeditor): add testTags for `SaveActionBar` under `CaseEditorScreen` --- .../feature/caseeditor/ui/CaseEditorScreen.kt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/CaseEditorScreen.kt b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/CaseEditorScreen.kt index 33a9ccf3f..639b9b7c7 100644 --- a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/CaseEditorScreen.kt +++ b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/CaseEditorScreen.kt @@ -22,6 +22,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -563,7 +564,9 @@ private fun SaveActionBar( ) { val style = LocalFontStyles.current.header5 BusyButton( - Modifier.weight(1f), + Modifier + .testTag("caseEditCancelBtn") + .weight(1f), text = cancelText, enabled = enable, onClick = onCancel, @@ -573,7 +576,9 @@ private fun SaveActionBar( ) if (showClaimAndSave) { BusyButton( - Modifier.weight(1.5f), + Modifier + .testTag("caseEditClaimAndSaveBtn") + .weight(1.5f), text = saveClaimText, enabled = enable, indicateBusy = isSaving, @@ -583,7 +588,9 @@ private fun SaveActionBar( ) } BusyButton( - Modifier.weight(if (showClaimAndSave) 1.1f else 1f), + Modifier + .testTag("caseEditSaveBtn") + .weight(if (showClaimAndSave) 1.1f else 1f), text = saveText, enabled = enable, indicateBusy = isSaving, From ef4712e608950a73a3dd3d129ce7a6ff2a68faa7 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 16:30:24 -0500 Subject: [PATCH 42/45] feat(caseeditor): set testTags in `PropertyDataScreen` --- .../caseeditor/ui/PropertyDataScreen.kt | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/PropertyDataScreen.kt b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/PropertyDataScreen.kt index 79e086a72..99c99eaaf 100644 --- a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/PropertyDataScreen.kt +++ b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/PropertyDataScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Size import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp @@ -64,7 +65,7 @@ internal fun PropertyFormView( val phone1Label = translator("formLabels.phone1") ErrorText(inputData.phoneNumberError) OutlinedClearableTextField( - modifier = listItemModifier, + modifier = listItemModifier.testTag("propertyPhone1TextField"), labelResId = 0, label = "$phone1Label *", value = inputData.phoneNumber, @@ -80,7 +81,7 @@ internal fun PropertyFormView( { s: String -> inputData.phoneNumberSecondary = s } } OutlinedClearableTextField( - modifier = listItemModifier, + modifier = listItemModifier.testTag("propertyPhone2TextField"), labelResId = 0, label = translator("formLabels.phone2"), value = inputData.phoneNumberSecondary, @@ -97,7 +98,7 @@ internal fun PropertyFormView( val closeKeyboard = rememberCloseKeyboard(editor) ErrorText(inputData.emailError) OutlinedClearableTextField( - modifier = listItemModifier, + modifier = listItemModifier.testTag("propertyEmailTextField"), labelResId = 0, label = translator("formLabels.email"), value = inputData.email, @@ -121,6 +122,7 @@ internal fun PropertyFormView( autoContactFrequencyLabel, viewModel.helpHint, Modifier + .testTag("propertyAutoContactFrequencyHelpRow") .listItemHorizontalPadding() // TODO Common dimensions .padding(top = 16.dp), @@ -136,6 +138,7 @@ internal fun PropertyFormView( val isSelected = inputData.autoContactFrequency == it.first CrisisCleanupRadioButton( Modifier + .testTag("propertyAutoContactFrequencyRadioBtn_${it.second}") .fillMaxWidth() .listItemHeight() .listItemPadding(), @@ -168,9 +171,11 @@ private fun PropertyFormResidentNameView( val nameLabel = translator("formLabels.name") OutlinedClearableTextField( - modifier = listItemModifier.onGloballyPositioned { - contentWidth = it.size.toSize() - }, + modifier = listItemModifier + .testTag("propertyResidentNameTextField") + .onGloballyPositioned { + contentWidth = it.size.toSize() + }, labelResId = 0, label = "$nameLabel *", value = residentName, @@ -201,6 +206,7 @@ private fun PropertyFormResidentNameView( DropdownMenu( modifier = Modifier + .testTag("propertyResidentNameDropdown") .width(with(LocalDensity.current) { contentWidth.width.toDp() }), expanded = !hideDropdown, onDismissRequest = onStopSuggestions, @@ -213,7 +219,9 @@ private fun PropertyFormResidentNameView( text = { Text( LocalAppTranslator.current("actions.stop_searching_cases"), - modifier = Modifier.offset(x = 12.dp), + modifier = Modifier + .testTag("propertyResidentNameDropdownStopSearchingText") + .offset(x = 12.dp), style = LocalFontStyles.current.header4, ) }, From cbf21b62b319a333f8ed76b867ba350b7f60c66b Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 16:53:28 -0500 Subject: [PATCH 43/45] feat(caseeditor): add testTags on `PropertyLocationViews` --- .../feature/caseeditor/ui/PropertyLocationViews.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/PropertyLocationViews.kt b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/PropertyLocationViews.kt index eeb79d757..032726c5e 100644 --- a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/PropertyLocationViews.kt +++ b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/PropertyLocationViews.kt @@ -11,6 +11,7 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -58,6 +59,7 @@ internal fun PropertyLocationView( locationText, viewModel.helpHint, modifier = Modifier + .testTag("propertyLocationHelpRow") .listItemHorizontalPadding() // TODO Common dimensions .padding(top = 16.dp), @@ -69,6 +71,7 @@ internal fun PropertyLocationView( val fullAddressLabel = translator("caseView.full_address") OutlinedSingleLineTextField( modifier = Modifier + .testTag("propertyLocationFullAddressTextField") .fillMaxWidth() .listItemPadding() .clickable( @@ -131,14 +134,14 @@ private fun LocationMapActionBar( LocalTextStyle provides LocalFontStyles.current.header4, ) { CrisisCleanupIconTextButton( - modifier = modifier, + modifier = modifier.testTag("propertyLocationSelectOnMapBtn"), iconResId = R.drawable.ic_select_on_map, label = translator("caseForm.select_on_map"), onClick = moveLocationOnMap, enabled = isEditable, ) CrisisCleanupIconTextButton( - modifier = modifier, + modifier = modifier.testTag("propertyLocationUseMyLocationBtn"), iconResId = R.drawable.ic_use_my_location, label = translator("caseForm.use_my_location"), onClick = useMyLocation, From 99c12c5b89e430d50c20c3049288e7cdff7b1203 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 16:53:51 -0500 Subject: [PATCH 44/45] feat(caseeditor): add testTag for `GoogleMap` view under `LocationScreen` --- .../com/crisiscleanup/feature/caseeditor/ui/LocationScreen.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/LocationScreen.kt b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/LocationScreen.kt index 4bc4e71d4..afef9d6ca 100644 --- a/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/LocationScreen.kt +++ b/feature/caseeditor/src/main/java/com/crisiscleanup/feature/caseeditor/ui/LocationScreen.kt @@ -25,6 +25,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.input.KeyboardType @@ -169,7 +170,7 @@ internal fun BoxScope.LocationMapView( val mapProperties by rememberMapProperties() GoogleMap( - modifier = modifier, + modifier = modifier.testTag("mapView"), uiSettings = uiSettings, properties = mapProperties, cameraPositionState = cameraPositionState, From 9c0d1a2f4a055ed3edacd048f250dbbd9bdc8399 Mon Sep 17 00:00:00 2001 From: Deep Panchal Date: Wed, 16 Aug 2023 16:54:18 -0500 Subject: [PATCH 45/45] feat(designsystem): add testTags for `OpenSettingsDialog` in `ExplainLocationPermissionDialog` --- .../component/ExplainLocationPermissionDialog.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/ExplainLocationPermissionDialog.kt b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/ExplainLocationPermissionDialog.kt index 8cea3a203..9592d4397 100644 --- a/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/ExplainLocationPermissionDialog.kt +++ b/core/designsystem/src/main/java/com/crisiscleanup/core/designsystem/component/ExplainLocationPermissionDialog.kt @@ -4,7 +4,9 @@ import android.content.Intent import android.net.Uri import android.provider.Settings import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.testTag import androidx.core.content.ContextCompat import com.crisiscleanup.core.designsystem.LocalAppTranslator @@ -24,7 +26,8 @@ fun OpenSettingsDialog( dismissButton = { CrisisCleanupTextButton( text = dismissText, - onClick = closeDialog + onClick = closeDialog, + modifier = Modifier.testTag("ccuAlertDialogDismissBtn") ) }, confirmButton = { @@ -36,7 +39,8 @@ fun OpenSettingsDialog( } ContextCompat.startActivity(context, intent, null) closeDialog() - } + }, + modifier = Modifier.testTag("ccuAlertDialogConfirmBtn") ) }, )