Skip to content

Commit

Permalink
Merge branch 'develop' into 9661-add-dod-to-proof-of-vs
Browse files Browse the repository at this point in the history
  • Loading branch information
cadibemma committed Nov 25, 2024
2 parents 6165f33 + a56b2cc commit b9032d8
Show file tree
Hide file tree
Showing 19 changed files with 270 additions and 139 deletions.
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/release_ticket.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Release Review Template
about: Template for requesting a production release for VA mobile app
title: "{{ env.releaseDate }} Release Sign-Off: {{ env.versionNumber }}"
labels: release
assignees: timwright12, chrisj-usds, dumathane, rachelhanster, SarahHuber-AdHoc, DonMcCaugheyUSDS, TKDickson
assignees: timwright12, chrisj-usds, dumathane, SarahHuber-AdHoc, DonMcCaugheyUSDS, TKDickson

---

Expand Down
67 changes: 67 additions & 0 deletions .github/workflows/app_store_checks_apple.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
name: "App Store requirement checks"

on:
pull_request:
branches:
- main
- develop
- 'release/v**'
paths:
- "VAMobile/ios/fastlane/metadata/en-US/**"
- "VAMobile/ios/fastlane/screenshots/**"

jobs:
check_ios_ipad_pro2_images:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 10
working_dir: VAMobile/ios/fastlane/screenshots/en-US
file_counting_function: find . -maxdepth 1 -name "ipadPro2*" -printf '.' | wc -m
check_ios_ipad_pro13_images:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 10
working_dir: VAMobile/ios/fastlane/screenshots/en-US
file_counting_function: find . -maxdepth 1 -name "ipadPro13*" -printf '.' | wc -m
check_ios_ipad_pro129_images:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 10
working_dir: VAMobile/ios/fastlane/screenshots/en-US
file_counting_function: find . -maxdepth 1 -name "ipadPro12*" -printf '.' | wc -m
check_ios_iphone55_images:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 10
working_dir: VAMobile/ios/fastlane/screenshots/en-US
file_counting_function: find . -maxdepth 1 -name "phone5*" -printf '.' | wc -m
check_ios_iphone67_images:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 10
working_dir: VAMobile/ios/fastlane/screenshots/en-US
file_counting_function: find . -maxdepth 1 -name "iphone6*" -printf '.' | wc -m
check_ios_description:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 4000
working_dir: VAMobile/ios/fastlane/metadata/en-US
file_counting_function: wc -c description.txt | awk '{print $1}'
check_ios_release_notes:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 4000
working_dir: VAMobile/ios/fastlane/metadata/en-US
file_counting_function: wc -c release_notes.txt | awk '{print $1}'
check_ios_keyword:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 1000
working_dir: VAMobile/ios/fastlane/metadata/en-US
file_counting_function: wc -c keywords.txt | awk '{print $1}'
check_ios_title:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 50
working_dir: VAMobile/ios/fastlane/metadata/en-US
file_counting_function: wc -c title.txt | awk '{print $1}'
48 changes: 48 additions & 0 deletions .github/workflows/app_store_checks_google.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: "App Store requirement checks"

on:
pull_request:
branches:
- main
- develop
- 'release/v**'
paths:
- "VAMobile/android/fastlane/metadata/android/en-US/**"

jobs:
check_max_android_phone_screenshots:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 8
working_dir: VAMobile/android/fastlane/metadata/android/en-US/images/phoneScreenshots
file_counting_function: ls | wc -l
check_max_android_seven_inch_screenshots:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 8
working_dir: VAMobile/android/fastlane/metadata/android/en-US/images/sevenInchScreenshots
file_counting_function: ls | wc -l
check_android_long_description:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 4000
working_dir: VAMobile/android/fastlane/metadata/android/en-US
file_counting_function: wc -c full-description.txt | awk '{print $1}'
check_android_short_description:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 80
working_dir: VAMobile/android/fastlane/metadata/android/en-US
file_counting_function: wc -c short-description.txt | awk '{print $1}'
check_android_change_log:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 500
working_dir: VAMobile/android/fastlane/metadata/android/en-US/changelogs
file_counting_function: wc -c default.txt | awk '{print $1}'
check_android_release_name:
uses: ./.github/workflows/check_max_size.yml
with:
max_size: 50
working_dir: VAMobile/android/fastlane/metadata/android/en-US
file_counting_function: wc -c title.txt | awk '{print $1}'
25 changes: 25 additions & 0 deletions .github/workflows/check_max_size.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
on:
workflow_call:
inputs:
working_dir:
required: true
type: string
max_size:
required: true
type: string
file_counting_function:
required: true
type: string

