From 22b938bc2b8e40eb1d6ef480c7cd42bfa43d3816 Mon Sep 17 00:00:00 2001 From: Therese <94404065+TKDickson@users.noreply.github.com> Date: Tue, 12 Nov 2024 09:28:18 -0600 Subject: [PATCH 1/6] doc/7623 bug ticket frequency definition updates (#10153) --- .../documentation/docs/QA/QualityAssuranceProcess/index.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/index.md b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/index.md index dae3addd2cd..d73a766cef1 100644 --- a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/index.md +++ b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/index.md @@ -69,8 +69,9 @@ All issue tickets should be written using the [issue ticket template](https://gi | **Frequency** | **Definition** | **Examples** | | --- | --- | --- | -| High frequency | Affects a component, screen, or action used by 15% or more of monthly users | Authentication, home page (including What's New and Encouraged Update), category landing screens, feature landing or child screens for most-used features (Claims, Upcoming Appointments, and Decision Letters), feature landing or child screens for next-most-used features (Prescriptions, Payments, Messaging, Letters, Disability Rating, and Military Info), and downloading a letter (decision or any other kind) | -| Low frequency | Affects a component, screen, or action used by 14% or fewer of monthly users | All other app actions (send message, upload file, etc); and all screens not listed in high frequency examples | +| High frequency | Affects a component, screen, or action used by 15% or more of monthly users | - Authentication/login
- Home page (including What's New and Encouraged Update)
- Category landing screens (Health, Benefits, Payments and Profile)
- Feature landing and child screens for most-used features (Prescriptions, Upcoming Appointments, and Secure Messaging)
- Feature landing and child screens for next-most-used features (Claims, Disability Rating, Letters, Payment History)
- Key actions from the features already listed: med refill, sending a message (new or reply), and downloading a letter (decision or any other kind) | +| Low frequency | Affects a component, screen, or action used by 14% or fewer of monthly users | All other all screens and app actions (upload file, change demographic info, etc) not listed in high frequency examples | +_Frequency examples informed by the [Flagship Mobile Monthly Report](https://lookerstudio.google.com/reporting/e28cd59a-b2e5-4f29-8ae4-a4eea6d23f9c/page/p_xatxe90k9c)_ ### User-submitted Bug Reports From 4b2350aa90c274f3061a24bd62deacaab675f2e9 Mon Sep 17 00:00:00 2001 From: Rachael Bontrager Date: Tue, 12 Nov 2024 10:14:33 -0600 Subject: [PATCH 2/6] bug/10117-rachael-detox-fix-onboarding-after-push-notifications (#10120) --- .github/workflows/e2e_detox_mapping.yml | 2 +- VAMobile/e2e/tests/Onboarding.e2e.ts | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e_detox_mapping.yml b/.github/workflows/e2e_detox_mapping.yml index 000c07e8344..2c86b02b9af 100644 --- a/.github/workflows/e2e_detox_mapping.yml +++ b/.github/workflows/e2e_detox_mapping.yml @@ -93,7 +93,7 @@ jobs: select(contains(["auth"])) += ["SignIn"] | select(contains(["authorizedServices"])) += ["Appeals", "AppealsExpanded", "Appointments", "AppointmentsExpanded", "Claims", "DirectDeposit", "DisabilityRatings", "PersonalInformationScreen", "VALetters", "MilitaryInformation", "Payments", "Prescriptions", "Messages", "VeteranStatusCard"] | select(contains(["contactInformation"]) or contains(["ContactInformationScreen"])) += ["ContactInformation", "VALetters"] | - select(contains(["NotificationManager"])) += ["SettingsScreen", "PushNotifications"] | + select(contains(["NotificationManager"])) += ["SettingsScreen", "PushNotifications", "Onboarding"] | select(contains(["Types"]) or contains(["VAImage"])) += ["AvailabilityFramework", "Cerner", "ContactInformation", "VALetters", "LoginScreen", "Onboarding", "ProfileScreen", "PushNotifications", "SettingsScreen", "SignIn", "VaccineRecords", "Claims", "Appeals", "AppealsExpanded", "DisabilityRatings", "Appointments", "AppointmentsExpanded", "Prescriptions", "Messages", "MilitaryInformation", "HomeScreen", "VeteransCrisisLine", "VeteranStatusCard", "DirectDeposit", "Payments", "PersonalInformationScreen"] | unique') diff --git a/VAMobile/e2e/tests/Onboarding.e2e.ts b/VAMobile/e2e/tests/Onboarding.e2e.ts index 930fb292252..7a6c41c3f69 100644 --- a/VAMobile/e2e/tests/Onboarding.e2e.ts +++ b/VAMobile/e2e/tests/Onboarding.e2e.ts @@ -5,6 +5,7 @@ import { CommonE2eIdConstants, checkImages, loginToDemoMode } from './utils' export const OnboardingE2eIdConstants = { VA_ICON_ID: 'VAIconOnboardingLogo', DONE_NEXT_BUTTON_ID: 'onboardingDoneNextButtonID', + NOTIFICATIONS_PAGE_HEADER: 'Stay updated with app notifications', } beforeAll(async () => { @@ -70,20 +71,25 @@ describe('Onboarding Screen', () => { await expect(element(by.text('Welcome, Kimberly'))).toExist() }) - it('verify the home page is displayed after tapping done', async () => { + it('verify the notifications page is displayed after tapping done', async () => { await element(by.id(OnboardingE2eIdConstants.DONE_NEXT_BUTTON_ID)).tap() await element(by.id(OnboardingE2eIdConstants.DONE_NEXT_BUTTON_ID)).tap() await element(by.id(OnboardingE2eIdConstants.DONE_NEXT_BUTTON_ID)).tap() await element(by.id(OnboardingE2eIdConstants.DONE_NEXT_BUTTON_ID)).tap() - await expect(element(by.text(CommonE2eIdConstants.HOME_ACTIVITY_HEADER_TEXT))).toExist() + await expect(element(by.text(OnboardingE2eIdConstants.NOTIFICATIONS_PAGE_HEADER))).toExist() }) - it('verify the home page is displayed after skipping', async () => { + it('verify the notifications page is displayed after skipping', async () => { await device.uninstallApp() await device.installApp() await device.launchApp({ newInstance: true, permissions: { notifications: 'YES' } }) await loginToDemoMode(false) await element(by.id(CommonE2eIdConstants.SKIP_BACK_BUTTON_ID)).tap() + await expect(element(by.text(OnboardingE2eIdConstants.NOTIFICATIONS_PAGE_HEADER))).toExist() + }) + + it('verify the home page is displayed after tapping turn on notifications', async () => { + await element(by.text('Turn on notifications')).tap() await expect(element(by.text(CommonE2eIdConstants.HOME_ACTIVITY_HEADER_TEXT))).toExist() }) }) From c84de4aee642ca2dc1b71426ea4e927e8a92d3c0 Mon Sep 17 00:00:00 2001 From: Dave Formanek <184258725+oddballdave@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:01:46 -0700 Subject: [PATCH 3/6] chore/9994-Usei18nInUnitTests-Home-2 (#10140) --- .../ContactVAScreen/ContactVAScreen.test.tsx | 16 ++++++------- .../ProfileScreen/ProfileScreen.test.tsx | 13 +++++------ .../VeteransCrisisLineScreen.test.tsx | 23 ++++++++----------- 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/VAMobile/src/screens/HomeScreen/ContactVAScreen/ContactVAScreen.test.tsx b/VAMobile/src/screens/HomeScreen/ContactVAScreen/ContactVAScreen.test.tsx index 71eab71b885..101314e4ffc 100644 --- a/VAMobile/src/screens/HomeScreen/ContactVAScreen/ContactVAScreen.test.tsx +++ b/VAMobile/src/screens/HomeScreen/ContactVAScreen/ContactVAScreen.test.tsx @@ -1,8 +1,10 @@ import React from 'react' import { screen } from '@testing-library/react-native' +import { t } from 'i18next' import { context, mockNavProps, render } from 'testUtils' +import { displayedTextPhoneNumber } from 'utils/formattingUtils' import ContactVAScreen from './ContactVAScreen' @@ -18,14 +20,10 @@ context('ContactVAScreen', () => { }) it('initializes correctly', () => { - expect(screen.getByRole('link', { name: 'Talk to the Veterans Crisis Line now' })).toBeTruthy() - expect(screen.getByRole('header', { name: 'Call MyVA411' })).toBeTruthy() - expect( - screen.getByText( - 'MyVA411 is our main VA information line. We can help connect you to any of our VA contact centers.', - ), - ).toBeTruthy() - expect(screen.getByRole('link', { name: '800-698-2411' })).toBeTruthy() - expect(screen.getByRole('link', { name: 'TTY: 711' })).toBeTruthy() + expect(screen.getByRole('link', { name: t('crisisLineButton.label') })).toBeTruthy() + expect(screen.getByRole('header', { name: t('contactVA.va411.callMy') })).toBeTruthy() + expect(screen.getByText(t('contactVA.va411.body'))).toBeTruthy() + expect(screen.getByRole('link', { name: displayedTextPhoneNumber(t('8006982411')) })).toBeTruthy() + expect(screen.getByRole('link', { name: t('contactVA.tty.displayText') })).toBeTruthy() }) }) diff --git a/VAMobile/src/screens/HomeScreen/ProfileScreen/ProfileScreen.test.tsx b/VAMobile/src/screens/HomeScreen/ProfileScreen/ProfileScreen.test.tsx index eb0885e90a3..06e637921d1 100644 --- a/VAMobile/src/screens/HomeScreen/ProfileScreen/ProfileScreen.test.tsx +++ b/VAMobile/src/screens/HomeScreen/ProfileScreen/ProfileScreen.test.tsx @@ -1,6 +1,7 @@ import React from 'react' import { screen } from '@testing-library/react-native' +import { t } from 'i18next' import { personalInformationKeys } from 'api/personalInformation/queryKeys' import { BranchesOfServiceConstants, MilitaryServiceHistoryData, ServiceHistoryAttributes } from 'api/types' @@ -75,10 +76,10 @@ context('ProfileScreen', () => { .calledWith('/v0/military-service-history') .mockResolvedValue(militaryServiceHistoryData) initializeTestInstance() - await waitFor(() => expect(screen.queryByText('Personal information')).toBeFalsy()) - await waitFor(() => expect(screen.queryByText('Contact information')).toBeFalsy()) - await waitFor(() => expect(screen.getByText('Military information')).toBeTruthy()) - await waitFor(() => expect(screen.getByText('Settings')).toBeTruthy()) + await waitFor(() => expect(screen.queryByText(t('personalInformation.title'))).toBeFalsy()) + await waitFor(() => expect(screen.queryByText(t('contactInformation.title'))).toBeFalsy()) + await waitFor(() => expect(screen.getByText(t('militaryInformation.title'))).toBeTruthy()) + await waitFor(() => expect(screen.getByText(t('settings.title'))).toBeTruthy()) }) }) @@ -89,9 +90,7 @@ context('ProfileScreen', () => { .mockRejectedValue({ networkError: true } as api.APIError) initializeTestInstance() - await waitFor(() => - expect(screen.getByText('We can’t show all your information right now. Check back later.')).toBeTruthy(), - ) + await waitFor(() => expect(screen.getByText(t('aboutYou.error.cantShowAllInfo'))).toBeTruthy()) }) }) }) diff --git a/VAMobile/src/screens/HomeScreen/VeteransCrisisLineScreen/VeteransCrisisLineScreen.test.tsx b/VAMobile/src/screens/HomeScreen/VeteransCrisisLineScreen/VeteransCrisisLineScreen.test.tsx index b8a8c907e3d..8d6a4e2c48d 100644 --- a/VAMobile/src/screens/HomeScreen/VeteransCrisisLineScreen/VeteransCrisisLineScreen.test.tsx +++ b/VAMobile/src/screens/HomeScreen/VeteransCrisisLineScreen/VeteransCrisisLineScreen.test.tsx @@ -2,6 +2,7 @@ import React from 'react' import { Alert } from 'react-native' import { fireEvent, screen } from '@testing-library/react-native' +import { t } from 'i18next' import { context, render } from 'testUtils' @@ -13,23 +14,19 @@ context('VeteransCrisisLineScreen', () => { }) it('initializes correctly', () => { - expect(screen.getByRole('header', { name: 'We’re here anytime, day or night – 24/7' })).toBeTruthy() - expect( - screen.getByText( - "If you're a Veteran in crisis or concerned about one, connect with our caring, qualified responders for confidential help. Many of them are Veterans themselves.", - ), - ).toBeTruthy() - expect(screen.getByRole('link', { name: 'Call 988 and select 1' })).toBeTruthy() - expect(screen.getByRole('link', { name: 'Text 838255' })).toBeTruthy() - expect(screen.getByRole('link', { name: 'Start a confidential chat' })).toBeTruthy() - expect(screen.getByRole('link', { name: 'TTY: 800-799-4889' })).toBeTruthy() - expect(screen.getByRole('header', { name: 'Get more resources' })).toBeTruthy() - expect(screen.getByRole('link', { name: 'VeteransCrisisLine.net' })).toBeTruthy() + expect(screen.getByRole('header', { name: t('veteransCrisisLine.weAreHereForYou') })).toBeTruthy() + expect(screen.getByText(t('veteransCrisisLine.connectWithResponders'))).toBeTruthy() + expect(screen.getByRole('link', { name: t('veteransCrisisLine.crisisCallNumberDisplayed') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('veteransCrisisLine.textNumberDisplayed') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('veteransCrisisLine.startConfidentialChat') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('veteransCrisisLine.hearingLossNumberDisplayed') })).toBeTruthy() + expect(screen.getByRole('header', { name: t('veteransCrisisLine.getMoreResources') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('veteransCrisisLine.urlDisplayed') })).toBeTruthy() }) describe('when the veteransCrisisLine.net link is clicked', () => { it('should show alert', () => { - fireEvent.press(screen.getByRole('link', { name: 'VeteransCrisisLine.net' })) + fireEvent.press(screen.getByRole('link', { name: t('veteransCrisisLine.urlDisplayed') })) expect(Alert.alert).toBeCalled() }) }) From ad27d7ddc41e2a4d027d0ed8509320efffa5c72e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 11:18:36 -0800 Subject: [PATCH 4/6] Bump react-native-webview from 13.10.4 to 13.12.3 in /VAMobile (#10155) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- VAMobile/package.json | 2 +- VAMobile/yarn.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/VAMobile/package.json b/VAMobile/package.json index aaf8311505e..5d0c6b47bed 100644 --- a/VAMobile/package.json +++ b/VAMobile/package.json @@ -83,7 +83,7 @@ "react-native-svg-transformer": "^1.5.0", "react-native-toast-notifications": "^3.4.0", "react-native-webp-format": "^1.2.0", - "react-native-webview": "^13.10.4", + "react-native-webview": "^13.12.3", "react-redux": "^9.1.2", "styled-components": "^5.3.10", "underscore": "^1.13.7" diff --git a/VAMobile/yarn.lock b/VAMobile/yarn.lock index 028396cb42d..20f7537ff3a 100644 --- a/VAMobile/yarn.lock +++ b/VAMobile/yarn.lock @@ -5203,16 +5203,16 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -9345,12 +9345,12 @@ react-native-webp-format@^1.2.0: resolved "https://registry.yarnpkg.com/react-native-webp-format/-/react-native-webp-format-1.2.0.tgz#6c7cbed4cdc8247711c7d7f656d0d4f739836c82" integrity sha512-tUL/AbM6QwUsxsGutJ1bN4RW8JdD2w5Mpj+An4DvYKkm0bKHbODj7U7gI1+8X68GqJWOy+Ps2cbVmgNpSDfRPQ== -react-native-webview@^13.10.4: - version "13.10.4" - resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-13.10.4.tgz#9b84d9ebc07f55d9e19d4e42074a77e33005fa0b" - integrity sha512-kRn70M7vyBS3IDaX2KqyF66ovUkrBS6LiHOgrEmRdZFO0i3hYY0wldEv1fJuKvgQIPMfo7GtGAjozFrk2vQdBw== +react-native-webview@^13.12.3: + version "13.12.3" + resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-13.12.3.tgz#3aa9d2fc982ba2681e56d3e96e22b63a0d929270" + integrity sha512-Y1I5YyDYyE7NC96RHLhd2nxh7ymLYOYLTefgx5ixxw2OToQK0ow3OJ+o77QcI1Tuevj5PCxwqC/14ceS/7yPJQ== dependencies: - escape-string-regexp "2.0.0" + escape-string-regexp "^4.0.0" invariant "2.2.4" react-native@*, react-native@0.75.3: From d34f8df53c236c03a45f7137d65afe1c85011af0 Mon Sep 17 00:00:00 2001 From: VA Automation Bot Date: Wed, 13 Nov 2024 07:05:40 +0000 Subject: [PATCH 5/6] Automated bundler and fastlane updates --- VAMobile/android/Gemfile.lock | 10 +++++----- VAMobile/ios/Gemfile.lock | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/VAMobile/android/Gemfile.lock b/VAMobile/android/Gemfile.lock index f715530f744..52415a9144c 100644 --- a/VAMobile/android/Gemfile.lock +++ b/VAMobile/android/Gemfile.lock @@ -10,8 +10,8 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.1001.0) - aws-sdk-core (3.211.0) + aws-partitions (1.1005.0) + aws-sdk-core (3.212.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) @@ -19,7 +19,7 @@ GEM aws-sdk-kms (1.95.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.169.0) + aws-sdk-s3 (1.170.1) aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -160,7 +160,7 @@ GEM domain_name (~> 0.5) httpclient (2.8.3) jmespath (1.6.2) - json (2.7.6) + json (2.8.1) jwt (2.9.3) base64 mini_magick (4.13.2) @@ -171,7 +171,7 @@ GEM nanaimo (0.4.0) naturally (2.2.1) nkf (0.2.0) - optparse (0.5.0) + optparse (0.6.0) os (1.1.4) plist (3.7.1) public_suffix (6.0.1) diff --git a/VAMobile/ios/Gemfile.lock b/VAMobile/ios/Gemfile.lock index 4ce56818fa0..743107a8657 100644 --- a/VAMobile/ios/Gemfile.lock +++ b/VAMobile/ios/Gemfile.lock @@ -25,8 +25,8 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.1001.0) - aws-sdk-core (3.211.0) + aws-partitions (1.1005.0) + aws-sdk-core (3.212.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) @@ -34,7 +34,7 @@ GEM aws-sdk-kms (1.95.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.169.0) + aws-sdk-s3 (1.170.1) aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -42,7 +42,7 @@ GEM aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) base64 (0.2.0) - benchmark (0.3.0) + benchmark (0.4.0) bigdecimal (3.1.8) claide (1.1.0) cocoapods (1.16.2) @@ -221,7 +221,7 @@ GEM i18n (1.14.6) concurrent-ruby (~> 1.0) jmespath (1.6.2) - json (2.7.6) + json (2.8.1) jwt (2.9.3) base64 logger (1.6.1) @@ -236,7 +236,7 @@ GEM naturally (2.2.1) netrc (0.11.0) nkf (0.2.0) - optparse (0.5.0) + optparse (0.6.0) os (1.1.4) plist (3.7.1) public_suffix (4.0.7) @@ -251,7 +251,7 @@ GEM ruby-macho (2.5.1) ruby2_keywords (0.0.5) rubyzip (2.3.2) - securerandom (0.3.1) + securerandom (0.3.2) security (0.1.5) signet (0.19.0) addressable (~> 2.8) From 77c3e5e85434305595b3bf859855f06681537cce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Nov 2024 08:56:27 -0500 Subject: [PATCH 6/6] Bump serve-static from 1.15.0 to 1.16.2 in /VAMobile in the npm_and_yarn group (#9582) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tim Wright <459581+timwright12@users.noreply.github.com> Co-authored-by: Theo Bentum