From 082edeb5109876e37c367091e7ab4550b041ed86 Mon Sep 17 00:00:00 2001 From: JennyNou Date: Mon, 15 Sep 2025 10:21:36 -0400 Subject: [PATCH 1/6] Adding flag set to true for opted in sms --- playwright-tests/tests/CashReplaceGlassPromoInshop.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/playwright-tests/tests/CashReplaceGlassPromoInshop.ts b/playwright-tests/tests/CashReplaceGlassPromoInshop.ts index d958c86e2..139efbb1b 100644 --- a/playwright-tests/tests/CashReplaceGlassPromoInshop.ts +++ b/playwright-tests/tests/CashReplaceGlassPromoInshop.ts @@ -5,7 +5,6 @@ import { ITestCase } from '../framework/Typedefs' import { VehicleLookupType } from 'safelite-playwright-core'; import { getDefaultTestData, setFakerSeedFromTestName } from 'safelite-playwright-core'; import { PaymentMethod } from 'framework/localTypes/Enums'; - // Set the seed before generating any data setFakerSeedFromTestName("CashReplaceGlassPromoInshop"); @@ -47,6 +46,9 @@ const cashReplaceGlassPromoInshopData: Partial = { ...getDefaultTestData().appointmentDetails!, shopAddress: "6826 Sawmill Rd, Columbus, OH 43235" }, + + // Flag for opting in for text message appt updates + isOptedInForTextMessages: true, // Override payment details paymentDetails: { From 736674cdb0e40466a835c6ed910bcf31f22950ee Mon Sep 17 00:00:00 2001 From: JennyNou Date: Mon, 15 Sep 2025 10:22:11 -0400 Subject: [PATCH 2/6] Added comment to clarify mobile time slot logic --- playwright-tests/pages/SchedulePage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright-tests/pages/SchedulePage.ts b/playwright-tests/pages/SchedulePage.ts index a8f01b03a..bad1e4a08 100644 --- a/playwright-tests/pages/SchedulePage.ts +++ b/playwright-tests/pages/SchedulePage.ts @@ -214,7 +214,7 @@ export class SchedulePage extends BasePage { { formattedTimeSlot = selectedTimeSlot.includes("overnight") ? "drop off by 5:30 pm on the night of your scheduled appointment. Pick-up time dependent on shop schedule" : "drop off before 9:30 AM"; } - else if (selectedTimeSlot.includes("-") || selectedTimeSlot.includes("Earlybird")) + else if (selectedTimeSlot.includes("-") || selectedTimeSlot.includes("Earlybird")) // - means Mobile time slot where service time is between 8:00 AM - 12:00 PM { formattedTimeSlot = selectedTimeSlot.includes("Earlybird") ? "arriving between 8:00 AM - 12:00 PM" : `arriving between ${selectedTimeSlot}`; } From cfda5a92d75da6ff50ace51379a3e78cb0c560cb Mon Sep 17 00:00:00 2001 From: JennyNou Date: Mon, 15 Sep 2025 10:22:34 -0400 Subject: [PATCH 3/6] Updated methods for payment method page validations --- playwright-tests/pages/PaymentMethodPage.ts | 87 +++++++++------------ 1 file changed, 39 insertions(+), 48 deletions(-) diff --git a/playwright-tests/pages/PaymentMethodPage.ts b/playwright-tests/pages/PaymentMethodPage.ts index 7bb4a6fcc..f150bd76c 100644 --- a/playwright-tests/pages/PaymentMethodPage.ts +++ b/playwright-tests/pages/PaymentMethodPage.ts @@ -1,7 +1,7 @@ import { expect, type Locator, type Page } from '@playwright/test'; import { BasePage } from './BasePage'; import { IPaymentDetails, Soft, waitUntil } from 'safelite-playwright-core'; -import { AppointmentTimeslot, ServiceLocation, PaymentType, ServicePackage, VehicleDamage } from 'safelite-playwright-core'; +import { AppointmentTimeslot, ServiceLocation, PaymentType, ServicePackage, VehicleDamage, } from 'safelite-playwright-core'; import { PaymentMethod, ProgressBarPercentages } from 'framework/localTypes/Enums'; import { PaymentPage } from './PaymentPage'; import { AfterpayPage } from './AfterpayPage'; @@ -29,11 +29,9 @@ export class PaymentMethodPage extends BasePage { // Payment detail page validation locators readonly reviewTable: Locator; - readonly vehicleSection: Locator; - readonly damageSection: Locator; readonly serviceDetailsSection: Locator; - readonly serviceLocationSection: Locator; - readonly appointmentDateSection: Locator; + readonly serviceLocationDateandTimeSection: Locator; + readonly vehicleDamageLocationsSection: Locator; readonly contactDetailsSection: Locator; readonly cartPanelDetails: Locator; readonly subtotalText: Locator; @@ -65,11 +63,8 @@ export class PaymentMethodPage extends BasePage { this.reviewTable = this.page.locator('div.review-table'); // Section locators - find by heading text - this.vehicleSection = this.page.locator('.review-table').locator('div', { hasText: 'Vehicle' }).first(); - this.damageSection = this.page.locator('.review-table').locator('div', { hasText: 'Damage' }).first(); - this.serviceDetailsSection = this.page.locator('.review-table').locator('div', { hasText: 'Glass service only' }).first(); - this.serviceLocationSection = this.page.locator('.review-table').locator('div', { hasText: "We're coming to you" }).first(); - this.appointmentDateSection = this.page.locator('.review-table').locator('div', { hasText: 'Appointment date + time' }).first(); + this.serviceLocationDateandTimeSection = this.page.locator('.review-table').locator('div .service-location'); + this.vehicleDamageLocationsSection= this.page.locator('.review-table').locator('div.py-3[damagelocationswidgetname="DamageLocationsWidget"]'); this.contactDetailsSection = this.page.locator('.review-table').locator('div', { hasText: 'Contact details' }).first(); // Cart panel elements @@ -99,15 +94,12 @@ export class PaymentMethodPage extends BasePage { ); let expectedAppointmentDetails = new Map(); - expectedAppointmentDetails = await this.getExpectedVehicleDetails(testData, expectedAppointmentDetails); - expectedAppointmentDetails = await this.getExpectedVehicleDamage(testData, expectedAppointmentDetails); - // expectedAppointmentDetails = await this.expectedServicePackageDetails(testData, expectedAppointmentDetails); - expectedAppointmentDetails = await this.getExpectedServiceLocation(testData, expectedAppointmentDetails); - expectedAppointmentDetails = await this.getExpectedAppointmentDate(testData, expectedAppointmentDetails); - expectedAppointmentDetails = await this.getExpectedCustomerDetails(testData, expectedAppointmentDetails); + expectedAppointmentDetails = await this.getExpectedServiceLocationDateAndTimeSection(testData, expectedAppointmentDetails); + expectedAppointmentDetails = await this.getExpectedVehicleDamageLocations(testData, expectedAppointmentDetails); + expectedAppointmentDetails = await this.getExpectedContactDetails(testData, expectedAppointmentDetails); + expectedAppointmentDetails = await this.getExpectedTextServiceUpdatesOptInOrOut(testData, expectedAppointmentDetails); let actualAppointmentDetails = await this.getActualAppointmentDetails(); - for (const key in expectedAppointmentDetails) { Soft.expect(actualAppointmentDetails[key]?.map(item => item.toLowerCase())) .toEqual(expectedAppointmentDetails[key].map(item => item.toLowerCase())); @@ -399,55 +391,43 @@ l return expectedServicePackageDetails; } - async getExpectedServiceLocation(testData: Partial, expectedServicePackageDetails: Map): Promise { - const { appointmentDetails } = testData; + async getExpectedServiceLocationDateAndTimeSection(testData: Partial, expectedServicePackageDetails: Map): Promise { + const { customerDetails, appointmentDetails } = testData; let serviceLocationTitle = appointmentDetails?.serviceLocation == ServiceLocation.Mobile ? "We're coming to you" : "You're coming to us"; let serviceLocation: string[] = []; - - serviceLocation.push( - appointmentDetails?.serviceLocation == ServiceLocation.Mobile + let serviceLocationText = appointmentDetails?.serviceLocation == ServiceLocation.Mobile ? appointmentDetails?.serviceAddress ? appointmentDetails.serviceAddress.street + ", " + appointmentDetails.serviceAddress.city + ", " + appointmentDetails.serviceAddress.state + " " + appointmentDetails.serviceAddress.postalCode : "" : appointmentDetails?.shopAddress ? appointmentDetails.shopAddress - : "" + : ""; + serviceLocationText += " on " + serviceLocationText += customerDetails?.apptDate ? await this.getFormattedAppointmentDate(customerDetails.apptDate) + " " + customerDetails?.apptTime?.replace("-", "—") : ""; + serviceLocation.push( + serviceLocationText ); expectedServicePackageDetails[serviceLocationTitle] = serviceLocation; return expectedServicePackageDetails; } - async getExpectedAppointmentDate(testData: Partial, expectedServicePackageDetails: Map): Promise { - const { customerDetails, appointmentDetails } = testData; - let appointmentDateText: string[] = []; - const isMobileAppointment = appointmentDetails?.serviceLocation == ServiceLocation.Mobile - if (isMobileAppointment) { - let localStorage= JSON.parse(await this.page.evaluate('localStorage.getItem(\'vuex\')')); - let jobMinMinutes = localStorage.order.schedule.jobMinMinutes as number; - let jobMaxMinutes = localStorage.order.schedule.jobMaxMinutes as number; + async getExpectedVehicleDamageLocations(testData: Partial, expectedServicePackageDetails: Map): Promise { + const { customerDetails } = testData; + let VehicleDamageLocationsText: string[] = []; + if (VehicleDamage.WindshieldCrack) { + let VehicleDamageLocationsText: string[] = []; + VehicleDamageLocationsText.push("Replace the windshield"); + }; - if (jobMinMinutes < 60) { - customerDetails!.apptDuration = `${jobMinMinutes} - ${jobMaxMinutes} minutes`; - } else { - const minHours = Math.floor(jobMinMinutes / 60); - const maxHours = Math.floor(jobMaxMinutes / 60); - customerDetails!.apptDuration = `${minHours} - ${maxHours} hours`; - } - } - - appointmentDateText.push( - customerDetails?.apptDate ? await this.getFormattedAppointmentDate(customerDetails.apptDate) + " " + customerDetails?.apptTime?.replace("-", "—") : "", - customerDetails?.apptDuration ? "Estimated appointment length: " + customerDetails.apptDuration : "" - ); - - expectedServicePackageDetails["Appointment Date + Time"] = appointmentDateText; + expectedServicePackageDetails["VehicleDamageLocationsText"] = VehicleDamageLocationsText; return expectedServicePackageDetails; + } - async getExpectedCustomerDetails(testData: Partial, expectedServicePackageDetails: Map): Promise { + async getExpectedContactDetails(testData: Partial, expectedServicePackageDetails: Map): Promise { const { customerDetails } = testData; let customerDetailsText: string[] = []; @@ -455,13 +435,24 @@ l // customerDetails?.firstName.toUpperCase() + " " + customerDetails?.lastName.toUpperCase(), customerDetails?.email ? customerDetails?.email.toUpperCase() : "", customerDetails?.phoneNumber ? customerDetails?.phoneNumber : "", - "Opted out of text message updates" ); expectedServicePackageDetails["Contact details"] = customerDetailsText; return expectedServicePackageDetails; } + async getExpectedTextServiceUpdatesOptInOrOut(testData: Partial, expectedServicePackageDetails: Map): Promise { + const { customerDetails } = testData; + + let isOptedInForTextMessages = testData.isOptedInForTextMessages ?? false; + + let expectedText = isOptedInForTextMessages ? customerDetails?.phoneNumber : "Not opted in"; + + + expectedServicePackageDetails["We’ll text service updates to"] = expectedText + return expectedServicePackageDetails; + } + async getFormattedAppointmentDate(appointmentDate: string) { // Parse the original date From 62bae320ea6089834f45ae711b4e08151b03f52c Mon Sep 17 00:00:00 2001 From: JennyNou Date: Mon, 15 Sep 2025 10:23:08 -0400 Subject: [PATCH 4/6] Added locator and logic for sms opt in box on contact details page --- playwright-tests/pages/ContactDetailsPage.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/playwright-tests/pages/ContactDetailsPage.ts b/playwright-tests/pages/ContactDetailsPage.ts index 543ffe1b2..171166190 100644 --- a/playwright-tests/pages/ContactDetailsPage.ts +++ b/playwright-tests/pages/ContactDetailsPage.ts @@ -14,7 +14,7 @@ export class ContactDetailsPage extends BasePage { readonly lastNameTextBox: Locator; readonly emailAddressTextBox: Locator; readonly phoneNumberTextBox: Locator; - readonly notesTextBox: Locator; + readonly textOptInBox: Locator; constructor(page: Page) { super(page); @@ -25,7 +25,7 @@ export class ContactDetailsPage extends BasePage { this.lastNameTextBox = this.page.getByRole('textbox', { name: 'Last name' }); this.emailAddressTextBox = this.page.getByRole('textbox', { name: 'Email address' }); this.phoneNumberTextBox = this.page.getByRole('textbox', { name: 'Phone number' }); - this.notesTextBox = this.page.getByRole('textbox', { name: 'Notes' }); + this.textOptInBox = this.page.getByRole('checkbox', { name: 'Text me updates about my appointment*' }); } @@ -36,10 +36,8 @@ export class ContactDetailsPage extends BasePage { await this.phoneNumberTextBox.fill(customerDetails.phoneNumber); } - async fillNotes(notes?: string) { - if (notes) { - await this.notesTextBox.fill(notes); - } + async checkTextMeUpdates(customerDetails: ICustomerDetails) { + await this.textOptInBox.check(); } @step("ContactDetailsPage >> Enter contact details: ") @@ -48,6 +46,11 @@ export class ContactDetailsPage extends BasePage { await this.validateProgressBar(ProgressBarPercentages.ContactDetailsPage); await this.enterContactDetails(customerDetails!); + + if (testData.isOptedInForTextMessages) { + await this.checkTextMeUpdates(customerDetails!); + } + await this.nextPage(); } } \ No newline at end of file From 3362b6a1939198d36fb543a1dad090e2e2e62dc8 Mon Sep 17 00:00:00 2001 From: JennyNou Date: Mon, 15 Sep 2025 10:23:23 -0400 Subject: [PATCH 5/6] Added flag for sms opt in --- playwright-tests/framework/TestData.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/playwright-tests/framework/TestData.ts b/playwright-tests/framework/TestData.ts index 8f00bb276..cc9e44c23 100644 --- a/playwright-tests/framework/TestData.ts +++ b/playwright-tests/framework/TestData.ts @@ -4,4 +4,5 @@ import { PaymentMethod } from './localTypes/Enums' export interface ITestData extends base { // Put any project-specific data here. Anything useful to other Safelite projects should be submitted as a pull request to safelite-playwright-core. paymentMethod: PaymentMethod + isOptedInForTextMessages: boolean } \ No newline at end of file From ce00c4c6179abc7d1904b6961611961a9fa27153 Mon Sep 17 00:00:00 2001 From: kpatel8hs4io <31411746+kpatel8hs4io@users.noreply.github.com> Date: Fri, 26 Sep 2025 10:00:53 -0400 Subject: [PATCH 6/6] Update PaymentMethodPage.ts --- playwright-tests/pages/PaymentMethodPage.ts | 66 ++++++++++----------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/playwright-tests/pages/PaymentMethodPage.ts b/playwright-tests/pages/PaymentMethodPage.ts index f150bd76c..00bb9c2e1 100644 --- a/playwright-tests/pages/PaymentMethodPage.ts +++ b/playwright-tests/pages/PaymentMethodPage.ts @@ -95,7 +95,7 @@ export class PaymentMethodPage extends BasePage { let expectedAppointmentDetails = new Map(); expectedAppointmentDetails = await this.getExpectedServiceLocationDateAndTimeSection(testData, expectedAppointmentDetails); - expectedAppointmentDetails = await this.getExpectedVehicleDamageLocations(testData, expectedAppointmentDetails); + expectedAppointmentDetails = await this.getExpectedVehicleDamageAndVehicle(testData, expectedAppointmentDetails); expectedAppointmentDetails = await this.getExpectedContactDetails(testData, expectedAppointmentDetails); expectedAppointmentDetails = await this.getExpectedTextServiceUpdatesOptInOrOut(testData, expectedAppointmentDetails); @@ -280,64 +280,66 @@ l return expectedServicePackageDetails; } - async getExpectedVehicleDamage(testdata: Partial, expectedServicePackageDetails: Map): Promise { + async getExpectedVehicleDamageAndVehicle(testdata: Partial, expectedServicePackageDetails: Map): Promise { - const {vehicleDamage} = testdata; + const {vehicleDetails, vehicleDamage} = testdata; - let vehicleDamageText: string[] = []; - if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.WindshieldOneChip)) { - vehicleDamageText.push("Windshield repair - 1 chip"); + let vehicleDamageText: string= ''; + if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.WindshieldOneChip || item == VehicleDamage.WindshieldTwoChips || item == VehicleDamage.WindshieldThreeChips)) { + vehicleDamageText = "Repair the windshield of your"; } - else if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.WindshieldTwoChips)) { - vehicleDamageText.push("Windshield repair - 2 chips"); - } - - else if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.WindshieldThreeChips)) { - vehicleDamageText.push("Windshield repair - 3 chips"); - } - if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.WindshieldCrack)) { - vehicleDamageText.push("Windshield crack"); + vehicleDamageText = vehicleDamage?.length > 1 ? "Replace the Windshield" : "Replace the windshield"; } - if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.DriverVentGlass)) { - vehicleDamageText.includes("Side door - Driver side") ? vehicleDamageText[vehicleDamageText.length - 1 ] += "\nVent glass" : vehicleDamageText.push("Side door - Driver side", "Vent glass"); + if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.DriverVentGlass) && !vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.WindshieldCrack)) { + vehicleDamageText.includes("Replace") ? vehicleDamageText += ", Driver Vent Glass" : "Replace the Driver Vent Glass"; } if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.DriverFrontDoor)) { - vehicleDamageText.includes("Side door - Driver side") ? vehicleDamageText[vehicleDamageText.length - 1 ] += "\nFront door" : vehicleDamageText.push("Side door - Driver side", "Front door"); + vehicleDamageText.includes("Replace") ? vehicleDamageText += ", Driver Front Glass" : "Replace the Driver Front Glass"; } if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.DriverRearDoor)) { - vehicleDamageText.includes("Side door - Driver side") ? vehicleDamageText[vehicleDamageText.length - 1 ] += "\nBack door" : vehicleDamageText.push("Side door - Driver side", "Back door"); - } + vehicleDamageText.includes("Replace") ? vehicleDamageText += ", Driver Back Glass" : "Replace the Driver Back Glass"; + } + + if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.DriverVentGlass) && vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.WindshieldCrack)) { + vehicleDamageText.includes("Replace") ? vehicleDamageText += ", Driver Vent Glass" : "Replace the Driver Vent Glass"; + } if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.DriverQuarterPanel)) { - vehicleDamageText.includes("Side door - Driver side") ? vehicleDamageText[vehicleDamageText.length - 1 ] += "\nQuarter panel" : vehicleDamageText.push("Side door - Driver side", "Quarter panel"); + vehicleDamageText.includes("Replace") ? vehicleDamageText += ", Driver Quarter Glass" : "Replace the Driver Quarter Glass"; } if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.PassengerVentGlass)) { - vehicleDamageText.includes("Side door - Passenger side") ? vehicleDamageText[vehicleDamageText.length - 1 ] += "\nVent glass" : vehicleDamageText.push("Side door - Passenger side", "Vent glass"); + vehicleDamageText.includes("Replace") ? vehicleDamageText += ", Passenger Vent Glass" : "Replace the Passenger Vent Glass"; } if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.PassengerFrontDoor)) { - vehicleDamageText.includes("Side door - Passenger side") ? vehicleDamageText[vehicleDamageText.length - 1 ] += "\nFront door" : vehicleDamageText.push("Side door - Passenger side", "Front door"); + vehicleDamageText.includes("Replace") ? vehicleDamageText += ", Passenger Front Glass" : "Replace the Passenger Front Glass"; } if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.PassengerRearDoor)) { - vehicleDamageText.includes("Side door - Passenger side") ? vehicleDamageText[vehicleDamageText.length - 1 ] += "\nBack door" : vehicleDamageText.push("Side door - Passenger side", "Back door"); + vehicleDamageText.includes("Replace") ? vehicleDamageText += ", Passenger Back Glass" : "Replace the Passenger Back Glass"; } if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.PassengerQuarterPanel)) { - vehicleDamageText.includes("Side door - Passenger side") ? vehicleDamageText[vehicleDamageText.length - 1 ] += "\nQuarter panel" : vehicleDamageText.push("Side door - Passenger side", "Quarter panel"); + vehicleDamageText.includes("Replace") ? vehicleDamageText += ", Passenger Quarter Glass" : "Replace the Passenger Quarter Glass"; } if (vehicleDamage?.find((item: VehicleDamage) => item == VehicleDamage.RearWindow || item == VehicleDamage.RearSliding)) { - vehicleDamageText.push("Rear window"); + vehicleDamageText.includes("Replace") ? vehicleDamageText += ", Back Glass" : "Replace the Back Glass"; } - expectedServicePackageDetails["Damage"] = vehicleDamageText; + // Replace last comma with " and" if there are multiple damages + if (vehicleDamageText.includes(",") && vehicleDamageText !== "Replace the windshield") + { + vehicleDamageText = vehicleDamageText.replace(/,([^,]*)$/, " and$1") + " of your"; + } + + expectedServicePackageDetails[vehicleDamageText] = [vehicleDetails?.year + " " + vehicleDetails?.make + " " + vehicleDetails?.model]; return expectedServicePackageDetails; } @@ -396,7 +398,6 @@ l let serviceLocationTitle = appointmentDetails?.serviceLocation == ServiceLocation.Mobile ? "We're coming to you" : "You're coming to us"; - let serviceLocation: string[] = []; let serviceLocationText = appointmentDetails?.serviceLocation == ServiceLocation.Mobile ? appointmentDetails?.serviceAddress ? appointmentDetails.serviceAddress.street + ", " + appointmentDetails.serviceAddress.city + ", " + appointmentDetails.serviceAddress.state + " " + appointmentDetails.serviceAddress.postalCode @@ -406,11 +407,8 @@ l : ""; serviceLocationText += " on " serviceLocationText += customerDetails?.apptDate ? await this.getFormattedAppointmentDate(customerDetails.apptDate) + " " + customerDetails?.apptTime?.replace("-", "—") : ""; - serviceLocation.push( - serviceLocationText - ); - expectedServicePackageDetails[serviceLocationTitle] = serviceLocation; + expectedServicePackageDetails[serviceLocationTitle] = [serviceLocationText]; return expectedServicePackageDetails; } @@ -437,7 +435,7 @@ l customerDetails?.phoneNumber ? customerDetails?.phoneNumber : "", ); - expectedServicePackageDetails["Contact details"] = customerDetailsText; + expectedServicePackageDetails["Contact details"] = customerDetailsText return expectedServicePackageDetails; } @@ -449,7 +447,7 @@ l let expectedText = isOptedInForTextMessages ? customerDetails?.phoneNumber : "Not opted in"; - expectedServicePackageDetails["We’ll text service updates to"] = expectedText + expectedServicePackageDetails["We’ll text service updates to"] = [expectedText]; return expectedServicePackageDetails; }