jobs:
check_max_files:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: |
if [[ $(${{ inputs.file_counting_function }}) -gt ${{ inputs.max_size }} ]]
then
echo "PR exceeds app store limits of ${{ inputs.max_size }} for this check"
exit 1
fi
working-directory: ${{ inputs.working_dir }}
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,20 @@ Because the release is tied into a commit and not the current state of the branc
5. Run `git pull` to ensure you have the latest changes
6. Tag the branch with the version we're trying to release: `git tag -a RC-vX.XX.0-XXXXXX-XXXX -m RC-vX.XX.0-XXXXXX-XXXX`
7. Push the tag `git push origin RC-vX.XX.0-XXXXXX-XXXX`

## Release Ticket Failure

Outlined below are the steps to follow when the automation to create a release ticket and Slack coordination thread fails due to issues like incorrect GitHub username assignment.

1. Update the [release_ticket](https://github.com/department-of-veterans-affairs/va-mobile-app/blob/develop/.github/ISSUE_TEMPLATE/release_ticket.md) template with the correct GitHub username and push to Github
2. Determine the version number of the build (vX.X.X) and RC tag RC-vX.XX.0-XXXXXX-XXXX you want to delete
3. Delete the local release candidate tag: `git tag --delete RC-vX.XX.0-XXXXXX-XXXX`
4. Delete the remote tag: `git push --delete origin <RC-vX.XX.0-XXXXXX-XXXX>`
5. Delete the local release branch : `git branch -d <release/vX.X.X>`
6. Delete the remote release branch: `git push origin --delete <release/vX.X.X>`
7. Manually ran the [new_release_branch](https://github.com/department-of-veterans-affairs/va-mobile-app/blob/develop/.github/workflows/new_release_branch.yml) workflow using workflow_dispatch.
8. Confirm that:
1. New RC tag.
2. New release branch.
3. release ticket has been created.
4. Slack thread coordination has been triggered on va-mobile-app channel.
8 changes: 4 additions & 4 deletions VAMobile/e2e/tests/Cerner.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,17 @@ beforeAll(async () => {
await openDeveloperScreen()
await waitFor(element(by.text('Remote Config')))
.toBeVisible()
.whileElement(by.id('developerScreenTestID'))
.whileElement(by.id(CommonE2eIdConstants.DEVELOPER_SCREEN_SCROLL_ID))
.scroll(200, 'down')
await element(by.text('Remote Config')).tap()
await waitFor(element(by.text('cernerTrueForDemo')))
.toBeVisible()
.whileElement(by.id('remoteConfigTestID'))
.whileElement(by.id(CommonE2eIdConstants.REMOTE_CONFIG_TEST_ID))
.scroll(200, 'down')
await element(by.text('cernerTrueForDemo')).tap()
await waitFor(element(by.text('Apply Overrides')))
.toBeVisible()
.whileElement(by.id('remoteConfigTestID'))
.whileElement(by.id(CommonE2eIdConstants.REMOTE_CONFIG_TEST_ID))
.scroll(200, 'down')
await element(by.text('Apply Overrides')).tap()

Expand All @@ -63,7 +63,7 @@ describe(':android: Cerner Notice', () => {
it('should match the cerner subtext on home screen', async () => {
await waitFor(element(by.text(CernerIdConstants.CERNER_HOME_SUBTEXT_TEXT)))
.toBeVisible()
.whileElement(by.id('homeScreenID'))
.whileElement(by.id(CommonE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.scroll(200, 'down')
await expect(element(by.text(CernerIdConstants.CERNER_HOME_SUBTEXT_TEXT))).toExist()
})
Expand Down
26 changes: 12 additions & 14 deletions VAMobile/e2e/tests/ContactInformation.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { setTimeout } from 'timers/promises'
import { CommonE2eIdConstants, loginToDemoMode, openContactInfo, openProfile, toggleRemoteConfigFlag } from './utils'

export const ContactInfoE2eIdConstants = {
CONTACT_INFO_PAGE_ID: 'ContactInfoTestID',
MAILING_ADDRESS_ID: 'Mailing address 3101 N Fort Valley Rd Flagstaff, AZ, 86001',
MAILING_ADDRESS_2_ID: 'Mailing address 3101 N Fort Valley Rd, 2 Flagstaff, AZ, 86001',
HOME_ADDRESS_ID: 'Home address Add your home address',
Expand All @@ -27,7 +26,6 @@ export const ContactInfoE2eIdConstants = {
CANCEL_KEEP_EDITING_TEXT: device.getPlatform() === 'ios' ? 'Keep Editing' : 'Keep Editing ',
REMOVE_KEEP_TEXT: 'Keep',
REMOVE_REMOVE_TEXT: 'Remove',
SAVE_TEXT: 'Save',
DISMISS_TEXT: 'Dismiss',
EDIT_ADDRESS_ID: 'EditAddressTestID',
COUNTRY_PICKER_CONFIRM_ID: 'countryPickerConfirmID',
Expand Down Expand Up @@ -82,10 +80,10 @@ export async function fillHomeAddressFields() {

export async function validateAddresses(addressID: string, addressType: string) {
it('update the ' + addressType + ' address', async () => {
await element(by.id(ContactInfoE2eIdConstants.CONTACT_INFO_PAGE_ID)).scrollTo('top')
await element(by.id(CommonE2eIdConstants.CONTACT_INFO_SCREEN_ID)).scrollTo('top')
await waitFor(element(by.id(addressID)))
.toBeVisible()
.whileElement(by.id(ContactInfoE2eIdConstants.CONTACT_INFO_PAGE_ID))
.whileElement(by.id(CommonE2eIdConstants.CONTACT_INFO_SCREEN_ID))
.scroll(50, 'down')
await element(by.id(addressID)).tap()
})
Expand Down Expand Up @@ -124,10 +122,10 @@ export async function validateAddresses(addressID: string, addressType: string)
})

it('should open and update the ' + addressType + ' address', async () => {
await element(by.id(ContactInfoE2eIdConstants.CONTACT_INFO_PAGE_ID)).scrollTo('top')
await element(by.id(CommonE2eIdConstants.CONTACT_INFO_SCREEN_ID)).scrollTo('top')
await waitFor(element(by.id(addressID)))
.toBeVisible()
.whileElement(by.id(ContactInfoE2eIdConstants.CONTACT_INFO_PAGE_ID))
.whileElement(by.id(CommonE2eIdConstants.CONTACT_INFO_SCREEN_ID))
.scroll(100, 'down')
await element(by.id(addressID)).tap()
await element(by.id(CommonE2eIdConstants.CONTACT_INFO_STREET_ADDRESS_LINE_2_ID)).typeText('2')
Expand Down Expand Up @@ -183,7 +181,7 @@ export async function validatePhoneNumbers(phoneID: string, phoneType: string) {
it('should open the ' + phoneType + ' phone number', async () => {
await waitFor(element(by.id(phoneID)))
.toBeVisible()
.whileElement(by.id(ContactInfoE2eIdConstants.CONTACT_INFO_PAGE_ID))
.whileElement(by.id(CommonE2eIdConstants.CONTACT_INFO_SCREEN_ID))
.scroll(100, 'down')
await element(by.id(phoneID)).tap()
})
Expand Down Expand Up @@ -243,7 +241,7 @@ export async function validatePhoneNumbers(phoneID: string, phoneType: string) {
it('should update the ' + phoneType + ' with an extension', async () => {
await waitFor(element(by.id(phoneID)))
.toBeVisible()
.whileElement(by.id(ContactInfoE2eIdConstants.CONTACT_INFO_PAGE_ID))
.whileElement(by.id(CommonE2eIdConstants.CONTACT_INFO_SCREEN_ID))
.scroll(100, 'down')
await element(by.id(phoneID)).tap()
if (phoneType === 'Work') {
Expand Down Expand Up @@ -279,7 +277,7 @@ export async function validatePhoneNumbers(phoneID: string, phoneType: string) {
it(phoneType + ': verify user can remove the extension', async () => {
await waitFor(element(by.id(phoneID)))
.toBeVisible()
.whileElement(by.id(ContactInfoE2eIdConstants.CONTACT_INFO_PAGE_ID))
.whileElement(by.id(CommonE2eIdConstants.CONTACT_INFO_SCREEN_ID))
.scroll(100, 'down')
await element(by.id(phoneID)).tap()
await element(by.id(ContactInfoE2eIdConstants.PHONE_NUMBER_EXTENSION_ID)).clearText()
Expand All @@ -301,10 +299,10 @@ export async function validatePhoneNumbers(phoneID: string, phoneType: string) {

export async function removeContactInfoFeature(contactInfoTypeText: string, type: string) {
it('should tap remove ' + type + ' and verify remove pop up appears', async () => {
await element(by.id(ContactInfoE2eIdConstants.CONTACT_INFO_PAGE_ID)).scrollTo('top')
await element(by.id(CommonE2eIdConstants.CONTACT_INFO_SCREEN_ID)).scrollTo('top')
await waitFor(element(by.id(contactInfoTypeText)))
.toBeVisible()
.whileElement(by.id(ContactInfoE2eIdConstants.CONTACT_INFO_PAGE_ID))
.whileElement(by.id(CommonE2eIdConstants.CONTACT_INFO_SCREEN_ID))
.scroll(100, 'down')
await element(by.id(contactInfoTypeText)).tap()
await element(by.text('Remove ' + type)).tap()
Expand Down Expand Up @@ -443,7 +441,7 @@ describe(':ios: Contact Info Screen', () => {
removeContactInfoFeature(ContactInfoE2eIdConstants.MOBILE_PHONE_ID, 'mobile phone')

it('should open the email address', async () => {
await element(by.id(ContactInfoE2eIdConstants.CONTACT_INFO_PAGE_ID)).scrollTo('bottom')
await element(by.id(CommonE2eIdConstants.CONTACT_INFO_SCREEN_ID)).scrollTo('bottom')
await element(by.id(ContactInfoE2eIdConstants.EMAIL_ADDRESS_ID)).tap()
})

Expand All @@ -469,7 +467,7 @@ describe(':ios: Contact Info Screen', () => {
})

it('should update the email address and remove the +', async () => {
await element(by.id(ContactInfoE2eIdConstants.CONTACT_INFO_PAGE_ID)).scrollTo('bottom')
await element(by.id(CommonE2eIdConstants.CONTACT_INFO_SCREEN_ID)).scrollTo('bottom')
await element(by.id(ContactInfoE2eIdConstants.EMAIL_ADDRESS_ID)).tap()
await element(by.id(ContactInfoE2eIdConstants.EMAIL_ADDRESS_EDIT_ID)).clearText()
await element(by.id(ContactInfoE2eIdConstants.EMAIL_ADDRESS_EDIT_ID)).typeText('[email protected]')
Expand All @@ -483,7 +481,7 @@ describe(':ios: Contact Info Screen', () => {
await expect(element(by.text('Email address saved'))).toExist()
await element(by.text(ContactInfoE2eIdConstants.DISMISS_TEXT)).tap()
} catch (ex) {}
await element(by.id(ContactInfoE2eIdConstants.CONTACT_INFO_PAGE_ID)).scrollTo('top')
await element(by.id(CommonE2eIdConstants.CONTACT_INFO_SCREEN_ID)).scrollTo('top')
})

removeContactInfoFeature(ContactInfoE2eIdConstants.EMAIL_ADDRESS_ID, 'email address')
Expand Down
15 changes: 7 additions & 8 deletions VAMobile/e2e/tests/HomeScreen.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ export const HomeE2eIdConstants = {
DISABILITY_RATING_SUBTEXT_TEXT: 'service connected',
MONTHLY_PAYMENT_TITLE_TEXT: 'Monthly compensation payment',
MONTHLY_PAYMENT_AMOUNT_TEXT: '$3,084.75',
HOME_SCREEN_SCROLL_ID: 'homeScreenID',
}

beforeAll(async () => {
Expand Down Expand Up @@ -112,7 +111,7 @@ describe('Home Screen', () => {
await element(by.text(CommonE2eIdConstants.HOME_TAB_BUTTON_TEXT)).tap()
await waitFor(element(by.text(HomeE2eIdConstants.APPOINTMENTS_BUTTON_SUBTEXT_TEXT)))
.toBeVisible()
.whileElement(by.id(HomeE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.whileElement(by.id(CommonE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.scroll(200, 'down')
await element(by.text(HomeE2eIdConstants.APPOINTMENTS_BUTTON_SUBTEXT_TEXT)).atIndex(0).tap()
await expect(element(by.text(CommonE2eIdConstants.UPCOMING_APPT_BUTTON_TEXT))).toExist()
Expand All @@ -122,7 +121,7 @@ describe('Home Screen', () => {
await element(by.text(CommonE2eIdConstants.HOME_TAB_BUTTON_TEXT)).tap()
await waitFor(element(by.text(HomeE2eIdConstants.CLAIMS_BUTTON_SUBTEXT_TEXT)))
.toBeVisible()
.whileElement(by.id(HomeE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.whileElement(by.id(CommonE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.scroll(200, 'down')
await element(by.text(HomeE2eIdConstants.CLAIMS_BUTTON_SUBTEXT_TEXT)).tap()
await expect(element(by.id(CommonE2eIdConstants.CLAIMS_HISTORY_SCROLL_ID))).toExist()
Expand All @@ -132,7 +131,7 @@ describe('Home Screen', () => {
await element(by.text(CommonE2eIdConstants.HOME_TAB_BUTTON_TEXT)).tap()
await waitFor(element(by.text(HomeE2eIdConstants.MESSAGES_BUTTON_SUBTEXT_TEXT)))
.toBeVisible()
.whileElement(by.id(HomeE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.whileElement(by.id(CommonE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.scroll(200, 'down')
await element(by.text(HomeE2eIdConstants.MESSAGES_BUTTON_SUBTEXT_TEXT)).tap()
await expect(element(by.id(CommonE2eIdConstants.START_NEW_MESSAGE_BUTTON_ID))).toExist()
Expand All @@ -142,7 +141,7 @@ describe('Home Screen', () => {
await element(by.text(CommonE2eIdConstants.HOME_TAB_BUTTON_TEXT)).tap()
await waitFor(element(by.text(HomeE2eIdConstants.PRESCRIPTIONS_BUTTON_SUBTEXT_TEXT)))
.toBeVisible()
.whileElement(by.id(HomeE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.whileElement(by.id(CommonE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.scroll(200, 'down')
await element(by.text(HomeE2eIdConstants.PRESCRIPTIONS_BUTTON_SUBTEXT_TEXT)).tap()
await expect(element(by.id(CommonE2eIdConstants.PRESCRIPTION_REFILL_BUTTON_ID))).toExist()
Expand All @@ -155,7 +154,7 @@ describe('Home Screen', () => {
} catch (e) {}
await waitFor(element(by.text(HomeE2eIdConstants.MONTHLY_PAYMENT_AMOUNT_TEXT)))
.toBeVisible()
.whileElement(by.id(HomeE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.whileElement(by.id(CommonE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.scroll(200, 'down')
await expect(element(by.text(HomeE2eIdConstants.HOME_PAGE_MILITARY_BRANCH))).toExist()
await expect(element(by.text(HomeE2eIdConstants.VETERAN_STATUS_TEXT))).toExist()
Expand All @@ -173,7 +172,7 @@ describe('Home Screen', () => {
it('should show home page VA Resources content', async () => {
await waitFor(element(by.text(HomeE2eIdConstants.LOCATION_FINDER_ROW_TEXT)))
.toBeVisible()
.whileElement(by.id(HomeE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.whileElement(by.id(CommonE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.scroll(200, 'down')
await expect(element(by.text(HomeE2eIdConstants.LOCATION_FINDER_ROW_TEXT))).toExist()
await expect(element(by.text(HomeE2eIdConstants.CONTACT_VA_ROW_TEXT))).toExist()
Expand Down Expand Up @@ -215,7 +214,7 @@ describe('Home Screen', () => {
await element(by.text('Done')).tap()
await waitFor(element(by.text(HomeE2eIdConstants.ANNOUNCEMENT_BANNER_TEXT)))
.toBeVisible()
.whileElement(by.id(HomeE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.whileElement(by.id(CommonE2eIdConstants.HOME_SCREEN_SCROLL_ID))
.scroll(200, 'down')
await expect(element(by.text(HomeE2eIdConstants.ANNOUNCEMENT_BANNER_TEXT))).toExist()
})
Expand Down
Loading

0 comments on commit b9032d8

Please sign in to comment.