From 5d21741e63985455844af0124318ef2c052768a0 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Mon, 2 Feb 2026 12:12:15 -0700
Subject: [PATCH 01/36] Begin to update personal page so language agnostic
---
playwright/pageobjects/page-manager.page.ts | 2 +-
playwright/pageobjects/personal.page.ts | 34 ++-
playwright/tests/e2e-mocked.spec.ts | 26 +-
playwright/tests/personal.spec.ts | 297 ++++++++++----------
public/locales/en/common.json | 4 +-
public/locales/es/common.json | 4 +-
src/components/PersonalFormFields/index.tsx | 5 +-
7 files changed, 196 insertions(+), 176 deletions(-)
diff --git a/playwright/pageobjects/page-manager.page.ts b/playwright/pageobjects/page-manager.page.ts
index 6e63de2c..1f0558d3 100644
--- a/playwright/pageobjects/page-manager.page.ts
+++ b/playwright/pageobjects/page-manager.page.ts
@@ -23,7 +23,7 @@ export class PageManager {
}
get personalPage(): PersonalPage {
- return new PersonalPage(this.page);
+ return new PersonalPage(this.page, this.appContent);
}
get addressPage(): AddressPage {
diff --git a/playwright/pageobjects/personal.page.ts b/playwright/pageobjects/personal.page.ts
index cc79c32f..0f2b1c9f 100644
--- a/playwright/pageobjects/personal.page.ts
+++ b/playwright/pageobjects/personal.page.ts
@@ -19,46 +19,54 @@ export class PersonalPage {
readonly previousButton: Locator;
readonly nextButton: Locator;
- constructor(page: Page) {
+ constructor(page: Page, appContent?: any) {
this.page = page;
this.mainHeading = this.page.getByRole("heading", {
- name: "Apply for a Library Card Online",
+ name: appContent?.banner?.title || "Apply for a Library Card Online",
level: 1,
});
this.stepHeading = this.page.getByRole("heading", {
- name: "Step 1 of 5: Personal information",
+ name: appContent?.personal?.title || "Step 1 of 5: Personal information",
level: 2,
});
- this.firstNameInput = this.page.getByLabel(/First name/i);
+ this.firstNameInput = this.page.getByLabel(
+ appContent?.personal?.firstName.label || /First name/i
+ );
this.firstNameError = this.page.getByText(
ERROR_MESSAGES.FIRST_NAME_INVALID
);
- this.lastNameInput = this.page.getByLabel(/Last name/i);
+ this.lastNameInput = this.page.getByLabel(
+ appContent?.personal?.lastName.label || /Last name/i
+ );
this.lastNameError = this.page.getByText(ERROR_MESSAGES.LAST_NAME_INVALID);
- this.dateOfBirthInput = this.page.getByLabel(/Date of birth/i);
+ this.dateOfBirthInput = this.page.getByLabel(
+ appContent?.personal?.birthdate.label || /Date of birth/i
+ );
this.dateOfBirthError = this.page.getByText(
ERROR_MESSAGES.DATE_OF_BIRTH_INVALID
);
- this.emailInput = this.page.getByLabel(/Email/i);
+ this.emailInput = this.page.getByLabel(
+ appContent?.personal?.email.label || /Email/i
+ );
this.emailError = this.page.getByText(ERROR_MESSAGES.EMAIL_INVALID);
this.alternateFormLink = this.page.getByRole("link", {
- name: "alternate form",
+ name: appContent?.personal?.email?.alternateForm || "alternate form",
exact: true,
});
this.locationsLink = this.page.getByRole("link", {
- name: "locations",
+ name: appContent?.personal?.email?.locations || "locations",
exact: true,
});
this.receiveInfoCheckbox = this.page.getByText(
- "Yes, I would like to receive information about NYPL's programs and services"
+ appContent?.personal?.eCommunications?.labelText ||
+ "Yes, I would like to receive information about NYPL's programs and services"
);
-
this.previousButton = this.page.getByRole("link", {
- name: "Previous",
+ name: appContent?.button?.previous || "Previous",
exact: true,
});
this.nextButton = this.page.getByRole("button", {
- name: "Next",
+ name: appContent?.button?.next || "Next",
exact: true,
});
}
diff --git a/playwright/tests/e2e-mocked.spec.ts b/playwright/tests/e2e-mocked.spec.ts
index 4717c2a0..6ec44bca 100644
--- a/playwright/tests/e2e-mocked.spec.ts
+++ b/playwright/tests/e2e-mocked.spec.ts
@@ -8,11 +8,11 @@ import {
// TEST_PATRON_INFO,
} from "../utils/constants";
// import { mockCreatePatronApi } from "../utils/mock-api";
-// import {
-// fillAccountInfo,
-// fillAddress,
-// fillPersonalInfo,
-// } from "../utils/form-helper";
+import {
+ // fillAccountInfo,
+ // fillAddress,
+ fillPersonalInfo,
+} from "../utils/form-helper";
for (const { lang, name } of SUPPORTED_LANGUAGES) {
test.describe(`E2E: Complete application using mocked submit in ${name} (${lang})`, () => {
@@ -30,14 +30,14 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await pageManager.landingPage.getStartedButton.click();
});
- // await test.step("enters personal information", async () => {
- // await expect(pageManager.personalPage.stepHeading).toBeVisible();
- // await fillPersonalInfo(pageManager.personalPage);
- // await expect(
- // pageManager.personalPage.receiveInfoCheckbox
- // ).toBeChecked();
- // await pageManager.personalPage.nextButton.click();
- // });
+ await test.step("enters personal information", async () => {
+ await expect(pageManager.personalPage.stepHeading).toBeVisible();
+ await fillPersonalInfo(pageManager.personalPage);
+ await expect(
+ pageManager.personalPage.receiveInfoCheckbox
+ ).toBeChecked();
+ await pageManager.personalPage.nextButton.click();
+ });
// await test.step("enters home address", async () => {
// await expect(pageManager.addressPage.stepHeading).toBeVisible();
diff --git a/playwright/tests/personal.spec.ts b/playwright/tests/personal.spec.ts
index db7123a1..654bc9ae 100644
--- a/playwright/tests/personal.spec.ts
+++ b/playwright/tests/personal.spec.ts
@@ -1,148 +1,153 @@
import { test, expect } from "@playwright/test";
import { PersonalPage } from "../pageobjects/personal.page";
-import { TEST_PATRON_INFO } from "../utils/constants";
-import { fillPersonalInfo } from "../utils/form-helper";
-
-test.beforeEach(async ({ page }) => {
- await page.goto("/library-card/personal?newCard=true");
-});
-
-test.describe("displays elements on personal information page", () => {
- test("displays headings", async ({ page }) => {
- const personalPage = new PersonalPage(page);
- await expect(personalPage.mainHeading).toBeVisible();
- await expect(personalPage.stepHeading).toBeVisible();
- });
-
- test("displays personal information form", async ({ page }) => {
- const personalPage = new PersonalPage(page);
- await expect(personalPage.firstNameInput).toBeVisible();
- await expect(personalPage.lastNameInput).toBeVisible();
- await expect(personalPage.dateOfBirthInput).toBeVisible();
- await expect(personalPage.emailInput).toBeVisible();
- await expect(personalPage.receiveInfoCheckbox).toBeVisible();
- });
-
- test("displays links", async ({ page }) => {
- const personalPage = new PersonalPage(page);
- await expect(personalPage.alternateFormLink).toBeVisible();
- await expect(personalPage.locationsLink).toBeVisible();
- });
-
- test("displays next and previous buttons", async ({ page }) => {
- const personalPage = new PersonalPage(page);
- await expect(personalPage.previousButton).toBeVisible();
- await expect(personalPage.nextButton).toBeVisible();
- });
-});
-
-test.describe("enters personal information", () => {
- test("enters valid personal information", async ({ page }) => {
- const personalPage = new PersonalPage(page);
- await fillPersonalInfo(personalPage);
- await expect(personalPage.firstNameInput).toHaveValue(
- TEST_PATRON_INFO.firstName
- );
- await expect(personalPage.lastNameInput).toHaveValue(
- TEST_PATRON_INFO.lastName
- );
- await expect(personalPage.dateOfBirthInput).toHaveValue(
- TEST_PATRON_INFO.dateOfBirth
- );
- await expect(personalPage.emailInput).toHaveValue(TEST_PATRON_INFO.email);
- });
-});
-
-test.describe("displays error messages", () => {
- test("displays errors for required fields", async ({ page }) => {
- const personalPage = new PersonalPage(page);
- await personalPage.firstNameInput.fill("");
- await personalPage.lastNameInput.fill("");
- await personalPage.dateOfBirthInput.fill("");
- await personalPage.emailInput.fill("");
- await personalPage.nextButton.click();
-
- await expect(personalPage.firstNameError).toBeVisible();
- await expect(personalPage.lastNameError).toBeVisible();
- await expect(personalPage.dateOfBirthError).toBeVisible();
- await expect(personalPage.emailError).toBeVisible();
- });
-
- test("displays error for dashes in date of birth", async ({ page }) => {
- const personalPage = new PersonalPage(page);
- await personalPage.dateOfBirthInput.fill("12-25-1984");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
- });
-
- test("displays error for YYYY/MM/DD format in date of birth", async ({
- page,
- }) => {
- const personalPage = new PersonalPage(page);
- await personalPage.dateOfBirthInput.fill("1984/12/25");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
- });
-
- test("displays error for DD/MM/YYYY format in date of birth", async ({
- page,
- }) => {
- const personalPage = new PersonalPage(page);
- await personalPage.dateOfBirthInput.fill("25/12/1984");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
- });
-
- test("displays error for M/D/YY format in date of birth", async ({
- page,
- }) => {
- const personalPage = new PersonalPage(page);
- await personalPage.dateOfBirthInput.fill("1/1/84");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
- });
-
- test("displays error for written date of birth", async ({ page }) => {
- const personalPage = new PersonalPage(page);
- await personalPage.dateOfBirthInput.fill("December 25, 1984");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
- });
-
- test("displays error for future date of birth", async ({ page }) => {
- const personalPage = new PersonalPage(page);
- await personalPage.dateOfBirthInput.fill("12/31/2099");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
- });
-
- test("displays error for missing email symbol", async ({ page }) => {
- const personalPage = new PersonalPage(page);
- await personalPage.emailInput.fill("testgmail.com");
- await personalPage.nextButton.click();
- await expect(personalPage.emailError).toBeVisible();
- });
-
- test("displays error for missing email domain", async ({ page }) => {
- const personalPage = new PersonalPage(page);
- await personalPage.emailInput.fill("test@.com");
- await personalPage.nextButton.click();
- await expect(personalPage.emailError).toBeVisible();
- });
-
- test("displays error for missing email username", async ({ page }) => {
- const personalPage = new PersonalPage(page);
- await personalPage.emailInput.fill("@gmail.com");
- await personalPage.nextButton.click();
- await expect(personalPage.emailError).toBeVisible();
- });
-
- test("displays error for missing email top-level domain", async ({
- page,
- }) => {
- const personalPage = new PersonalPage(page);
- await personalPage.emailInput.fill("user@gmail");
- await personalPage.nextButton.click();
- await expect(personalPage.emailError).toBeVisible();
- });
-});
+import { SUPPORTED_LANGUAGES /*TEST_PATRON_INFO*/ } from "../utils/constants";
+// import { fillPersonalInfo } from "../utils/form-helper";
+
+for (const { lang, name } of SUPPORTED_LANGUAGES) {
+ test.describe(`personal information page in ${name} (${lang})`, () => {
+ let personalPage: PersonalPage;
+ let appContent: any;
+
+ test.beforeEach(async ({ page }) => {
+ appContent = require(`../../public/locales/${lang}/common.json`);
+ personalPage = new PersonalPage(page, appContent);
+ await page.goto(`/library-card/personal?newCard=true&lang=${lang}`);
+ });
+
+ test.describe("displays elements on personal information page", () => {
+ test("displays headings", async () => {
+ await expect(personalPage.mainHeading).toBeVisible();
+ await expect(personalPage.stepHeading).toBeVisible();
+ });
+
+ test("displays personal information form", async () => {
+ await expect(personalPage.firstNameInput).toBeVisible();
+ await expect(personalPage.lastNameInput).toBeVisible();
+ await expect(personalPage.dateOfBirthInput).toBeVisible();
+ await expect(personalPage.emailInput).toBeVisible();
+ await expect(personalPage.receiveInfoCheckbox).toBeVisible();
+ });
+
+ test("displays links", async () => {
+ await expect(personalPage.alternateFormLink).toBeVisible();
+ await expect(personalPage.locationsLink).toBeVisible();
+ });
+
+ test("displays next and previous buttons", async () => {
+ await expect(personalPage.previousButton).toBeVisible();
+ await expect(personalPage.nextButton).toBeVisible();
+ });
+ });
+ });
+}
+
+// test.describe("enters personal information", () => {
+// test("enters valid personal information", async ({ page }) => {
+// const personalPage = new PersonalPage(page);
+// await fillPersonalInfo(personalPage);
+// await expect(personalPage.firstNameInput).toHaveValue(
+// TEST_PATRON_INFO.firstName
+// );
+// await expect(personalPage.lastNameInput).toHaveValue(
+// TEST_PATRON_INFO.lastName
+// );
+// await expect(personalPage.dateOfBirthInput).toHaveValue(
+// TEST_PATRON_INFO.dateOfBirth
+// );
+// await expect(personalPage.emailInput).toHaveValue(TEST_PATRON_INFO.email);
+// });
+// });
+
+// test.describe("displays error messages", () => {
+// test("displays errors for required fields", async ({ page }) => {
+// const personalPage = new PersonalPage(page);
+// await personalPage.firstNameInput.fill("");
+// await personalPage.lastNameInput.fill("");
+// await personalPage.dateOfBirthInput.fill("");
+// await personalPage.emailInput.fill("");
+// await personalPage.nextButton.click();
+
+// await expect(personalPage.firstNameError).toBeVisible();
+// await expect(personalPage.lastNameError).toBeVisible();
+// await expect(personalPage.dateOfBirthError).toBeVisible();
+// await expect(personalPage.emailError).toBeVisible();
+// });
+
+// test("displays error for dashes in date of birth", async ({ page }) => {
+// const personalPage = new PersonalPage(page);
+// await personalPage.dateOfBirthInput.fill("12-25-1984");
+// await personalPage.nextButton.click();
+// await expect(personalPage.dateOfBirthError).toBeVisible();
+// });
+
+// test("displays error for YYYY/MM/DD format in date of birth", async ({
+// page,
+// }) => {
+// const personalPage = new PersonalPage(page);
+// await personalPage.dateOfBirthInput.fill("1984/12/25");
+// await personalPage.nextButton.click();
+// await expect(personalPage.dateOfBirthError).toBeVisible();
+// });
+
+// test("displays error for DD/MM/YYYY format in date of birth", async ({
+// page,
+// }) => {
+// const personalPage = new PersonalPage(page);
+// await personalPage.dateOfBirthInput.fill("25/12/1984");
+// await personalPage.nextButton.click();
+// await expect(personalPage.dateOfBirthError).toBeVisible();
+// });
+
+// test("displays error for M/D/YY format in date of birth", async ({
+// page,
+// }) => {
+// const personalPage = new PersonalPage(page);
+// await personalPage.dateOfBirthInput.fill("1/1/84");
+// await personalPage.nextButton.click();
+// await expect(personalPage.dateOfBirthError).toBeVisible();
+// });
+
+// test("displays error for written date of birth", async ({ page }) => {
+// const personalPage = new PersonalPage(page);
+// await personalPage.dateOfBirthInput.fill("December 25, 1984");
+// await personalPage.nextButton.click();
+// await expect(personalPage.dateOfBirthError).toBeVisible();
+// });
+
+// test("displays error for future date of birth", async ({ page }) => {
+// const personalPage = new PersonalPage(page);
+// await personalPage.dateOfBirthInput.fill("12/31/2099");
+// await personalPage.nextButton.click();
+// await expect(personalPage.dateOfBirthError).toBeVisible();
+// });
+
+// test("displays error for missing email symbol", async ({ page }) => {
+// const personalPage = new PersonalPage(page);
+// await personalPage.emailInput.fill("testgmail.com");
+// await personalPage.nextButton.click();
+// await expect(personalPage.emailError).toBeVisible();
+// });
+
+// test("displays error for missing email domain", async ({ page }) => {
+// const personalPage = new PersonalPage(page);
+// await personalPage.emailInput.fill("test@.com");
+// await personalPage.nextButton.click();
+// await expect(personalPage.emailError).toBeVisible();
+// });
+
+// test("displays error for missing email username", async ({ page }) => {
+// const personalPage = new PersonalPage(page);
+// await personalPage.emailInput.fill("@gmail.com");
+// await personalPage.nextButton.click();
+// await expect(personalPage.emailError).toBeVisible();
+// });
+
+// test("displays error for missing email top-level domain", async ({
+// page,
+// }) => {
+// const personalPage = new PersonalPage(page);
+// await personalPage.emailInput.fill("user@gmail");
+// await personalPage.nextButton.click();
+// await expect(personalPage.emailError).toBeVisible();
+// });
+// });
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index d0194e62..03b0a16c 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -32,7 +32,9 @@
"ageGate": "Yes, I am over 13 years old.",
"email": {
"label": "Email address",
- "instruction": "An email address is required to use many of our digital resources, such as e-books. If you do not wish to provide an email address, you can apply for a physical card using our alternate form. Once filled out, please visit one of our locations with proof of identity and home address to pick up your card."
+ "instruction": "An email address is required to use many of our digital resources, such as e-books. If you do not wish to provide an email address, you can apply for a physical card using our {{alternateForm}}. Once filled out, please visit one of our {{locations}} with proof of identity and home address to pick up your card.",
+ "alternateForm": "alternate form",
+ "locations": "locations"
},
"eCommunications": {
"labelText": "Yes, I would like to receive information about NYPL's programs and services"
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index 946f1b45..0d321189 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -28,7 +28,9 @@
"ageGate": "Yes, I am over 13 years old.",
"email": {
"label": "Dirección de correo electrónico",
- "instruction": "Se requiere una dirección de correo electrónico para utilizar muchos de nuestros recursos digitales, como los libros electrónicos. Si no desea proporcionar una dirección de correo electrónico, puede solicitar una tarjeta física utilizando nuestro formulario alterno (en inglés). Una vez que lo haya completado, por favor visite una de nuestras bibliotecas con un comprobante de identidad y domicilio para recoger su tarjeta física."
+ "instruction": "Se requiere una dirección de correo electrónico para utilizar muchos de nuestros recursos digitales, como los libros electrónicos. Si no desea proporcionar una dirección de correo electrónico, puede solicitar una tarjeta física utilizando nuestro {{alternateForm}}. Una vez que lo haya completado, por favor visite una de nuestras {{locations}} con un comprobante de identidad y domicilio para recoger su tarjeta física.",
+ "alternateForm": "formulario alterno (en inglés)",
+ "locations": "bibliotecas"
},
"eCommunications": {
"labelText": "Sí, me gustaría recibir información sobre los programas y servicios que ofrece la NYPL"
diff --git a/src/components/PersonalFormFields/index.tsx b/src/components/PersonalFormFields/index.tsx
index da5b0718..a528065b 100644
--- a/src/components/PersonalFormFields/index.tsx
+++ b/src/components/PersonalFormFields/index.tsx
@@ -76,7 +76,10 @@ function PersonalFormFields({ id = "" }: PersonalFormFieldsProps) {
errorState={errors}
isRequired
defaultValue={formValues.email}
- instructionText={t("personal.email.instruction")}
+ instructionText={t("personal.email.instruction", {
+ alternateForm: t("personal.email.alternateForm"),
+ locations: t("personal.email.locations"),
+ })}
autoComplete="email"
/>
From 1e76b536a150b4b9506af02de448533e9630121e Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Mon, 2 Feb 2026 13:29:49 -0700
Subject: [PATCH 02/36] Update rest of personal page tests
---
playwright/pageobjects/personal.page.ts | 17 +-
playwright/tests/e2e.spec.ts | 20 +--
playwright/tests/personal.spec.ts | 208 +++++++++++-------------
3 files changed, 117 insertions(+), 128 deletions(-)
diff --git a/playwright/pageobjects/personal.page.ts b/playwright/pageobjects/personal.page.ts
index 0f2b1c9f..580afa2e 100644
--- a/playwright/pageobjects/personal.page.ts
+++ b/playwright/pageobjects/personal.page.ts
@@ -1,5 +1,4 @@
import { Page, Locator } from "@playwright/test";
-import { ERROR_MESSAGES } from "../utils/constants";
export class PersonalPage {
readonly page: Page;
@@ -33,22 +32,30 @@ export class PersonalPage {
appContent?.personal?.firstName.label || /First name/i
);
this.firstNameError = this.page.getByText(
- ERROR_MESSAGES.FIRST_NAME_INVALID
+ appContent?.personal?.errorMessage?.firstName ||
+ "There was a problem. Please enter a valid first name."
);
this.lastNameInput = this.page.getByLabel(
appContent?.personal?.lastName.label || /Last name/i
);
- this.lastNameError = this.page.getByText(ERROR_MESSAGES.LAST_NAME_INVALID);
+ this.lastNameError = this.page.getByText(
+ appContent?.personal?.errorMessage?.lastName ||
+ "There was a problem. Please enter a valid last name."
+ );
this.dateOfBirthInput = this.page.getByLabel(
appContent?.personal?.birthdate.label || /Date of birth/i
);
this.dateOfBirthError = this.page.getByText(
- ERROR_MESSAGES.DATE_OF_BIRTH_INVALID
+ appContent?.personal?.errorMessage?.birthdate ||
+ "There was a problem. Please enter a valid date, MM/DD/YYYY, including slashes."
);
this.emailInput = this.page.getByLabel(
appContent?.personal?.email.label || /Email/i
);
- this.emailError = this.page.getByText(ERROR_MESSAGES.EMAIL_INVALID);
+ this.emailError = this.page.getByText(
+ appContent?.personal?.errorMessage?.email ||
+ "There was a problem. Please enter a valid email address."
+ );
this.alternateFormLink = this.page.getByRole("link", {
name: appContent?.personal?.email?.alternateForm || "alternate form",
exact: true,
diff --git a/playwright/tests/e2e.spec.ts b/playwright/tests/e2e.spec.ts
index 9cd31598..f5f96ee1 100644
--- a/playwright/tests/e2e.spec.ts
+++ b/playwright/tests/e2e.spec.ts
@@ -1,10 +1,10 @@
import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
-// import {
-// fillPersonalInfo,
-// fillAddress,
-// fillAccountInfo,
-// } from "../utils/form-helper";
+import {
+ fillPersonalInfo,
+ // fillAddress,
+ // fillAccountInfo,
+} from "../utils/form-helper";
import {
SUPPORTED_LANGUAGES,
// TEST_CUSTOMIZE_ACCOUNT,
@@ -49,11 +49,11 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await pageManager.landingPage.getStartedButton.click();
});
- // await test.step("enters personal information", async () => {
- // await expect(pageManager.personalPage.stepHeading).toBeVisible();
- // await fillPersonalInfo(pageManager.personalPage);
- // await pageManager.personalPage.nextButton.click();
- // });
+ await test.step("enters personal information", async () => {
+ await expect(pageManager.personalPage.stepHeading).toBeVisible();
+ await fillPersonalInfo(pageManager.personalPage);
+ await pageManager.personalPage.nextButton.click();
+ });
// await test.step("enters home address", async () => {
// await expect(pageManager.addressPage.stepHeading).toBeVisible();
diff --git a/playwright/tests/personal.spec.ts b/playwright/tests/personal.spec.ts
index 654bc9ae..85ad3d51 100644
--- a/playwright/tests/personal.spec.ts
+++ b/playwright/tests/personal.spec.ts
@@ -1,7 +1,7 @@
import { test, expect } from "@playwright/test";
import { PersonalPage } from "../pageobjects/personal.page";
-import { SUPPORTED_LANGUAGES /*TEST_PATRON_INFO*/ } from "../utils/constants";
-// import { fillPersonalInfo } from "../utils/form-helper";
+import { SUPPORTED_LANGUAGES, TEST_PATRON_INFO } from "../utils/constants";
+import { fillPersonalInfo } from "../utils/form-helper";
for (const { lang, name } of SUPPORTED_LANGUAGES) {
test.describe(`personal information page in ${name} (${lang})`, () => {
@@ -38,116 +38,98 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(personalPage.nextButton).toBeVisible();
});
});
+
+ test.describe("enters personal information", () => {
+ test("enters valid personal information", async () => {
+ await fillPersonalInfo(personalPage);
+ await expect(personalPage.firstNameInput).toHaveValue(
+ TEST_PATRON_INFO.firstName
+ );
+ await expect(personalPage.lastNameInput).toHaveValue(
+ TEST_PATRON_INFO.lastName
+ );
+ await expect(personalPage.dateOfBirthInput).toHaveValue(
+ TEST_PATRON_INFO.dateOfBirth
+ );
+ await expect(personalPage.emailInput).toHaveValue(
+ TEST_PATRON_INFO.email
+ );
+ });
+ });
+
+ test.describe("displays error messages", () => {
+ test("displays errors for required fields", async () => {
+ await personalPage.firstNameInput.fill("");
+ await personalPage.lastNameInput.fill("");
+ await personalPage.dateOfBirthInput.fill("");
+ await personalPage.emailInput.fill("");
+ await personalPage.nextButton.click();
+
+ await expect(personalPage.firstNameError).toBeVisible();
+ await expect(personalPage.lastNameError).toBeVisible();
+ await expect(personalPage.dateOfBirthError).toBeVisible();
+ await expect(personalPage.emailError).toBeVisible();
+ });
+
+ test("displays error for dashes in date of birth", async () => {
+ await personalPage.dateOfBirthInput.fill("12-25-1984");
+ await personalPage.nextButton.click();
+ await expect(personalPage.dateOfBirthError).toBeVisible();
+ });
+
+ test("displays error for YYYY/MM/DD format in date of birth", async () => {
+ await personalPage.dateOfBirthInput.fill("1984/12/25");
+ await personalPage.nextButton.click();
+ await expect(personalPage.dateOfBirthError).toBeVisible();
+ });
+
+ test("displays error for DD/MM/YYYY format in date of birth", async () => {
+ await personalPage.dateOfBirthInput.fill("25/12/1984");
+ await personalPage.nextButton.click();
+ await expect(personalPage.dateOfBirthError).toBeVisible();
+ });
+
+ test("displays error for M/D/YY format in date of birth", async () => {
+ await personalPage.dateOfBirthInput.fill("1/1/84");
+ await personalPage.nextButton.click();
+ await expect(personalPage.dateOfBirthError).toBeVisible();
+ });
+
+ test("displays error for written date of birth", async () => {
+ await personalPage.dateOfBirthInput.fill("December 25, 1984");
+ await personalPage.nextButton.click();
+ await expect(personalPage.dateOfBirthError).toBeVisible();
+ });
+
+ test("displays error for future date of birth", async () => {
+ await personalPage.dateOfBirthInput.fill("12/31/2099");
+ await personalPage.nextButton.click();
+ await expect(personalPage.dateOfBirthError).toBeVisible();
+ });
+
+ test("displays error for missing email symbol", async () => {
+ await personalPage.emailInput.fill("testgmail.com");
+ await personalPage.nextButton.click();
+ await expect(personalPage.emailError).toBeVisible();
+ });
+
+ test("displays error for missing email domain", async () => {
+ await personalPage.emailInput.fill("test@.com");
+ await personalPage.nextButton.click();
+ await expect(personalPage.emailError).toBeVisible();
+ });
+
+ test("displays error for missing email username", async () => {
+ await personalPage.emailInput.fill("@gmail.com");
+ await personalPage.nextButton.click();
+ await expect(personalPage.emailError).toBeVisible();
+ });
+
+ test("displays error for missing email top-level domain", async () => {
+ await personalPage.emailInput.fill("user@gmail");
+ await personalPage.nextButton.click();
+ await expect(personalPage.emailError).toBeVisible();
+ });
+ });
});
}
-
-// test.describe("enters personal information", () => {
-// test("enters valid personal information", async ({ page }) => {
-// const personalPage = new PersonalPage(page);
-// await fillPersonalInfo(personalPage);
-// await expect(personalPage.firstNameInput).toHaveValue(
-// TEST_PATRON_INFO.firstName
-// );
-// await expect(personalPage.lastNameInput).toHaveValue(
-// TEST_PATRON_INFO.lastName
-// );
-// await expect(personalPage.dateOfBirthInput).toHaveValue(
-// TEST_PATRON_INFO.dateOfBirth
-// );
-// await expect(personalPage.emailInput).toHaveValue(TEST_PATRON_INFO.email);
-// });
-// });
-
-// test.describe("displays error messages", () => {
-// test("displays errors for required fields", async ({ page }) => {
-// const personalPage = new PersonalPage(page);
-// await personalPage.firstNameInput.fill("");
-// await personalPage.lastNameInput.fill("");
-// await personalPage.dateOfBirthInput.fill("");
-// await personalPage.emailInput.fill("");
-// await personalPage.nextButton.click();
-
-// await expect(personalPage.firstNameError).toBeVisible();
-// await expect(personalPage.lastNameError).toBeVisible();
-// await expect(personalPage.dateOfBirthError).toBeVisible();
-// await expect(personalPage.emailError).toBeVisible();
-// });
-
-// test("displays error for dashes in date of birth", async ({ page }) => {
-// const personalPage = new PersonalPage(page);
-// await personalPage.dateOfBirthInput.fill("12-25-1984");
-// await personalPage.nextButton.click();
-// await expect(personalPage.dateOfBirthError).toBeVisible();
-// });
-
-// test("displays error for YYYY/MM/DD format in date of birth", async ({
-// page,
-// }) => {
-// const personalPage = new PersonalPage(page);
-// await personalPage.dateOfBirthInput.fill("1984/12/25");
-// await personalPage.nextButton.click();
-// await expect(personalPage.dateOfBirthError).toBeVisible();
-// });
-
-// test("displays error for DD/MM/YYYY format in date of birth", async ({
-// page,
-// }) => {
-// const personalPage = new PersonalPage(page);
-// await personalPage.dateOfBirthInput.fill("25/12/1984");
-// await personalPage.nextButton.click();
-// await expect(personalPage.dateOfBirthError).toBeVisible();
-// });
-
-// test("displays error for M/D/YY format in date of birth", async ({
-// page,
-// }) => {
-// const personalPage = new PersonalPage(page);
-// await personalPage.dateOfBirthInput.fill("1/1/84");
-// await personalPage.nextButton.click();
-// await expect(personalPage.dateOfBirthError).toBeVisible();
-// });
-
-// test("displays error for written date of birth", async ({ page }) => {
-// const personalPage = new PersonalPage(page);
-// await personalPage.dateOfBirthInput.fill("December 25, 1984");
-// await personalPage.nextButton.click();
-// await expect(personalPage.dateOfBirthError).toBeVisible();
-// });
-
-// test("displays error for future date of birth", async ({ page }) => {
-// const personalPage = new PersonalPage(page);
-// await personalPage.dateOfBirthInput.fill("12/31/2099");
-// await personalPage.nextButton.click();
-// await expect(personalPage.dateOfBirthError).toBeVisible();
-// });
-
-// test("displays error for missing email symbol", async ({ page }) => {
-// const personalPage = new PersonalPage(page);
-// await personalPage.emailInput.fill("testgmail.com");
-// await personalPage.nextButton.click();
-// await expect(personalPage.emailError).toBeVisible();
-// });
-
-// test("displays error for missing email domain", async ({ page }) => {
-// const personalPage = new PersonalPage(page);
-// await personalPage.emailInput.fill("test@.com");
-// await personalPage.nextButton.click();
-// await expect(personalPage.emailError).toBeVisible();
-// });
-
-// test("displays error for missing email username", async ({ page }) => {
-// const personalPage = new PersonalPage(page);
-// await personalPage.emailInput.fill("@gmail.com");
-// await personalPage.nextButton.click();
-// await expect(personalPage.emailError).toBeVisible();
-// });
-
-// test("displays error for missing email top-level domain", async ({
-// page,
-// }) => {
-// const personalPage = new PersonalPage(page);
-// await personalPage.emailInput.fill("user@gmail");
-// await personalPage.nextButton.click();
-// await expect(personalPage.emailError).toBeVisible();
-// });
-// });
From 79ac2cda5686a70ddb1572637704b295137b8211 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Tue, 3 Feb 2026 09:55:48 -0700
Subject: [PATCH 03/36] Merge tests
---
playwright/tests/personal.spec.ts | 16 +++++-----------
1 file changed, 5 insertions(+), 11 deletions(-)
diff --git a/playwright/tests/personal.spec.ts b/playwright/tests/personal.spec.ts
index 85ad3d51..f09dfa7f 100644
--- a/playwright/tests/personal.spec.ts
+++ b/playwright/tests/personal.spec.ts
@@ -15,9 +15,13 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
});
test.describe("displays elements on personal information page", () => {
- test("displays headings", async () => {
+ test("displays headings, links, and buttons", async () => {
await expect(personalPage.mainHeading).toBeVisible();
await expect(personalPage.stepHeading).toBeVisible();
+ await expect(personalPage.alternateFormLink).toBeVisible();
+ await expect(personalPage.locationsLink).toBeVisible();
+ await expect(personalPage.previousButton).toBeVisible();
+ await expect(personalPage.nextButton).toBeVisible();
});
test("displays personal information form", async () => {
@@ -27,16 +31,6 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(personalPage.emailInput).toBeVisible();
await expect(personalPage.receiveInfoCheckbox).toBeVisible();
});
-
- test("displays links", async () => {
- await expect(personalPage.alternateFormLink).toBeVisible();
- await expect(personalPage.locationsLink).toBeVisible();
- });
-
- test("displays next and previous buttons", async () => {
- await expect(personalPage.previousButton).toBeVisible();
- await expect(personalPage.nextButton).toBeVisible();
- });
});
test.describe("enters personal information", () => {
From 0c1fe5401f8334d8b9fd9d88e379b547664b210c Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Wed, 4 Feb 2026 12:10:48 -0700
Subject: [PATCH 04/36] Update address page to be language agnostic
---
playwright/pageobjects/address.page.ts | 54 +++++---
playwright/pageobjects/page-manager.page.ts | 2 +-
playwright/tests/address.spec.ts | 146 ++++++++++----------
3 files changed, 114 insertions(+), 88 deletions(-)
diff --git a/playwright/pageobjects/address.page.ts b/playwright/pageobjects/address.page.ts
index f294649a..e1b0a678 100644
--- a/playwright/pageobjects/address.page.ts
+++ b/playwright/pageobjects/address.page.ts
@@ -1,5 +1,4 @@
import { Page, Locator } from "@playwright/test";
-import { ERROR_MESSAGES } from "../utils/constants";
export class AddressPage {
readonly page: Page;
@@ -18,34 +17,57 @@ export class AddressPage {
readonly nextButton: Locator;
readonly previousButton: Locator;
- constructor(page: Page) {
+ constructor(page: Page, appContent?: any) {
this.page = page;
this.mainHeading = page.getByRole("heading", {
- name: "Apply for a Library Card Online",
+ name: appContent?.banner?.title || "Apply for a Library Card Online",
level: 1,
});
this.stepHeading = page.getByRole("heading", {
- name: "Step 2 of 5: Address",
+ name: appContent?.location?.title || "Step 2 of 5: Address",
level: 2,
});
this.addressHeading = page.getByRole("heading", {
- name: "Home address",
+ name: appContent?.location?.address.title || "Home address",
level: 3,
});
- this.streetAddressInput = page.getByLabel(/Street address/i);
- this.apartmentSuiteInput = page.getByLabel(/Apartment \/ Suite/i);
- this.cityInput = page.getByLabel(/City/i);
- this.stateInput = page.getByLabel(/State/i);
- this.postalCodeInput = page.getByLabel(/Postal code/i);
+ this.streetAddressInput = page.getByLabel(
+ appContent?.location?.address.line1.label || "Street address"
+ );
+ this.apartmentSuiteInput = page.getByLabel(
+ appContent?.location?.address.line2.label || "Apartment / Suite"
+ );
+ this.cityInput = page.getByLabel(
+ appContent?.location?.address.city.label || "City"
+ );
+ this.stateInput = page.getByLabel(
+ appContent?.location?.address.state.label || "State"
+ );
+ this.postalCodeInput = page.getByLabel(
+ appContent?.location?.address.postalCode.label || "Postal code"
+ );
this.streetAddressError = page.getByText(
- ERROR_MESSAGES.STREET_ADDRESS_INVALID
+ appContent?.location?.errorMessage?.line1 ||
+ "There was a problem. Please enter a valid street address."
);
- this.cityError = page.getByText(ERROR_MESSAGES.CITY_INVALID);
- this.stateError = page.getByText(ERROR_MESSAGES.STATE_INVALID);
- this.postalCodeError = page.getByText(ERROR_MESSAGES.POSTAL_CODE_INVALID);
- this.nextButton = page.getByRole("button", { name: "Next", exact: true });
+ this.cityError = page.getByText(
+ appContent?.location?.errorMessage?.city ||
+ "There was a problem. Please enter a valid city."
+ );
+ this.stateError = page.getByText(
+ appContent?.location?.errorMessage?.state ||
+ "There was a problem. Please enter a 2-character state abbreviation."
+ );
+ this.postalCodeError = page.getByText(
+ appContent?.location?.errorMessage?.zip ||
+ "There was a problem. Please enter a 5 or 9-digit postal code."
+ );
+ this.nextButton = page.getByRole("button", {
+ name: appContent?.button?.next || "Next",
+ exact: true,
+ });
this.previousButton = page.getByRole("link", {
- name: "Previous",
+ name: appContent?.button?.previous || "Previous",
exact: true,
});
}
diff --git a/playwright/pageobjects/page-manager.page.ts b/playwright/pageobjects/page-manager.page.ts
index 1f0558d3..a3bf9b65 100644
--- a/playwright/pageobjects/page-manager.page.ts
+++ b/playwright/pageobjects/page-manager.page.ts
@@ -27,7 +27,7 @@ export class PageManager {
}
get addressPage(): AddressPage {
- return new AddressPage(this.page);
+ return new AddressPage(this.page, this.appContent);
}
get alternateAddressPage(): AlternateAddressPage {
diff --git a/playwright/tests/address.spec.ts b/playwright/tests/address.spec.ts
index 71a3efe6..a856c46d 100644
--- a/playwright/tests/address.spec.ts
+++ b/playwright/tests/address.spec.ts
@@ -1,83 +1,87 @@
import { test, expect } from "@playwright/test";
import { AddressPage } from "../pageobjects/address.page";
-import { TEST_OOS_ADDRESS } from "../utils/constants";
+import { SUPPORTED_LANGUAGES, TEST_OOS_ADDRESS } from "../utils/constants";
import { fillAddress } from "../utils/form-helper";
-test.beforeEach(async ({ page }) => {
- await page.goto("/library-card/location?newCard=true");
-});
+for (const { lang, name } of SUPPORTED_LANGUAGES) {
+ test.describe(`home address page in ${name} (${lang})`, () => {
+ let addressPage: AddressPage;
+ let appContent: any;
-test.describe("displays elements on Address page", () => {
- test("displays headings", async ({ page }) => {
- const addressPage = new AddressPage(page);
- await expect(addressPage.mainHeading).toBeVisible();
- await expect(addressPage.stepHeading).toBeVisible();
- await expect(addressPage.addressHeading).toBeVisible();
- });
+ test.beforeEach(async ({ page }) => {
+ appContent = require(`../../public/locales/${lang}/common.json`);
+ addressPage = new AddressPage(page, appContent);
+ await page.goto(`/library-card/location?newCard=true&lang=${lang}`);
+ });
- test("displays home address form", async ({ page }) => {
- const addressPage = new AddressPage(page);
- await expect(addressPage.streetAddressInput).toBeVisible();
- await expect(addressPage.apartmentSuiteInput).toBeVisible();
- await expect(addressPage.cityInput).toBeVisible();
- await expect(addressPage.stateInput).toBeVisible();
- await expect(addressPage.postalCodeInput).toBeVisible();
- });
+ test.describe("displays elements", () => {
+ test("displays headings", async () => {
+ await expect(addressPage.mainHeading).toBeVisible();
+ await expect(addressPage.stepHeading).toBeVisible();
+ await expect(addressPage.addressHeading).toBeVisible();
+ });
- test("displays next and previous buttons", async ({ page }) => {
- const addressPage = new AddressPage(page);
- await expect(addressPage.nextButton).toBeVisible();
- await expect(addressPage.previousButton).toBeVisible();
- });
-});
+ test("displays home address form", async () => {
+ await expect(addressPage.streetAddressInput).toBeVisible();
+ await expect(addressPage.apartmentSuiteInput).toBeVisible();
+ await expect(addressPage.cityInput).toBeVisible();
+ await expect(addressPage.stateInput).toBeVisible();
+ await expect(addressPage.postalCodeInput).toBeVisible();
+ });
-test.describe("enters home address", () => {
- test("enters valid home address", async ({ page }) => {
- const addressPage = new AddressPage(page);
- await fillAddress(addressPage, TEST_OOS_ADDRESS);
- await expect(addressPage.streetAddressInput).toHaveValue(
- TEST_OOS_ADDRESS.street
- );
- await expect(addressPage.apartmentSuiteInput).toHaveValue(
- TEST_OOS_ADDRESS.apartmentSuite
- );
- await expect(addressPage.cityInput).toHaveValue(TEST_OOS_ADDRESS.city);
- await expect(addressPage.stateInput).toHaveValue(TEST_OOS_ADDRESS.state);
- await expect(addressPage.postalCodeInput).toHaveValue(
- TEST_OOS_ADDRESS.postalCode
- );
- });
-});
+ test("displays next and previous buttons", async () => {
+ await expect(addressPage.nextButton).toBeVisible();
+ await expect(addressPage.previousButton).toBeVisible();
+ });
+ });
-test.describe("displays error messages", () => {
- test("displays errors for required fields", async ({ page }) => {
- const addressPage = new AddressPage(page);
- await addressPage.streetAddressInput.fill("");
- await addressPage.cityInput.fill("");
- await addressPage.stateInput.fill("");
- await addressPage.postalCodeInput.fill("");
- await addressPage.nextButton.click();
- await expect(addressPage.streetAddressError).toBeVisible();
- await expect(addressPage.cityError).toBeVisible();
- await expect(addressPage.stateError).toBeVisible();
- await expect(addressPage.postalCodeError).toBeVisible();
- });
+ test.describe("enters home address", () => {
+ test("enters valid home address", async () => {
+ await fillAddress(addressPage, TEST_OOS_ADDRESS);
+ await expect(addressPage.streetAddressInput).toHaveValue(
+ TEST_OOS_ADDRESS.street
+ );
+ await expect(addressPage.apartmentSuiteInput).toHaveValue(
+ TEST_OOS_ADDRESS.apartmentSuite
+ );
+ await expect(addressPage.cityInput).toHaveValue(TEST_OOS_ADDRESS.city);
+ await expect(addressPage.stateInput).toHaveValue(
+ TEST_OOS_ADDRESS.state
+ );
+ await expect(addressPage.postalCodeInput).toHaveValue(
+ TEST_OOS_ADDRESS.postalCode
+ );
+ });
+ });
- test("enter too many characters", async ({ page }) => {
- const addressPage = new AddressPage(page);
- await addressPage.stateInput.fill("ABC");
- await addressPage.postalCodeInput.fill("123456");
- await addressPage.nextButton.click();
- await expect(addressPage.stateError).toBeVisible();
- await expect(addressPage.postalCodeError).toBeVisible();
- });
+ test.describe("displays error messages", () => {
+ test("displays errors for required fields", async () => {
+ await addressPage.streetAddressInput.fill("");
+ await addressPage.cityInput.fill("");
+ await addressPage.stateInput.fill("");
+ await addressPage.postalCodeInput.fill("");
+ await addressPage.nextButton.click();
+ await expect(addressPage.streetAddressError).toBeVisible();
+ await expect(addressPage.cityError).toBeVisible();
+ await expect(addressPage.stateError).toBeVisible();
+ await expect(addressPage.postalCodeError).toBeVisible();
+ });
+
+ test("enter too many characters", async () => {
+ await addressPage.stateInput.fill("ABC");
+ await addressPage.postalCodeInput.fill("123456");
+ await addressPage.nextButton.click();
+ await expect(addressPage.stateError).toBeVisible();
+ await expect(addressPage.postalCodeError).toBeVisible();
+ });
- test("enter too few characters", async ({ page }) => {
- const addressPage = new AddressPage(page);
- await addressPage.stateInput.fill("A");
- await addressPage.postalCodeInput.fill("1234");
- await addressPage.nextButton.click();
- await expect(addressPage.stateError).toBeVisible();
- await expect(addressPage.postalCodeError).toBeVisible();
+ test("enter too few characters", async () => {
+ await addressPage.stateInput.fill("A");
+ await addressPage.postalCodeInput.fill("1234");
+ await addressPage.nextButton.click();
+ await expect(addressPage.stateError).toBeVisible();
+ await expect(addressPage.postalCodeError).toBeVisible();
+ });
+ });
});
-});
+}
From 87a3a27840dfa01ecc5bc0feaf7f896181fd4431 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Wed, 4 Feb 2026 12:31:39 -0700
Subject: [PATCH 05/36] Update e2e tests
---
playwright/tests/e2e-mocked.spec.ts | 14 +++++++-------
playwright/tests/e2e.spec.ts | 14 +++++++-------
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/playwright/tests/e2e-mocked.spec.ts b/playwright/tests/e2e-mocked.spec.ts
index 6ec44bca..837a59d4 100644
--- a/playwright/tests/e2e-mocked.spec.ts
+++ b/playwright/tests/e2e-mocked.spec.ts
@@ -4,13 +4,13 @@ import {
SUPPORTED_LANGUAGES,
// TEST_BARCODE_NUMBER,
// TEST_NYC_ADDRESS,
- // TEST_OOS_ADDRESS,
+ TEST_OOS_ADDRESS,
// TEST_PATRON_INFO,
} from "../utils/constants";
// import { mockCreatePatronApi } from "../utils/mock-api";
import {
// fillAccountInfo,
- // fillAddress,
+ fillAddress,
fillPersonalInfo,
} from "../utils/form-helper";
@@ -39,11 +39,11 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await pageManager.personalPage.nextButton.click();
});
- // await test.step("enters home address", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
- // await pageManager.addressPage.nextButton.click();
- // });
+ await test.step("enters home address", async () => {
+ await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
+ await pageManager.addressPage.nextButton.click();
+ });
// await test.step("enters alternate address", async () => {
// await expect(
diff --git a/playwright/tests/e2e.spec.ts b/playwright/tests/e2e.spec.ts
index f5f96ee1..02dc29a5 100644
--- a/playwright/tests/e2e.spec.ts
+++ b/playwright/tests/e2e.spec.ts
@@ -2,13 +2,13 @@ import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
import {
fillPersonalInfo,
- // fillAddress,
+ fillAddress,
// fillAccountInfo,
} from "../utils/form-helper";
import {
SUPPORTED_LANGUAGES,
// TEST_CUSTOMIZE_ACCOUNT,
- // TEST_OOS_ADDRESS,
+ TEST_OOS_ADDRESS,
// TEST_NYC_ADDRESS,
// TEST_PATRON_INFO,
} from "../utils/constants";
@@ -55,11 +55,11 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await pageManager.personalPage.nextButton.click();
});
- // await test.step("enters home address", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
- // await pageManager.addressPage.nextButton.click();
- // });
+ await test.step("enters home address", async () => {
+ await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
+ await pageManager.addressPage.nextButton.click();
+ });
// await test.step("enters alternate address", async () => {
// await expect(pageManager.alternateAddressPage.stepHeading).toBeVisible();
From 25de9072c28295170d204c5678da91b5ed78710f Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Wed, 4 Feb 2026 12:32:28 -0700
Subject: [PATCH 06/36] Remove error messages
---
playwright/utils/constants.ts | 4 ----
1 file changed, 4 deletions(-)
diff --git a/playwright/utils/constants.ts b/playwright/utils/constants.ts
index 0358d559..5dda2672 100644
--- a/playwright/utils/constants.ts
+++ b/playwright/utils/constants.ts
@@ -77,10 +77,6 @@ export const ERROR_MESSAGES = {
LAST_NAME_INVALID: appContent.personal.errorMessage.lastName,
DATE_OF_BIRTH_INVALID: appContent.personal.errorMessage.birthdate,
EMAIL_INVALID: appContent.personal.errorMessage.email,
- STREET_ADDRESS_INVALID: appContent.location.errorMessage.line1,
- CITY_INVALID: appContent.location.errorMessage.city,
- STATE_INVALID: appContent.location.errorMessage.state,
- POSTAL_CODE_INVALID: appContent.location.errorMessage.zip,
USERNAME_INVALID: appContent.account.errorMessage.username,
USERNAME_UNAVAILABLE: "This username is unavailable. Please try another.",
USERNAME_AVAILABLE: "This username is available.",
From 727ac27e9bc506e0797a9f267c32f74e095d1230 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Wed, 4 Feb 2026 12:47:54 -0700
Subject: [PATCH 07/36] Remove error messages
---
playwright/utils/constants.ts | 4 ----
1 file changed, 4 deletions(-)
diff --git a/playwright/utils/constants.ts b/playwright/utils/constants.ts
index 0358d559..072ee590 100644
--- a/playwright/utils/constants.ts
+++ b/playwright/utils/constants.ts
@@ -73,10 +73,6 @@ export const TEST_BARCODE_NUMBER = "12341234123412";
export const ERROR_MESSAGES = {
// probs remove this at the end
- FIRST_NAME_INVALID: appContent.personal.errorMessage.firstName,
- LAST_NAME_INVALID: appContent.personal.errorMessage.lastName,
- DATE_OF_BIRTH_INVALID: appContent.personal.errorMessage.birthdate,
- EMAIL_INVALID: appContent.personal.errorMessage.email,
STREET_ADDRESS_INVALID: appContent.location.errorMessage.line1,
CITY_INVALID: appContent.location.errorMessage.city,
STATE_INVALID: appContent.location.errorMessage.state,
From f57bd6daf16b1413e53f467b3ce4dadc3f7935d8 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Wed, 4 Feb 2026 12:55:54 -0700
Subject: [PATCH 08/36] Add string back to error message locators
---
playwright/pageobjects/review.page.ts | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/playwright/pageobjects/review.page.ts b/playwright/pageobjects/review.page.ts
index 4c43aade..a46c4f50 100644
--- a/playwright/pageobjects/review.page.ts
+++ b/playwright/pageobjects/review.page.ts
@@ -96,7 +96,9 @@ export class ReviewPage {
name: "First name (required)",
exact: true,
});
- this.firstNameError = page.getByText(ERROR_MESSAGES.FIRST_NAME_INVALID);
+ this.firstNameError = page.getByText(
+ "There was a problem. Please enter a valid first name."
+ );
this.lastNameHeading = page.getByText("Last name", { exact: true });
this.lastNameInputHeading = page.getByText("Last name (required)", {
exact: true,
@@ -105,7 +107,9 @@ export class ReviewPage {
name: "Last name (required)",
exact: true,
});
- this.lastNameError = page.getByText(ERROR_MESSAGES.LAST_NAME_INVALID);
+ this.lastNameError = page.getByText(
+ "There was a problem. Please enter a valid last name."
+ );
this.dateOfBirthHeading = page.getByText("Date of birth", { exact: true });
this.dateOfBirthInputHeading = page.getByText("Date of birth (required)", {
exact: true,
@@ -115,7 +119,7 @@ export class ReviewPage {
exact: true,
});
this.dateOfBirthError = page.getByText(
- ERROR_MESSAGES.DATE_OF_BIRTH_INVALID
+ "There was a problem. Please enter a valid date, MM/DD/YYYY, including slashes."
);
this.emailHeading = page.getByText("Email address", { exact: true });
this.emailInputHeading = page.getByText("Email address (required)", {
@@ -125,7 +129,9 @@ export class ReviewPage {
name: "Email address (required)",
exact: true,
});
- this.emailError = page.getByText(ERROR_MESSAGES.EMAIL_INVALID);
+ this.emailError = page.getByText(
+ "There was a problem. Please enter a valid email address."
+ );
this.receiveInfoHeading = page.getByText(
"Receive information about NYPL's programs and services",
{ exact: true }
From 8ff4591bdc630573a1a4b0bfc361c698413f1d53 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Thu, 5 Feb 2026 09:56:17 -0700
Subject: [PATCH 09/36] Combine small tests
---
playwright/tests/address.spec.ts | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/playwright/tests/address.spec.ts b/playwright/tests/address.spec.ts
index a856c46d..03fe7e40 100644
--- a/playwright/tests/address.spec.ts
+++ b/playwright/tests/address.spec.ts
@@ -15,10 +15,12 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
});
test.describe("displays elements", () => {
- test("displays headings", async () => {
+ test("displays headings and buttons", async () => {
await expect(addressPage.mainHeading).toBeVisible();
await expect(addressPage.stepHeading).toBeVisible();
await expect(addressPage.addressHeading).toBeVisible();
+ await expect(addressPage.nextButton).toBeVisible();
+ await expect(addressPage.previousButton).toBeVisible();
});
test("displays home address form", async () => {
@@ -28,11 +30,6 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(addressPage.stateInput).toBeVisible();
await expect(addressPage.postalCodeInput).toBeVisible();
});
-
- test("displays next and previous buttons", async () => {
- await expect(addressPage.nextButton).toBeVisible();
- await expect(addressPage.previousButton).toBeVisible();
- });
});
test.describe("enters home address", () => {
From 31d0e3385080da896edbf52a89e35f1d81983b89 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Fri, 6 Feb 2026 13:23:53 -0700
Subject: [PATCH 10/36] Update new Trans component
---
playwright/pageobjects/personal.page.ts | 2 --
public/locales/en/common.json | 2 +-
public/locales/es/common.json | 2 +-
src/components/PersonalFormFields/index.tsx | 9 ++++++++-
4 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/playwright/pageobjects/personal.page.ts b/playwright/pageobjects/personal.page.ts
index 580afa2e..942808ac 100644
--- a/playwright/pageobjects/personal.page.ts
+++ b/playwright/pageobjects/personal.page.ts
@@ -58,11 +58,9 @@ export class PersonalPage {
);
this.alternateFormLink = this.page.getByRole("link", {
name: appContent?.personal?.email?.alternateForm || "alternate form",
- exact: true,
});
this.locationsLink = this.page.getByRole("link", {
name: appContent?.personal?.email?.locations || "locations",
- exact: true,
});
this.receiveInfoCheckbox = this.page.getByText(
appContent?.personal?.eCommunications?.labelText ||
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 6cf729a8..18b3c82e 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -40,7 +40,7 @@
"ageGate": "Yes, I am over 13 years old.",
"email": {
"label": "Email address",
- "instruction": "An email address is required to use many of our digital resources, such as e-books. If you do not wish to provide an email address, you can apply for a physical card using our {{alternateForm}}. Once filled out, please visit one of our {{locations}} with proof of identity and home address to pick up your card.",
+ "instruction": "An email address is required to use many of our digital resources, such as e-books. If you do not wish to provide an email address, you can apply for a physical card using our {{alternateForm}}. Once filled out, please visit one of our {{locations}} with proof of identity and home address to pick up your card.",
"alternateForm": "alternate form",
"locations": "locations"
},
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index 962111db..04c8c4ac 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -28,7 +28,7 @@
"ageGate": "Yes, I am over 13 years old.",
"email": {
"label": "Dirección de correo electrónico",
- "instruction": "Se requiere una dirección de correo electrónico para utilizar muchos de nuestros recursos digitales, como los libros electrónicos. Si no desea proporcionar una dirección de correo electrónico, puede solicitar una tarjeta física utilizando nuestro {{alternateForm}}. Una vez que lo haya completado, por favor visite una de nuestras {{locations}} con un comprobante de identidad y domicilio para recoger su tarjeta física.",
+ "instruction": "Se requiere una dirección de correo electrónico para utilizar muchos de nuestros recursos digitales, como los libros electrónicos. Si no desea proporcionar una dirección de correo electrónico, puede solicitar una tarjeta física utilizando nuestro {{alternateForm}}. Una vez que lo haya completado, por favor visite una de nuestras {{locations}} con un comprobante de identidad y domicilio para recoger su tarjeta física.",
"alternateForm": "formulario alterno (en inglés)",
"locations": "bibliotecas"
},
diff --git a/src/components/PersonalFormFields/index.tsx b/src/components/PersonalFormFields/index.tsx
index 97d6ac82..0a44d79f 100644
--- a/src/components/PersonalFormFields/index.tsx
+++ b/src/components/PersonalFormFields/index.tsx
@@ -81,7 +81,14 @@ function PersonalFormFields({ id = "" }: PersonalFormFieldsProps) {
instructionText={
}}
+ values={{
+ alternateForm: t("personal.email.alternateForm"),
+ locations: t("personal.email.locations"),
+ }}
+ components={{
+ a1: ,
+ a2: ,
+ }}
/>
}
autoComplete="email"
From 62b05da64ceae62cf08d5f15fd5bf1dffd6065e4 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Fri, 6 Feb 2026 13:57:10 -0700
Subject: [PATCH 11/36] Add missing chained locator
---
playwright/pageobjects/personal.page.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/playwright/pageobjects/personal.page.ts b/playwright/pageobjects/personal.page.ts
index 942808ac..e7eba1bb 100644
--- a/playwright/pageobjects/personal.page.ts
+++ b/playwright/pageobjects/personal.page.ts
@@ -59,7 +59,7 @@ export class PersonalPage {
this.alternateFormLink = this.page.getByRole("link", {
name: appContent?.personal?.email?.alternateForm || "alternate form",
});
- this.locationsLink = this.page.getByRole("link", {
+ this.locationsLink = this.page.locator("#mainContent").getByRole("link", {
name: appContent?.personal?.email?.locations || "locations",
});
this.receiveInfoCheckbox = this.page.getByText(
From 3e47473325195897909a0811cd50ea6ea34f5711 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Mon, 9 Feb 2026 10:53:43 -0700
Subject: [PATCH 12/36] Add chained locators
---
.../pageobjects/alternate-address.page.ts | 35 +++++++++++++------
playwright/pageobjects/page-manager.page.ts | 2 +-
2 files changed, 25 insertions(+), 12 deletions(-)
diff --git a/playwright/pageobjects/alternate-address.page.ts b/playwright/pageobjects/alternate-address.page.ts
index 601ee166..365e4962 100644
--- a/playwright/pageobjects/alternate-address.page.ts
+++ b/playwright/pageobjects/alternate-address.page.ts
@@ -13,28 +13,41 @@ export class AlternateAddressPage {
readonly nextButton: Locator;
readonly previousButton: Locator;
- constructor(page: Page) {
+ constructor(page: Page, appContent?: any) {
this.page = page;
this.mainHeading = page.getByRole("heading", {
- name: "Apply for a Library Card Online",
+ name: appContent?.banner?.title || "Apply for a Library Card Online",
level: 1,
});
this.stepHeading = page.getByRole("heading", {
- name: "Alternate address",
+ name: appContent?.location?.title || "Alternate address",
level: 2,
});
this.addressHeading = page.getByRole("heading", {
- name: "Alternate address",
+ name: appContent?.location?.title || "Alternate address",
level: 3,
});
- this.streetAddressInput = page.getByLabel(/Street address/i);
- this.apartmentSuiteInput = page.getByLabel(/Apartment \/ Suite/i);
- this.cityInput = page.getByLabel(/City/i);
- this.stateInput = page.getByLabel(/State/i);
- this.postalCodeInput = page.getByLabel(/Postal code/i);
- this.nextButton = page.getByRole("button", { name: "Next", exact: true });
+ this.streetAddressInput = page.getByLabel(
+ appContent?.location?.address.line1.label || "Street address"
+ );
+ this.apartmentSuiteInput = page.getByLabel(
+ appContent?.location?.address.line2.label || "Apartment / Suite"
+ );
+ this.cityInput = page.getByLabel(
+ appContent?.location?.city.label || "City"
+ );
+ this.stateInput = page.getByLabel(
+ appContent?.location?.state.label || "State"
+ );
+ this.postalCodeInput = page.getByLabel(
+ appContent?.location?.postalCode.label || "Postal code"
+ );
+ this.nextButton = page.getByRole("button", {
+ name: appContent?.button?.next || "Next",
+ exact: true,
+ });
this.previousButton = page.getByRole("link", {
- name: "Previous",
+ name: appContent?.button?.previous || "Previous",
exact: true,
});
}
diff --git a/playwright/pageobjects/page-manager.page.ts b/playwright/pageobjects/page-manager.page.ts
index a3bf9b65..2b0f5dd3 100644
--- a/playwright/pageobjects/page-manager.page.ts
+++ b/playwright/pageobjects/page-manager.page.ts
@@ -31,7 +31,7 @@ export class PageManager {
}
get alternateAddressPage(): AlternateAddressPage {
- return new AlternateAddressPage(this.page);
+ return new AlternateAddressPage(this.page, this.appContent);
}
get addressVerificationPage(): AddressVerificationPage {
From 2230df8a78693ad99728dddc30487297e56f1296 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Mon, 9 Feb 2026 12:17:25 -0700
Subject: [PATCH 13/36] Fix brackets
---
playwright/tests/address.spec.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/playwright/tests/address.spec.ts b/playwright/tests/address.spec.ts
index 5fb4c5df..3d12dd23 100644
--- a/playwright/tests/address.spec.ts
+++ b/playwright/tests/address.spec.ts
@@ -79,12 +79,12 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(addressPage.stateError).toBeVisible();
await expect(addressPage.postalCodeError).toBeVisible();
});
-
- test("enter postal code with dash", async ({ page }) => {
+
+ test("enter postal code with dash", async () => {
await addressPage.postalCodeInput.fill("12345-6789");
await addressPage.nextButton.click();
await expect(addressPage.postalCodeError).toBeVisible();
});
});
});
-});
+}
From fd04116e0f02c7c90bda15b695de590e3af597d1 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Mon, 9 Feb 2026 15:18:07 -0700
Subject: [PATCH 14/36] Update alternate address tests
---
.../pageobjects/alternate-address.page.ts | 4 +-
playwright/tests/alternate-address.spec.ts | 92 ++++++------
playwright/tests/backward-navigation.spec.ts | 41 +++---
playwright/tests/e2e-mocked.spec.ts | 137 +++++++++---------
playwright/tests/e2e-partial.spec.ts | 101 ++++++++-----
5 files changed, 204 insertions(+), 171 deletions(-)
diff --git a/playwright/pageobjects/alternate-address.page.ts b/playwright/pageobjects/alternate-address.page.ts
index 5c673a44..90caca56 100644
--- a/playwright/pageobjects/alternate-address.page.ts
+++ b/playwright/pageobjects/alternate-address.page.ts
@@ -21,11 +21,11 @@ export class AlternateAddressPage {
level: 1,
});
this.stepHeading = page.getByRole("heading", {
- name: appContent?.location?.title || "Alternate address",
+ name: appContent?.location?.workAddress?.title || "Alternate address",
level: 2,
});
this.addressHeading = page.getByRole("heading", {
- name: appContent?.location?.title || "Alternate address",
+ name: appContent?.location?.workAddress?.title || "Alternate address",
level: 3,
});
this.streetAddressInput = page.getByLabel(
diff --git a/playwright/tests/alternate-address.spec.ts b/playwright/tests/alternate-address.spec.ts
index 82eec873..293b2e92 100644
--- a/playwright/tests/alternate-address.spec.ts
+++ b/playwright/tests/alternate-address.spec.ts
@@ -1,54 +1,56 @@
import { test, expect } from "@playwright/test";
import { AlternateAddressPage } from "../pageobjects/alternate-address.page";
-import { TEST_NYC_ADDRESS } from "../utils/constants";
import { fillAddress } from "../utils/form-helper";
+import { SUPPORTED_LANGUAGES, TEST_NYC_ADDRESS } from "../utils/constants";
-test.beforeEach(async ({ page }) => {
- await page.goto("/library-card/workAddress?newCard=true");
-});
+for (const { lang, name } of SUPPORTED_LANGUAGES) {
+ test.describe(`alternate address page in ${name} (${lang})`, () => {
+ let alternateAddressPage: AlternateAddressPage;
+ let appContent: any;
-test.describe("displays elements on Alternate address page", () => {
- test("displays all headings", async ({ page }) => {
- const alternateAddressPage = new AlternateAddressPage(page);
- await expect(alternateAddressPage.mainHeading).toBeVisible();
- await expect(alternateAddressPage.stepHeading).toBeVisible();
- await expect(alternateAddressPage.addressHeading).toBeVisible();
- });
+ test.beforeEach(async ({ page }) => {
+ appContent = require(`../../public/locales/${lang}/common.json`);
+ alternateAddressPage = new AlternateAddressPage(page, appContent);
+ await page.goto(`/library-card/workAddress?newCard=true&lang=${lang}`);
+ });
- test("displays alternate address form", async ({ page }) => {
- const alternateAddressPage = new AlternateAddressPage(page);
- await expect(alternateAddressPage.streetAddressInput).toBeVisible();
- await expect(alternateAddressPage.apartmentSuiteInput).toBeVisible();
- await expect(alternateAddressPage.cityInput).toBeVisible();
- await expect(alternateAddressPage.stateInput).toBeVisible();
- await expect(alternateAddressPage.postalCodeInput).toBeVisible();
- });
+ test.describe("displays elements", () => {
+ test("displays headings and buttons", async () => {
+ await expect(alternateAddressPage.mainHeading).toBeVisible();
+ await expect(alternateAddressPage.stepHeading).toBeVisible();
+ await expect(alternateAddressPage.addressHeading).toBeVisible();
+ await expect(alternateAddressPage.nextButton).toBeVisible();
+ await expect(alternateAddressPage.previousButton).toBeVisible();
+ });
- test("displays next and previous buttons", async ({ page }) => {
- const alternateAddressPage = new AlternateAddressPage(page);
- await expect(alternateAddressPage.nextButton).toBeVisible();
- await expect(alternateAddressPage.previousButton).toBeVisible();
- });
-});
+ test("displays alternate address form", async () => {
+ await expect(alternateAddressPage.streetAddressInput).toBeVisible();
+ await expect(alternateAddressPage.apartmentSuiteInput).toBeVisible();
+ await expect(alternateAddressPage.cityInput).toBeVisible();
+ await expect(alternateAddressPage.stateInput).toBeVisible();
+ await expect(alternateAddressPage.postalCodeInput).toBeVisible();
+ });
+ });
-test.describe("enters alternate address", () => {
- test("enters valid alternate address", async ({ page }) => {
- const alternateAddressPage = new AlternateAddressPage(page);
- await fillAddress(alternateAddressPage, TEST_NYC_ADDRESS);
- await expect(alternateAddressPage.streetAddressInput).toHaveValue(
- TEST_NYC_ADDRESS.street
- );
- await expect(alternateAddressPage.apartmentSuiteInput).toHaveValue(
- TEST_NYC_ADDRESS.apartmentSuite
- );
- await expect(alternateAddressPage.cityInput).toHaveValue(
- TEST_NYC_ADDRESS.city
- );
- await expect(alternateAddressPage.stateInput).toHaveValue(
- TEST_NYC_ADDRESS.state
- );
- await expect(alternateAddressPage.postalCodeInput).toHaveValue(
- TEST_NYC_ADDRESS.postalCode
- );
+ test.describe("enters alternate address", () => {
+ test("enters valid alternate address", async () => {
+ await fillAddress(alternateAddressPage, TEST_NYC_ADDRESS);
+ await expect(alternateAddressPage.streetAddressInput).toHaveValue(
+ TEST_NYC_ADDRESS.street
+ );
+ await expect(alternateAddressPage.apartmentSuiteInput).toHaveValue(
+ TEST_NYC_ADDRESS.apartmentSuite
+ );
+ await expect(alternateAddressPage.cityInput).toHaveValue(
+ TEST_NYC_ADDRESS.city
+ );
+ await expect(alternateAddressPage.stateInput).toHaveValue(
+ TEST_NYC_ADDRESS.state
+ );
+ await expect(alternateAddressPage.postalCodeInput).toHaveValue(
+ TEST_NYC_ADDRESS.postalCode
+ );
+ });
+ });
});
-});
+}
diff --git a/playwright/tests/backward-navigation.spec.ts b/playwright/tests/backward-navigation.spec.ts
index 392acc4b..1b8b24d5 100644
--- a/playwright/tests/backward-navigation.spec.ts
+++ b/playwright/tests/backward-navigation.spec.ts
@@ -1,11 +1,11 @@
import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
-import { /*fillAddress,*/ fillPersonalInfo } from "../utils/form-helper";
+import { fillAddress, fillPersonalInfo } from "../utils/form-helper";
import {
- // SPINNER_TIMEOUT,
+ SPINNER_TIMEOUT,
SUPPORTED_LANGUAGES,
- // TEST_NYC_ADDRESS,
- // TEST_OOS_ADDRESS,
+ TEST_NYC_ADDRESS,
+ TEST_OOS_ADDRESS,
// TEST_PATRON_INFO,
} from "../utils/constants";
@@ -68,22 +68,25 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await pageManager.personalPage.nextButton.click();
});
- // await test.step("enters home address", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
- // await pageManager.addressPage.nextButton.click();
- // });
+ await test.step("enters home address", async () => {
+ await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
+ await pageManager.addressPage.nextButton.click();
+ await expect(pageManager.addressPage.spinner).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
+ });
- // await test.step("enters alternate address", async () => {
- // await expect(
- // pageManager.alternateAddressPage.stepHeading
- // ).toBeVisible();
- // await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
- // await pageManager.alternateAddressPage.nextButton.click();
- // await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
+ await test.step("enters alternate address", async () => {
+ await expect(
+ pageManager.alternateAddressPage.stepHeading
+ ).toBeVisible();
+ await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
+ await pageManager.alternateAddressPage.nextButton.click();
+ await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
+ });
// await test.step("confirms address verification", async () => {
// await expect(
diff --git a/playwright/tests/e2e-mocked.spec.ts b/playwright/tests/e2e-mocked.spec.ts
index 805c925d..2423dc2a 100644
--- a/playwright/tests/e2e-mocked.spec.ts
+++ b/playwright/tests/e2e-mocked.spec.ts
@@ -1,18 +1,19 @@
import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
import {
+ // fillAccountInfo,
+ fillAddress,
+ fillPersonalInfo,
+} from "../utils/form-helper";
+import {
+ SPINNER_TIMEOUT,
SUPPORTED_LANGUAGES,
// TEST_BARCODE_NUMBER,
- // TEST_NYC_ADDRESS,
+ TEST_NYC_ADDRESS,
TEST_OOS_ADDRESS,
// TEST_PATRON_INFO,
} from "../utils/constants";
// import { mockCreatePatronApi } from "../utils/mock-api";
-import {
- // fillAccountInfo,
- fillAddress,
- fillPersonalInfo,
-} from "../utils/form-helper";
for (const { lang, name } of SUPPORTED_LANGUAGES) {
test.describe(`E2E: Complete application using mocked submit in ${name} (${lang})`, () => {
@@ -29,79 +30,85 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(pageManager.landingPage.applyHeading).toBeVisible();
await pageManager.landingPage.getStartedButton.click();
});
-
- await test.step("enters personal information", async () => {
- await expect(pageManager.personalPage.stepHeading).toBeVisible();
- await fillPersonalInfo(pageManager.personalPage);
- });
- await test.step("unchecks receive info checkbox", async () => {
- await pageManager.personalPage.receiveInfoCheckbox.click();
- await expect(
- pageManager.personalPage.receiveInfoCheckbox
- ).not.toBeChecked();
- await pageManager.personalPage.nextButton.click();
- });
+ await test.step("enters personal information", async () => {
+ await expect(pageManager.personalPage.stepHeading).toBeVisible();
+ await fillPersonalInfo(pageManager.personalPage);
+ });
+
+ await test.step("unchecks receive info checkbox", async () => {
+ await pageManager.personalPage.receiveInfoCheckbox.click();
+ await expect(
+ pageManager.personalPage.receiveInfoCheckbox
+ ).not.toBeChecked();
+ await pageManager.personalPage.nextButton.click();
+ });
await test.step("enters home address", async () => {
await expect(pageManager.addressPage.stepHeading).toBeVisible();
await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
await pageManager.addressPage.nextButton.click();
+ await expect(pageManager.addressPage.spinner).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
});
- // await test.step("enters alternate address", async () => {
- // await expect(
- // pageManager.alternateAddressPage.stepHeading
- // ).toBeVisible();
- // await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
- // await pageManager.alternateAddressPage.nextButton.click();
- // });
+ await test.step("enters alternate address", async () => {
+ await expect(
+ pageManager.alternateAddressPage.stepHeading
+ ).toBeVisible();
+ await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
+ await pageManager.alternateAddressPage.nextButton.click();
+ await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
- // await test.step("confirms address verification", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await pageManager.addressVerificationPage
- // .getHomeAddressOption(TEST_OOS_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage
- // .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage.nextButton.click();
- // });
+ // await test.step("confirms address verification", async () => {
+ // await expect(
+ // pageManager.addressVerificationPage.stepHeading
+ // ).toBeVisible();
+ // await pageManager.addressVerificationPage
+ // .getHomeAddressOption(TEST_OOS_ADDRESS.street)
+ // .check();
+ // await pageManager.addressVerificationPage
+ // .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
+ // .check();
+ // await pageManager.addressVerificationPage.nextButton.click();
+ // });
- // await test.step("enters account information", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await fillAccountInfo(pageManager.accountPage);
- // await pageManager.accountPage.nextButton.click();
- // });
+ // await test.step("enters account information", async () => {
+ // await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ // await fillAccountInfo(pageManager.accountPage);
+ // await pageManager.accountPage.nextButton.click();
+ // });
- // await test.step("displays review page", async () => {
- // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
- // });
-
- // await test.step("verifies receive info checkbox is unchecked on review page", async () => {
- // await pageManager.reviewPage.editPersonalInfoButton.click();
- // await expect(
+ // await test.step("displays review page", async () => {
+ // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
+ // });
+
+ // await test.step("verifies receive info checkbox is unchecked on review page", async () => {
+ // await pageManager.reviewPage.editPersonalInfoButton.click();
+ // await expect(
// pageManager.reviewPage.receiveInfoCheckbox
- // ).not.toBeChecked();
- // });
+ // ).not.toBeChecked();
+ // });
- // await test.step("submits application", async () => {
- // await mockCreatePatronApi(page, fullName, TEST_BARCODE_NUMBER);
- // await expect(pageManager.reviewPage.submitButton).toBeVisible();
- // await pageManager.reviewPage.submitButton.click();
- // });
+ // await test.step("submits application", async () => {
+ // await mockCreatePatronApi(page, fullName, TEST_BARCODE_NUMBER);
+ // await expect(pageManager.reviewPage.submitButton).toBeVisible();
+ // await pageManager.reviewPage.submitButton.click();
+ // });
- // await test.step("displays variable elements on Congrats page", async () => {
- // await expect(pageManager.congratsPage.memberNameHeading).toBeVisible();
- // await expect(pageManager.congratsPage.memberName).toHaveText(fullName);
- // await expect(pageManager.congratsPage.issuedDateHeading).toBeVisible();
- // await expect(pageManager.congratsPage.issuedDate).toBeVisible();
- // await expect(pageManager.congratsPage.patronBarcodeNumber).toHaveText(
- // TEST_BARCODE_NUMBER
- // );
- // });
+ // await test.step("displays variable elements on Congrats page", async () => {
+ // await expect(pageManager.congratsPage.memberNameHeading).toBeVisible();
+ // await expect(pageManager.congratsPage.memberName).toHaveText(fullName);
+ // await expect(pageManager.congratsPage.issuedDateHeading).toBeVisible();
+ // await expect(pageManager.congratsPage.issuedDate).toBeVisible();
+ // await expect(pageManager.congratsPage.patronBarcodeNumber).toHaveText(
+ // TEST_BARCODE_NUMBER
+ // );
+ // });
+ });
});
});
}
diff --git a/playwright/tests/e2e-partial.spec.ts b/playwright/tests/e2e-partial.spec.ts
index 4c2c7ad8..43290689 100644
--- a/playwright/tests/e2e-partial.spec.ts
+++ b/playwright/tests/e2e-partial.spec.ts
@@ -1,46 +1,67 @@
-// import { test, expect } from "@playwright/test";
-// import { PageManager } from "../pageobjects/page-manager.page";
-// import { fillAccountInfo, fillAddress } from "../utils/form-helper";
+import { test, expect } from "@playwright/test";
+import { PageManager } from "../pageobjects/page-manager.page";
+import { /*fillAccountInfo,*/ fillAddress } from "../utils/form-helper";
+import {
+ SPINNER_TIMEOUT,
+ SUPPORTED_LANGUAGES,
+ // TEST_PATRON_INFO,
+} from "../utils/constants";
-// test("displays error when address is too long", async ({ page }) => {
-// const pageManager = new PageManager(page);
-// const invalidStreet = "A".repeat(100);
+for (const { lang, name } of SUPPORTED_LANGUAGES) {
+ test.describe(`E2E: Validate address errors in ${name} (${lang})`, () => {
+ let pageManager: PageManager;
+ let appContent: any;
-// await test.step("enters invalid home address", async () => {
-// await page.goto("/library-card/location?newCard=true");
-// await expect(pageManager.addressPage.stepHeading).toBeVisible();
-// await fillAddress(pageManager.addressPage, {
-// street: invalidStreet,
-// apartmentSuite: "1",
-// city: "City",
-// state: "NY",
-// postalCode: "12345",
-// });
-// await pageManager.addressPage.nextButton.click();
-// });
+ test("displays error when address is too long", async ({ page }) => {
+ appContent = require(`../../public/locales/${lang}/common.json`);
+ pageManager = new PageManager(page, appContent);
+ const invalidStreet = "A".repeat(100);
-// await test.step("skips alternate address", async () => {
-// await expect(pageManager.alternateAddressPage.stepHeading).toBeVisible();
-// await pageManager.alternateAddressPage.nextButton.click();
-// });
+ await test.step("enters invalid home address", async () => {
+ await page.goto(`/library-card/location?newCard=true&lang=${lang}`);
+ await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ await fillAddress(pageManager.addressPage, {
+ street: invalidStreet,
+ apartmentSuite: "1",
+ city: "City",
+ state: "NY",
+ postalCode: "12345",
+ });
+ await pageManager.addressPage.nextButton.click();
+ await expect(pageManager.addressPage.spinner).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
+ });
-// await test.step("confirms address verification", async () => {
-// await expect(pageManager.addressVerificationPage.stepHeading).toBeVisible();
-// await pageManager.addressVerificationPage
-// .getHomeAddressOption(invalidStreet)
-// .check();
-// await pageManager.addressVerificationPage.nextButton.click();
-// });
+ await test.step("skips alternate address", async () => {
+ await expect(
+ pageManager.alternateAddressPage.stepHeading
+ ).toBeVisible();
+ await pageManager.alternateAddressPage.nextButton.click();
+ await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
+ });
-// await test.step("enters account information", async () => {
-// await expect(pageManager.accountPage.stepHeading).toBeVisible();
-// await fillAccountInfo(pageManager.accountPage);
-// await pageManager.accountPage.nextButton.click();
-// });
+ // await test.step("confirms address verification", async () => {
+ // await expect(pageManager.addressVerificationPage.stepHeading).toBeVisible();
+ // await pageManager.addressVerificationPage
+ // .getHomeAddressOption(invalidStreet)
+ // .check();
+ // await pageManager.addressVerificationPage.nextButton.click();
+ // });
-// await test.step("displays error on review page", async () => {
-// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
-// await pageManager.reviewPage.submitButton.click();
-// await expect(pageManager.reviewPage.streetAddressError).toBeVisible();
-// });
-// });
+ // await test.step("enters account information", async () => {
+ // await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ // await fillAccountInfo(pageManager.accountPage);
+ // await pageManager.accountPage.nextButton.click();
+ // });
+
+ // await test.step("displays error on review page", async () => {
+ // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
+ // await pageManager.reviewPage.submitButton.click();
+ // await expect(pageManager.reviewPage.streetAddressError).toBeVisible();
+ // });
+ });
+ });
+}
From 826866447745119ec55b5a8a27a8d1854546e193 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Mon, 9 Feb 2026 15:43:59 -0700
Subject: [PATCH 15/36] Update to strings
---
playwright/pageobjects/personal.page.ts | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/playwright/pageobjects/personal.page.ts b/playwright/pageobjects/personal.page.ts
index e7eba1bb..b95c0621 100644
--- a/playwright/pageobjects/personal.page.ts
+++ b/playwright/pageobjects/personal.page.ts
@@ -29,28 +29,28 @@ export class PersonalPage {
level: 2,
});
this.firstNameInput = this.page.getByLabel(
- appContent?.personal?.firstName.label || /First name/i
+ appContent?.personal?.firstName.label || "First name"
);
this.firstNameError = this.page.getByText(
appContent?.personal?.errorMessage?.firstName ||
"There was a problem. Please enter a valid first name."
);
this.lastNameInput = this.page.getByLabel(
- appContent?.personal?.lastName.label || /Last name/i
+ appContent?.personal?.lastName.label || "Last name"
);
this.lastNameError = this.page.getByText(
appContent?.personal?.errorMessage?.lastName ||
"There was a problem. Please enter a valid last name."
);
this.dateOfBirthInput = this.page.getByLabel(
- appContent?.personal?.birthdate.label || /Date of birth/i
+ appContent?.personal?.birthdate.label || "Date of birth"
);
this.dateOfBirthError = this.page.getByText(
appContent?.personal?.errorMessage?.birthdate ||
"There was a problem. Please enter a valid date, MM/DD/YYYY, including slashes."
);
this.emailInput = this.page.getByLabel(
- appContent?.personal?.email.label || /Email/i
+ appContent?.personal?.email.label || "Email"
);
this.emailError = this.page.getByText(
appContent?.personal?.errorMessage?.email ||
From 5df5979239dd980911cee0508953492186a2a71f Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Tue, 10 Feb 2026 08:35:44 -0700
Subject: [PATCH 16/36] Update test name
---
playwright/tests/personal.spec.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/playwright/tests/personal.spec.ts b/playwright/tests/personal.spec.ts
index 16c90725..5f8f45bd 100644
--- a/playwright/tests/personal.spec.ts
+++ b/playwright/tests/personal.spec.ts
@@ -14,7 +14,7 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await page.goto(`/library-card/personal?newCard=true&lang=${lang}`);
});
- test.describe("displays elements on personal information page", () => {
+ test.describe("displays elements", () => {
test("displays headings, links, and buttons", async () => {
await expect(personalPage.mainHeading).toBeVisible();
await expect(personalPage.stepHeading).toBeVisible();
From f196829be86c520c19504991d72325869fca873c Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Tue, 10 Feb 2026 12:28:09 -0700
Subject: [PATCH 17/36] Add spinner checks
---
playwright/tests/backward-navigation.spec.ts | 19 ++--
playwright/tests/e2e-mocked.spec.ts | 35 +++---
playwright/tests/e2e-partial.spec.ts | 107 +++++++++++--------
playwright/tests/review.spec.ts | 12 +++
4 files changed, 104 insertions(+), 69 deletions(-)
diff --git a/playwright/tests/backward-navigation.spec.ts b/playwright/tests/backward-navigation.spec.ts
index 392acc4b..d4965a05 100644
--- a/playwright/tests/backward-navigation.spec.ts
+++ b/playwright/tests/backward-navigation.spec.ts
@@ -1,11 +1,11 @@
import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
-import { /*fillAddress,*/ fillPersonalInfo } from "../utils/form-helper";
+import { fillAddress, fillPersonalInfo } from "../utils/form-helper";
import {
- // SPINNER_TIMEOUT,
+ SPINNER_TIMEOUT,
SUPPORTED_LANGUAGES,
// TEST_NYC_ADDRESS,
- // TEST_OOS_ADDRESS,
+ TEST_OOS_ADDRESS,
// TEST_PATRON_INFO,
} from "../utils/constants";
@@ -68,11 +68,14 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await pageManager.personalPage.nextButton.click();
});
- // await test.step("enters home address", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
- // await pageManager.addressPage.nextButton.click();
- // });
+ await test.step("enters home address", async () => {
+ await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
+ await pageManager.addressPage.nextButton.click();
+ await expect(pageManager.addressPage.spinner).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
+ });
// await test.step("enters alternate address", async () => {
// await expect(
diff --git a/playwright/tests/e2e-mocked.spec.ts b/playwright/tests/e2e-mocked.spec.ts
index 805c925d..3cc4befc 100644
--- a/playwright/tests/e2e-mocked.spec.ts
+++ b/playwright/tests/e2e-mocked.spec.ts
@@ -1,6 +1,7 @@
import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
import {
+ SPINNER_TIMEOUT,
SUPPORTED_LANGUAGES,
// TEST_BARCODE_NUMBER,
// TEST_NYC_ADDRESS,
@@ -29,24 +30,28 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(pageManager.landingPage.applyHeading).toBeVisible();
await pageManager.landingPage.getStartedButton.click();
});
-
- await test.step("enters personal information", async () => {
- await expect(pageManager.personalPage.stepHeading).toBeVisible();
- await fillPersonalInfo(pageManager.personalPage);
- });
- await test.step("unchecks receive info checkbox", async () => {
- await pageManager.personalPage.receiveInfoCheckbox.click();
- await expect(
- pageManager.personalPage.receiveInfoCheckbox
- ).not.toBeChecked();
- await pageManager.personalPage.nextButton.click();
- });
+ await test.step("enters personal information", async () => {
+ await expect(pageManager.personalPage.stepHeading).toBeVisible();
+ await fillPersonalInfo(pageManager.personalPage);
+ });
+
+ await test.step("unchecks receive info checkbox", async () => {
+ await pageManager.personalPage.receiveInfoCheckbox.click();
+ await expect(
+ pageManager.personalPage.receiveInfoCheckbox
+ ).not.toBeChecked();
+ await pageManager.personalPage.nextButton.click();
+ });
await test.step("enters home address", async () => {
await expect(pageManager.addressPage.stepHeading).toBeVisible();
await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
await pageManager.addressPage.nextButton.click();
+ await expect(pageManager.addressPage.spinner).not.toBeVisible({
+ // eventually replace with mock
+ timeout: SPINNER_TIMEOUT,
+ });
});
// await test.step("enters alternate address", async () => {
@@ -79,13 +84,13 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
// await test.step("displays review page", async () => {
// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
// });
-
+
// await test.step("verifies receive info checkbox is unchecked on review page", async () => {
// await pageManager.reviewPage.editPersonalInfoButton.click();
// await expect(
- // pageManager.reviewPage.receiveInfoCheckbox
+ // pageManager.reviewPage.receiveInfoCheckbox
// ).not.toBeChecked();
- // });
+ // });
// await test.step("submits application", async () => {
// await mockCreatePatronApi(page, fullName, TEST_BARCODE_NUMBER);
diff --git a/playwright/tests/e2e-partial.spec.ts b/playwright/tests/e2e-partial.spec.ts
index 4c2c7ad8..ed1c06e8 100644
--- a/playwright/tests/e2e-partial.spec.ts
+++ b/playwright/tests/e2e-partial.spec.ts
@@ -1,46 +1,61 @@
-// import { test, expect } from "@playwright/test";
-// import { PageManager } from "../pageobjects/page-manager.page";
-// import { fillAccountInfo, fillAddress } from "../utils/form-helper";
-
-// test("displays error when address is too long", async ({ page }) => {
-// const pageManager = new PageManager(page);
-// const invalidStreet = "A".repeat(100);
-
-// await test.step("enters invalid home address", async () => {
-// await page.goto("/library-card/location?newCard=true");
-// await expect(pageManager.addressPage.stepHeading).toBeVisible();
-// await fillAddress(pageManager.addressPage, {
-// street: invalidStreet,
-// apartmentSuite: "1",
-// city: "City",
-// state: "NY",
-// postalCode: "12345",
-// });
-// await pageManager.addressPage.nextButton.click();
-// });
-
-// await test.step("skips alternate address", async () => {
-// await expect(pageManager.alternateAddressPage.stepHeading).toBeVisible();
-// await pageManager.alternateAddressPage.nextButton.click();
-// });
-
-// await test.step("confirms address verification", async () => {
-// await expect(pageManager.addressVerificationPage.stepHeading).toBeVisible();
-// await pageManager.addressVerificationPage
-// .getHomeAddressOption(invalidStreet)
-// .check();
-// await pageManager.addressVerificationPage.nextButton.click();
-// });
-
-// await test.step("enters account information", async () => {
-// await expect(pageManager.accountPage.stepHeading).toBeVisible();
-// await fillAccountInfo(pageManager.accountPage);
-// await pageManager.accountPage.nextButton.click();
-// });
-
-// await test.step("displays error on review page", async () => {
-// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
-// await pageManager.reviewPage.submitButton.click();
-// await expect(pageManager.reviewPage.streetAddressError).toBeVisible();
-// });
-// });
+import { test, expect } from "@playwright/test";
+import { PageManager } from "../pageobjects/page-manager.page";
+import { /*fillAccountInfo,*/ fillAddress } from "../utils/form-helper";
+import { SPINNER_TIMEOUT, SUPPORTED_LANGUAGES } from "../utils/constants";
+
+for (const { lang, name } of SUPPORTED_LANGUAGES) {
+ test.describe(`partial e2e tests in ${name} (${lang})`, () => {
+ let pageManager: PageManager;
+ let appContent: any;
+
+ test.beforeEach(async ({ page }) => {
+ appContent = require(`../../public/locales/${lang}/common.json`);
+ pageManager = new PageManager(page, appContent);
+ });
+
+ test("displays error when address is too long", async ({ page }) => {
+ const invalidStreet = "A".repeat(100);
+
+ await test.step("enters invalid home address", async () => {
+ await page.goto(`/library-card/location?newCard=true&lang=${lang}`);
+ await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ await fillAddress(pageManager.addressPage, {
+ street: invalidStreet,
+ apartmentSuite: "1",
+ city: "City",
+ state: "NY",
+ postalCode: "12345",
+ });
+ await pageManager.addressPage.nextButton.click();
+ await expect(pageManager.addressPage.spinner).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
+ });
+
+ // await test.step("skips alternate address", async () => {
+ // await expect(pageManager.alternateAddressPage.stepHeading).toBeVisible();
+ // await pageManager.alternateAddressPage.nextButton.click();
+ // });
+
+ // await test.step("confirms address verification", async () => {
+ // await expect(pageManager.addressVerificationPage.stepHeading).toBeVisible();
+ // await pageManager.addressVerificationPage
+ // .getHomeAddressOption(invalidStreet)
+ // .check();
+ // await pageManager.addressVerificationPage.nextButton.click();
+ // });
+
+ // await test.step("enters account information", async () => {
+ // await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ // await fillAccountInfo(pageManager.accountPage);
+ // await pageManager.accountPage.nextButton.click();
+ // });
+
+ // await test.step("displays error on review page", async () => {
+ // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
+ // await pageManager.reviewPage.submitButton.click();
+ // await expect(pageManager.reviewPage.streetAddressError).toBeVisible();
+ // });
+ });
+ });
+}
diff --git a/playwright/tests/review.spec.ts b/playwright/tests/review.spec.ts
index 57e15c88..f42609bc 100644
--- a/playwright/tests/review.spec.ts
+++ b/playwright/tests/review.spec.ts
@@ -2,6 +2,7 @@ import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
import { ReviewPage } from "../pageobjects/review.page";
import {
+ SPINNER_TIMEOUT,
TEST_CUSTOMIZE_ACCOUNT,
TEST_NYC_ADDRESS,
TEST_OOS_ADDRESS,
@@ -107,12 +108,18 @@ test.describe("edits patron information on review page", () => {
await expect(pageManager.addressPage.stepHeading).toBeVisible();
await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
await pageManager.addressPage.nextButton.click();
+ await expect(pageManager.addressPage.spinner).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
});
await test.step("enters alternate address", async () => {
await expect(pageManager.alternateAddressPage.stepHeading).toBeVisible();
await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
await pageManager.alternateAddressPage.nextButton.click();
+ await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
});
await test.step("confirms addresses", async () => {
@@ -126,6 +133,11 @@ test.describe("edits patron information on review page", () => {
.getAlternateAddressOption(TEST_NYC_ADDRESS.street)
.check();
await pageManager.addressVerificationPage.nextButton.click();
+ await expect(pageManager.addressVerificationPage.spinner).not.toBeVisible(
+ {
+ timeout: SPINNER_TIMEOUT,
+ }
+ );
});
await test.step("enters account information", async () => {
From 9457afab7da1b52e090d00b5dada3f8f76c29610 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Wed, 11 Feb 2026 10:42:35 -0700
Subject: [PATCH 18/36] Update address verification tests
---
.../pageobjects/address-verification.page.ts | 27 +-
playwright/pageobjects/address.page.ts | 6 +-
playwright/pageobjects/page-manager.page.ts | 2 +-
playwright/tests/address-verification.spec.ts | 242 ++++++++++--------
playwright/tests/backward-navigation.spec.ts | 30 +--
playwright/tests/e2e-mocked.spec.ts | 52 ++--
playwright/tests/e2e-partial.spec.ts | 16 +-
playwright/tests/e2e.spec.ts | 30 +--
8 files changed, 225 insertions(+), 180 deletions(-)
diff --git a/playwright/pageobjects/address-verification.page.ts b/playwright/pageobjects/address-verification.page.ts
index d74c401f..6f70dbd2 100644
--- a/playwright/pageobjects/address-verification.page.ts
+++ b/playwright/pageobjects/address-verification.page.ts
@@ -2,6 +2,7 @@ import { Page, Locator } from "@playwright/test";
export class AddressVerificationPage {
readonly page: Page;
+ readonly appContent: any;
readonly mainHeading: Locator; // displays on each page
readonly stepHeading: Locator;
readonly homeAddressHeading: Locator;
@@ -10,41 +11,49 @@ export class AddressVerificationPage {
readonly nextButton: Locator;
readonly previousButton: Locator;
- constructor(page: Page) {
+ constructor(page: Page, appContent?: any) {
this.page = page;
+ this.appContent = appContent;
this.mainHeading = this.page.getByRole("heading", {
- name: "Apply for a Library Card Online",
+ name: appContent?.banner?.title || "Apply for a Library Card Online",
level: 1,
});
this.stepHeading = this.page.getByRole("heading", {
- name: "Step 3 of 5: Address verification",
+ name:
+ appContent?.verifyAddress?.title || "Step 3 of 5: Address verification",
level: 2,
});
this.homeAddressHeading = this.page.getByRole("heading", {
- name: "Home address",
+ name: appContent?.verifyAddress?.homeAddress || "Home address",
level: 3,
});
this.alternateAddressHeading = this.page.getByRole("heading", {
- name: "Alternate address",
+ name: appContent?.verifyAddress?.workAddress || "Alternate address",
level: 3,
});
this.previousButton = this.page.getByRole("link", {
- name: "Previous",
+ name: appContent?.button?.previous || "Previous",
exact: true,
});
this.nextButton = this.page.getByRole("button", {
- name: "Next",
+ name: appContent?.button?.next || "Next",
exact: true,
});
this.spinner = this.page.getByRole("status", { name: "Loading Indicator" });
}
getHomeAddressOption(street: string): Locator {
- return this.page.getByLabel("Home address").getByText(street);
+ return this.page
+ .getByLabel(this.appContent?.verifyAddress?.homeAddress || "Home address")
+ .getByText(street);
}
getAlternateAddressOption(street: string): Locator {
- return this.page.getByLabel("Alternate address").getByText(street);
+ return this.page
+ .getByLabel(
+ this.appContent?.verifyAddress?.workAddress || "Alternate address"
+ )
+ .getByText(street);
}
get getRadioButtons() {
diff --git a/playwright/pageobjects/address.page.ts b/playwright/pageobjects/address.page.ts
index c18964d8..9e964195 100644
--- a/playwright/pageobjects/address.page.ts
+++ b/playwright/pageobjects/address.page.ts
@@ -30,10 +30,12 @@ export class AddressPage {
level: 2,
});
this.addressHeading = page.getByRole("heading", {
- name: appContent?.location?.address.title || "Home address",
+ name: appContent?.location?.address?.title || "Home address",
level: 3,
});
- this.alternateForm = page.getByRole("link", { name: appContent?.home?.description?.alternateForm || "alternate form" });
+ this.alternateForm = page.getByRole("link", {
+ name: appContent?.home?.description?.alternateForm || "alternate form",
+ });
this.streetAddressInput = page.getByLabel(
appContent?.location?.address.line1.label || "Street address"
);
diff --git a/playwright/pageobjects/page-manager.page.ts b/playwright/pageobjects/page-manager.page.ts
index 2b0f5dd3..52e12651 100644
--- a/playwright/pageobjects/page-manager.page.ts
+++ b/playwright/pageobjects/page-manager.page.ts
@@ -35,7 +35,7 @@ export class PageManager {
}
get addressVerificationPage(): AddressVerificationPage {
- return new AddressVerificationPage(this.page);
+ return new AddressVerificationPage(this.page, this.appContent);
}
get accountPage(): AccountPage {
diff --git a/playwright/tests/address-verification.spec.ts b/playwright/tests/address-verification.spec.ts
index 5f9b6723..feb83ac3 100644
--- a/playwright/tests/address-verification.spec.ts
+++ b/playwright/tests/address-verification.spec.ts
@@ -1,10 +1,12 @@
import { test, expect } from "@playwright/test";
-import { SPINNER_TIMEOUT } from "../utils/constants";
-import { AddressPage } from "../pageobjects/address.page";
-import { AlternateAddressPage } from "../pageobjects/alternate-address.page";
+// import { AddressPage } from "../pageobjects/address.page";
+// import { AlternateAddressPage } from "../pageobjects/alternate-address.page";
import { AddressVerificationPage } from "../pageobjects/address-verification.page";
+import { PageManager } from "../pageobjects/page-manager.page";
import { fillAddress } from "../utils/form-helper";
import {
+ SPINNER_TIMEOUT,
+ SUPPORTED_LANGUAGES,
TEST_NYC_ADDRESS,
TEST_OOS_ADDRESS,
TEST_MULTIMATCH_ADDRESS,
@@ -12,120 +14,148 @@ import {
TEST_MULTIMATCH_ADDRESS_WEST,
} from "../utils/constants";
-test.describe("displays elements on address verification page", () => {
- test.beforeEach(async ({ page }) => {
- await page.goto("/library-card/address-verification?newCard=true");
- });
- test("displays headings", async ({ page }) => {
- const addressVerificationPage = new AddressVerificationPage(page);
- await expect(addressVerificationPage.mainHeading).toBeVisible();
- await expect(addressVerificationPage.stepHeading).toBeVisible();
- await expect(addressVerificationPage.homeAddressHeading).toBeVisible();
- });
+for (const { lang, name } of SUPPORTED_LANGUAGES) {
+ test.describe(`address verification page in ${name} (${lang})`, () => {
+ let addressVerificationPage: AddressVerificationPage;
+ let pageManager: PageManager;
+ let appContent: any;
- test("displays next and previous buttons", async ({ page }) => {
- const addressVerificationPage = new AddressVerificationPage(page);
- await expect(addressVerificationPage.previousButton).toBeVisible();
- await expect(addressVerificationPage.nextButton).toBeVisible();
- });
-});
-
-test.describe("enters home address and alternate address", () => {
- test.beforeEach(async ({ page }) => {
- await page.goto("/library-card/location?newCard=true");
- });
-
- test("enters valid addresses", async ({ page }) => {
- const addressPage = new AddressPage(page);
- const alternateAddressPage = new AlternateAddressPage(page);
- const addressVerificationPage = new AddressVerificationPage(page);
-
- await test.step("enters home address", async () => {
- await expect(addressPage.addressHeading).toBeVisible();
- await fillAddress(addressPage, TEST_OOS_ADDRESS);
- await addressPage.nextButton.click();
+ test.beforeEach(async ({ page }) => {
+ appContent = require(`../../public/locales/${lang}/common.json`);
+ addressVerificationPage = new AddressVerificationPage(page, appContent);
+ pageManager = new PageManager(page, appContent);
});
- await test.step("enters alternate address", async () => {
- await expect(alternateAddressPage.addressHeading).toBeVisible();
- await fillAddress(alternateAddressPage, TEST_NYC_ADDRESS);
- await alternateAddressPage.nextButton.click();
+ test.describe("displays elements", () => {
+ test("displays headings and buttons", async ({ page }) => {
+ await page.goto(
+ `/library-card/address-verification?newCard=true&lang=${lang}`
+ );
+ await expect(addressVerificationPage.mainHeading).toBeVisible();
+ await expect(addressVerificationPage.stepHeading).toBeVisible();
+ await expect(addressVerificationPage.homeAddressHeading).toBeVisible();
+ await expect(addressVerificationPage.previousButton).toBeVisible();
+ await expect(addressVerificationPage.nextButton).toBeVisible();
+ });
});
- await test.step("displays home and alternate addresses", async () => {
- await expect(addressVerificationPage.homeAddressHeading).toBeVisible();
- await expect(
- addressVerificationPage.getHomeAddressOption(TEST_OOS_ADDRESS.street)
- ).toBeVisible();
- await expect(
- addressVerificationPage.alternateAddressHeading
- ).toBeVisible();
- await expect(
- addressVerificationPage.getAlternateAddressOption(
- TEST_NYC_ADDRESS.street
- )
- ).toBeVisible();
- });
- });
+ test.describe("enters home address and alternate address", () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto(`/library-card/location?newCard=true&lang=${lang}`);
+ });
- test("prompts multiple address options", async ({ page }) => {
- const addressPage = new AddressPage(page);
- const alternateAddressPage = new AlternateAddressPage(page);
- const addressVerificationPage = new AddressVerificationPage(page);
+ test("enters valid addresses", async () => {
+ await test.step("enters home address", async () => {
+ await expect(pageManager.addressPage.addressHeading).toBeVisible();
+ await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
+ await pageManager.addressPage.nextButton.click();
+ await expect(
+ pageManager.addressVerificationPage.spinner
+ ).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
+ });
- await test.step("enters home and alternate addresses", async () => {
- await expect(addressPage.addressHeading).toBeVisible();
- await fillAddress(addressPage, TEST_MULTIMATCH_ADDRESS);
- await addressPage.nextButton.click();
- await expect(addressVerificationPage.spinner).not.toBeVisible({
- timeout: SPINNER_TIMEOUT,
- });
+ await test.step("enters alternate address", async () => {
+ await expect(
+ pageManager.alternateAddressPage.addressHeading
+ ).toBeVisible();
+ await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
+ await pageManager.alternateAddressPage.nextButton.click();
+ await expect(
+ pageManager.addressVerificationPage.spinner
+ ).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
+ });
- await expect(alternateAddressPage.addressHeading).toBeVisible();
- await fillAddress(alternateAddressPage, TEST_MULTIMATCH_ADDRESS);
- await alternateAddressPage.nextButton.click();
- await expect(addressVerificationPage.spinner).not.toBeVisible({
- timeout: SPINNER_TIMEOUT,
+ await test.step("displays home and alternate addresses", async () => {
+ await expect(
+ pageManager.addressVerificationPage.homeAddressHeading
+ ).toBeVisible();
+ await expect(
+ pageManager.addressVerificationPage.getHomeAddressOption(
+ TEST_OOS_ADDRESS.street
+ )
+ ).toBeVisible();
+ await expect(
+ pageManager.addressVerificationPage.alternateAddressHeading
+ ).toBeVisible();
+ await expect(
+ pageManager.addressVerificationPage.getAlternateAddressOption(
+ TEST_NYC_ADDRESS.street
+ )
+ ).toBeVisible();
+ });
});
- });
- await test.step("displays address options", async () => {
- await expect(addressVerificationPage.homeAddressHeading).toBeVisible();
- await expect(
- addressVerificationPage.getHomeAddressOption(
- TEST_MULTIMATCH_ADDRESS_WEST.street
- )
- ).toBeVisible();
- await expect(
- addressVerificationPage.alternateAddressHeading
- ).toBeVisible();
- await expect(
- addressVerificationPage.getAlternateAddressOption(
- TEST_MULTIMATCH_ADDRESS_EAST.street
- )
- ).toBeVisible();
- });
+ test("prompts multiple address options", async () => {
+ await test.step("enters home and alternate addresses", async () => {
+ await expect(pageManager.addressPage.addressHeading).toBeVisible();
+ await fillAddress(pageManager.addressPage, TEST_MULTIMATCH_ADDRESS);
+ await pageManager.addressPage.nextButton.click();
+ await expect(
+ pageManager.addressVerificationPage.spinner
+ ).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
- await test.step("selects address options", async () => {
- await addressVerificationPage
- .getHomeAddressOption(TEST_MULTIMATCH_ADDRESS_WEST.street)
- .check();
- await addressVerificationPage
- .getAlternateAddressOption(TEST_MULTIMATCH_ADDRESS_EAST.street)
- .check();
- });
+ await expect(
+ pageManager.alternateAddressPage.addressHeading
+ ).toBeVisible();
+ await fillAddress(
+ pageManager.alternateAddressPage,
+ TEST_MULTIMATCH_ADDRESS
+ );
+ await pageManager.alternateAddressPage.nextButton.click();
+ await expect(
+ pageManager.addressVerificationPage.spinner
+ ).not.toBeVisible({
+ timeout: SPINNER_TIMEOUT,
+ });
+ });
+
+ await test.step("displays address options", async () => {
+ await expect(
+ pageManager.addressVerificationPage.homeAddressHeading
+ ).toBeVisible();
+ await expect(
+ pageManager.addressVerificationPage.getHomeAddressOption(
+ TEST_MULTIMATCH_ADDRESS_WEST.street
+ )
+ ).toBeVisible();
+ await expect(
+ pageManager.addressVerificationPage.alternateAddressHeading
+ ).toBeVisible();
+ await expect(
+ pageManager.addressVerificationPage.getAlternateAddressOption(
+ TEST_MULTIMATCH_ADDRESS_EAST.street
+ )
+ ).toBeVisible();
+ });
- await test.step("confirms addresses are selected", async () => {
- await expect(
- addressVerificationPage.getHomeAddressOption(
- TEST_MULTIMATCH_ADDRESS_WEST.street
- )
- ).toBeChecked();
- await expect(
- addressVerificationPage.getAlternateAddressOption(
- TEST_MULTIMATCH_ADDRESS_EAST.street
- )
- ).toBeChecked();
+ await test.step("selects address options", async () => {
+ await pageManager.addressVerificationPage
+ .getHomeAddressOption(TEST_MULTIMATCH_ADDRESS_WEST.street)
+ .check();
+ await pageManager.addressVerificationPage
+ .getAlternateAddressOption(TEST_MULTIMATCH_ADDRESS_EAST.street)
+ .check();
+ });
+
+ await test.step("confirms addresses are selected", async () => {
+ await expect(
+ pageManager.addressVerificationPage.getHomeAddressOption(
+ TEST_MULTIMATCH_ADDRESS_WEST.street
+ )
+ ).toBeChecked();
+ await expect(
+ pageManager.addressVerificationPage.getAlternateAddressOption(
+ TEST_MULTIMATCH_ADDRESS_EAST.street
+ )
+ ).toBeChecked();
+ });
+ });
});
});
-});
+}
diff --git a/playwright/tests/backward-navigation.spec.ts b/playwright/tests/backward-navigation.spec.ts
index 1b8b24d5..614594b9 100644
--- a/playwright/tests/backward-navigation.spec.ts
+++ b/playwright/tests/backward-navigation.spec.ts
@@ -88,21 +88,21 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
});
});
- // await test.step("confirms address verification", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await pageManager.addressVerificationPage
- // .getHomeAddressOption(TEST_OOS_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage
- // .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage.nextButton.click();
- // await expect(
- // pageManager.addressVerificationPage.spinner
- // ).not.toBeVisible({ timeout: SPINNER_TIMEOUT });
- // });
+ await test.step("confirms address verification", async () => {
+ await expect(
+ pageManager.addressVerificationPage.stepHeading
+ ).toBeVisible();
+ await pageManager.addressVerificationPage
+ .getHomeAddressOption(TEST_OOS_ADDRESS.street)
+ .check();
+ await pageManager.addressVerificationPage
+ .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
+ .check();
+ await pageManager.addressVerificationPage.nextButton.click();
+ await expect(
+ pageManager.addressVerificationPage.spinner
+ ).not.toBeVisible({ timeout: SPINNER_TIMEOUT });
+ });
// await test.step("displays account page", async () => {
// await expect(pageManager.accountPage.stepHeading).toBeVisible();
diff --git a/playwright/tests/e2e-mocked.spec.ts b/playwright/tests/e2e-mocked.spec.ts
index 5574782a..9032d81b 100644
--- a/playwright/tests/e2e-mocked.spec.ts
+++ b/playwright/tests/e2e-mocked.spec.ts
@@ -65,22 +65,24 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
timeout: SPINNER_TIMEOUT,
});
- // await test.step("confirms address verification", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await pageManager.addressVerificationPage
- // .getHomeAddressOption(TEST_OOS_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage
- // .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage.nextButton.click();
-// await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
-// // eventually replace with mock
-// timeout: SPINNER_TIMEOUT,
-// });
- // });
+ await test.step("confirms address verification", async () => {
+ await expect(
+ pageManager.addressVerificationPage.stepHeading
+ ).toBeVisible();
+ await pageManager.addressVerificationPage
+ .getHomeAddressOption(TEST_OOS_ADDRESS.street)
+ .check();
+ await pageManager.addressVerificationPage
+ .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
+ .check();
+ await pageManager.addressVerificationPage.nextButton.click();
+ await expect(
+ pageManager.addressVerificationPage.spinner
+ ).not.toBeVisible({
+ // eventually replace with mock
+ timeout: SPINNER_TIMEOUT,
+ });
+ });
// await test.step("enters account information", async () => {
// await expect(pageManager.accountPage.stepHeading).toBeVisible();
@@ -88,16 +90,16 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
// await pageManager.accountPage.nextButton.click();
// });
- // await test.step("displays review page", async () => {
- // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
- // });
+ // await test.step("displays review page", async () => {
+ // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
+ // });
- // await test.step("verifies receive info checkbox is unchecked on review page", async () => {
- // await pageManager.reviewPage.editPersonalInfoButton.click();
- // await expect(
- // pageManager.reviewPage.receiveInfoCheckbox
- // ).not.toBeChecked();
- // });
+ // await test.step("verifies receive info checkbox is unchecked on review page", async () => {
+ // await pageManager.reviewPage.editPersonalInfoButton.click();
+ // await expect(
+ // pageManager.reviewPage.receiveInfoCheckbox
+ // ).not.toBeChecked();
+ // });
// await test.step("submits application", async () => {
// await mockCreatePatronApi(page, fullName, TEST_BARCODE_NUMBER);
diff --git a/playwright/tests/e2e-partial.spec.ts b/playwright/tests/e2e-partial.spec.ts
index 0ff930c9..4ce77e1f 100644
--- a/playwright/tests/e2e-partial.spec.ts
+++ b/playwright/tests/e2e-partial.spec.ts
@@ -42,13 +42,15 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
});
});
- // await test.step("confirms address verification", async () => {
- // await expect(pageManager.addressVerificationPage.stepHeading).toBeVisible();
- // await pageManager.addressVerificationPage
- // .getHomeAddressOption(invalidStreet)
- // .check();
- // await pageManager.addressVerificationPage.nextButton.click();
- // });
+ await test.step("confirms address verification", async () => {
+ await expect(
+ pageManager.addressVerificationPage.stepHeading
+ ).toBeVisible();
+ await pageManager.addressVerificationPage
+ .getHomeAddressOption(invalidStreet)
+ .check();
+ await pageManager.addressVerificationPage.nextButton.click();
+ });
// await test.step("enters account information", async () => {
// await expect(pageManager.accountPage.stepHeading).toBeVisible();
diff --git a/playwright/tests/e2e.spec.ts b/playwright/tests/e2e.spec.ts
index f3d1b6a1..b06f8bb4 100644
--- a/playwright/tests/e2e.spec.ts
+++ b/playwright/tests/e2e.spec.ts
@@ -76,21 +76,21 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
});
});
- // await test.step("selects home and alternate addresses", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await pageManager.addressVerificationPage
- // .getHomeAddressOption(TEST_OOS_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage
- // .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage.nextButton.click();
- // await expect(pageManager.addressVerificationPage.spinner).not.toBeVisible(
- // { timeout: SPINNER_TIMEOUT }
- // );
- // });
+ await test.step("selects home and alternate addresses", async () => {
+ await expect(
+ pageManager.addressVerificationPage.stepHeading
+ ).toBeVisible();
+ await pageManager.addressVerificationPage
+ .getHomeAddressOption(TEST_OOS_ADDRESS.street)
+ .check();
+ await pageManager.addressVerificationPage
+ .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
+ .check();
+ await pageManager.addressVerificationPage.nextButton.click();
+ await expect(
+ pageManager.addressVerificationPage.spinner
+ ).not.toBeVisible({ timeout: SPINNER_TIMEOUT });
+ });
// await test.step("enters account information", async () => {
// await expect(pageManager.accountPage.stepHeading).toBeVisible();
From 3b2376282fbc53981d68d4e7e0bd801b236f7a88 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Thu, 12 Feb 2026 11:05:51 -0700
Subject: [PATCH 19/36] Fix import
---
playwright/tests/e2e-mocked.spec.ts | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/playwright/tests/e2e-mocked.spec.ts b/playwright/tests/e2e-mocked.spec.ts
index d98d9a21..ae49446f 100644
--- a/playwright/tests/e2e-mocked.spec.ts
+++ b/playwright/tests/e2e-mocked.spec.ts
@@ -1,10 +1,10 @@
import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
-// import {
-// fillAccountInfo,
-// fillAddress,
+import {
+ // fillAccountInfo,
+ // fillAddress,
fillPersonalInfo,
-// } from "../utils/form-helper";
+} from "../utils/form-helper";
import {
SUPPORTED_LANGUAGES,
// TEST_ACCOUNT,
@@ -30,7 +30,7 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(pageManager.landingPage.applyHeading).toBeVisible();
await pageManager.landingPage.getStartedButton.click();
});
-
+
await test.step("enters personal information", async () => {
await expect(pageManager.personalPage.stepHeading).toBeVisible();
await fillPersonalInfo(pageManager.personalPage);
@@ -41,7 +41,7 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(
pageManager.personalPage.receiveInfoCheckbox
).not.toBeChecked();
- await pageManager.personalPage.nextButton.click();
+ await pageManager.personalPage.nextButton.click();
});
// await test.step("enters home address", async () => {
@@ -80,13 +80,13 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
// await test.step("displays review page", async () => {
// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
// });
-
+
// await test.step("verifies receive info checkbox is unchecked on review page", async () => {
// await pageManager.reviewPage.editPersonalInfoButton.click();
// await expect(
- // pageManager.reviewPage.receiveInfoCheckbox
+ // pageManager.reviewPage.receiveInfoCheckbox
// ).not.toBeChecked();
- // });
+ // });
// await test.step("submits application", async () => {
// await mockCreatePatronApi(page, fullName, TEST_BARCODE_NUMBER);
From 5f9e6caac49676e14c4cd25bd249ea6b64692349 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Thu, 12 Feb 2026 11:41:23 -0700
Subject: [PATCH 20/36] Reorder imports
---
playwright/tests/account.spec.ts | 2 +-
playwright/tests/address-verification.spec.ts | 2 +-
playwright/tests/alternate-address.spec.ts | 2 +-
playwright/tests/personal.spec.ts | 2 +-
playwright/tests/review.spec.ts | 10 +++++-----
5 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/playwright/tests/account.spec.ts b/playwright/tests/account.spec.ts
index 94fbf23c..e63cd123 100644
--- a/playwright/tests/account.spec.ts
+++ b/playwright/tests/account.spec.ts
@@ -1,7 +1,7 @@
import { test, expect } from "@playwright/test";
import { AccountPage } from "../pageobjects/account.page";
-import { ERROR_MESSAGES, TEST_ACCOUNT } from "../utils/constants";
import { fillAccountInfo } from "../utils/form-helper";
+import { ERROR_MESSAGES, TEST_ACCOUNT } from "../utils/constants";
import { mockUsernameApi } from "../utils/mock-api";
test.beforeEach(async ({ page }) => {
diff --git a/playwright/tests/address-verification.spec.ts b/playwright/tests/address-verification.spec.ts
index 5f9b6723..9c1bce06 100644
--- a/playwright/tests/address-verification.spec.ts
+++ b/playwright/tests/address-verification.spec.ts
@@ -1,10 +1,10 @@
import { test, expect } from "@playwright/test";
-import { SPINNER_TIMEOUT } from "../utils/constants";
import { AddressPage } from "../pageobjects/address.page";
import { AlternateAddressPage } from "../pageobjects/alternate-address.page";
import { AddressVerificationPage } from "../pageobjects/address-verification.page";
import { fillAddress } from "../utils/form-helper";
import {
+ SPINNER_TIMEOUT,
TEST_NYC_ADDRESS,
TEST_OOS_ADDRESS,
TEST_MULTIMATCH_ADDRESS,
diff --git a/playwright/tests/alternate-address.spec.ts b/playwright/tests/alternate-address.spec.ts
index 82eec873..8a7bde9b 100644
--- a/playwright/tests/alternate-address.spec.ts
+++ b/playwright/tests/alternate-address.spec.ts
@@ -1,7 +1,7 @@
import { test, expect } from "@playwright/test";
import { AlternateAddressPage } from "../pageobjects/alternate-address.page";
-import { TEST_NYC_ADDRESS } from "../utils/constants";
import { fillAddress } from "../utils/form-helper";
+import { TEST_NYC_ADDRESS } from "../utils/constants";
test.beforeEach(async ({ page }) => {
await page.goto("/library-card/workAddress?newCard=true");
diff --git a/playwright/tests/personal.spec.ts b/playwright/tests/personal.spec.ts
index 5f8f45bd..b139f096 100644
--- a/playwright/tests/personal.spec.ts
+++ b/playwright/tests/personal.spec.ts
@@ -1,7 +1,7 @@
import { test, expect } from "@playwright/test";
import { PersonalPage } from "../pageobjects/personal.page";
-import { SUPPORTED_LANGUAGES, TEST_PATRON_INFO } from "../utils/constants";
import { fillPersonalInfo } from "../utils/form-helper";
+import { SUPPORTED_LANGUAGES, TEST_PATRON_INFO } from "../utils/constants";
for (const { lang, name } of SUPPORTED_LANGUAGES) {
test.describe(`personal information page in ${name} (${lang})`, () => {
diff --git a/playwright/tests/review.spec.ts b/playwright/tests/review.spec.ts
index 49da110e..a55cf9d6 100644
--- a/playwright/tests/review.spec.ts
+++ b/playwright/tests/review.spec.ts
@@ -1,6 +1,11 @@
import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
import { ReviewPage } from "../pageobjects/review.page";
+import {
+ fillAccountInfo,
+ fillAddress,
+ fillPersonalInfo,
+} from "../utils/form-helper";
import {
SPINNER_TIMEOUT,
TEST_ACCOUNT,
@@ -9,11 +14,6 @@ import {
TEST_PATRON_INFO,
ERROR_MESSAGES,
} from "../utils/constants";
-import {
- fillAccountInfo,
- fillAddress,
- fillPersonalInfo,
-} from "../utils/form-helper";
import { mockUsernameApi } from "../utils/mock-api";
test.beforeEach(async ({ page }) => {
From 117088a90bd3f090f1c34fbb61de771dfc3b0cf2 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Fri, 13 Feb 2026 10:15:41 -0700
Subject: [PATCH 21/36] Update locator
---
playwright/pageobjects/alternate-address.page.ts | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/playwright/pageobjects/alternate-address.page.ts b/playwright/pageobjects/alternate-address.page.ts
index 5cbb5d5c..8e21fc59 100644
--- a/playwright/pageobjects/alternate-address.page.ts
+++ b/playwright/pageobjects/alternate-address.page.ts
@@ -21,11 +21,15 @@ export class AlternateAddressPage {
level: 1,
});
this.stepHeading = page.getByRole("heading", {
- name: appContent?.location?.workAddress?.title || "Step 2 of 5: Alternate address",
+ name:
+ appContent?.location?.workAddress?.title ||
+ "Step 2 of 5: Alternate address",
level: 2,
});
this.addressHeading = page.getByRole("heading", {
- name: appContent?.location?.workAddress?.title || "Alternate address (optional)",
+ name:
+ appContent?.location?.workAddress?.subtitle ||
+ "Alternate address (optional)",
level: 3,
});
this.streetAddressInput = page.getByLabel(
From c14006936d3f1ca35d60511f969124b9b974d4e5 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Wed, 25 Feb 2026 14:36:47 -0700
Subject: [PATCH 22/36] Update locators
---
playwright/pageobjects/account.page.ts | 97 ++++--
playwright/pageobjects/page-manager.page.ts | 3 +-
playwright/tests/account.spec.ts | 285 +++++++++---------
public/locales/en/common.json | 5 +-
public/locales/es/common.json | 5 +-
.../AcceptTermsFormFields/index.tsx | 11 +-
6 files changed, 228 insertions(+), 178 deletions(-)
diff --git a/playwright/pageobjects/account.page.ts b/playwright/pageobjects/account.page.ts
index 0fd808f9..48107ce6 100644
--- a/playwright/pageobjects/account.page.ts
+++ b/playwright/pageobjects/account.page.ts
@@ -1,5 +1,4 @@
import { Page, Locator } from "@playwright/test";
-import { ERROR_MESSAGES } from "../utils/constants";
export class AccountPage {
readonly page: Page;
@@ -28,75 +27,113 @@ export class AccountPage {
readonly nextButton: Locator;
readonly previousButton: Locator;
- constructor(page: Page) {
+ constructor(page: Page, appContent?: any) {
this.page = page;
+
+ const required = appContent?.required || "required";
+ const withRequired = (label: string) => `${label} (${required})`;
+
this.mainHeading = page.getByRole("heading", {
- name: "Apply for a Library Card Online",
+ name: appContent?.banner?.title || "Apply for a Library Card Online",
level: 1,
});
this.stepHeading = page.getByRole("heading", {
- name: "Step 4 of 5: Customize your account",
+ name: appContent?.account?.title || "Step 4 of 5: Customize your account",
level: 2,
});
this.usernameInput = page.getByRole("textbox", {
- name: "Username (required)",
+ name: withRequired(appContent?.account?.username?.label || "Username"),
exact: true,
});
- this.usernameError = page.getByText(ERROR_MESSAGES.USERNAME_INVALID);
+ this.usernameError = page.getByText(
+ appContent?.account?.errorMessage?.username ||
+ "There was a problem. Username must be between 5-25 alphanumeric characters."
+ );
this.availableUsernameButton = page.getByRole("button", {
- name: "Check if username is available",
+ name:
+ appContent?.account?.username?.checkButton ||
+ "Check if username is available",
exact: true,
});
this.availableUsernameMessage = page.getByText(
- ERROR_MESSAGES.USERNAME_AVAILABLE
+ "This username is available.",
+ { exact: true }
);
this.unavailableUsernameMessage = page.getByText(
- ERROR_MESSAGES.USERNAME_UNAVAILABLE
+ "This username is unavailable. Please try another.",
+ { exact: true }
);
this.passwordInput = page.getByRole("textbox", {
- name: "Password (required)",
+ name: withRequired(appContent?.account?.password?.label || "Password"),
exact: true,
});
- this.passwordError = page.getByText(ERROR_MESSAGES.PASSWORD_INVALID);
+ this.passwordError = page.getByText(
+ appContent?.account?.errorMessage?.password ||
+ "There was a problem. Your password must be at least 8 characters, include a mixture of both uppercase and lowercase letters, include a mixture of letters and numbers, and have at least one special character except period (.)"
+ );
this.verifyPasswordInput = page.getByRole("textbox", {
- name: "Verify password (required)",
+ name: withRequired(
+ appContent?.account?.verifyPassword?.label || "Verify password"
+ ),
exact: true,
});
this.verifyPasswordError = page.getByText(
- ERROR_MESSAGES.VERIFY_PASSWORD_INVALID
+ appContent?.account?.errorMessage?.verifyPassword ||
+ "There was a problem. The two passwords don't match."
);
this.showPasswordCheckbox = page.getByRole("checkbox", {
- name: "Show password",
- });
- this.showPasswordLabel = page.getByText("Show password", {
- exact: true,
+ name: appContent?.account?.showPassword || "Show password",
});
+ this.showPasswordLabel = page.getByText(
+ appContent?.account?.showPassword || "Show password",
+ { exact: true }
+ );
this.homeLibraryHeading = page.getByRole("heading", {
- name: "Home library",
+ name: appContent?.account?.library?.title || "Home library",
level: 3,
exact: true,
});
- this.selectHomeLibrary = page.getByLabel("Select a home library:");
- this.homeLibraryError = page.getByText(ERROR_MESSAGES.HOME_LIBRARY_ERROR);
+ this.selectHomeLibrary = page.getByLabel(
+ appContent?.account?.library?.selectLibrary || "Select a home library:"
+ );
+ this.homeLibraryError = page.getByText(
+ appContent?.account?.errorMessage?.homeLibraryCode ||
+ "There was a problem. Please select a home library."
+ );
this.cardholderTerms = page.getByRole("link", {
- name: "Cardholder Terms and Conditions",
+ name:
+ appContent?.account?.termsAndCondition?.termsConditions ||
+ "Cardholder Terms and Conditions",
});
this.rulesRegulations = page.getByRole("link", {
- name: "Rules and Regulations",
+ name:
+ appContent?.account?.termsAndCondition?.rulesRegulations ||
+ "Rules and Regulations",
+ });
+ this.privacyPolicy = page.locator("#mainContent").getByRole("link", {
+ name:
+ appContent?.account?.termsAndCondition?.privacyPolicy ||
+ "Privacy Policy",
});
- this.privacyPolicy = page
- .locator("#mainContent")
- .getByRole("link", { name: "Privacy Policy" });
this.acceptTermsCheckbox = page.getByRole("checkbox", {
- name: "Yes, I accept the terms and conditions.",
+ name:
+ appContent?.account?.termsAndCondition?.label ||
+ "Yes, I accept the terms and conditions.",
});
this.acceptTermsLabel = page.getByText(
- "Yes, I accept the terms and conditions."
+ appContent?.account?.termsAndCondition?.label ||
+ "Yes, I accept the terms and conditions."
);
- this.acceptTermsError = page.getByText(ERROR_MESSAGES.ACCEPT_TERMS_ERROR);
- this.nextButton = page.getByRole("button", { name: "Next", exact: true });
+ this.acceptTermsError = page.getByText(
+ appContent?.account?.errorMessage?.acceptTerms ||
+ "There was a problem. The Terms and Conditions must be checked."
+ );
+ this.nextButton = page.getByRole("button", {
+ name: appContent?.button?.next || "Next",
+ exact: true,
+ });
this.previousButton = page.getByRole("link", {
- name: "Previous",
+ name: appContent?.button?.previous || "Previous",
exact: true,
});
}
diff --git a/playwright/pageobjects/page-manager.page.ts b/playwright/pageobjects/page-manager.page.ts
index 52e12651..0eb3354e 100644
--- a/playwright/pageobjects/page-manager.page.ts
+++ b/playwright/pageobjects/page-manager.page.ts
@@ -39,7 +39,7 @@ export class PageManager {
}
get accountPage(): AccountPage {
- return new AccountPage(this.page);
+ return new AccountPage(this.page, this.appContent);
}
get reviewPage(): ReviewPage {
@@ -49,6 +49,7 @@ export class PageManager {
get congratsPage(): CongratsPage {
return new CongratsPage(this.page);
}
+
get globalComponents(): GlobalComponentsPage {
return new GlobalComponentsPage(this.page);
}
diff --git a/playwright/tests/account.spec.ts b/playwright/tests/account.spec.ts
index 9eb708e7..966dc8e1 100644
--- a/playwright/tests/account.spec.ts
+++ b/playwright/tests/account.spec.ts
@@ -1,150 +1,147 @@
import { test, expect } from "@playwright/test";
import { AccountPage } from "../pageobjects/account.page";
import { fillAccountInfo } from "../utils/form-helper";
-import { ERROR_MESSAGES, PAGE_ROUTES, TEST_ACCOUNT } from "../utils/constants";
+import {
+ ERROR_MESSAGES,
+ PAGE_ROUTES,
+ SUPPORTED_LANGUAGES,
+ TEST_ACCOUNT,
+} from "../utils/constants";
import { mockUsernameApi } from "../utils/mock-api";
-test.beforeEach(async ({ page }) => {
- await page.goto(PAGE_ROUTES.ACCOUNT());
-});
-
-test.describe("displays all form elements on Account page", () => {
- test("displays all headings", async ({ page }) => {
- const accountPage = new AccountPage(page);
- await expect(accountPage.mainHeading).toBeVisible();
- await expect(accountPage.stepHeading).toBeVisible();
- await expect(accountPage.homeLibraryHeading).toBeVisible();
- });
-
- test("displays username and password form", async ({ page }) => {
- const accountPage = new AccountPage(page);
- await expect(accountPage.usernameInput).toBeVisible();
- await expect(accountPage.availableUsernameButton).toBeVisible();
- await expect(accountPage.passwordInput).toBeVisible();
- await expect(accountPage.verifyPasswordInput).toBeVisible();
- await expect(accountPage.showPasswordLabel).toBeVisible();
- });
-
- test("displays home library form", async ({ page }) => {
- const accountPage = new AccountPage(page);
- await expect(accountPage.selectHomeLibrary).toBeVisible();
- await expect(accountPage.cardholderTerms).toBeVisible();
- await expect(accountPage.rulesRegulations).toBeVisible();
- await expect(accountPage.privacyPolicy).toBeVisible();
- await expect(accountPage.acceptTermsLabel).toBeVisible();
- });
-
- test("displays next and previous buttons", async ({ page }) => {
- const accountPage = new AccountPage(page);
- await expect(accountPage.nextButton).toBeVisible();
- await expect(accountPage.previousButton).toBeVisible();
- });
-});
-
-test.describe("enters account information", () => {
- test("displays entered values in form fields", async ({ page }) => {
- const accountPage = new AccountPage(page);
- await fillAccountInfo(accountPage, TEST_ACCOUNT);
- await expect(accountPage.usernameInput).toHaveValue(TEST_ACCOUNT.username);
- await accountPage.showPasswordLabel.check();
- await expect(accountPage.passwordInput).toHaveValue(TEST_ACCOUNT.password);
- await expect(accountPage.verifyPasswordInput).toHaveValue(
- TEST_ACCOUNT.password
- );
- await expect(accountPage.selectHomeLibrary).toHaveValue(
- TEST_ACCOUNT.homeLibraryCode
- );
- await expect(accountPage.acceptTermsLabel).toBeChecked();
- });
-});
-
-test.describe("mocks API responses on account page", () => {
- test("displays username available message", async ({ page }) => {
- // mock the API call for username availability
- await mockUsernameApi(page, ERROR_MESSAGES.USERNAME_AVAILABLE);
-
- const accountPage = new AccountPage(page);
- await accountPage.usernameInput.fill("AvailableUsername");
- await accountPage.availableUsernameButton.click();
- await expect(accountPage.availableUsernameMessage).toBeVisible();
- });
-
- test("displays username unavailable error message", async ({ page }) => {
- // mock the API call for username unavailability
- await mockUsernameApi(page, ERROR_MESSAGES.USERNAME_UNAVAILABLE);
-
- const accountPage = new AccountPage(page);
- await accountPage.usernameInput.fill("UnavailableUsername");
- await accountPage.availableUsernameButton.click();
- await expect(accountPage.unavailableUsernameMessage).toBeVisible();
- });
-});
-
-test.describe("displays error messages", () => {
- test("displays errors for required fields", async ({ page }) => {
- const accountPage = new AccountPage(page);
- await accountPage.usernameInput.fill("");
- await accountPage.passwordInput.fill("");
- await accountPage.selectHomeLibrary.click();
- await accountPage.nextButton.click();
- await expect(accountPage.usernameError).toBeVisible();
- await expect(accountPage.passwordError).toBeVisible();
- await expect(accountPage.homeLibraryError).toBeVisible();
- });
-
- test("displays error when special characters in username", async ({
- page,
- }) => {
- const accountPage = new AccountPage(page);
- await accountPage.usernameInput.fill("User!@#");
- await accountPage.nextButton.click();
- await expect(accountPage.usernameError).toBeVisible();
- });
-
- test("displays error when non-Latin characters in username", async ({
- page,
- }) => {
- const accountPage = new AccountPage(page);
- await accountPage.usernameInput.fill("用戶名用戶名");
- await accountPage.nextButton.click();
- await expect(accountPage.usernameError).toBeVisible();
- });
-
- test("displays error when passwords do not match", async ({ page }) => {
- const accountPage = new AccountPage(page);
- await accountPage.usernameInput.fill("ValidUser1");
- await accountPage.passwordInput.fill("ValidPass1!");
- await accountPage.verifyPasswordInput.fill("DifferentPass1!");
- await accountPage.nextButton.click();
- await expect(accountPage.verifyPasswordError).toBeVisible();
- });
-
- test("displays error when terms are not accepted", async ({ page }) => {
- const accountPage = new AccountPage(page);
- await accountPage.usernameInput.fill("ValidUser1");
- await accountPage.passwordInput.fill("ValidPass1!");
- await accountPage.verifyPasswordInput.fill("ValidPass1!");
- await accountPage.selectHomeLibrary.click();
- await accountPage.selectHomeLibrary.selectOption("vr");
- await accountPage.nextButton.click();
- await expect(accountPage.acceptTermsError).toBeVisible();
- });
-
- test("displays error with too many characters", async ({ page }) => {
- const accountPage = new AccountPage(page);
- await accountPage.usernameInput.fill("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
- await accountPage.passwordInput.fill("123456789012345678901234567890123");
- await accountPage.nextButton.click();
- await expect(accountPage.usernameError).toBeVisible();
- await expect(accountPage.passwordError).toBeVisible();
- });
-
- test("displays error with too few characters", async ({ page }) => {
- const accountPage = new AccountPage(page);
- await accountPage.usernameInput.fill("A");
- await accountPage.passwordInput.fill("1!");
- await accountPage.nextButton.click();
- await expect(accountPage.usernameError).toBeVisible();
- await expect(accountPage.passwordError).toBeVisible();
+for (const { lang, name } of SUPPORTED_LANGUAGES) {
+ test.describe(`account page tests in ${name} (${lang})`, () => {
+ let accountPage: AccountPage;
+ let appContent: any;
+
+ test.beforeEach(async ({ page }) => {
+ appContent = require(`../../public/locales/${lang}/common.json`);
+ accountPage = new AccountPage(page, appContent);
+ await page.goto(PAGE_ROUTES.ACCOUNT(lang));
+ });
+
+ test.describe("displays elements", () => {
+ test("displays headings and buttons", async () => {
+ await expect(accountPage.mainHeading).toBeVisible();
+ await expect(accountPage.stepHeading).toBeVisible();
+ await expect(accountPage.homeLibraryHeading).toBeVisible();
+ await expect(accountPage.nextButton).toBeVisible();
+ await expect(accountPage.previousButton).toBeVisible();
+ });
+
+ test("displays username and password form", async () => {
+ await expect(accountPage.usernameInput).toBeVisible();
+ await expect(accountPage.availableUsernameButton).toBeVisible();
+ await expect(accountPage.passwordInput).toBeVisible();
+ await expect(accountPage.verifyPasswordInput).toBeVisible();
+ await expect(accountPage.showPasswordLabel).toBeVisible();
+ });
+
+ test("displays home library form", async () => {
+ await expect(accountPage.selectHomeLibrary).toBeVisible();
+ await expect(accountPage.cardholderTerms).toBeVisible();
+ await expect(accountPage.rulesRegulations).toBeVisible();
+ await expect(accountPage.privacyPolicy).toBeVisible();
+ await expect(accountPage.acceptTermsLabel).toBeVisible();
+ });
+ });
+
+ test.describe("enters account information", () => {
+ test("displays entered values in form fields", async () => {
+ await fillAccountInfo(accountPage, TEST_ACCOUNT);
+ await expect(accountPage.usernameInput).toHaveValue(
+ TEST_ACCOUNT.username
+ );
+ await accountPage.showPasswordLabel.check();
+ await expect(accountPage.passwordInput).toHaveValue(
+ TEST_ACCOUNT.password
+ );
+ await expect(accountPage.verifyPasswordInput).toHaveValue(
+ TEST_ACCOUNT.password
+ );
+ await expect(accountPage.selectHomeLibrary).toHaveValue(
+ TEST_ACCOUNT.homeLibraryCode
+ );
+ await expect(accountPage.acceptTermsLabel).toBeChecked();
+ });
+ });
+
+ test.describe("mocks API responses on account page", () => {
+ test("displays username available message", async ({ page }) => {
+ // mock the API call for username availability
+ await mockUsernameApi(page, ERROR_MESSAGES.USERNAME_AVAILABLE);
+ await accountPage.usernameInput.fill("AvailableUsername");
+ await accountPage.availableUsernameButton.click();
+ await expect(accountPage.availableUsernameMessage).toBeVisible();
+ });
+
+ test("displays username unavailable error message", async ({ page }) => {
+ // mock the API call for username unavailability
+ await mockUsernameApi(page, ERROR_MESSAGES.USERNAME_UNAVAILABLE);
+ await accountPage.usernameInput.fill("UnavailableUsername");
+ await accountPage.availableUsernameButton.click();
+ await expect(accountPage.unavailableUsernameMessage).toBeVisible();
+ });
+ });
+
+ test.describe("displays error messages", () => {
+ test("displays errors for required fields", async () => {
+ await accountPage.usernameInput.fill("");
+ await accountPage.passwordInput.fill("");
+ await accountPage.selectHomeLibrary.click();
+ await accountPage.nextButton.click();
+ await expect(accountPage.usernameError).toBeVisible();
+ await expect(accountPage.passwordError).toBeVisible();
+ await expect(accountPage.homeLibraryError).toBeVisible();
+ });
+
+ test("displays error when special characters in username", async () => {
+ await accountPage.usernameInput.fill("User!@#");
+ await accountPage.nextButton.click();
+ await expect(accountPage.usernameError).toBeVisible();
+ });
+
+ test("displays error when non-Latin characters in username", async () => {
+ await accountPage.usernameInput.fill("用戶名用戶名");
+ await accountPage.nextButton.click();
+ await expect(accountPage.usernameError).toBeVisible();
+ });
+
+ test("displays error when passwords do not match", async () => {
+ await accountPage.usernameInput.fill("ValidUser1");
+ await accountPage.passwordInput.fill("ValidPass1!");
+ await accountPage.verifyPasswordInput.fill("DifferentPass1!");
+ await accountPage.nextButton.click();
+ await expect(accountPage.verifyPasswordError).toBeVisible();
+ });
+
+ test("displays error when terms are not accepted", async () => {
+ await accountPage.usernameInput.fill("ValidUser1");
+ await accountPage.passwordInput.fill("ValidPass1!");
+ await accountPage.verifyPasswordInput.fill("ValidPass1!");
+ await accountPage.selectHomeLibrary.click();
+ await accountPage.selectHomeLibrary.selectOption("vr");
+ await accountPage.nextButton.click();
+ await expect(accountPage.acceptTermsError).toBeVisible();
+ });
+
+ test("displays error with too many characters", async () => {
+ await accountPage.usernameInput.fill("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+ await accountPage.passwordInput.fill(
+ "123456789012345678901234567890123"
+ );
+ await accountPage.nextButton.click();
+ await expect(accountPage.usernameError).toBeVisible();
+ await expect(accountPage.passwordError).toBeVisible();
+ });
+
+ test("displays error with too few characters", async () => {
+ await accountPage.usernameInput.fill("A");
+ await accountPage.passwordInput.fill("1!");
+ await accountPage.nextButton.click();
+ await expect(accountPage.usernameError).toBeVisible();
+ await expect(accountPage.passwordError).toBeVisible();
+ });
+ });
});
-});
+}
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 2103dc4d..78567d6e 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -119,7 +119,10 @@
},
"termsAndCondition": {
"label": "Yes, I accept the terms and conditions.",
- "text": "By submitting an application, you understand and agree to our Cardholder Terms and Conditions and agree to our Rules and Regulations. To learn more about the Library’s use of personal information, please read our Privacy Policy."
+ "text": "By submitting an application, you understand and agree to our {{termsConditions}} and agree to our {{rulesRegulations}}. To learn more about the Library’s use of personal information, please read our {{privacyPolicy}}.",
+ "termsConditions": "Cardholder Terms and Conditions",
+ "rulesRegulations": "Rules and Regulations",
+ "privacyPolicy": "Privacy Policy"
},
"errorMessage": {
"username": "There was a problem. Username must be between 5-25 alphanumeric characters.",
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index f254bf31..ea29c254 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -116,7 +116,10 @@
},
"termsAndCondition": {
"label": "Sí, acepto los términos y condiciones.",
- "text": "Al enviar una solicitud, comprende y acepta nuestros Términos y condiciones del titular de la tarjeta (en inglés) y acepta nuestras Normas y reglamentos generales. Para obtener más información sobre el uso de información personal por parte de la Biblioteca, lea nuestra Política de privacidad."
+ "text": "Al enviar una solicitud, comprende y acepta nuestros {{termsConditions}} (en inglés) y acepta nuestras {{rulesRegulations}}. Para obtener más información sobre el uso de información personal por parte de la Biblioteca, lea nuestra {{privacyPolicy}}.",
+ "termsConditions": "Términos y condiciones del titular de la tarjeta",
+ "rulesRegulations": "Normas y reglamentos generales",
+ "privacyPolicy": "Política de privacidad"
},
"errorMessage": {
"username": "Hubo un problema. El nombre de usuario debe tener entre 5 y 25 caracteres alfanuméricos.",
diff --git a/src/components/AcceptTermsFormFields/index.tsx b/src/components/AcceptTermsFormFields/index.tsx
index a900fb5b..83398fad 100644
--- a/src/components/AcceptTermsFormFields/index.tsx
+++ b/src/components/AcceptTermsFormFields/index.tsx
@@ -23,7 +23,16 @@ const AcceptTermsForm: React.FC = () => {
}}
+ values={{
+ termsConditions: t("account.termsAndCondition.termsConditions"),
+ rulesRegulations: t("account.termsAndCondition.rulesRegulations"),
+ privacyPolicy: t("account.termsAndCondition.privacyPolicy"),
+ }}
+ components={{
+ a1: ,
+ a2: ,
+ a3: ,
+ }}
/>
From 93f2dc7c87661f50b8de61e51c6665d97fa54606 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Fri, 27 Feb 2026 11:44:21 -0700
Subject: [PATCH 23/36] Fix tests
---
playwright/tests/personal.spec.ts | 31 +++++++++++++------------------
1 file changed, 13 insertions(+), 18 deletions(-)
diff --git a/playwright/tests/personal.spec.ts b/playwright/tests/personal.spec.ts
index 99306cdf..dfd3ad16 100644
--- a/playwright/tests/personal.spec.ts
+++ b/playwright/tests/personal.spec.ts
@@ -63,54 +63,49 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(personalPage.firstNameError).toBeVisible();
await expect(personalPage.lastNameError).toBeVisible();
- await expect(personalPage.dateOfBirthError).toBeVisible();
+ await expect(personalPage.dateOfBirthInvalid).toBeVisible();
await expect(personalPage.emailError).toBeVisible();
});
test("displays error for dashes in date of birth", async () => {
await personalPage.dateOfBirthInput.fill("12-25-1984");
await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
+ await expect(personalPage.dateOfBirthInvalid).toBeVisible();
});
test("displays error for YYYY/MM/DD format in date of birth", async () => {
await personalPage.dateOfBirthInput.fill("1984/12/25");
await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
+ await expect(personalPage.dateOfBirthInvalid).toBeVisible();
});
test("displays error for DD/MM/YYYY format in date of birth", async () => {
await personalPage.dateOfBirthInput.fill("25/12/1984");
await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
+ await expect(personalPage.dateOfBirthInvalid).toBeVisible();
});
test("displays error for M/D/YY format in date of birth", async () => {
await personalPage.dateOfBirthInput.fill("1/1/84");
await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
+ await expect(personalPage.dateOfBirthInvalid).toBeVisible();
});
test("displays error for written date of birth", async () => {
await personalPage.dateOfBirthInput.fill("December 25, 1984");
await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
+ await expect(personalPage.dateOfBirthInvalid).toBeVisible();
});
test("displays error for earliest date of birth", async () => {
await personalPage.dateOfBirthInput.fill("01/01/1902");
await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
- });
-
- test("displays error for date of birth in current year", async () => {
- await page.clock.setFixedTime(new Date("2026-01-01T10:00:00"));
- await personalPage.dateOfBirthInput.fill("01/01/2026");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
+ await expect(personalPage.dateOfBirthInvalid).toBeVisible();
});
- test("displays error for date of birth under 13 years old", async () => {
+ test("displays error for date of birth under 13 years old", async ({
+ page,
+ }) => {
await page.clock.setFixedTime(new Date("2026-01-01T10:00:00"));
await personalPage.dateOfBirthInput.fill("01/01/2014");
await personalPage.nextButton.click();
@@ -121,13 +116,13 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await page.clock.setFixedTime(new Date("2026-01-01T10:00:00"));
await personalPage.dateOfBirthInput.fill("01/01/2026");
await personalPage.nextButton.click();
- await expect(personalPage.ageError).toBeVisible();
+ await expect(personalPage.dateOfBirthError).toBeVisible();
});
test("displays error for future date of birth", async () => {
await personalPage.dateOfBirthInput.fill("12/31/2099");
await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
+ await expect(personalPage.dateOfBirthInvalid).toBeVisible();
});
test("displays error for missing email symbol", async () => {
@@ -155,4 +150,4 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
});
});
});
-}
\ No newline at end of file
+}
From bf0f51b2565d06ba0279ef231b99560f894e9b38 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Tue, 3 Mar 2026 09:08:31 -0700
Subject: [PATCH 24/36] Lint
---
playwright/pageobjects/address.page.ts | 4 +-
playwright/pageobjects/review.page.ts | 8 ++-
playwright/tests/address.spec.ts | 98 ++++++++++++++------------
3 files changed, 61 insertions(+), 49 deletions(-)
diff --git a/playwright/pageobjects/address.page.ts b/playwright/pageobjects/address.page.ts
index c18964d8..a7f056dc 100644
--- a/playwright/pageobjects/address.page.ts
+++ b/playwright/pageobjects/address.page.ts
@@ -33,7 +33,9 @@ export class AddressPage {
name: appContent?.location?.address.title || "Home address",
level: 3,
});
- this.alternateForm = page.getByRole("link", { name: appContent?.home?.description?.alternateForm || "alternate form" });
+ this.alternateForm = page.getByRole("link", {
+ name: appContent?.home?.description?.alternateForm || "alternate form",
+ });
this.streetAddressInput = page.getByLabel(
appContent?.location?.address.line1.label || "Street address"
);
diff --git a/playwright/pageobjects/review.page.ts b/playwright/pageobjects/review.page.ts
index 684ef008..44c1af82 100644
--- a/playwright/pageobjects/review.page.ts
+++ b/playwright/pageobjects/review.page.ts
@@ -120,8 +120,12 @@ export class ReviewPage {
name: "Date of birth (required)",
exact: true,
});
- this.dateOfBirthInvalid = this.page.getByText("There was a problem. Please enter a valid date, MM/DD/YYYY, including slashes.");
- this.dateOfBirthError = this.page.getByText("There was a problem. Date of birth is below the minimum age of 13.");
+ this.dateOfBirthInvalid = this.page.getByText(
+ "There was a problem. Please enter a valid date, MM/DD/YYYY, including slashes."
+ );
+ this.dateOfBirthError = this.page.getByText(
+ "There was a problem. Date of birth is below the minimum age of 13."
+ );
this.emailHeading = page.getByText("Email address", { exact: true });
this.emailInputHeading = page.getByText("Email address (required)", {
exact: true,
diff --git a/playwright/tests/address.spec.ts b/playwright/tests/address.spec.ts
index 791c0b81..c470a8b4 100644
--- a/playwright/tests/address.spec.ts
+++ b/playwright/tests/address.spec.ts
@@ -34,64 +34,70 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(addressPage.stateInput).toBeVisible();
await expect(addressPage.postalCodeInput).toBeVisible();
});
-
+
test("opens link in new tab", async ({ page }) => {
const addressPage = new AddressPage(page);
- await expect(addressPage.alternateForm).toHaveAttribute("target", "_blank");
+ await expect(addressPage.alternateForm).toHaveAttribute(
+ "target",
+ "_blank"
+ );
await expect(addressPage.alternateForm).toHaveAttribute(
"rel",
"nofollow noopener noreferrer"
);
- });
-
- test.describe("enters home address", () => {
- test("enters valid home address", async () => {
- await fillAddress(addressPage, TEST_OOS_ADDRESS);
- await expect(addressPage.streetAddressInput).toHaveValue(
- TEST_OOS_ADDRESS.street
- );
- await expect(addressPage.apartmentSuiteInput).toHaveValue(
- TEST_OOS_ADDRESS.apartmentSuite
- );
- await expect(addressPage.cityInput).toHaveValue(TEST_OOS_ADDRESS.city);
- await expect(addressPage.stateInput).toHaveValue(
- TEST_OOS_ADDRESS.state
- );
- await expect(addressPage.postalCodeInput).toHaveValue(
- TEST_OOS_ADDRESS.postalCode
- );
});
- });
- test.describe("displays error messages", () => {
- test("displays errors for required fields", async () => {
- await addressPage.streetAddressInput.fill("");
- await addressPage.cityInput.fill("");
- await addressPage.stateInput.click();
- await addressPage.postalCodeInput.fill("");
- await addressPage.nextButton.click();
- await expect(addressPage.streetAddressError).toBeVisible();
- await expect(addressPage.cityError).toBeVisible();
- await expect(addressPage.stateError).toBeVisible();
- await expect(addressPage.postalCodeError).toBeVisible();
+ test.describe("enters home address", () => {
+ test("enters valid home address", async () => {
+ await fillAddress(addressPage, TEST_OOS_ADDRESS);
+ await expect(addressPage.streetAddressInput).toHaveValue(
+ TEST_OOS_ADDRESS.street
+ );
+ await expect(addressPage.apartmentSuiteInput).toHaveValue(
+ TEST_OOS_ADDRESS.apartmentSuite
+ );
+ await expect(addressPage.cityInput).toHaveValue(
+ TEST_OOS_ADDRESS.city
+ );
+ await expect(addressPage.stateInput).toHaveValue(
+ TEST_OOS_ADDRESS.state
+ );
+ await expect(addressPage.postalCodeInput).toHaveValue(
+ TEST_OOS_ADDRESS.postalCode
+ );
+ });
});
- test("enter too many characters", async () => {
- await addressPage.postalCodeInput.fill("123456");
- await addressPage.nextButton.click();
- await expect(addressPage.postalCodeError).toBeVisible();
- });
+ test.describe("displays error messages", () => {
+ test("displays errors for required fields", async () => {
+ await addressPage.streetAddressInput.fill("");
+ await addressPage.cityInput.fill("");
+ await addressPage.stateInput.click();
+ await addressPage.postalCodeInput.fill("");
+ await addressPage.nextButton.click();
+ await expect(addressPage.streetAddressError).toBeVisible();
+ await expect(addressPage.cityError).toBeVisible();
+ await expect(addressPage.stateError).toBeVisible();
+ await expect(addressPage.postalCodeError).toBeVisible();
+ });
- test("enter too few characters", async () => {
- await addressPage.postalCodeInput.fill("1234");
- await addressPage.nextButton.click();
- await expect(addressPage.postalCodeError).toBeVisible();
- });
+ test("enter too many characters", async () => {
+ await addressPage.postalCodeInput.fill("123456");
+ await addressPage.nextButton.click();
+ await expect(addressPage.postalCodeError).toBeVisible();
+ });
+
+ test("enter too few characters", async () => {
+ await addressPage.postalCodeInput.fill("1234");
+ await addressPage.nextButton.click();
+ await expect(addressPage.postalCodeError).toBeVisible();
+ });
- test("enter postal code with dash", async () => {
- await addressPage.postalCodeInput.fill("12345-6789");
- await addressPage.nextButton.click();
- await expect(addressPage.postalCodeError).toBeVisible();
+ test("enter postal code with dash", async () => {
+ await addressPage.postalCodeInput.fill("12345-6789");
+ await addressPage.nextButton.click();
+ await expect(addressPage.postalCodeError).toBeVisible();
+ });
});
});
});
From dfc99a5a448858a5e2de3586bbb77bc989140e89 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Tue, 3 Mar 2026 09:21:36 -0700
Subject: [PATCH 25/36] Lint
---
playwright/pageobjects/personal.page.ts | 4 ++--
playwright/tests/account.spec.ts | 10 ++++++----
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/playwright/pageobjects/personal.page.ts b/playwright/pageobjects/personal.page.ts
index f118d645..9f93b9e0 100644
--- a/playwright/pageobjects/personal.page.ts
+++ b/playwright/pageobjects/personal.page.ts
@@ -62,10 +62,10 @@ export class PersonalPage {
"There was a problem. Please enter a valid email address."
);
this.alternateFormLink = this.page.getByRole("link", {
- name: appContent?.personal?.email?.alternateForm || "alternate form"
+ name: appContent?.personal?.email?.alternateForm || "alternate form",
});
this.locationsLink = this.page.locator("#mainContent").getByRole("link", {
- name: appContent?.personal?.email?.locations || "locations"
+ name: appContent?.personal?.email?.locations || "locations",
});
this.receiveInfoCheckbox = this.page.getByText(
appContent?.personal?.eCommunications?.labelText ||
diff --git a/playwright/tests/account.spec.ts b/playwright/tests/account.spec.ts
index a592bbd5..bd128c1a 100644
--- a/playwright/tests/account.spec.ts
+++ b/playwright/tests/account.spec.ts
@@ -44,8 +44,7 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(accountPage.privacyPolicy).toBeVisible();
await expect(accountPage.acceptTermsLabel).toBeVisible();
});
-
-
+
test("opens links in new tab", async ({ page }) => {
const accountPage = new AccountPage(page);
const links = [
@@ -55,7 +54,10 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
];
for (const link of links) {
await expect(link).toHaveAttribute("target", "_blank");
- await expect(link).toHaveAttribute("rel", "nofollow noopener noreferrer");
+ await expect(link).toHaveAttribute(
+ "rel",
+ "nofollow noopener noreferrer"
+ );
}
});
});
@@ -157,5 +159,5 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(accountPage.passwordError).toBeVisible();
});
});
-});
+ });
}
From 5031115be92823d303a594330f211dc74b67145a Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Tue, 3 Mar 2026 13:28:34 -0700
Subject: [PATCH 26/36] Fix link
---
playwright/tests/address.spec.ts | 96 ++++++++++++++++----------------
public/locales/es/common.json | 4 +-
2 files changed, 49 insertions(+), 51 deletions(-)
diff --git a/playwright/tests/address.spec.ts b/playwright/tests/address.spec.ts
index c470a8b4..fbc1d2db 100644
--- a/playwright/tests/address.spec.ts
+++ b/playwright/tests/address.spec.ts
@@ -19,10 +19,11 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
});
test.describe("displays elements", () => {
- test("displays headings and buttons", async () => {
+ test("displays headings, link, and buttons", async () => {
await expect(addressPage.mainHeading).toBeVisible();
await expect(addressPage.stepHeading).toBeVisible();
await expect(addressPage.addressHeading).toBeVisible();
+ await expect(addressPage.alternateForm).toBeVisible();
await expect(addressPage.nextButton).toBeVisible();
await expect(addressPage.previousButton).toBeVisible();
});
@@ -35,8 +36,7 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(addressPage.postalCodeInput).toBeVisible();
});
- test("opens link in new tab", async ({ page }) => {
- const addressPage = new AddressPage(page);
+ test("confirms link opens in new tab", async () => {
await expect(addressPage.alternateForm).toHaveAttribute(
"target",
"_blank"
@@ -46,58 +46,56 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
"nofollow noopener noreferrer"
);
});
+ });
- test.describe("enters home address", () => {
- test("enters valid home address", async () => {
- await fillAddress(addressPage, TEST_OOS_ADDRESS);
- await expect(addressPage.streetAddressInput).toHaveValue(
- TEST_OOS_ADDRESS.street
- );
- await expect(addressPage.apartmentSuiteInput).toHaveValue(
- TEST_OOS_ADDRESS.apartmentSuite
- );
- await expect(addressPage.cityInput).toHaveValue(
- TEST_OOS_ADDRESS.city
- );
- await expect(addressPage.stateInput).toHaveValue(
- TEST_OOS_ADDRESS.state
- );
- await expect(addressPage.postalCodeInput).toHaveValue(
- TEST_OOS_ADDRESS.postalCode
- );
- });
+ test.describe("enters home address", () => {
+ test("enters valid home address", async () => {
+ await fillAddress(addressPage, TEST_OOS_ADDRESS);
+ await expect(addressPage.streetAddressInput).toHaveValue(
+ TEST_OOS_ADDRESS.street
+ );
+ await expect(addressPage.apartmentSuiteInput).toHaveValue(
+ TEST_OOS_ADDRESS.apartmentSuite
+ );
+ await expect(addressPage.cityInput).toHaveValue(TEST_OOS_ADDRESS.city);
+ await expect(addressPage.stateInput).toHaveValue(
+ TEST_OOS_ADDRESS.state
+ );
+ await expect(addressPage.postalCodeInput).toHaveValue(
+ TEST_OOS_ADDRESS.postalCode
+ );
});
+ });
- test.describe("displays error messages", () => {
- test("displays errors for required fields", async () => {
- await addressPage.streetAddressInput.fill("");
- await addressPage.cityInput.fill("");
- await addressPage.stateInput.click();
- await addressPage.postalCodeInput.fill("");
- await addressPage.nextButton.click();
- await expect(addressPage.streetAddressError).toBeVisible();
- await expect(addressPage.cityError).toBeVisible();
- await expect(addressPage.stateError).toBeVisible();
- await expect(addressPage.postalCodeError).toBeVisible();
- });
+ test.describe("displays error messages", () => {
+ test("displays errors for required fields", async () => {
+ await addressPage.streetAddressInput.fill("");
+ await addressPage.cityInput.fill("");
+ await addressPage.stateInput.click();
+ await addressPage.postalCodeInput.fill("");
+ await addressPage.nextButton.click();
+ await expect(addressPage.streetAddressError).toBeVisible();
+ await expect(addressPage.cityError).toBeVisible();
+ await expect(addressPage.stateError).toBeVisible();
+ await expect(addressPage.postalCodeError).toBeVisible();
+ });
- test("enter too many characters", async () => {
- await addressPage.postalCodeInput.fill("123456");
- await addressPage.nextButton.click();
- await expect(addressPage.postalCodeError).toBeVisible();
- });
+ test("enter too many characters", async () => {
+ await addressPage.postalCodeInput.fill("123456");
+ await addressPage.nextButton.click();
+ await expect(addressPage.postalCodeError).toBeVisible();
+ });
- test("enter too few characters", async () => {
- await addressPage.postalCodeInput.fill("1234");
- await addressPage.nextButton.click();
- await expect(addressPage.postalCodeError).toBeVisible();
- });
+ test("enter too few characters", async () => {
+ await addressPage.postalCodeInput.fill("1234");
+ await addressPage.nextButton.click();
+ await expect(addressPage.postalCodeError).toBeVisible();
+ });
- test("enter postal code with dash", async () => {
- await addressPage.postalCodeInput.fill("12345-6789");
- await addressPage.nextButton.click();
- await expect(addressPage.postalCodeError).toBeVisible();
- });
+ test("enter postal code with dash", async () => {
+ await addressPage.postalCodeInput.fill("12345-6789");
+ await addressPage.nextButton.click();
+ await expect(addressPage.postalCodeError).toBeVisible();
});
});
});
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index f254bf31..1357b333 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -12,8 +12,8 @@
"digitalResources": "recursos digitales",
"visitNYPL": "visite cualquier biblioteca de la NYPL",
"part3": "Si viene de otro estado a visitar Nueva York, con este formulario puede solicitar una tarjeta temporal. Antes de su visita, puede pedir materiales físicos y programar citas para investigación. Para acceder a otros servicios, debe validar su tarjeta en persona en alguna biblioteca de la NYPL en un plazo de 30 días.",
- "part4": "Si viene de visita desde otro país, utilice {{alternateForm}} para turistas internacionales. Con su tarjeta temporal, puede pedir materiales y programar citas para investigación.",
- "alternateForm": "el formulario alternativo",
+ "part4": "Si viene de visita desde otro país, utilice el {{alternateForm}} para turistas internacionales. Con su tarjeta temporal, puede pedir materiales y programar citas para investigación.",
+ "alternateForm": "formulario alternativo",
"part5": "{{whatYouCanAccess}} sobre a qué puede acceder con su tarjeta de la biblioteca.",
"whatYouCanAccess": "Obtenga más información",
"part6": "Al presentar una solicitud, usted entiende y está de acuerdo con nuestros {{termsConditions}} y con nuestras {{rulesRegulations}}. Para obtener más información sobre cómo la Biblioteca usa la información personal, consulte nuestra {{privacyPolicy}}.",
From f356ec28e4f5907918616d16ec43ecb01323d1ad Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Tue, 3 Mar 2026 14:36:50 -0700
Subject: [PATCH 27/36] Update e2e tests
---
playwright/pageobjects/account.page.ts | 14 +-
playwright/tests/account.spec.ts | 3 +-
playwright/tests/address.spec.ts | 3 +-
playwright/tests/backward-navigation.spec.ts | 178 +++++++++----------
playwright/tests/e2e-edited.spec.ts | 14 +-
playwright/tests/e2e-partial.spec.ts | 128 ++++++-------
playwright/tests/oos-e2e-mocked.spec.ts | 14 +-
playwright/tests/oos-e2e.spec.ts | 14 +-
public/locales/es/common.json | 4 +-
9 files changed, 184 insertions(+), 188 deletions(-)
diff --git a/playwright/pageobjects/account.page.ts b/playwright/pageobjects/account.page.ts
index 48107ce6..1717d5d1 100644
--- a/playwright/pageobjects/account.page.ts
+++ b/playwright/pageobjects/account.page.ts
@@ -55,14 +55,12 @@ export class AccountPage {
"Check if username is available",
exact: true,
});
- this.availableUsernameMessage = page.getByText(
- "This username is available.",
- { exact: true }
- );
- this.unavailableUsernameMessage = page.getByText(
- "This username is unavailable. Please try another.",
- { exact: true }
- );
+ this.availableUsernameMessage = page
+ .getByText("El nombre de usuario está disponible.") // replace when translation available
+ .or(page.getByText("This username is available."));
+ this.unavailableUsernameMessage = page
+ .getByText("Este nombre de usuario no está disponible. Pruebe con otro.") // replace when translation available
+ .or(page.getByText("This username is unavailable. Please try another."));
this.passwordInput = page.getByRole("textbox", {
name: withRequired(appContent?.account?.password?.label || "Password"),
exact: true,
diff --git a/playwright/tests/account.spec.ts b/playwright/tests/account.spec.ts
index bd128c1a..70bc6936 100644
--- a/playwright/tests/account.spec.ts
+++ b/playwright/tests/account.spec.ts
@@ -45,8 +45,7 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(accountPage.acceptTermsLabel).toBeVisible();
});
- test("opens links in new tab", async ({ page }) => {
- const accountPage = new AccountPage(page);
+ test("confirms links open in new tab", async () => {
const links = [
accountPage.cardholderTerms,
accountPage.rulesRegulations,
diff --git a/playwright/tests/address.spec.ts b/playwright/tests/address.spec.ts
index c470a8b4..d6dfdd3f 100644
--- a/playwright/tests/address.spec.ts
+++ b/playwright/tests/address.spec.ts
@@ -35,8 +35,7 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await expect(addressPage.postalCodeInput).toBeVisible();
});
- test("opens link in new tab", async ({ page }) => {
- const addressPage = new AddressPage(page);
+ test("confirms link opens in new tab", async () => {
await expect(addressPage.alternateForm).toHaveAttribute(
"target",
"_blank"
diff --git a/playwright/tests/backward-navigation.spec.ts b/playwright/tests/backward-navigation.spec.ts
index 106006d3..1e4c3423 100644
--- a/playwright/tests/backward-navigation.spec.ts
+++ b/playwright/tests/backward-navigation.spec.ts
@@ -20,42 +20,42 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
pageManager = new PageManager(page, appContent);
});
- // test("navigates backward to landing without entering info", async ({
- // page,
- // }) => {
- // await test.step("begins at account page", async () => {
- // await page.goto(PAGE_ROUTES.ACCOUNT(lang));
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await expect(pageManager.accountPage.previousButton).toBeVisible();
- // await pageManager.accountPage.previousButton.click();
- // });
+ test("navigates backward to landing without entering info", async ({
+ page,
+ }) => {
+ await test.step("begins at account page", async () => {
+ await page.goto(PAGE_ROUTES.ACCOUNT(lang));
+ await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ await expect(pageManager.accountPage.previousButton).toBeVisible();
+ await pageManager.accountPage.previousButton.click();
+ });
- // await test.step("displays address verification page", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await expect(
- // pageManager.addressVerificationPage.previousButton
- // ).toBeVisible();
- // await pageManager.addressVerificationPage.previousButton.click();
- // });
+ await test.step("displays address verification page", async () => {
+ await expect(
+ pageManager.addressVerificationPage.stepHeading
+ ).toBeVisible();
+ await expect(
+ pageManager.addressVerificationPage.previousButton
+ ).toBeVisible();
+ await pageManager.addressVerificationPage.previousButton.click();
+ });
- // await test.step("displays address page", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await expect(pageManager.addressPage.previousButton).toBeVisible();
- // await pageManager.addressPage.previousButton.click();
- // });
+ await test.step("displays address page", async () => {
+ await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ await expect(pageManager.addressPage.previousButton).toBeVisible();
+ await pageManager.addressPage.previousButton.click();
+ });
- // await test.step("displays personal information page", async () => {
- // await expect(pageManager.personalPage.stepHeading).toBeVisible();
- // await expect(pageManager.personalPage.previousButton).toBeVisible();
- // await pageManager.personalPage.previousButton.click();
- // });
+ await test.step("displays personal information page", async () => {
+ await expect(pageManager.personalPage.stepHeading).toBeVisible();
+ await expect(pageManager.personalPage.previousButton).toBeVisible();
+ await pageManager.personalPage.previousButton.click();
+ });
- // await test.step("displays landing page", async () => {
- // await expect(pageManager.landingPage.applyHeading).toBeVisible();
- // });
- // });
+ await test.step("displays landing page", async () => {
+ await expect(pageManager.landingPage.applyHeading).toBeVisible();
+ });
+ });
test("retains user-entered info when navigating backward", async ({
page,
@@ -104,66 +104,66 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
).not.toBeVisible({ timeout: SPINNER_TIMEOUT });
});
- // await test.step("displays account page", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await pageManager.accountPage.previousButton.click();
- // });
+ await test.step("displays account page", async () => {
+ await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ await pageManager.accountPage.previousButton.click();
+ });
- // await test.step("displays user-entered info on address verification page", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await expect(
- // pageManager.addressVerificationPage.getHomeAddressOption(
- // TEST_OOS_ADDRESS.street
- // )
- // ).toBeChecked();
- // await expect(
- // pageManager.addressVerificationPage.getAlternateAddressOption(
- // TEST_NYC_ADDRESS.street
- // )
- // ).toBeChecked();
- // await pageManager.addressVerificationPage.previousButton.click();
- // });
+ await test.step("displays user-entered info on address verification page", async () => {
+ await expect(
+ pageManager.addressVerificationPage.stepHeading
+ ).toBeVisible();
+ await expect(
+ pageManager.addressVerificationPage.getHomeAddressOption(
+ TEST_OOS_ADDRESS.street
+ )
+ ).toBeChecked();
+ await expect(
+ pageManager.addressVerificationPage.getAlternateAddressOption(
+ TEST_NYC_ADDRESS.street
+ )
+ ).toBeChecked();
+ await pageManager.addressVerificationPage.previousButton.click();
+ });
- // await test.step("displays user-entered info on address page", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await expect(pageManager.addressPage.streetAddressInput).toHaveValue(
- // TEST_OOS_ADDRESS.street
- // );
- // await expect(pageManager.addressPage.apartmentSuiteInput).toHaveValue(
- // TEST_OOS_ADDRESS.apartmentSuite
- // );
- // await expect(pageManager.addressPage.cityInput).toHaveValue(
- // TEST_OOS_ADDRESS.city
- // );
- // await expect(pageManager.addressPage.stateInput).toHaveValue(
- // TEST_OOS_ADDRESS.state
- // );
- // await expect(pageManager.addressPage.postalCodeInput).toHaveValue(
- // TEST_OOS_ADDRESS.postalCode
- // );
- // await pageManager.addressPage.previousButton.click();
- // });
+ await test.step("displays user-entered info on address page", async () => {
+ await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ await expect(pageManager.addressPage.streetAddressInput).toHaveValue(
+ TEST_OOS_ADDRESS.street
+ );
+ await expect(pageManager.addressPage.apartmentSuiteInput).toHaveValue(
+ TEST_OOS_ADDRESS.apartmentSuite
+ );
+ await expect(pageManager.addressPage.cityInput).toHaveValue(
+ TEST_OOS_ADDRESS.city
+ );
+ await expect(pageManager.addressPage.stateInput).toHaveValue(
+ TEST_OOS_ADDRESS.state
+ );
+ await expect(pageManager.addressPage.postalCodeInput).toHaveValue(
+ TEST_OOS_ADDRESS.postalCode
+ );
+ await pageManager.addressPage.previousButton.click();
+ });
- // await test.step("displays user-entered info on personal information page", async () => {
- // await expect(pageManager.personalPage.stepHeading).toBeVisible();
- // await expect(pageManager.personalPage.firstNameInput).toHaveValue(
- // TEST_PATRON.firstName
- // );
- // await expect(pageManager.personalPage.lastNameInput).toHaveValue(
- // TEST_PATRON.lastName
- // );
- // await expect(pageManager.personalPage.dateOfBirthInput).toHaveValue(
- // TEST_PATRON.dateOfBirth
- // );
- // await expect(pageManager.personalPage.emailInput).toHaveValue(
- // TEST_PATRON.email
- // );
- // await expect(
- // pageManager.personalPage.receiveInfoCheckbox
- // ).not.toBeChecked();
- // });
+ await test.step("displays user-entered info on personal information page", async () => {
+ await expect(pageManager.personalPage.stepHeading).toBeVisible();
+ await expect(pageManager.personalPage.firstNameInput).toHaveValue(
+ TEST_PATRON.firstName
+ );
+ await expect(pageManager.personalPage.lastNameInput).toHaveValue(
+ TEST_PATRON.lastName
+ );
+ await expect(pageManager.personalPage.dateOfBirthInput).toHaveValue(
+ TEST_PATRON.dateOfBirth
+ );
+ await expect(pageManager.personalPage.emailInput).toHaveValue(
+ TEST_PATRON.email
+ );
+ await expect(
+ pageManager.personalPage.receiveInfoCheckbox
+ ).not.toBeChecked();
+ });
});
});
}
diff --git a/playwright/tests/e2e-edited.spec.ts b/playwright/tests/e2e-edited.spec.ts
index 61501a04..c7353778 100644
--- a/playwright/tests/e2e-edited.spec.ts
+++ b/playwright/tests/e2e-edited.spec.ts
@@ -1,7 +1,7 @@
import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
import {
- // fillAccountInfo,
+ fillAccountInfo,
fillAddress,
fillPersonalInfo,
} from "../utils/form-helper";
@@ -9,7 +9,7 @@ import {
PAGE_ROUTES,
SPINNER_TIMEOUT,
SUPPORTED_LANGUAGES,
- // TEST_ACCOUNT,
+ TEST_ACCOUNT,
// TEST_EDITED_PATRON,
TEST_OOS_ADDRESS,
TEST_PATRON,
@@ -88,11 +88,11 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
});
});
- // await test.step("enters account information", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
- // await pageManager.accountPage.nextButton.click();
- // });
+ await test.step("enters account information", async () => {
+ await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
+ await pageManager.accountPage.nextButton.click();
+ });
// await test.step("edits personal info on review page", async () => {
// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
diff --git a/playwright/tests/e2e-partial.spec.ts b/playwright/tests/e2e-partial.spec.ts
index 1468a0d1..83d68f8e 100644
--- a/playwright/tests/e2e-partial.spec.ts
+++ b/playwright/tests/e2e-partial.spec.ts
@@ -1,11 +1,11 @@
import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
-import { /*fillAccountInfo,*/ fillAddress } from "../utils/form-helper";
+import { fillAccountInfo, fillAddress } from "../utils/form-helper";
import {
PAGE_ROUTES,
SPINNER_TIMEOUT,
SUPPORTED_LANGUAGES,
- // TEST_ACCOUNT,
+ TEST_ACCOUNT,
// TEST_EDITED_ACCOUNT,
// TEST_NYC_ADDRESS,
} from "../utils/constants";
@@ -64,11 +64,11 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
});
});
- // await test.step("enters account information", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
- // await pageManager.accountPage.nextButton.click();
- // });
+ await test.step("enters account information", async () => {
+ await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
+ await pageManager.accountPage.nextButton.click();
+ });
// await test.step("displays error on review page", async () => {
// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
@@ -77,68 +77,68 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
// });
});
- // test("displays updated account info after editing addresses", async ({
- // page,
- // }) => {
- // await test.step("enters account information", async () => {
- // await page.goto(PAGE_ROUTES.ACCOUNT(lang));
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
- // await pageManager.accountPage.nextButton.click();
- // });
+ test("displays updated account info after editing addresses", async ({
+ page,
+ }) => {
+ await test.step("enters account information", async () => {
+ await page.goto(PAGE_ROUTES.ACCOUNT(lang));
+ await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
+ await pageManager.accountPage.nextButton.click();
+ });
- // await test.step("edits address from review page", async () => {
- // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
- // await pageManager.reviewPage.editAddressButton.click();
- // });
+ // await test.step("edits address from review page", async () => {
+ // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
+ // await pageManager.reviewPage.editAddressButton.click();
+ // });
- // await test.step("enters home address", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await fillAddress(pageManager.addressPage, TEST_NYC_ADDRESS);
- // await pageManager.addressPage.nextButton.click();
- // await expect(pageManager.addressPage.spinner).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
+ // await test.step("enters home address", async () => {
+ // await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ // await fillAddress(pageManager.addressPage, TEST_NYC_ADDRESS);
+ // await pageManager.addressPage.nextButton.click();
+ // await expect(pageManager.addressPage.spinner).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
- // await test.step("skips alternate address", async () => {
- // await expect(pageManager.alternateAddressPage.stepHeading).toBeVisible();
- // await pageManager.alternateAddressPage.nextButton.click();
- // await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
+ // await test.step("skips alternate address", async () => {
+ // await expect(pageManager.alternateAddressPage.stepHeading).toBeVisible();
+ // await pageManager.alternateAddressPage.nextButton.click();
+ // await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
- // await test.step("confirms address verification", async () => {
- // await expect(pageManager.addressVerificationPage.stepHeading).toBeVisible();
- // await pageManager.addressVerificationPage
- // .getHomeAddressOption(TEST_NYC_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage.nextButton.click();
- // await expect(pageManager.addressVerificationPage.spinner).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
+ // await test.step("confirms address verification", async () => {
+ // await expect(pageManager.addressVerificationPage.stepHeading).toBeVisible();
+ // await pageManager.addressVerificationPage
+ // .getHomeAddressOption(TEST_NYC_ADDRESS.street)
+ // .check();
+ // await pageManager.addressVerificationPage.nextButton.click();
+ // await expect(pageManager.addressVerificationPage.spinner).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
- // await test.step("edits account information", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await fillAccountInfo(pageManager.accountPage, TEST_EDITED_ACCOUNT);
- // await pageManager.accountPage.nextButton.click();
- // });
+ // await test.step("edits account information", async () => {
+ // await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ // await fillAccountInfo(pageManager.accountPage, TEST_EDITED_ACCOUNT);
+ // await pageManager.accountPage.nextButton.click();
+ // });
- // await test.step("displays updated account info on review page", async () => {
- // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
- // await expect(
- // pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.username)
- // ).toBeVisible();
- // await pageManager.reviewPage.showPasswordLabel.check();
- // await expect(
- // pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.password)
- // ).toBeVisible();
- // await expect(
- // pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.homeLibrary)
- // ).toBeVisible();
- // });
- // });
+ // await test.step("displays updated account info on review page", async () => {
+ // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
+ // await expect(
+ // pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.username)
+ // ).toBeVisible();
+ // await pageManager.reviewPage.showPasswordLabel.check();
+ // await expect(
+ // pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.password)
+ // ).toBeVisible();
+ // await expect(
+ // pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.homeLibrary)
+ // ).toBeVisible();
+ // });
+ });
});
}
diff --git a/playwright/tests/oos-e2e-mocked.spec.ts b/playwright/tests/oos-e2e-mocked.spec.ts
index 4cdea288..cebde41d 100644
--- a/playwright/tests/oos-e2e-mocked.spec.ts
+++ b/playwright/tests/oos-e2e-mocked.spec.ts
@@ -1,7 +1,7 @@
import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
import {
- // fillAccountInfo,
+ fillAccountInfo,
fillAddress,
fillPersonalInfo,
} from "../utils/form-helper";
@@ -9,7 +9,7 @@ import {
PAGE_ROUTES,
SPINNER_TIMEOUT,
SUPPORTED_LANGUAGES,
- // TEST_ACCOUNT,
+ TEST_ACCOUNT,
// TEST_BARCODE_NUMBER,
TEST_NYC_ADDRESS,
TEST_OOS_ADDRESS,
@@ -86,11 +86,11 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
});
});
- // await test.step("enters account information", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
- // await pageManager.accountPage.nextButton.click();
- // });
+ await test.step("enters account information", async () => {
+ await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
+ await pageManager.accountPage.nextButton.click();
+ });
// await test.step("displays review page", async () => {
// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
diff --git a/playwright/tests/oos-e2e.spec.ts b/playwright/tests/oos-e2e.spec.ts
index 97316cb1..e262ed6f 100644
--- a/playwright/tests/oos-e2e.spec.ts
+++ b/playwright/tests/oos-e2e.spec.ts
@@ -1,7 +1,7 @@
import { test, expect } from "@playwright/test";
import { PageManager } from "../pageobjects/page-manager.page";
import {
- // fillAccountInfo,
+ fillAccountInfo,
fillAddress,
fillPersonalInfo,
} from "../utils/form-helper";
@@ -10,7 +10,7 @@ import {
// PATRON_TYPES,
SPINNER_TIMEOUT,
SUPPORTED_LANGUAGES,
- // TEST_ACCOUNT,
+ TEST_ACCOUNT,
TEST_NYC_ADDRESS,
TEST_OOS_ADDRESS,
TEST_PATRON,
@@ -96,11 +96,11 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
).not.toBeVisible({ timeout: SPINNER_TIMEOUT });
});
- // await test.step("enters account information", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
- // await pageManager.accountPage.nextButton.click();
- // });
+ await test.step("enters account information", async () => {
+ await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
+ await pageManager.accountPage.nextButton.click();
+ });
// await test.step("displays personal information on review page", async () => {
// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index ea29c254..ee753728 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -12,8 +12,8 @@
"digitalResources": "recursos digitales",
"visitNYPL": "visite cualquier biblioteca de la NYPL",
"part3": "Si viene de otro estado a visitar Nueva York, con este formulario puede solicitar una tarjeta temporal. Antes de su visita, puede pedir materiales físicos y programar citas para investigación. Para acceder a otros servicios, debe validar su tarjeta en persona en alguna biblioteca de la NYPL en un plazo de 30 días.",
- "part4": "Si viene de visita desde otro país, utilice {{alternateForm}} para turistas internacionales. Con su tarjeta temporal, puede pedir materiales y programar citas para investigación.",
- "alternateForm": "el formulario alternativo",
+ "part4": "Si viene de visita desde otro país, utilice el {{alternateForm}} para turistas internacionales. Con su tarjeta temporal, puede pedir materiales y programar citas para investigación.",
+ "alternateForm": "formulario alternativo",
"part5": "{{whatYouCanAccess}} sobre a qué puede acceder con su tarjeta de la biblioteca.",
"whatYouCanAccess": "Obtenga más información",
"part6": "Al presentar una solicitud, usted entiende y está de acuerdo con nuestros {{termsConditions}} y con nuestras {{rulesRegulations}}. Para obtener más información sobre cómo la Biblioteca usa la información personal, consulte nuestra {{privacyPolicy}}.",
From 21e755822fb1e24ec32f024f5579af8513411e9a Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Wed, 4 Mar 2026 09:31:00 -0700
Subject: [PATCH 28/36] Uncomment personal tests
---
playwright/tests/backward-navigation.spec.ts | 166 -----
.../tests/e2e/backward-navigation.spec.ts | 396 ++++++------
playwright/tests/e2e/e2e-partial.spec.ts | 606 +++++++++---------
3 files changed, 501 insertions(+), 667 deletions(-)
delete mode 100644 playwright/tests/backward-navigation.spec.ts
diff --git a/playwright/tests/backward-navigation.spec.ts b/playwright/tests/backward-navigation.spec.ts
deleted file mode 100644
index fa6c5780..00000000
--- a/playwright/tests/backward-navigation.spec.ts
+++ /dev/null
@@ -1,166 +0,0 @@
-import { test, expect } from "@playwright/test";
-import { PageManager } from "../pageobjects/page-manager.page";
-import { /*fillAddress,*/ fillPersonalInfo } from "../utils/form-helper";
-import {
- PAGE_ROUTES,
- // SPINNER_TIMEOUT,
- SUPPORTED_LANGUAGES,
- TEST_PATRON,
- // TEST_NYC_ADDRESS,
- // TEST_OOS_ADDRESS,
-} from "../utils/constants";
-
-for (const { lang, name } of SUPPORTED_LANGUAGES) {
- test.describe(`E2E: Navigate backward in application in ${name} (${lang})`, () => {
- let pageManager: PageManager;
- let appContent: any;
-
- test.beforeEach(async ({ page }) => {
- appContent = require(`../../public/locales/${lang}/common.json`);
- pageManager = new PageManager(page, appContent);
- });
-
- // test("navigates backward to landing without entering info", async ({
- // page,
- // }) => {
- // await test.step("begins at account page", async () => {
- // await page.goto(PAGE_ROUTES.ACCOUNT(lang));
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await expect(pageManager.accountPage.previousButton).toBeVisible();
- // await pageManager.accountPage.previousButton.click();
- // });
-
- // await test.step("displays address verification page", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await expect(
- // pageManager.addressVerificationPage.previousButton
- // ).toBeVisible();
- // await pageManager.addressVerificationPage.previousButton.click();
- // });
-
- // await test.step("displays address page", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await expect(pageManager.addressPage.previousButton).toBeVisible();
- // await pageManager.addressPage.previousButton.click();
- // });
-
- // await test.step("displays personal information page", async () => {
- // await expect(pageManager.personalPage.stepHeading).toBeVisible();
- // await expect(pageManager.personalPage.previousButton).toBeVisible();
- // await pageManager.personalPage.previousButton.click();
- // });
-
- // await test.step("displays landing page", async () => {
- // await expect(pageManager.landingPage.applyHeading).toBeVisible();
- // });
- // });
-
- test("retains user-entered info when navigating backward", async ({
- page,
- }) => {
- await test.step("enters personal information", async () => {
- await page.goto(PAGE_ROUTES.PERSONAL(lang));
- await expect(pageManager.personalPage.stepHeading).toBeVisible();
- await fillPersonalInfo(pageManager.personalPage, TEST_PATRON);
- await pageManager.personalPage.receiveInfoCheckbox.click(); // unchecks
- await pageManager.personalPage.nextButton.click();
- });
-
- // await test.step("enters home address", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
- // await pageManager.addressPage.nextButton.click();
- // });
-
- // await test.step("enters alternate address", async () => {
- // await expect(
- // pageManager.alternateAddressPage.stepHeading
- // ).toBeVisible();
- // await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
- // await pageManager.alternateAddressPage.nextButton.click();
- // await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
-
- // await test.step("confirms address verification", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await pageManager.addressVerificationPage
- // .getHomeAddressOption(TEST_OOS_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage
- // .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage.nextButton.click();
- // await expect(
- // pageManager.addressVerificationPage.spinner
- // ).not.toBeVisible({ timeout: SPINNER_TIMEOUT });
- // });
-
- // await test.step("displays account page", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await pageManager.accountPage.previousButton.click();
- // });
-
- // await test.step("displays user-entered info on address verification page", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await expect(
- // pageManager.addressVerificationPage.getHomeAddressOption(
- // TEST_OOS_ADDRESS.street
- // )
- // ).toBeChecked();
- // await expect(
- // pageManager.addressVerificationPage.getAlternateAddressOption(
- // TEST_NYC_ADDRESS.street
- // )
- // ).toBeChecked();
- // await pageManager.addressVerificationPage.previousButton.click();
- // });
-
- // await test.step("displays user-entered info on address page", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await expect(pageManager.addressPage.streetAddressInput).toHaveValue(
- // TEST_OOS_ADDRESS.street
- // );
- // await expect(pageManager.addressPage.apartmentSuiteInput).toHaveValue(
- // TEST_OOS_ADDRESS.apartmentSuite
- // );
- // await expect(pageManager.addressPage.cityInput).toHaveValue(
- // TEST_OOS_ADDRESS.city
- // );
- // await expect(pageManager.addressPage.stateInput).toHaveValue(
- // TEST_OOS_ADDRESS.state
- // );
- // await expect(pageManager.addressPage.postalCodeInput).toHaveValue(
- // TEST_OOS_ADDRESS.postalCode
- // );
- // await pageManager.addressPage.previousButton.click();
- // });
-
- // await test.step("displays user-entered info on personal information page", async () => {
- // await expect(pageManager.personalPage.stepHeading).toBeVisible();
- // await expect(pageManager.personalPage.firstNameInput).toHaveValue(
- // TEST_PATRON.firstName
- // );
- // await expect(pageManager.personalPage.lastNameInput).toHaveValue(
- // TEST_PATRON.lastName
- // );
- // await expect(pageManager.personalPage.dateOfBirthInput).toHaveValue(
- // TEST_PATRON.dateOfBirth
- // );
- // await expect(pageManager.personalPage.emailInput).toHaveValue(
- // TEST_PATRON.email
- // );
- // await expect(
- // pageManager.personalPage.receiveInfoCheckbox
- // ).not.toBeChecked();
- // });
- });
- });
-}
diff --git a/playwright/tests/e2e/backward-navigation.spec.ts b/playwright/tests/e2e/backward-navigation.spec.ts
index 2b9914d7..701d9506 100644
--- a/playwright/tests/e2e/backward-navigation.spec.ts
+++ b/playwright/tests/e2e/backward-navigation.spec.ts
@@ -1,198 +1,198 @@
-// import { test, expect } from "@playwright/test";
-// import { PageManager } from "../../pageobjects/page-manager.page";
-// import {
-// fillAccountInfo,
-// fillAddress,
-// fillPersonalInfo,
-// } from "../../utils/form-helper";
-// import {
-// PAGE_ROUTES,
-// SPINNER_TIMEOUT,
-// SUPPORTED_LANGUAGES,
-// TEST_ACCOUNT,
-// TEST_NYC_ADDRESS,
-// TEST_OOS_ADDRESS,
-// TEST_PATRON,
-// } from "../../utils/constants";
-
-// for (const { lang, name } of SUPPORTED_LANGUAGES) {
-// test.describe(`E2E: Navigate backward in application in ${name} (${lang})`, () => {
-// let pageManager: PageManager;
-// let appContent: any;
-
-// test.beforeEach(async ({ page }) => {
-// appContent = require(`../../../public/locales/${lang}/common.json`);
-// pageManager = new PageManager(page, appContent);
-// });
-
-// test("navigates backward to landing without entering info", async ({
-// page,
-// }) => {
-// await test.step("begins at account page", async () => {
-// await page.goto(PAGE_ROUTES.ACCOUNT(lang));
-// await expect(pageManager.accountPage.stepHeading).toBeVisible();
-// await expect(pageManager.accountPage.previousButton).toBeVisible();
-// await pageManager.accountPage.previousButton.click();
-// });
-
-// await test.step("navigates back to address verification page", async () => {
-// await expect(
-// pageManager.addressVerificationPage.stepHeading
-// ).toBeVisible();
-// await expect(
-// pageManager.addressVerificationPage.previousButton
-// ).toBeVisible();
-// await pageManager.addressVerificationPage.previousButton.click();
-// });
-
-// await test.step("navigates back to address page", async () => {
-// await expect(pageManager.addressPage.stepHeading).toBeVisible();
-// await expect(pageManager.addressPage.previousButton).toBeVisible();
-// await pageManager.addressPage.previousButton.click();
-// });
-
-// await test.step("navigates back to personal information page", async () => {
-// await expect(pageManager.personalPage.stepHeading).toBeVisible();
-// await expect(pageManager.personalPage.previousButton).toBeVisible();
-// await pageManager.personalPage.previousButton.click();
-// });
-
-// await test.step("navigates back to landing page", async () => {
-// await expect(pageManager.landingPage.applyHeading).toBeVisible();
-// });
-// });
-
-// test("retains user-entered info when navigating backward", async ({
-// page,
-// }) => {
-// await test.step("enters personal information", async () => {
-// await page.goto(PAGE_ROUTES.PERSONAL(lang));
-// await expect(pageManager.personalPage.stepHeading).toBeVisible();
-// await fillPersonalInfo(pageManager.personalPage, TEST_PATRON);
-// await pageManager.personalPage.receiveInfoCheckbox.click(); // unchecks
-// await pageManager.personalPage.nextButton.click();
-// });
-
-// await test.step("enters home address", async () => {
-// await expect(pageManager.addressPage.stepHeading).toBeVisible();
-// await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
-// await pageManager.addressPage.nextButton.click();
-// await expect(pageManager.addressPage.spinner).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
-
-// await test.step("enters alternate address", async () => {
-// await expect(
-// pageManager.alternateAddressPage.stepHeading
-// ).toBeVisible();
-// await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
-// await pageManager.alternateAddressPage.nextButton.click();
-// await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
-
-// await test.step("verifies home and alternate addresses", async () => {
-// await expect(
-// pageManager.addressVerificationPage.stepHeading
-// ).toBeVisible();
-// await pageManager.addressVerificationPage
-// .getHomeAddressOption(TEST_OOS_ADDRESS.street)
-// .check();
-// await pageManager.addressVerificationPage
-// .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
-// .check();
-// await pageManager.addressVerificationPage.nextButton.click();
-// await expect(
-// pageManager.addressVerificationPage.spinner
-// ).not.toBeVisible({ timeout: SPINNER_TIMEOUT });
-// });
-
-// await test.step("enters account information", async () => {
-// await expect(pageManager.accountPage.stepHeading).toBeVisible();
-// await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
-// await pageManager.accountPage.nextButton.click();
-// });
-
-// await test.step("displays review page and navigates back to account page", async () => {
-// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
-// await page.goBack();
-// });
-
-// await test.step("retains info on account page", async () => {
-// await expect(pageManager.accountPage.stepHeading).toBeVisible();
-// await expect(pageManager.accountPage.usernameInput).toHaveValue(
-// TEST_ACCOUNT.username
-// );
-// await expect(pageManager.accountPage.passwordInput).toHaveValue(
-// TEST_ACCOUNT.password
-// );
-// await expect(pageManager.accountPage.verifyPasswordInput).toHaveValue(
-// TEST_ACCOUNT.password
-// );
-// await expect(pageManager.accountPage.selectHomeLibrary).toHaveValue(
-// TEST_ACCOUNT.homeLibraryCode
-// );
-// await expect(pageManager.accountPage.acceptTermsCheckbox).toBeChecked();
-// await pageManager.accountPage.previousButton.click();
-// });
-
-// await test.step("retains info on address verification page", async () => {
-// await expect(
-// pageManager.addressVerificationPage.stepHeading
-// ).toBeVisible();
-// await expect(
-// pageManager.addressVerificationPage.getHomeAddressOption(
-// TEST_OOS_ADDRESS.street
-// )
-// ).toBeChecked();
-// await expect(
-// pageManager.addressVerificationPage.getAlternateAddressOption(
-// TEST_NYC_ADDRESS.street
-// )
-// ).toBeChecked();
-// await pageManager.addressVerificationPage.previousButton.click();
-// });
-
-// await test.step("retains info on address page", async () => {
-// await expect(pageManager.addressPage.stepHeading).toBeVisible();
-// await expect(pageManager.addressPage.streetAddressInput).toHaveValue(
-// TEST_OOS_ADDRESS.street
-// );
-// await expect(pageManager.addressPage.apartmentSuiteInput).toHaveValue(
-// TEST_OOS_ADDRESS.apartmentSuite
-// );
-// await expect(pageManager.addressPage.cityInput).toHaveValue(
-// TEST_OOS_ADDRESS.city
-// );
-// await expect(pageManager.addressPage.stateInput).toHaveValue(
-// TEST_OOS_ADDRESS.state
-// );
-// await expect(pageManager.addressPage.postalCodeInput).toHaveValue(
-// TEST_OOS_ADDRESS.postalCode
-// );
-// await pageManager.addressPage.previousButton.click();
-// });
-
-// await test.step("retains info on personal information page", async () => {
-// await expect(pageManager.personalPage.stepHeading).toBeVisible();
-// await expect(pageManager.personalPage.firstNameInput).toHaveValue(
-// TEST_PATRON.firstName
-// );
-// await expect(pageManager.personalPage.lastNameInput).toHaveValue(
-// TEST_PATRON.lastName
-// );
-// await expect(pageManager.personalPage.dateOfBirthInput).toHaveValue(
-// TEST_PATRON.dateOfBirth
-// );
-// await expect(pageManager.personalPage.emailInput).toHaveValue(
-// TEST_PATRON.email
-// );
-// await expect(
-// pageManager.personalPage.receiveInfoCheckbox
-// ).not.toBeChecked();
-// });
-// });
-// });
-// }
+import { test, expect } from "@playwright/test";
+import { PageManager } from "../../pageobjects/page-manager.page";
+import {
+ // fillAccountInfo,
+ // fillAddress,
+ fillPersonalInfo,
+} from "../../utils/form-helper";
+import {
+ PAGE_ROUTES,
+ // SPINNER_TIMEOUT,
+ SUPPORTED_LANGUAGES,
+ // TEST_ACCOUNT,
+ // TEST_NYC_ADDRESS,
+ // TEST_OOS_ADDRESS,
+ TEST_PATRON,
+} from "../../utils/constants";
+
+for (const { lang, name } of SUPPORTED_LANGUAGES) {
+ test.describe(`E2E: Navigate backward in application in ${name} (${lang})`, () => {
+ let pageManager: PageManager;
+ let appContent: any;
+
+ test.beforeEach(async ({ page }) => {
+ appContent = require(`../../../public/locales/${lang}/common.json`);
+ pageManager = new PageManager(page, appContent);
+ });
+
+ // test("navigates backward to landing without entering info", async ({
+ // page,
+ // }) => {
+ // await test.step("begins at account page", async () => {
+ // await page.goto(PAGE_ROUTES.ACCOUNT(lang));
+ // await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ // await expect(pageManager.accountPage.previousButton).toBeVisible();
+ // await pageManager.accountPage.previousButton.click();
+ // });
+
+ // await test.step("navigates back to address verification page", async () => {
+ // await expect(
+ // pageManager.addressVerificationPage.stepHeading
+ // ).toBeVisible();
+ // await expect(
+ // pageManager.addressVerificationPage.previousButton
+ // ).toBeVisible();
+ // await pageManager.addressVerificationPage.previousButton.click();
+ // });
+
+ // await test.step("navigates back to address page", async () => {
+ // await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ // await expect(pageManager.addressPage.previousButton).toBeVisible();
+ // await pageManager.addressPage.previousButton.click();
+ // });
+
+ // await test.step("navigates back to personal information page", async () => {
+ // await expect(pageManager.personalPage.stepHeading).toBeVisible();
+ // await expect(pageManager.personalPage.previousButton).toBeVisible();
+ // await pageManager.personalPage.previousButton.click();
+ // });
+
+ // await test.step("navigates back to landing page", async () => {
+ // await expect(pageManager.landingPage.applyHeading).toBeVisible();
+ // });
+ // });
+
+ test("retains user-entered info when navigating backward", async ({
+ page,
+ }) => {
+ await test.step("enters personal information", async () => {
+ await page.goto(PAGE_ROUTES.PERSONAL(lang));
+ await expect(pageManager.personalPage.stepHeading).toBeVisible();
+ await fillPersonalInfo(pageManager.personalPage, TEST_PATRON);
+ await pageManager.personalPage.receiveInfoCheckbox.click(); // unchecks
+ await pageManager.personalPage.nextButton.click();
+ });
+
+ // await test.step("enters home address", async () => {
+ // await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ // await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
+ // await pageManager.addressPage.nextButton.click();
+ // await expect(pageManager.addressPage.spinner).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
+
+ // await test.step("enters alternate address", async () => {
+ // await expect(
+ // pageManager.alternateAddressPage.stepHeading
+ // ).toBeVisible();
+ // await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
+ // await pageManager.alternateAddressPage.nextButton.click();
+ // await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
+
+ // await test.step("verifies home and alternate addresses", async () => {
+ // await expect(
+ // pageManager.addressVerificationPage.stepHeading
+ // ).toBeVisible();
+ // await pageManager.addressVerificationPage
+ // .getHomeAddressOption(TEST_OOS_ADDRESS.street)
+ // .check();
+ // await pageManager.addressVerificationPage
+ // .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
+ // .check();
+ // await pageManager.addressVerificationPage.nextButton.click();
+ // await expect(
+ // pageManager.addressVerificationPage.spinner
+ // ).not.toBeVisible({ timeout: SPINNER_TIMEOUT });
+ // });
+
+ // await test.step("enters account information", async () => {
+ // await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
+ // await pageManager.accountPage.nextButton.click();
+ // });
+
+ // await test.step("displays review page and navigates back to account page", async () => {
+ // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
+ // await page.goBack();
+ // });
+
+ // await test.step("retains info on account page", async () => {
+ // await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ // await expect(pageManager.accountPage.usernameInput).toHaveValue(
+ // TEST_ACCOUNT.username
+ // );
+ // await expect(pageManager.accountPage.passwordInput).toHaveValue(
+ // TEST_ACCOUNT.password
+ // );
+ // await expect(pageManager.accountPage.verifyPasswordInput).toHaveValue(
+ // TEST_ACCOUNT.password
+ // );
+ // await expect(pageManager.accountPage.selectHomeLibrary).toHaveValue(
+ // TEST_ACCOUNT.homeLibraryCode
+ // );
+ // await expect(pageManager.accountPage.acceptTermsCheckbox).toBeChecked();
+ // await pageManager.accountPage.previousButton.click();
+ // });
+
+ // await test.step("retains info on address verification page", async () => {
+ // await expect(
+ // pageManager.addressVerificationPage.stepHeading
+ // ).toBeVisible();
+ // await expect(
+ // pageManager.addressVerificationPage.getHomeAddressOption(
+ // TEST_OOS_ADDRESS.street
+ // )
+ // ).toBeChecked();
+ // await expect(
+ // pageManager.addressVerificationPage.getAlternateAddressOption(
+ // TEST_NYC_ADDRESS.street
+ // )
+ // ).toBeChecked();
+ // await pageManager.addressVerificationPage.previousButton.click();
+ // });
+
+ // await test.step("retains info on address page", async () => {
+ // await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ // await expect(pageManager.addressPage.streetAddressInput).toHaveValue(
+ // TEST_OOS_ADDRESS.street
+ // );
+ // await expect(pageManager.addressPage.apartmentSuiteInput).toHaveValue(
+ // TEST_OOS_ADDRESS.apartmentSuite
+ // );
+ // await expect(pageManager.addressPage.cityInput).toHaveValue(
+ // TEST_OOS_ADDRESS.city
+ // );
+ // await expect(pageManager.addressPage.stateInput).toHaveValue(
+ // TEST_OOS_ADDRESS.state
+ // );
+ // await expect(pageManager.addressPage.postalCodeInput).toHaveValue(
+ // TEST_OOS_ADDRESS.postalCode
+ // );
+ // await pageManager.addressPage.previousButton.click();
+ // });
+
+ // await test.step("retains info on personal information page", async () => {
+ // await expect(pageManager.personalPage.stepHeading).toBeVisible();
+ // await expect(pageManager.personalPage.firstNameInput).toHaveValue(
+ // TEST_PATRON.firstName
+ // );
+ // await expect(pageManager.personalPage.lastNameInput).toHaveValue(
+ // TEST_PATRON.lastName
+ // );
+ // await expect(pageManager.personalPage.dateOfBirthInput).toHaveValue(
+ // TEST_PATRON.dateOfBirth
+ // );
+ // await expect(pageManager.personalPage.emailInput).toHaveValue(
+ // TEST_PATRON.email
+ // );
+ // await expect(
+ // pageManager.personalPage.receiveInfoCheckbox
+ // ).not.toBeChecked();
+ // });
+ });
+ });
+}
diff --git a/playwright/tests/e2e/e2e-partial.spec.ts b/playwright/tests/e2e/e2e-partial.spec.ts
index 2bfaa09e..48f84dc6 100644
--- a/playwright/tests/e2e/e2e-partial.spec.ts
+++ b/playwright/tests/e2e/e2e-partial.spec.ts
@@ -1,330 +1,330 @@
-// import { test, expect } from "@playwright/test";
-// import { PageManager } from "../../pageobjects/page-manager.page";
-// import {
-// fillAccountInfo,
-// fillAddress,
-// fillPersonalInfo,
-// } from "../../utils/form-helper";
-// import {
-// PAGE_ROUTES,
-// SPINNER_TIMEOUT,
-// SUPPORTED_LANGUAGES,
-// TEST_ACCOUNT,
-// TEST_EDITED_ACCOUNT,
-// TEST_NYC_ADDRESS,
-// TEST_OOS_ADDRESS,
-// TEST_PATRON,
-// } from "../../utils/constants";
+import { test, expect } from "@playwright/test";
+import { PageManager } from "../../pageobjects/page-manager.page";
+import {
+ // fillAccountInfo,
+ // fillAddress,
+ fillPersonalInfo,
+} from "../../utils/form-helper";
+import {
+ PAGE_ROUTES,
+ // SPINNER_TIMEOUT,
+ SUPPORTED_LANGUAGES,
+ // TEST_ACCOUNT,
+ // TEST_EDITED_ACCOUNT,
+ // TEST_NYC_ADDRESS,
+ // TEST_OOS_ADDRESS,
+ TEST_PATRON,
+} from "../../utils/constants";
-// for (const { lang, name } of SUPPORTED_LANGUAGES) {
-// test.describe(`E2E: Edits patron information in ${name} (${lang})`, () => {
-// let pageManager: PageManager;
-// let appContent: any;
+for (const { lang, name } of SUPPORTED_LANGUAGES) {
+ test.describe(`E2E: Edits patron information in ${name} (${lang})`, () => {
+ let pageManager: PageManager;
+ let appContent: any;
-// test.beforeEach(async ({ page }) => {
-// appContent = require(`../../../public/locales/${lang}/common.json`);
-// pageManager = new PageManager(page, appContent);
-// });
+ test.beforeEach(async ({ page }) => {
+ appContent = require(`../../../public/locales/${lang}/common.json`);
+ pageManager = new PageManager(page, appContent);
+ });
-// test("displays error when address is too long", async ({ page }) => {
-// const invalidStreet = "A".repeat(100);
+ // test("displays error when address is too long", async ({ page }) => {
+ // const invalidStreet = "A".repeat(100);
-// await test.step("enters invalid home address", async () => {
-// await page.goto(PAGE_ROUTES.ADDRESS(lang));
-// await expect(pageManager.addressPage.stepHeading).toBeVisible();
-// await fillAddress(pageManager.addressPage, {
-// street: invalidStreet,
-// apartmentSuite: "1",
-// city: "City",
-// state: "NY",
-// postalCode: "12345",
-// });
-// await pageManager.addressPage.nextButton.click();
-// await expect(pageManager.addressPage.spinner).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
+ // await test.step("enters invalid home address", async () => {
+ // await page.goto(PAGE_ROUTES.ADDRESS(lang));
+ // await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ // await fillAddress(pageManager.addressPage, {
+ // street: invalidStreet,
+ // apartmentSuite: "1",
+ // city: "City",
+ // state: "NY",
+ // postalCode: "12345",
+ // });
+ // await pageManager.addressPage.nextButton.click();
+ // await expect(pageManager.addressPage.spinner).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
-// await test.step("skips alternate address", async () => {
-// await expect(
-// pageManager.alternateAddressPage.stepHeading
-// ).toBeVisible();
-// await pageManager.alternateAddressPage.nextButton.click();
-// await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
+ // await test.step("skips alternate address", async () => {
+ // await expect(
+ // pageManager.alternateAddressPage.stepHeading
+ // ).toBeVisible();
+ // await pageManager.alternateAddressPage.nextButton.click();
+ // await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
-// await test.step("verifies home address", async () => {
-// await expect(
-// pageManager.addressVerificationPage.stepHeading
-// ).toBeVisible();
-// await pageManager.addressVerificationPage
-// .getHomeAddressOption(invalidStreet)
-// .check();
-// await pageManager.addressVerificationPage.nextButton.click();
-// await expect(
-// pageManager.addressVerificationPage.spinner
-// ).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
+ // await test.step("verifies home address", async () => {
+ // await expect(
+ // pageManager.addressVerificationPage.stepHeading
+ // ).toBeVisible();
+ // await pageManager.addressVerificationPage
+ // .getHomeAddressOption(invalidStreet)
+ // .check();
+ // await pageManager.addressVerificationPage.nextButton.click();
+ // await expect(
+ // pageManager.addressVerificationPage.spinner
+ // ).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
-// await test.step("enters account information", async () => {
-// await expect(pageManager.accountPage.stepHeading).toBeVisible();
-// await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
-// await pageManager.accountPage.nextButton.click();
-// });
+ // await test.step("enters account information", async () => {
+ // await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
+ // await pageManager.accountPage.nextButton.click();
+ // });
-// await test.step("displays error on review page", async () => {
-// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
-// await pageManager.reviewPage.submitButton.click();
-// await expect(pageManager.reviewPage.streetAddressError).toBeVisible();
-// });
-// });
+ // await test.step("displays error on review page", async () => {
+ // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
+ // await pageManager.reviewPage.submitButton.click();
+ // await expect(pageManager.reviewPage.streetAddressError).toBeVisible();
+ // });
+ // });
-// test("displays updated account info after editing addresses", async ({
-// page,
-// }) => {
-// await test.step("enters account information", async () => {
-// await page.goto(PAGE_ROUTES.ACCOUNT(lang));
-// await expect(pageManager.accountPage.stepHeading).toBeVisible();
-// await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
-// await pageManager.accountPage.nextButton.click();
-// });
+ // test("displays updated account info after editing addresses", async ({
+ // page,
+ // }) => {
+ // await test.step("enters account information", async () => {
+ // await page.goto(PAGE_ROUTES.ACCOUNT(lang));
+ // await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
+ // await pageManager.accountPage.nextButton.click();
+ // });
-// await test.step("edits address from review page", async () => {
-// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
-// await pageManager.reviewPage.editAddressButton.click();
-// });
+ // await test.step("edits address from review page", async () => {
+ // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
+ // await pageManager.reviewPage.editAddressButton.click();
+ // });
-// await test.step("enters home address", async () => {
-// await expect(pageManager.addressPage.stepHeading).toBeVisible();
-// await fillAddress(pageManager.addressPage, TEST_NYC_ADDRESS);
-// await pageManager.addressPage.nextButton.click();
-// await expect(pageManager.addressPage.spinner).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
+ // await test.step("enters home address", async () => {
+ // await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ // await fillAddress(pageManager.addressPage, TEST_NYC_ADDRESS);
+ // await pageManager.addressPage.nextButton.click();
+ // await expect(pageManager.addressPage.spinner).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
-// await test.step("skips alternate address", async () => {
-// await expect(
-// pageManager.alternateAddressPage.stepHeading
-// ).toBeVisible();
-// await pageManager.alternateAddressPage.nextButton.click();
-// await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
+ // await test.step("skips alternate address", async () => {
+ // await expect(
+ // pageManager.alternateAddressPage.stepHeading
+ // ).toBeVisible();
+ // await pageManager.alternateAddressPage.nextButton.click();
+ // await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
-// await test.step("verifies home address", async () => {
-// await expect(
-// pageManager.addressVerificationPage.stepHeading
-// ).toBeVisible();
-// await pageManager.addressVerificationPage
-// .getHomeAddressOption(TEST_NYC_ADDRESS.street)
-// .check();
-// await pageManager.addressVerificationPage.nextButton.click();
-// await expect(
-// pageManager.addressVerificationPage.spinner
-// ).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
+ // await test.step("verifies home address", async () => {
+ // await expect(
+ // pageManager.addressVerificationPage.stepHeading
+ // ).toBeVisible();
+ // await pageManager.addressVerificationPage
+ // .getHomeAddressOption(TEST_NYC_ADDRESS.street)
+ // .check();
+ // await pageManager.addressVerificationPage.nextButton.click();
+ // await expect(
+ // pageManager.addressVerificationPage.spinner
+ // ).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
-// await test.step("edits account information", async () => {
-// await expect(pageManager.accountPage.stepHeading).toBeVisible();
-// await fillAccountInfo(pageManager.accountPage, TEST_EDITED_ACCOUNT);
-// await pageManager.accountPage.nextButton.click();
-// });
+ // await test.step("edits account information", async () => {
+ // await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ // await fillAccountInfo(pageManager.accountPage, TEST_EDITED_ACCOUNT);
+ // await pageManager.accountPage.nextButton.click();
+ // });
-// await test.step("displays updated account info on review page", async () => {
-// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
-// await expect(
-// pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.username)
-// ).toBeVisible();
-// await pageManager.reviewPage.showPasswordLabel.check();
-// await expect(
-// pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.password)
-// ).toBeVisible();
-// await expect(
-// pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.homeLibrary)
-// ).toBeVisible();
-// });
-// });
+ // await test.step("displays updated account info on review page", async () => {
+ // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
+ // await expect(
+ // pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.username)
+ // ).toBeVisible();
+ // await pageManager.reviewPage.showPasswordLabel.check();
+ // await expect(
+ // pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.password)
+ // ).toBeVisible();
+ // await expect(
+ // pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.homeLibrary)
+ // ).toBeVisible();
+ // });
+ // });
-// test("retains user-entered info after clicking breadcrumb", async ({
-// page,
-// }) => {
-// await test.step("enters personal information", async () => {
-// await page.goto(PAGE_ROUTES.PERSONAL(lang));
-// await expect(pageManager.personalPage.stepHeading).toBeVisible();
-// await fillPersonalInfo(pageManager.personalPage, TEST_PATRON);
-// await pageManager.personalPage.receiveInfoCheckbox.click(); // unchecks
-// await pageManager.personalPage.nextButton.click();
-// });
+ test("retains user-entered info after clicking breadcrumb", async ({
+ page,
+ }) => {
+ await test.step("enters personal information", async () => {
+ await page.goto(PAGE_ROUTES.PERSONAL(lang));
+ await expect(pageManager.personalPage.stepHeading).toBeVisible();
+ await fillPersonalInfo(pageManager.personalPage, TEST_PATRON);
+ await pageManager.personalPage.receiveInfoCheckbox.click(); // unchecks
+ await pageManager.personalPage.nextButton.click();
+ });
-// await test.step("enters home address", async () => {
-// await expect(pageManager.addressPage.stepHeading).toBeVisible();
-// await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
-// await pageManager.addressPage.nextButton.click();
-// });
+ // await test.step("enters home address", async () => {
+ // await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ // await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
+ // await pageManager.addressPage.nextButton.click();
+ // });
-// await test.step("enters alternate address", async () => {
-// await expect(
-// pageManager.alternateAddressPage.stepHeading
-// ).toBeVisible();
-// await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
-// await pageManager.alternateAddressPage.nextButton.click();
-// await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
+ // await test.step("enters alternate address", async () => {
+ // await expect(
+ // pageManager.alternateAddressPage.stepHeading
+ // ).toBeVisible();
+ // await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
+ // await pageManager.alternateAddressPage.nextButton.click();
+ // await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
-// await test.step("verifies home and alternate addresses", async () => {
-// await expect(
-// pageManager.addressVerificationPage.stepHeading
-// ).toBeVisible();
-// await pageManager.addressVerificationPage
-// .getHomeAddressOption(TEST_OOS_ADDRESS.street)
-// .check();
-// await pageManager.addressVerificationPage
-// .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
-// .check();
-// await pageManager.addressVerificationPage.nextButton.click();
-// await expect(
-// pageManager.addressVerificationPage.spinner
-// ).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
+ // await test.step("verifies home and alternate addresses", async () => {
+ // await expect(
+ // pageManager.addressVerificationPage.stepHeading
+ // ).toBeVisible();
+ // await pageManager.addressVerificationPage
+ // .getHomeAddressOption(TEST_OOS_ADDRESS.street)
+ // .check();
+ // await pageManager.addressVerificationPage
+ // .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
+ // .check();
+ // await pageManager.addressVerificationPage.nextButton.click();
+ // await expect(
+ // pageManager.addressVerificationPage.spinner
+ // ).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
-// await test.step("enters account information", async () => {
-// await expect(pageManager.accountPage.stepHeading).toBeVisible();
-// await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
-// await pageManager.accountPage.nextButton.click();
-// });
+ // await test.step("enters account information", async () => {
+ // await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
+ // await pageManager.accountPage.nextButton.click();
+ // });
-// await test.step("displays review page and verifies receive info checkbox is unchecked", async () => {
-// await expect(pageManager.reviewPage.stepHeading).toBeVisible();
-// await pageManager.reviewPage.editPersonalInfoButton.click();
-// await expect(
-// pageManager.reviewPage.receiveInfoCheckbox
-// ).not.toBeChecked();
-// });
+ // await test.step("displays review page and verifies receive info checkbox is unchecked", async () => {
+ // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
+ // await pageManager.reviewPage.editPersonalInfoButton.click();
+ // await expect(
+ // pageManager.reviewPage.receiveInfoCheckbox
+ // ).not.toBeChecked();
+ // });
-// await test.step("clicks breadcrumb and displays landing page", async () => {
-// await pageManager.globalComponents.getLibraryCardBreadcrumb.click();
-// await expect(pageManager.landingPage.applyHeading).toBeVisible();
-// await pageManager.landingPage.getStartedButton.click();
-// });
+ // await test.step("clicks breadcrumb and displays landing page", async () => {
+ // await pageManager.globalComponents.getLibraryCardBreadcrumb.click();
+ // await expect(pageManager.landingPage.applyHeading).toBeVisible();
+ // await pageManager.landingPage.getStartedButton.click();
+ // });
-// await test.step("retains info on personal information page", async () => {
-// await expect(pageManager.personalPage.stepHeading).toBeVisible();
-// await expect(pageManager.personalPage.firstNameInput).toHaveValue(
-// TEST_PATRON.firstName
-// );
-// await expect(pageManager.personalPage.lastNameInput).toHaveValue(
-// TEST_PATRON.lastName
-// );
-// await expect(pageManager.personalPage.dateOfBirthInput).toHaveValue(
-// TEST_PATRON.dateOfBirth
-// );
-// await expect(pageManager.personalPage.emailInput).toHaveValue(
-// TEST_PATRON.email
-// );
-// await expect(
-// pageManager.personalPage.receiveInfoCheckbox
-// ).not.toBeChecked();
-// await pageManager.personalPage.nextButton.click();
-// });
+ // await test.step("retains info on personal information page", async () => {
+ // await expect(pageManager.personalPage.stepHeading).toBeVisible();
+ // await expect(pageManager.personalPage.firstNameInput).toHaveValue(
+ // TEST_PATRON.firstName
+ // );
+ // await expect(pageManager.personalPage.lastNameInput).toHaveValue(
+ // TEST_PATRON.lastName
+ // );
+ // await expect(pageManager.personalPage.dateOfBirthInput).toHaveValue(
+ // TEST_PATRON.dateOfBirth
+ // );
+ // await expect(pageManager.personalPage.emailInput).toHaveValue(
+ // TEST_PATRON.email
+ // );
+ // await expect(
+ // pageManager.personalPage.receiveInfoCheckbox
+ // ).not.toBeChecked();
+ // await pageManager.personalPage.nextButton.click();
+ // });
-// await test.step("retains info on address page", async () => {
-// await expect(pageManager.addressPage.stepHeading).toBeVisible();
-// await expect(pageManager.addressPage.streetAddressInput).toHaveValue(
-// TEST_OOS_ADDRESS.street
-// );
-// await expect(pageManager.addressPage.apartmentSuiteInput).toHaveValue(
-// TEST_OOS_ADDRESS.apartmentSuite
-// );
-// await expect(pageManager.addressPage.cityInput).toHaveValue(
-// TEST_OOS_ADDRESS.city
-// );
-// await expect(pageManager.addressPage.stateInput).toHaveValue(
-// TEST_OOS_ADDRESS.state
-// );
-// await expect(pageManager.addressPage.postalCodeInput).toHaveValue(
-// TEST_OOS_ADDRESS.postalCode
-// );
-// await pageManager.addressPage.nextButton.click();
-// await expect(pageManager.addressPage.spinner).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
+ // await test.step("retains info on address page", async () => {
+ // await expect(pageManager.addressPage.stepHeading).toBeVisible();
+ // await expect(pageManager.addressPage.streetAddressInput).toHaveValue(
+ // TEST_OOS_ADDRESS.street
+ // );
+ // await expect(pageManager.addressPage.apartmentSuiteInput).toHaveValue(
+ // TEST_OOS_ADDRESS.apartmentSuite
+ // );
+ // await expect(pageManager.addressPage.cityInput).toHaveValue(
+ // TEST_OOS_ADDRESS.city
+ // );
+ // await expect(pageManager.addressPage.stateInput).toHaveValue(
+ // TEST_OOS_ADDRESS.state
+ // );
+ // await expect(pageManager.addressPage.postalCodeInput).toHaveValue(
+ // TEST_OOS_ADDRESS.postalCode
+ // );
+ // await pageManager.addressPage.nextButton.click();
+ // await expect(pageManager.addressPage.spinner).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
-// await test.step("retains info on alternate address page", async () => {
-// await expect(
-// pageManager.alternateAddressPage.stepHeading
-// ).toBeVisible();
-// await expect(
-// pageManager.alternateAddressPage.streetAddressInput
-// ).toHaveValue(TEST_NYC_ADDRESS.street);
-// await expect(
-// pageManager.alternateAddressPage.apartmentSuiteInput
-// ).toHaveValue(TEST_NYC_ADDRESS.apartmentSuite);
-// await expect(pageManager.alternateAddressPage.cityInput).toHaveValue(
-// TEST_NYC_ADDRESS.city
-// );
-// await expect(pageManager.alternateAddressPage.stateInput).toHaveValue(
-// TEST_NYC_ADDRESS.state
-// );
-// await expect(
-// pageManager.alternateAddressPage.postalCodeInput
-// ).toHaveValue(TEST_NYC_ADDRESS.postalCode);
-// await pageManager.alternateAddressPage.nextButton.click();
-// await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
+ // await test.step("retains info on alternate address page", async () => {
+ // await expect(
+ // pageManager.alternateAddressPage.stepHeading
+ // ).toBeVisible();
+ // await expect(
+ // pageManager.alternateAddressPage.streetAddressInput
+ // ).toHaveValue(TEST_NYC_ADDRESS.street);
+ // await expect(
+ // pageManager.alternateAddressPage.apartmentSuiteInput
+ // ).toHaveValue(TEST_NYC_ADDRESS.apartmentSuite);
+ // await expect(pageManager.alternateAddressPage.cityInput).toHaveValue(
+ // TEST_NYC_ADDRESS.city
+ // );
+ // await expect(pageManager.alternateAddressPage.stateInput).toHaveValue(
+ // TEST_NYC_ADDRESS.state
+ // );
+ // await expect(
+ // pageManager.alternateAddressPage.postalCodeInput
+ // ).toHaveValue(TEST_NYC_ADDRESS.postalCode);
+ // await pageManager.alternateAddressPage.nextButton.click();
+ // await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
-// await test.step("retains info on address verification page", async () => {
-// await expect(
-// pageManager.addressVerificationPage.stepHeading
-// ).toBeVisible();
-// await expect(
-// pageManager.addressVerificationPage.getHomeAddressOption(
-// TEST_OOS_ADDRESS.street
-// )
-// ).toBeChecked();
-// await expect(
-// pageManager.addressVerificationPage.getAlternateAddressOption(
-// TEST_NYC_ADDRESS.street
-// )
-// ).toBeChecked();
-// await pageManager.addressVerificationPage.nextButton.click();
-// await expect(
-// pageManager.addressVerificationPage.spinner
-// ).not.toBeVisible({
-// timeout: SPINNER_TIMEOUT,
-// });
-// });
+ // await test.step("retains info on address verification page", async () => {
+ // await expect(
+ // pageManager.addressVerificationPage.stepHeading
+ // ).toBeVisible();
+ // await expect(
+ // pageManager.addressVerificationPage.getHomeAddressOption(
+ // TEST_OOS_ADDRESS.street
+ // )
+ // ).toBeChecked();
+ // await expect(
+ // pageManager.addressVerificationPage.getAlternateAddressOption(
+ // TEST_NYC_ADDRESS.street
+ // )
+ // ).toBeChecked();
+ // await pageManager.addressVerificationPage.nextButton.click();
+ // await expect(
+ // pageManager.addressVerificationPage.spinner
+ // ).not.toBeVisible({
+ // timeout: SPINNER_TIMEOUT,
+ // });
+ // });
-// await test.step("retains info on account page", async () => {
-// await expect(pageManager.accountPage.stepHeading).toBeVisible();
-// await expect(pageManager.accountPage.usernameInput).toHaveValue(
-// TEST_ACCOUNT.username
-// );
-// await expect(pageManager.accountPage.passwordInput).toHaveValue(
-// TEST_ACCOUNT.password
-// );
-// await expect(pageManager.accountPage.verifyPasswordInput).toHaveValue(
-// TEST_ACCOUNT.password
-// );
-// await expect(pageManager.accountPage.selectHomeLibrary).toHaveValue(
-// TEST_ACCOUNT.homeLibraryCode
-// );
-// await expect(pageManager.accountPage.acceptTermsCheckbox).toBeChecked();
-// });
-// });
-// });
-// }
+ // await test.step("retains info on account page", async () => {
+ // await expect(pageManager.accountPage.stepHeading).toBeVisible();
+ // await expect(pageManager.accountPage.usernameInput).toHaveValue(
+ // TEST_ACCOUNT.username
+ // );
+ // await expect(pageManager.accountPage.passwordInput).toHaveValue(
+ // TEST_ACCOUNT.password
+ // );
+ // await expect(pageManager.accountPage.verifyPasswordInput).toHaveValue(
+ // TEST_ACCOUNT.password
+ // );
+ // await expect(pageManager.accountPage.selectHomeLibrary).toHaveValue(
+ // TEST_ACCOUNT.homeLibraryCode
+ // );
+ // await expect(pageManager.accountPage.acceptTermsCheckbox).toBeChecked();
+ // });
+ });
+ });
+}
From 6155447e99fc9b6c67adf420b55bd8feaf13aa12 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Thu, 5 Mar 2026 10:10:52 -0700
Subject: [PATCH 29/36] Add status to mock username API and refactor
---
playwright/tests/account.spec.ts | 5 ++---
playwright/tests/review.spec.ts | 5 ++---
playwright/utils/mock-api.ts | 19 +++++++++++++++++--
3 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/playwright/tests/account.spec.ts b/playwright/tests/account.spec.ts
index 70bc6936..56a1f2a1 100644
--- a/playwright/tests/account.spec.ts
+++ b/playwright/tests/account.spec.ts
@@ -2,7 +2,6 @@ import { test, expect } from "@playwright/test";
import { AccountPage } from "../pageobjects/account.page";
import { fillAccountInfo } from "../utils/form-helper";
import {
- ERROR_MESSAGES,
PAGE_ROUTES,
SUPPORTED_LANGUAGES,
TEST_ACCOUNT,
@@ -84,7 +83,7 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
test.describe("mocks API responses on account page", () => {
test("displays username available message", async ({ page }) => {
// mock the API call for username availability
- await mockUsernameApi(page, ERROR_MESSAGES.USERNAME_AVAILABLE);
+ await mockUsernameApi(page, "available");
await accountPage.usernameInput.fill("AvailableUsername");
await accountPage.availableUsernameButton.click();
await expect(accountPage.availableUsernameMessage).toBeVisible();
@@ -92,7 +91,7 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
test("displays username unavailable error message", async ({ page }) => {
// mock the API call for username unavailability
- await mockUsernameApi(page, ERROR_MESSAGES.USERNAME_UNAVAILABLE);
+ await mockUsernameApi(page, "unavailable");
await accountPage.usernameInput.fill("UnavailableUsername");
await accountPage.availableUsernameButton.click();
await expect(accountPage.unavailableUsernameMessage).toBeVisible();
diff --git a/playwright/tests/review.spec.ts b/playwright/tests/review.spec.ts
index a15461c5..48411c80 100644
--- a/playwright/tests/review.spec.ts
+++ b/playwright/tests/review.spec.ts
@@ -7,7 +7,6 @@ import {
fillPersonalInfo,
} from "../utils/form-helper";
import {
- ERROR_MESSAGES,
PAGE_ROUTES,
SPINNER_TIMEOUT,
TEST_ACCOUNT,
@@ -243,7 +242,7 @@ test.describe("edits patron information on review page", () => {
test.describe("mocks API responses on review page", () => {
test("displays username available message", async ({ page }) => {
// mock the API call for username availability
- await mockUsernameApi(page, ERROR_MESSAGES.USERNAME_AVAILABLE);
+ await mockUsernameApi(page, "available");
const reviewPage = new ReviewPage(page);
await reviewPage.editAccountButton.click();
@@ -254,7 +253,7 @@ test.describe("mocks API responses on review page", () => {
test("displays username unavailable error message", async ({ page }) => {
// mock the API call for username unavailability
- await mockUsernameApi(page, ERROR_MESSAGES.USERNAME_UNAVAILABLE);
+ await mockUsernameApi(page, "unavailable");
const reviewPage = new ReviewPage(page);
await reviewPage.editAccountButton.click();
diff --git a/playwright/utils/mock-api.ts b/playwright/utils/mock-api.ts
index 6bfe7eef..1720f997 100644
--- a/playwright/utils/mock-api.ts
+++ b/playwright/utils/mock-api.ts
@@ -1,9 +1,24 @@
import { Page } from "@playwright/test";
-export async function mockUsernameApi(page: Page, message: string) {
+export async function mockUsernameApi(
+ page: Page,
+ availability: "available" | "unavailable"
+) {
+ const usernameResponse = {
+ available: {
+ status: 200,
+ message: "This username is available.",
+ },
+ unavailable: {
+ status: 409,
+ message: "This username is unavailable. Please try another.",
+ },
+ };
+
await page.route("**/library-card/api/username", async (route) => {
+ const { status, message } = usernameResponse[availability];
await route.fulfill({
- status: 200,
+ status,
contentType: "application/json",
body: JSON.stringify({ message }),
});
From 0a19b9b7acb5c77023901c0ff49acb5c1e1b69fc Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Mon, 16 Mar 2026 15:18:31 -0600
Subject: [PATCH 30/36] Resolve remaining conflicts
---
.../pageobjects/alternate-address.page.ts | 3 +-
playwright/tests/address.spec.ts | 102 ------
playwright/tests/backward-navigation.spec.ts | 169 ---------
.../tests/e2e/backward-navigation.spec.ts | 198 -----------
playwright/tests/e2e/e2e-partial.spec.ts | 330 ------------------
.../page-tests/alternate-address.spec.ts | 2 +-
playwright/tests/personal.spec.ts | 167 ---------
7 files changed, 3 insertions(+), 968 deletions(-)
delete mode 100644 playwright/tests/address.spec.ts
delete mode 100644 playwright/tests/backward-navigation.spec.ts
delete mode 100644 playwright/tests/e2e/backward-navigation.spec.ts
delete mode 100644 playwright/tests/e2e/e2e-partial.spec.ts
delete mode 100644 playwright/tests/personal.spec.ts
diff --git a/playwright/pageobjects/alternate-address.page.ts b/playwright/pageobjects/alternate-address.page.ts
index 9044e916..bff8d548 100644
--- a/playwright/pageobjects/alternate-address.page.ts
+++ b/playwright/pageobjects/alternate-address.page.ts
@@ -33,7 +33,8 @@ export class AlternateAddressPage {
});
this.informationalBanner = page.locator("aside", {
hasText:
- "Please provide the address of where you work, attend school, or pay property taxes in New York State.",
+ appContent?.location?.workAddress?.description?.part3 ||
+ "Please provide the address of where you work, attend school, or pay property taxes in New York State. If none of these apply to you, click next.",
});
this.addressHeading = page.getByRole("heading", {
name:
diff --git a/playwright/tests/address.spec.ts b/playwright/tests/address.spec.ts
deleted file mode 100644
index fbc1d2db..00000000
--- a/playwright/tests/address.spec.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-import { test, expect } from "@playwright/test";
-import { AddressPage } from "../pageobjects/address.page";
-import { fillAddress } from "../utils/form-helper";
-import {
- PAGE_ROUTES,
- SUPPORTED_LANGUAGES,
- TEST_OOS_ADDRESS,
-} from "../utils/constants";
-
-for (const { lang, name } of SUPPORTED_LANGUAGES) {
- test.describe(`home address page in ${name} (${lang})`, () => {
- let addressPage: AddressPage;
- let appContent: any;
-
- test.beforeEach(async ({ page }) => {
- appContent = require(`../../public/locales/${lang}/common.json`);
- addressPage = new AddressPage(page, appContent);
- await page.goto(PAGE_ROUTES.ADDRESS(lang));
- });
-
- test.describe("displays elements", () => {
- test("displays headings, link, and buttons", async () => {
- await expect(addressPage.mainHeading).toBeVisible();
- await expect(addressPage.stepHeading).toBeVisible();
- await expect(addressPage.addressHeading).toBeVisible();
- await expect(addressPage.alternateForm).toBeVisible();
- await expect(addressPage.nextButton).toBeVisible();
- await expect(addressPage.previousButton).toBeVisible();
- });
-
- test("displays home address form", async () => {
- await expect(addressPage.streetAddressInput).toBeVisible();
- await expect(addressPage.apartmentSuiteInput).toBeVisible();
- await expect(addressPage.cityInput).toBeVisible();
- await expect(addressPage.stateInput).toBeVisible();
- await expect(addressPage.postalCodeInput).toBeVisible();
- });
-
- test("confirms link opens in new tab", async () => {
- await expect(addressPage.alternateForm).toHaveAttribute(
- "target",
- "_blank"
- );
- await expect(addressPage.alternateForm).toHaveAttribute(
- "rel",
- "nofollow noopener noreferrer"
- );
- });
- });
-
- test.describe("enters home address", () => {
- test("enters valid home address", async () => {
- await fillAddress(addressPage, TEST_OOS_ADDRESS);
- await expect(addressPage.streetAddressInput).toHaveValue(
- TEST_OOS_ADDRESS.street
- );
- await expect(addressPage.apartmentSuiteInput).toHaveValue(
- TEST_OOS_ADDRESS.apartmentSuite
- );
- await expect(addressPage.cityInput).toHaveValue(TEST_OOS_ADDRESS.city);
- await expect(addressPage.stateInput).toHaveValue(
- TEST_OOS_ADDRESS.state
- );
- await expect(addressPage.postalCodeInput).toHaveValue(
- TEST_OOS_ADDRESS.postalCode
- );
- });
- });
-
- test.describe("displays error messages", () => {
- test("displays errors for required fields", async () => {
- await addressPage.streetAddressInput.fill("");
- await addressPage.cityInput.fill("");
- await addressPage.stateInput.click();
- await addressPage.postalCodeInput.fill("");
- await addressPage.nextButton.click();
- await expect(addressPage.streetAddressError).toBeVisible();
- await expect(addressPage.cityError).toBeVisible();
- await expect(addressPage.stateError).toBeVisible();
- await expect(addressPage.postalCodeError).toBeVisible();
- });
-
- test("enter too many characters", async () => {
- await addressPage.postalCodeInput.fill("123456");
- await addressPage.nextButton.click();
- await expect(addressPage.postalCodeError).toBeVisible();
- });
-
- test("enter too few characters", async () => {
- await addressPage.postalCodeInput.fill("1234");
- await addressPage.nextButton.click();
- await expect(addressPage.postalCodeError).toBeVisible();
- });
-
- test("enter postal code with dash", async () => {
- await addressPage.postalCodeInput.fill("12345-6789");
- await addressPage.nextButton.click();
- await expect(addressPage.postalCodeError).toBeVisible();
- });
- });
- });
-}
diff --git a/playwright/tests/backward-navigation.spec.ts b/playwright/tests/backward-navigation.spec.ts
deleted file mode 100644
index caf35e6d..00000000
--- a/playwright/tests/backward-navigation.spec.ts
+++ /dev/null
@@ -1,169 +0,0 @@
-import { test, expect } from "@playwright/test";
-import { PageManager } from "../pageobjects/page-manager.page";
-import { fillAddress, fillPersonalInfo } from "../utils/form-helper";
-import {
- PAGE_ROUTES,
- SPINNER_TIMEOUT,
- SUPPORTED_LANGUAGES,
- TEST_NYC_ADDRESS,
- TEST_OOS_ADDRESS,
- TEST_PATRON,
-} from "../utils/constants";
-
-for (const { lang, name } of SUPPORTED_LANGUAGES) {
- test.describe(`E2E: Navigate backward in application in ${name} (${lang})`, () => {
- let pageManager: PageManager;
- let appContent: any;
-
- test.beforeEach(async ({ page }) => {
- appContent = require(`../../public/locales/${lang}/common.json`);
- pageManager = new PageManager(page, appContent);
- });
-
- // test("navigates backward to landing without entering info", async ({
- // page,
- // }) => {
- // await test.step("begins at account page", async () => {
- // await page.goto(PAGE_ROUTES.ACCOUNT(lang));
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await expect(pageManager.accountPage.previousButton).toBeVisible();
- // await pageManager.accountPage.previousButton.click();
- // });
-
- // await test.step("displays address verification page", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await expect(
- // pageManager.addressVerificationPage.previousButton
- // ).toBeVisible();
- // await pageManager.addressVerificationPage.previousButton.click();
- // });
-
- // await test.step("displays address page", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await expect(pageManager.addressPage.previousButton).toBeVisible();
- // await pageManager.addressPage.previousButton.click();
- // });
-
- // await test.step("displays personal information page", async () => {
- // await expect(pageManager.personalPage.stepHeading).toBeVisible();
- // await expect(pageManager.personalPage.previousButton).toBeVisible();
- // await pageManager.personalPage.previousButton.click();
- // });
-
- // await test.step("displays landing page", async () => {
- // await expect(pageManager.landingPage.applyHeading).toBeVisible();
- // });
- // });
-
- test("retains user-entered info when navigating backward", async ({
- page,
- }) => {
- await test.step("enters personal information", async () => {
- await page.goto(PAGE_ROUTES.PERSONAL(lang));
- await expect(pageManager.personalPage.stepHeading).toBeVisible();
- await fillPersonalInfo(pageManager.personalPage, TEST_PATRON);
- await pageManager.personalPage.receiveInfoCheckbox.click(); // unchecks
- await pageManager.personalPage.nextButton.click();
- });
-
- await test.step("enters home address", async () => {
- await expect(pageManager.addressPage.stepHeading).toBeVisible();
- await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
- await pageManager.addressPage.nextButton.click();
- await expect(pageManager.addressPage.spinner).not.toBeVisible({
- timeout: SPINNER_TIMEOUT,
- });
- });
-
- await test.step("enters alternate address", async () => {
- await expect(
- pageManager.alternateAddressPage.stepHeading
- ).toBeVisible();
- await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
- await pageManager.alternateAddressPage.nextButton.click();
- await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
- timeout: SPINNER_TIMEOUT,
- });
- });
-
- // await test.step("confirms address verification", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await pageManager.addressVerificationPage
- // .getHomeAddressOption(TEST_OOS_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage
- // .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage.nextButton.click();
- // await expect(
- // pageManager.addressVerificationPage.spinner
- // ).not.toBeVisible({ timeout: SPINNER_TIMEOUT });
- // });
-
- // await test.step("displays account page", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await pageManager.accountPage.previousButton.click();
- // });
-
- // await test.step("displays user-entered info on address verification page", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await expect(
- // pageManager.addressVerificationPage.getHomeAddressOption(
- // TEST_OOS_ADDRESS.street
- // )
- // ).toBeChecked();
- // await expect(
- // pageManager.addressVerificationPage.getAlternateAddressOption(
- // TEST_NYC_ADDRESS.street
- // )
- // ).toBeChecked();
- // await pageManager.addressVerificationPage.previousButton.click();
- // });
-
- // await test.step("displays user-entered info on address page", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await expect(pageManager.addressPage.streetAddressInput).toHaveValue(
- // TEST_OOS_ADDRESS.street
- // );
- // await expect(pageManager.addressPage.apartmentSuiteInput).toHaveValue(
- // TEST_OOS_ADDRESS.apartmentSuite
- // );
- // await expect(pageManager.addressPage.cityInput).toHaveValue(
- // TEST_OOS_ADDRESS.city
- // );
- // await expect(pageManager.addressPage.stateInput).toHaveValue(
- // TEST_OOS_ADDRESS.state
- // );
- // await expect(pageManager.addressPage.postalCodeInput).toHaveValue(
- // TEST_OOS_ADDRESS.postalCode
- // );
- // await pageManager.addressPage.previousButton.click();
- // });
-
- // await test.step("displays user-entered info on personal information page", async () => {
- // await expect(pageManager.personalPage.stepHeading).toBeVisible();
- // await expect(pageManager.personalPage.firstNameInput).toHaveValue(
- // TEST_PATRON.firstName
- // );
- // await expect(pageManager.personalPage.lastNameInput).toHaveValue(
- // TEST_PATRON.lastName
- // );
- // await expect(pageManager.personalPage.dateOfBirthInput).toHaveValue(
- // TEST_PATRON.dateOfBirth
- // );
- // await expect(pageManager.personalPage.emailInput).toHaveValue(
- // TEST_PATRON.email
- // );
- // await expect(
- // pageManager.personalPage.receiveInfoCheckbox
- // ).not.toBeChecked();
- // });
- });
- });
-}
diff --git a/playwright/tests/e2e/backward-navigation.spec.ts b/playwright/tests/e2e/backward-navigation.spec.ts
deleted file mode 100644
index aa8c0fe2..00000000
--- a/playwright/tests/e2e/backward-navigation.spec.ts
+++ /dev/null
@@ -1,198 +0,0 @@
-import { test, expect } from "@playwright/test";
-import { PageManager } from "../../pageobjects/page-manager.page";
-import {
- // fillAccountInfo,
- fillAddress,
- fillPersonalInfo,
-} from "../../utils/form-helper";
-import {
- PAGE_ROUTES,
- SPINNER_TIMEOUT,
- SUPPORTED_LANGUAGES,
- // TEST_ACCOUNT,
- TEST_NYC_ADDRESS,
- TEST_OOS_ADDRESS,
- TEST_PATRON,
-} from "../../utils/constants";
-
-for (const { lang, name } of SUPPORTED_LANGUAGES) {
- test.describe(`E2E: Navigate backward in application in ${name} (${lang})`, () => {
- let pageManager: PageManager;
- let appContent: any;
-
- test.beforeEach(async ({ page }) => {
- appContent = require(`../../../public/locales/${lang}/common.json`);
- pageManager = new PageManager(page, appContent);
- });
-
- // test("navigates backward to landing without entering info", async ({
- // page,
- // }) => {
- // await test.step("begins at account page", async () => {
- // await page.goto(PAGE_ROUTES.ACCOUNT(lang));
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await expect(pageManager.accountPage.previousButton).toBeVisible();
- // await pageManager.accountPage.previousButton.click();
- // });
-
- // await test.step("navigates back to address verification page", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await expect(
- // pageManager.addressVerificationPage.previousButton
- // ).toBeVisible();
- // await pageManager.addressVerificationPage.previousButton.click();
- // });
-
- // await test.step("navigates back to address page", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await expect(pageManager.addressPage.previousButton).toBeVisible();
- // await pageManager.addressPage.previousButton.click();
- // });
-
- // await test.step("navigates back to personal information page", async () => {
- // await expect(pageManager.personalPage.stepHeading).toBeVisible();
- // await expect(pageManager.personalPage.previousButton).toBeVisible();
- // await pageManager.personalPage.previousButton.click();
- // });
-
- // await test.step("navigates back to landing page", async () => {
- // await expect(pageManager.landingPage.applyHeading).toBeVisible();
- // });
- // });
-
- test("retains user-entered info when navigating backward", async ({
- page,
- }) => {
- await test.step("enters personal information", async () => {
- await page.goto(PAGE_ROUTES.PERSONAL(lang));
- await expect(pageManager.personalPage.stepHeading).toBeVisible();
- await fillPersonalInfo(pageManager.personalPage, TEST_PATRON);
- await pageManager.personalPage.receiveInfoCheckbox.click(); // unchecks
- await pageManager.personalPage.nextButton.click();
- });
-
- await test.step("enters home address", async () => {
- await expect(pageManager.addressPage.stepHeading).toBeVisible();
- await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
- await pageManager.addressPage.nextButton.click();
- await expect(pageManager.addressPage.spinner).not.toBeVisible({
- timeout: SPINNER_TIMEOUT,
- });
- });
-
- await test.step("enters alternate address", async () => {
- await expect(
- pageManager.alternateAddressPage.stepHeading
- ).toBeVisible();
- await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
- await pageManager.alternateAddressPage.nextButton.click();
- await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
- timeout: SPINNER_TIMEOUT,
- });
- });
-
- // await test.step("verifies home and alternate addresses", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await pageManager.addressVerificationPage
- // .getHomeAddressOption(TEST_OOS_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage
- // .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage.nextButton.click();
- // await expect(
- // pageManager.addressVerificationPage.spinner
- // ).not.toBeVisible({ timeout: SPINNER_TIMEOUT });
- // });
-
- // await test.step("enters account information", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
- // await pageManager.accountPage.nextButton.click();
- // });
-
- // await test.step("displays review page and navigates back to account page", async () => {
- // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
- // await page.goBack();
- // });
-
- // await test.step("retains info on account page", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await expect(pageManager.accountPage.usernameInput).toHaveValue(
- // TEST_ACCOUNT.username
- // );
- // await expect(pageManager.accountPage.passwordInput).toHaveValue(
- // TEST_ACCOUNT.password
- // );
- // await expect(pageManager.accountPage.verifyPasswordInput).toHaveValue(
- // TEST_ACCOUNT.password
- // );
- // await expect(pageManager.accountPage.selectHomeLibrary).toHaveValue(
- // TEST_ACCOUNT.homeLibraryCode
- // );
- // await expect(pageManager.accountPage.acceptTermsCheckbox).toBeChecked();
- // await pageManager.accountPage.previousButton.click();
- // });
-
- // await test.step("retains info on address verification page", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await expect(
- // pageManager.addressVerificationPage.getHomeAddressOption(
- // TEST_OOS_ADDRESS.street
- // )
- // ).toBeChecked();
- // await expect(
- // pageManager.addressVerificationPage.getAlternateAddressOption(
- // TEST_NYC_ADDRESS.street
- // )
- // ).toBeChecked();
- // await pageManager.addressVerificationPage.previousButton.click();
- // });
-
- // await test.step("retains info on address page", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await expect(pageManager.addressPage.streetAddressInput).toHaveValue(
- // TEST_OOS_ADDRESS.street
- // );
- // await expect(pageManager.addressPage.apartmentSuiteInput).toHaveValue(
- // TEST_OOS_ADDRESS.apartmentSuite
- // );
- // await expect(pageManager.addressPage.cityInput).toHaveValue(
- // TEST_OOS_ADDRESS.city
- // );
- // await expect(pageManager.addressPage.stateInput).toHaveValue(
- // TEST_OOS_ADDRESS.state
- // );
- // await expect(pageManager.addressPage.postalCodeInput).toHaveValue(
- // TEST_OOS_ADDRESS.postalCode
- // );
- // await pageManager.addressPage.previousButton.click();
- // });
-
- // await test.step("retains info on personal information page", async () => {
- // await expect(pageManager.personalPage.stepHeading).toBeVisible();
- // await expect(pageManager.personalPage.firstNameInput).toHaveValue(
- // TEST_PATRON.firstName
- // );
- // await expect(pageManager.personalPage.lastNameInput).toHaveValue(
- // TEST_PATRON.lastName
- // );
- // await expect(pageManager.personalPage.dateOfBirthInput).toHaveValue(
- // TEST_PATRON.dateOfBirth
- // );
- // await expect(pageManager.personalPage.emailInput).toHaveValue(
- // TEST_PATRON.email
- // );
- // await expect(
- // pageManager.personalPage.receiveInfoCheckbox
- // ).not.toBeChecked();
- // });
- });
- });
-}
diff --git a/playwright/tests/e2e/e2e-partial.spec.ts b/playwright/tests/e2e/e2e-partial.spec.ts
deleted file mode 100644
index edc4d90c..00000000
--- a/playwright/tests/e2e/e2e-partial.spec.ts
+++ /dev/null
@@ -1,330 +0,0 @@
-import { test, expect } from "@playwright/test";
-import { PageManager } from "../../pageobjects/page-manager.page";
-import {
- // fillAccountInfo,
- fillAddress,
- fillPersonalInfo,
-} from "../../utils/form-helper";
-import {
- PAGE_ROUTES,
- SPINNER_TIMEOUT,
- SUPPORTED_LANGUAGES,
- // TEST_ACCOUNT,
- // TEST_EDITED_ACCOUNT,
- TEST_NYC_ADDRESS,
- TEST_OOS_ADDRESS,
- TEST_PATRON,
-} from "../../utils/constants";
-
-for (const { lang, name } of SUPPORTED_LANGUAGES) {
- test.describe(`E2E: Edits patron information in ${name} (${lang})`, () => {
- let pageManager: PageManager;
- let appContent: any;
-
- test.beforeEach(async ({ page }) => {
- appContent = require(`../../../public/locales/${lang}/common.json`);
- pageManager = new PageManager(page, appContent);
- });
-
- test("displays error when address is too long", async ({ page }) => {
- const invalidStreet = "A".repeat(100);
-
- await test.step("enters invalid home address", async () => {
- await page.goto(PAGE_ROUTES.ADDRESS(lang));
- await expect(pageManager.addressPage.stepHeading).toBeVisible();
- await fillAddress(pageManager.addressPage, {
- street: invalidStreet,
- apartmentSuite: "1",
- city: "City",
- state: "NY",
- postalCode: "12345",
- });
- await pageManager.addressPage.nextButton.click();
- await expect(pageManager.addressPage.spinner).not.toBeVisible({
- timeout: SPINNER_TIMEOUT,
- });
- });
-
- await test.step("skips alternate address", async () => {
- await expect(
- pageManager.alternateAddressPage.stepHeading
- ).toBeVisible();
- await pageManager.alternateAddressPage.nextButton.click();
- await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
- timeout: SPINNER_TIMEOUT,
- });
- });
-
- // await test.step("verifies home address", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await pageManager.addressVerificationPage
- // .getHomeAddressOption(invalidStreet)
- // .check();
- // await pageManager.addressVerificationPage.nextButton.click();
- // await expect(
- // pageManager.addressVerificationPage.spinner
- // ).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
-
- // await test.step("enters account information", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
- // await pageManager.accountPage.nextButton.click();
- // });
-
- // await test.step("displays error on review page", async () => {
- // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
- // await pageManager.reviewPage.submitButton.click();
- // await expect(pageManager.reviewPage.streetAddressError).toBeVisible();
- // });
- });
-
- // test("displays updated account info after editing addresses", async ({
- // page,
- // }) => {
- // await test.step("enters account information", async () => {
- // await page.goto(PAGE_ROUTES.ACCOUNT(lang));
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
- // await pageManager.accountPage.nextButton.click();
- // });
-
- // await test.step("edits address from review page", async () => {
- // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
- // await pageManager.reviewPage.editAddressButton.click();
- // });
-
- // await test.step("enters home address", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await fillAddress(pageManager.addressPage, TEST_NYC_ADDRESS);
- // await pageManager.addressPage.nextButton.click();
- // await expect(pageManager.addressPage.spinner).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
-
- // await test.step("skips alternate address", async () => {
- // await expect(
- // pageManager.alternateAddressPage.stepHeading
- // ).toBeVisible();
- // await pageManager.alternateAddressPage.nextButton.click();
- // await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
-
- // await test.step("verifies home address", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await pageManager.addressVerificationPage
- // .getHomeAddressOption(TEST_NYC_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage.nextButton.click();
- // await expect(
- // pageManager.addressVerificationPage.spinner
- // ).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
-
- // await test.step("edits account information", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await fillAccountInfo(pageManager.accountPage, TEST_EDITED_ACCOUNT);
- // await pageManager.accountPage.nextButton.click();
- // });
-
- // await test.step("displays updated account info on review page", async () => {
- // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
- // await expect(
- // pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.username)
- // ).toBeVisible();
- // await pageManager.reviewPage.showPasswordLabel.check();
- // await expect(
- // pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.password)
- // ).toBeVisible();
- // await expect(
- // pageManager.reviewPage.getText(TEST_EDITED_ACCOUNT.homeLibrary)
- // ).toBeVisible();
- // });
- // });
-
- test("retains user-entered info after clicking breadcrumb", async ({
- page,
- }) => {
- await test.step("enters personal information", async () => {
- await page.goto(PAGE_ROUTES.PERSONAL(lang));
- await expect(pageManager.personalPage.stepHeading).toBeVisible();
- await fillPersonalInfo(pageManager.personalPage, TEST_PATRON);
- await pageManager.personalPage.receiveInfoCheckbox.click(); // unchecks
- await pageManager.personalPage.nextButton.click();
- });
-
- await test.step("enters home address", async () => {
- await expect(pageManager.addressPage.stepHeading).toBeVisible();
- await fillAddress(pageManager.addressPage, TEST_OOS_ADDRESS);
- await pageManager.addressPage.nextButton.click();
- });
-
- await test.step("enters alternate address", async () => {
- await expect(
- pageManager.alternateAddressPage.stepHeading
- ).toBeVisible();
- await fillAddress(pageManager.alternateAddressPage, TEST_NYC_ADDRESS);
- await pageManager.alternateAddressPage.nextButton.click();
- await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
- timeout: SPINNER_TIMEOUT,
- });
- });
-
- // await test.step("verifies home and alternate addresses", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await pageManager.addressVerificationPage
- // .getHomeAddressOption(TEST_OOS_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage
- // .getAlternateAddressOption(TEST_NYC_ADDRESS.street)
- // .check();
- // await pageManager.addressVerificationPage.nextButton.click();
- // await expect(
- // pageManager.addressVerificationPage.spinner
- // ).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
-
- // await test.step("enters account information", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await fillAccountInfo(pageManager.accountPage, TEST_ACCOUNT);
- // await pageManager.accountPage.nextButton.click();
- // });
-
- // await test.step("displays review page and verifies receive info checkbox is unchecked", async () => {
- // await expect(pageManager.reviewPage.stepHeading).toBeVisible();
- // await pageManager.reviewPage.editPersonalInfoButton.click();
- // await expect(
- // pageManager.reviewPage.receiveInfoCheckbox
- // ).not.toBeChecked();
- // });
-
- // await test.step("clicks breadcrumb and displays landing page", async () => {
- // await pageManager.globalComponents.getLibraryCardBreadcrumb.click();
- // await expect(pageManager.landingPage.applyHeading).toBeVisible();
- // await pageManager.landingPage.getStartedButton.click();
- // });
-
- // await test.step("retains info on personal information page", async () => {
- // await expect(pageManager.personalPage.stepHeading).toBeVisible();
- // await expect(pageManager.personalPage.firstNameInput).toHaveValue(
- // TEST_PATRON.firstName
- // );
- // await expect(pageManager.personalPage.lastNameInput).toHaveValue(
- // TEST_PATRON.lastName
- // );
- // await expect(pageManager.personalPage.dateOfBirthInput).toHaveValue(
- // TEST_PATRON.dateOfBirth
- // );
- // await expect(pageManager.personalPage.emailInput).toHaveValue(
- // TEST_PATRON.email
- // );
- // await expect(
- // pageManager.personalPage.receiveInfoCheckbox
- // ).not.toBeChecked();
- // await pageManager.personalPage.nextButton.click();
- // });
-
- // await test.step("retains info on address page", async () => {
- // await expect(pageManager.addressPage.stepHeading).toBeVisible();
- // await expect(pageManager.addressPage.streetAddressInput).toHaveValue(
- // TEST_OOS_ADDRESS.street
- // );
- // await expect(pageManager.addressPage.apartmentSuiteInput).toHaveValue(
- // TEST_OOS_ADDRESS.apartmentSuite
- // );
- // await expect(pageManager.addressPage.cityInput).toHaveValue(
- // TEST_OOS_ADDRESS.city
- // );
- // await expect(pageManager.addressPage.stateInput).toHaveValue(
- // TEST_OOS_ADDRESS.state
- // );
- // await expect(pageManager.addressPage.postalCodeInput).toHaveValue(
- // TEST_OOS_ADDRESS.postalCode
- // );
- // await pageManager.addressPage.nextButton.click();
- // await expect(pageManager.addressPage.spinner).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
-
- // await test.step("retains info on alternate address page", async () => {
- // await expect(
- // pageManager.alternateAddressPage.stepHeading
- // ).toBeVisible();
- // await expect(
- // pageManager.alternateAddressPage.streetAddressInput
- // ).toHaveValue(TEST_NYC_ADDRESS.street);
- // await expect(
- // pageManager.alternateAddressPage.apartmentSuiteInput
- // ).toHaveValue(TEST_NYC_ADDRESS.apartmentSuite);
- // await expect(pageManager.alternateAddressPage.cityInput).toHaveValue(
- // TEST_NYC_ADDRESS.city
- // );
- // await expect(pageManager.alternateAddressPage.stateInput).toHaveValue(
- // TEST_NYC_ADDRESS.state
- // );
- // await expect(
- // pageManager.alternateAddressPage.postalCodeInput
- // ).toHaveValue(TEST_NYC_ADDRESS.postalCode);
- // await pageManager.alternateAddressPage.nextButton.click();
- // await expect(pageManager.alternateAddressPage.spinner).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
-
- // await test.step("retains info on address verification page", async () => {
- // await expect(
- // pageManager.addressVerificationPage.stepHeading
- // ).toBeVisible();
- // await expect(
- // pageManager.addressVerificationPage.getHomeAddressOption(
- // TEST_OOS_ADDRESS.street
- // )
- // ).toBeChecked();
- // await expect(
- // pageManager.addressVerificationPage.getAlternateAddressOption(
- // TEST_NYC_ADDRESS.street
- // )
- // ).toBeChecked();
- // await pageManager.addressVerificationPage.nextButton.click();
- // await expect(
- // pageManager.addressVerificationPage.spinner
- // ).not.toBeVisible({
- // timeout: SPINNER_TIMEOUT,
- // });
- // });
-
- // await test.step("retains info on account page", async () => {
- // await expect(pageManager.accountPage.stepHeading).toBeVisible();
- // await expect(pageManager.accountPage.usernameInput).toHaveValue(
- // TEST_ACCOUNT.username
- // );
- // await expect(pageManager.accountPage.passwordInput).toHaveValue(
- // TEST_ACCOUNT.password
- // );
- // await expect(pageManager.accountPage.verifyPasswordInput).toHaveValue(
- // TEST_ACCOUNT.password
- // );
- // await expect(pageManager.accountPage.selectHomeLibrary).toHaveValue(
- // TEST_ACCOUNT.homeLibraryCode
- // );
- // await expect(pageManager.accountPage.acceptTermsCheckbox).toBeChecked();
- // });
- });
- });
-}
diff --git a/playwright/tests/page-tests/alternate-address.spec.ts b/playwright/tests/page-tests/alternate-address.spec.ts
index e163a392..b04dd180 100644
--- a/playwright/tests/page-tests/alternate-address.spec.ts
+++ b/playwright/tests/page-tests/alternate-address.spec.ts
@@ -13,7 +13,7 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
let appContent: any;
test.beforeEach(async ({ page }) => {
- appContent = require(`../../public/locales/${lang}/common.json`);
+ appContent = require(`../../../public/locales/${lang}/common.json`);
alternateAddressPage = new AlternateAddressPage(page, appContent);
await page.goto(PAGE_ROUTES.ALTERNATE_ADDRESS(lang));
});
diff --git a/playwright/tests/personal.spec.ts b/playwright/tests/personal.spec.ts
deleted file mode 100644
index 1d082464..00000000
--- a/playwright/tests/personal.spec.ts
+++ /dev/null
@@ -1,167 +0,0 @@
-import { test, expect } from "@playwright/test";
-import { PersonalPage } from "../pageobjects/personal.page";
-import { fillPersonalInfo } from "../utils/form-helper";
-import {
- PAGE_ROUTES,
- SUPPORTED_LANGUAGES,
- TEST_PATRON,
-} from "../utils/constants";
-
-for (const { lang, name } of SUPPORTED_LANGUAGES) {
- test.describe(`personal information page in ${name} (${lang})`, () => {
- let personalPage: PersonalPage;
- let appContent: any;
-
- test.beforeEach(async ({ page }) => {
- appContent = require(`../../public/locales/${lang}/common.json`);
- personalPage = new PersonalPage(page, appContent);
- await page.goto(PAGE_ROUTES.PERSONAL(lang));
- });
-
- test.describe("displays elements", () => {
- test("displays headings, links, and buttons", async () => {
- await expect(personalPage.mainHeading).toBeVisible();
- await expect(personalPage.stepHeading).toBeVisible();
- await expect(personalPage.alternateFormLink).toBeVisible();
- await expect(personalPage.locationsLink).toBeVisible();
- await expect(personalPage.previousButton).toBeVisible();
- await expect(personalPage.nextButton).toBeVisible();
- });
-
- test("displays personal information form", async () => {
- await expect(personalPage.firstNameInput).toBeVisible();
- await expect(personalPage.lastNameInput).toBeVisible();
- await expect(personalPage.dateOfBirthInput).toBeVisible();
- await expect(personalPage.emailInput).toBeVisible();
- await expect(personalPage.receiveInfoCheckbox).toBeVisible();
- });
-
- test("confirms links open in new tab", async () => {
- const links = [
- personalPage.alternateFormLink,
- personalPage.locationsLink,
- ];
- for (const link of links) {
- await expect(link).toHaveAttribute("target", "_blank");
- await expect(link).toHaveAttribute(
- "rel",
- "nofollow noopener noreferrer"
- );
- }
- });
- });
-
- test.describe("enters personal information", () => {
- test("enters valid personal information", async () => {
- await fillPersonalInfo(personalPage, TEST_PATRON);
- await expect(personalPage.firstNameInput).toHaveValue(
- TEST_PATRON.firstName
- );
- await expect(personalPage.lastNameInput).toHaveValue(
- TEST_PATRON.lastName
- );
- await expect(personalPage.dateOfBirthInput).toHaveValue(
- TEST_PATRON.dateOfBirth
- );
- await expect(personalPage.emailInput).toHaveValue(TEST_PATRON.email);
- });
- });
-
- test.describe("displays error messages", () => {
- test("displays errors for required fields", async () => {
- await personalPage.firstNameInput.fill("");
- await personalPage.lastNameInput.fill("");
- await personalPage.dateOfBirthInput.fill("");
- await personalPage.emailInput.fill("");
- await personalPage.nextButton.click();
-
- await expect(personalPage.firstNameError).toBeVisible();
- await expect(personalPage.lastNameError).toBeVisible();
- await expect(personalPage.dateOfBirthInvalid).toBeVisible();
- await expect(personalPage.emailError).toBeVisible();
- });
-
- test("displays error for dashes in date of birth", async () => {
- await personalPage.dateOfBirthInput.fill("12-25-1984");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthInvalid).toBeVisible();
- });
-
- test("displays error for YYYY/MM/DD format in date of birth", async () => {
- await personalPage.dateOfBirthInput.fill("1984/12/25");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthInvalid).toBeVisible();
- });
-
- test("displays error for DD/MM/YYYY format in date of birth", async () => {
- await personalPage.dateOfBirthInput.fill("25/12/1984");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthInvalid).toBeVisible();
- });
-
- test("displays error for M/D/YY format in date of birth", async () => {
- await personalPage.dateOfBirthInput.fill("1/1/84");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthInvalid).toBeVisible();
- });
-
- test("displays error for written date of birth", async () => {
- await personalPage.dateOfBirthInput.fill("December 25, 1984");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthInvalid).toBeVisible();
- });
-
- test("displays error for earliest date of birth", async () => {
- await personalPage.dateOfBirthInput.fill("01/01/1902");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthInvalid).toBeVisible();
- });
-
- test("displays error for date of birth under 13 years old", async ({
- page,
- }) => {
- await page.clock.setFixedTime(new Date("2026-01-01T10:00:00"));
- await personalPage.dateOfBirthInput.fill("01/01/2014");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
- });
-
- test("displays error for current date of birth", async ({ page }) => {
- await page.clock.setFixedTime(new Date("2026-01-01T10:00:00"));
- await personalPage.dateOfBirthInput.fill("01/01/2026");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthError).toBeVisible();
- });
-
- test("displays error for future date of birth", async () => {
- await personalPage.dateOfBirthInput.fill("12/31/2099");
- await personalPage.nextButton.click();
- await expect(personalPage.dateOfBirthInvalid).toBeVisible();
- });
-
- test("displays error for missing email symbol", async () => {
- await personalPage.emailInput.fill("testgmail.com");
- await personalPage.nextButton.click();
- await expect(personalPage.emailError).toBeVisible();
- });
-
- test("displays error for missing email domain", async () => {
- await personalPage.emailInput.fill("test@.com");
- await personalPage.nextButton.click();
- await expect(personalPage.emailError).toBeVisible();
- });
-
- test("displays error for missing email username", async () => {
- await personalPage.emailInput.fill("@gmail.com");
- await personalPage.nextButton.click();
- await expect(personalPage.emailError).toBeVisible();
- });
-
- test("displays error for missing email top-level domain", async () => {
- await personalPage.emailInput.fill("user@gmail");
- await personalPage.nextButton.click();
- await expect(personalPage.emailError).toBeVisible();
- });
- });
- });
-}
From 9405fba817a861d5c1e3c075f6aee951b022df9a Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Mon, 16 Mar 2026 15:29:19 -0600
Subject: [PATCH 31/36] Restore error messages
---
playwright/utils/constants.ts | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/playwright/utils/constants.ts b/playwright/utils/constants.ts
index 8ad23e7b..560d9cba 100644
--- a/playwright/utils/constants.ts
+++ b/playwright/utils/constants.ts
@@ -92,6 +92,11 @@ export const EXPECTED_BARCODE_PREFIX = "255";
export const ERROR_MESSAGES = {
// probs remove this at the end
+ FIRST_NAME_INVALID: appContent.personal.errorMessage.firstName,
+ LAST_NAME_INVALID: appContent.personal.errorMessage.lastName,
+ DATE_OF_BIRTH_INVALID: appContent.personal.errorMessage.birthdate,
+ DATE_OF_BIRTH_ERROR: appContent.personal.errorMessage.ageGate,
+ EMAIL_INVALID: appContent.personal.errorMessage.email,
STREET_ADDRESS_INVALID: appContent.location.errorMessage.line1,
CITY_INVALID: appContent.location.errorMessage.city,
STATE_INVALID: appContent.location.errorMessage.state,
From a6917b2be3d90b5dcd97cf52ec121465af88b2c8 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Mon, 16 Mar 2026 16:11:32 -0600
Subject: [PATCH 32/36] Separate banner text
---
pages/alternate-address/index.tsx | 11 ++++++++++-
playwright/pageobjects/alternate-address.page.ts | 4 ++--
public/locales/en/common.json | 3 ++-
public/locales/es/common.json | 3 ++-
4 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/pages/alternate-address/index.tsx b/pages/alternate-address/index.tsx
index 8d47a627..2ecb752d 100644
--- a/pages/alternate-address/index.tsx
+++ b/pages/alternate-address/index.tsx
@@ -40,7 +40,16 @@ function AlternateAddress({
{t("location.workAddress.description.part1")}
{t("internationalInstructions")}
}
+ content={
+
+ }
/>
>
diff --git a/playwright/pageobjects/alternate-address.page.ts b/playwright/pageobjects/alternate-address.page.ts
index bff8d548..f4bb3826 100644
--- a/playwright/pageobjects/alternate-address.page.ts
+++ b/playwright/pageobjects/alternate-address.page.ts
@@ -33,8 +33,8 @@ export class AlternateAddressPage {
});
this.informationalBanner = page.locator("aside", {
hasText:
- appContent?.location?.workAddress?.description?.part3 ||
- "Please provide the address of where you work, attend school, or pay property taxes in New York State. If none of these apply to you, click next.",
+ appContent?.location?.workAddress?.description?.provideAddress ||
+ "Please provide the address of where you work, attend school, or pay property taxes in New York State.",
});
this.addressHeading = page.getByRole("heading", {
name:
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index a27cf1ea..7f7622c8 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -79,7 +79,8 @@
"description": {
"part1": "Do you work, go to school, or pay property taxes in New York State? Even if you don't live in New York, you may still be eligible for a library card.",
"part2": "Form fields must be filled out using only Latin characters.",
- "part3": "Please provide the address of where you work, attend school, or pay property taxes in New York State. If none of these apply to you, click next."
+ "part3": "{{provideAddress}} If none of these apply to you, click next.",
+ "provideAddress": "Please provide the address of where you work, attend school, or pay property taxes in New York State."
}
},
"errorMessage": {
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index d25f9d7e..8c0a1ac5 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -71,7 +71,8 @@
"description": {
"part1": "¿Trabaja, estudia o paga impuestos a la propiedad en el Estado de Nueva York? Incluso si no vive en Nueva York, puede solicitar una tarjeta de la biblioteca.",
"part2": "Si trabaja o estudia en la ciudad de Nueva York, indique la dirección.",
- "part3": "Indique la dirección de su trabajo, escuela o lugar donde paga impuestos a la propiedad en el Estado de Nueva York. Si ninguna de estas opciones le corresponde, haga clic en “Siguiente”."
+ "part3": "{{provideAddress}} Si ninguna de estas opciones le corresponde, haga clic en “Siguiente”.",
+ "provideAddress": "Indique la dirección de su trabajo, escuela o lugar donde paga impuestos a la propiedad en el Estado de Nueva York."
}
},
"errorMessage": {
From b93baf217f917daef69133c3ffe126082bf9e0b7 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Tue, 17 Mar 2026 12:34:39 -0600
Subject: [PATCH 33/36] Uncomment alternate address in NY tests
---
playwright/tests/e2e-tests/nyc-e2e-mocked.spec.ts | 10 ++++++----
playwright/tests/e2e-tests/nys-e2e-mocked.spec.ts | 10 ++++++----
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/playwright/tests/e2e-tests/nyc-e2e-mocked.spec.ts b/playwright/tests/e2e-tests/nyc-e2e-mocked.spec.ts
index 0829d25a..45281e5c 100644
--- a/playwright/tests/e2e-tests/nyc-e2e-mocked.spec.ts
+++ b/playwright/tests/e2e-tests/nyc-e2e-mocked.spec.ts
@@ -50,10 +50,12 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await pageManager.addressPage.nextButton.click();
});
- // await test.step("skips alternate address", async () => {
- // await expect(pageManager.alternateAddressPage.stepHeading).toBeVisible();
- // await pageManager.alternateAddressPage.nextButton.click();
- // });
+ await test.step("skips alternate address", async () => {
+ await expect(
+ pageManager.alternateAddressPage.stepHeading
+ ).toBeVisible();
+ await pageManager.alternateAddressPage.nextButton.click();
+ });
// await test.step("verifies home address", async () => {
// await expect(
diff --git a/playwright/tests/e2e-tests/nys-e2e-mocked.spec.ts b/playwright/tests/e2e-tests/nys-e2e-mocked.spec.ts
index a65d9029..20f4680a 100644
--- a/playwright/tests/e2e-tests/nys-e2e-mocked.spec.ts
+++ b/playwright/tests/e2e-tests/nys-e2e-mocked.spec.ts
@@ -50,10 +50,12 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
await pageManager.addressPage.nextButton.click();
});
- // await test.step("skips alternate address", async () => {
- // await expect(pageManager.alternateAddressPage.stepHeading).toBeVisible();
- // await pageManager.alternateAddressPage.nextButton.click();
- // });
+ await test.step("skips alternate address", async () => {
+ await expect(
+ pageManager.alternateAddressPage.stepHeading
+ ).toBeVisible();
+ await pageManager.alternateAddressPage.nextButton.click();
+ });
// await test.step("verifies home address", async () => {
// await expect(
From 3eed85dba72cf21ea30ee17df9dcf819c471a246 Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Fri, 27 Mar 2026 15:53:59 -0600
Subject: [PATCH 34/36] Remove provideAddress
---
pages/alternate-address/index.tsx | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/pages/alternate-address/index.tsx b/pages/alternate-address/index.tsx
index 2ecb752d..8d47a627 100644
--- a/pages/alternate-address/index.tsx
+++ b/pages/alternate-address/index.tsx
@@ -40,16 +40,7 @@ function AlternateAddress({
{t("location.workAddress.description.part1")}
{t("internationalInstructions")}
- }
+ content={}
/>
>
From 626f619d6137b75e708dd4b60d44937c26fa5fda Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Wed, 1 Apr 2026 09:38:11 -0600
Subject: [PATCH 35/36] Update link and username message locators
---
playwright/pageobjects/account.page.ts | 14 ++++++++++----
src/components/AcceptTermsFormFields/index.tsx | 4 ++--
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/playwright/pageobjects/account.page.ts b/playwright/pageobjects/account.page.ts
index c2f5c4ab..f4801f41 100644
--- a/playwright/pageobjects/account.page.ts
+++ b/playwright/pageobjects/account.page.ts
@@ -1,4 +1,6 @@
import { Page, Locator } from "@playwright/test";
+import { apiTranslations } from "../../src/data/apiMessageTranslations";
+import { apiErrorTranslations } from "../../src/data/apiErrorMessageTranslations";
export class AccountPage {
readonly page: Page;
@@ -57,11 +59,15 @@ export class AccountPage {
exact: true,
});
this.availableUsernameMessage = page
- .getByText("El nombre de usuario está disponible.") // replace when translation available
- .or(page.getByText("This username is available."));
+ .getByText(apiTranslations["This username is available."].es)
+ .or(page.getByText(apiTranslations["This username is available."].en));
this.unavailableUsernameMessage = page
- .getByText("Este nombre de usuario no está disponible. Pruebe con otro.") // replace when translation available
- .or(page.getByText("This username is unavailable. Please try another."));
+ .getByText(
+ apiErrorTranslations[
+ "This username is unavailable. Please try another."
+ ].es
+ )
+ .or(page.getByText("This username is unavailable. Please try another.")); // en not listed
this.passwordInput = page.getByRole("textbox", {
name: withRequired(appContent?.account?.password?.label || "Password"),
exact: true,
diff --git a/src/components/AcceptTermsFormFields/index.tsx b/src/components/AcceptTermsFormFields/index.tsx
index 39afcf71..dba3084e 100644
--- a/src/components/AcceptTermsFormFields/index.tsx
+++ b/src/components/AcceptTermsFormFields/index.tsx
@@ -1,4 +1,4 @@
-import { Checkbox, Link } from "@nypl/design-system-react-components";
+import { Checkbox, Link as DSLink } from "@nypl/design-system-react-components";
import { Trans, useTranslation } from "next-i18next";
import React from "react";
import { Controller, useFormContext } from "react-hook-form";
@@ -23,7 +23,7 @@ const AcceptTermsForm: React.FC = () => {
}}
+ components={{ a: }}
values={{
termsConditions: t("account.termsAndCondition.termsConditions"),
rulesRegulations: t("account.termsAndCondition.rulesRegulations"),
From f197fccfefd775ec7ed8d7ddb94f10b2c12746ba Mon Sep 17 00:00:00 2001
From: Clarissa Richard <107963214+clarissarichard@users.noreply.github.com>
Date: Wed, 1 Apr 2026 10:03:28 -0600
Subject: [PATCH 36/36] Pass in lang
---
playwright/pageobjects/account.page.ts | 21 ++++++++++-----------
playwright/tests/page-tests/account.spec.ts | 2 +-
2 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/playwright/pageobjects/account.page.ts b/playwright/pageobjects/account.page.ts
index f4801f41..dd2a6ced 100644
--- a/playwright/pageobjects/account.page.ts
+++ b/playwright/pageobjects/account.page.ts
@@ -30,7 +30,7 @@ export class AccountPage {
readonly nextButton: Locator;
readonly previousButton: Locator;
- constructor(page: Page, appContent?: any) {
+ constructor(page: Page, appContent?: any, lang?: string) {
this.page = page;
const required = appContent?.required || "required";
@@ -58,16 +58,15 @@ export class AccountPage {
"Check if username is available",
exact: true,
});
- this.availableUsernameMessage = page
- .getByText(apiTranslations["This username is available."].es)
- .or(page.getByText(apiTranslations["This username is available."].en));
- this.unavailableUsernameMessage = page
- .getByText(
- apiErrorTranslations[
- "This username is unavailable. Please try another."
- ].es
- )
- .or(page.getByText("This username is unavailable. Please try another.")); // en not listed
+ this.availableUsernameMessage = page.getByText(
+ apiTranslations["This username is available."][lang] ||
+ "This username is available."
+ );
+ this.unavailableUsernameMessage = page.getByText(
+ apiErrorTranslations["This username is unavailable. Please try another."][
+ lang
+ ] || "This username is unavailable. Please try another."
+ );
this.passwordInput = page.getByRole("textbox", {
name: withRequired(appContent?.account?.password?.label || "Password"),
exact: true,
diff --git a/playwright/tests/page-tests/account.spec.ts b/playwright/tests/page-tests/account.spec.ts
index e3394a6c..534cc702 100644
--- a/playwright/tests/page-tests/account.spec.ts
+++ b/playwright/tests/page-tests/account.spec.ts
@@ -15,7 +15,7 @@ for (const { lang, name } of SUPPORTED_LANGUAGES) {
test.beforeEach(async ({ page }) => {
appContent = require(`../../../public/locales/${lang}/common.json`);
- accountPage = new AccountPage(page, appContent);
+ accountPage = new AccountPage(page, appContent, lang);
await page.goto(PAGE_ROUTES.ACCOUNT(lang));
});