From 57370d9e737ecc72597cbe6e4ef25d44614f05ea Mon Sep 17 00:00:00 2001 From: weimiao67 Date: Thu, 28 May 2026 10:54:04 -0600 Subject: [PATCH 1/4] feat: add division directors and team leaders to AgreementMetaAccordion --- .../AgreementMetaAccordion.jsx | 47 +++++++++++-- .../AgreementMetaAccordion.test.jsx | 68 +++++++++++++++++++ frontend/src/tests/data.js | 2 + 3 files changed, 113 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/Agreements/AgreementMetaAccordion/AgreementMetaAccordion.jsx b/frontend/src/components/Agreements/AgreementMetaAccordion/AgreementMetaAccordion.jsx index 963d8c2d73..eb994c8cb9 100644 --- a/frontend/src/components/Agreements/AgreementMetaAccordion/AgreementMetaAccordion.jsx +++ b/frontend/src/components/Agreements/AgreementMetaAccordion/AgreementMetaAccordion.jsx @@ -36,6 +36,9 @@ const AgreementMetaAccordion = ({ const MORE_THAN_THREE_RESEARCH_METHODS = agreement?.research_methodologies && agreement?.research_methodologies.length > 3; const MORE_THAN_THREE_SPECIAL_TOPICS = agreement?.special_topics && agreement?.special_topics.length > 3; + const MORE_THAN_THREE_DIVISION_DIRECTORS = + agreement?.division_directors && agreement?.division_directors.length > 3; + const MORE_THAN_THREE_TEAM_LEADERS = agreement?.team_leaders && agreement?.team_leaders.length > 3; /** * Renders a Term component. * @component @@ -171,10 +174,46 @@ const AgreementMetaAccordion = ({ )}
-
- {renderTerm("division-directors", "Division Director(s)", NO_DATA)} -
-
{renderTerm("team-leaders", "Team Leader(s)", NO_DATA)}
+ {agreement?.division_directors && agreement?.division_directors.length > 0 ? ( +
+
Division Director(s)
+ {agreement.division_directors.map((director, index) => ( +
+ {director} +
+ ))} +
+ ) : ( +
+ {renderTerm("division-directors", "Division Director(s)", NO_DATA)} +
+ )} + {agreement?.team_leaders && agreement?.team_leaders.length > 0 ? ( +
+
Team Leader(s)
+ {agreement.team_leaders.map((leader, index) => ( +
+ {leader} +
+ ))} +
+ ) : ( +
+ {renderTerm("team-leaders", "Team Leader(s)", NO_DATA)} +
+ )}
diff --git a/frontend/src/components/Agreements/AgreementMetaAccordion/AgreementMetaAccordion.test.jsx b/frontend/src/components/Agreements/AgreementMetaAccordion/AgreementMetaAccordion.test.jsx index ee9d5bfef3..1c7b49cdef 100644 --- a/frontend/src/components/Agreements/AgreementMetaAccordion/AgreementMetaAccordion.test.jsx +++ b/frontend/src/components/Agreements/AgreementMetaAccordion/AgreementMetaAccordion.test.jsx @@ -75,6 +75,74 @@ describe("AgreementMetaAccordion", () => { expect(allTBDs.length).toBeGreaterThan(0); }); + describe("Division Directors and Team Leaders", () => { + it("should display division director names when present", () => { + render( + + ); + + expect(screen.getByText("Division Director(s)")).toBeInTheDocument(); + expect(screen.getByText("Jane Smith")).toBeInTheDocument(); + }); + + it("should display team leader names when present", () => { + render( + + ); + + expect(screen.getByText("Team Leader(s)")).toBeInTheDocument(); + expect(screen.getByText("Bob Johnson")).toBeInTheDocument(); + }); + + it("should show NO_DATA when division_directors is empty", () => { + const agreementWithoutDDs = { + ...agreement, + division_directors: [] + }; + + render( + + ); + + expect(screen.getByText("Division Director(s)")).toBeInTheDocument(); + expect(screen.getAllByText(NO_DATA).length).toBeGreaterThan(0); + }); + + it("should show NO_DATA when team_leaders is empty", () => { + const agreementWithoutTLs = { + ...agreement, + team_leaders: [] + }; + + render( + + ); + + expect(screen.getByText("Team Leader(s)")).toBeInTheDocument(); + expect(screen.getAllByText(NO_DATA).length).toBeGreaterThan(0); + }); + }); + describe("Contract Number conditional rendering", () => { it("should show contract number for awarded CONTRACT agreements", () => { const contractAgreement = { diff --git a/frontend/src/tests/data.js b/frontend/src/tests/data.js index 0fb9b37114..ca10ca0112 100644 --- a/frontend/src/tests/data.js +++ b/frontend/src/tests/data.js @@ -57,6 +57,8 @@ export const agreement = { agreement_reason: "RECOMPETE", agreement_type: "CONTRACT", nick_name: "AACFRC", + division_directors: ["Jane Smith"], + team_leaders: ["Bob Johnson"], budget_line_items: [ { agreement_id: 1, From 97a01d348172c5bff2c58f682e0ad80170748eae Mon Sep 17 00:00:00 2001 From: weimiao67 Date: Thu, 28 May 2026 11:48:37 -0600 Subject: [PATCH 2/4] test: update e2e test and add coverage --- frontend/cypress/e2e/reviewAgreement.cy.js | 53 ++++++++++++------- .../AgreementMetaAccordion.jsx | 20 +++++-- 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/frontend/cypress/e2e/reviewAgreement.cy.js b/frontend/cypress/e2e/reviewAgreement.cy.js index ea453f9fa4..eabe9f3d43 100644 --- a/frontend/cypress/e2e/reviewAgreement.cy.js +++ b/frontend/cypress/e2e/reviewAgreement.cy.js @@ -19,26 +19,39 @@ describe("agreement change accordion", () => { cy.contains(".usa-accordion__button", "Review Agreement Details") .closest(".usa-accordion") .within(() => { - cy.contains("Agreement Type").should("exist"); - cy.get('[data-cy="agreement-meta-description"]').contains("Test description"); - cy.get('[data-cy="agreement-meta-nickname"]').contains("TBD"); - cy.get('[data-cy="agreement-meta-type"]').contains("Contract"); - cy.get('[data-cy="agreement-meta-contract-number"]').contains("XXXX000000001"); - cy.get('[data-cy="agreement-meta-contract-type"]').contains("Firm Fixed Price (FFP)"); - cy.get('[data-cy="agreement-meta-psc"]').contains("Other Scientific and Technical Consulting Services"); - cy.get('[data-cy="agreement-meta-naics"]').contains("541690"); - cy.get('[data-cy="agreement-meta-program-support-code"]').contains("R410 - Research"); - cy.get('[data-cy="agreement-meta-procurement-shop"]').contains("GCS"); - cy.get('[data-cy="agreement-meta-reason"]').contains("Recompete"); - cy.get('[data-cy="agreement-meta-vendor"]').contains("Vendor 1"); - cy.get('[data-cy="agreement-meta-division-directors"]').should("contain", NO_DATA); - cy.get('[data-cy="agreement-meta-team-leaders"]').should("contain", NO_DATA); - cy.get('[data-cy="agreement-meta-Descriptive Study"]').contains("Descriptive Study"); - cy.get('[data-cy="agreement-meta-Impact Study"]').contains("Impact Study"); - cy.get('[data-cy="agreement-meta-Special Topic 1"]').contains("Special Topic 1"); - cy.get('[data-cy="agreement-meta-Special Topic 2"]').contains("Special Topic 2"); - cy.get('[data-cy="agreement-meta-project-officer"]').contains("Chris Fortunato"); - cy.get('[data-cy="agreement-meta-alternate-project-officer"]').contains(NO_DATA); + cy.contains("Agreement Type").should("exist"); + cy.get('[data-cy="agreement-meta-description"]').contains("Test description"); + cy.get('[data-cy="agreement-meta-nickname"]').contains("TBD"); + cy.get('[data-cy="agreement-meta-type"]').contains("Contract"); + cy.get('[data-cy="agreement-meta-contract-number"]').contains("XXXX000000001"); + cy.get('[data-cy="agreement-meta-contract-type"]').contains("Firm Fixed Price (FFP)"); + cy.get('[data-cy="agreement-meta-psc"]').contains("Other Scientific and Technical Consulting Services"); + cy.get('[data-cy="agreement-meta-naics"]').contains("541690"); + cy.get('[data-cy="agreement-meta-program-support-code"]').contains("R410 - Research"); + cy.get('[data-cy="agreement-meta-procurement-shop"]').contains("GCS"); + cy.get('[data-cy="agreement-meta-reason"]').contains("Recompete"); + cy.get('[data-cy="agreement-meta-vendor"]').contains("Vendor 1"); + cy.get('[data-cy="agreement-meta-division-directors"]').within(() => { + cy.get("dd").should("have.length", 1); + cy.get("dd").eq(0).should("contain", "Dave Director"); + }); + cy.get('[data-cy="agreement-meta-team-leaders"]').within(() => { + cy.get("dd").should("have.length", 1); + cy.get("dd").eq(0).should("contain", "Amy Madigan"); + }); + cy.get('[data-cy="agreement-meta-team-members"]').within(() => { + cy.get("span").should("have.length", 4); + cy.get("span").eq(0).should("contain", "Chris Fortunato"); + cy.get("span").eq(1).should("contain", "Amelia Popham"); + cy.get("span").eq(2).should("contain", "Dave Director"); + cy.get("span").eq(3).should("contain", "System Owner"); + }); + cy.get('[data-cy="agreement-meta-Descriptive Study"]').contains("Descriptive Study"); + cy.get('[data-cy="agreement-meta-Impact Study"]').contains("Impact Study"); + cy.get('[data-cy="agreement-meta-Special Topic 1"]').contains("Special Topic 1"); + cy.get('[data-cy="agreement-meta-Special Topic 2"]').contains("Special Topic 2"); + cy.get('[data-cy="agreement-meta-project-officer"]').contains("Chris Fortunato"); + cy.get('[data-cy="agreement-meta-alternate-project-officer"]').contains(NO_DATA); }); }); diff --git a/frontend/src/components/Agreements/AgreementMetaAccordion/AgreementMetaAccordion.jsx b/frontend/src/components/Agreements/AgreementMetaAccordion/AgreementMetaAccordion.jsx index eb994c8cb9..e08be41faa 100644 --- a/frontend/src/components/Agreements/AgreementMetaAccordion/AgreementMetaAccordion.jsx +++ b/frontend/src/components/Agreements/AgreementMetaAccordion/AgreementMetaAccordion.jsx @@ -175,7 +175,10 @@ const AgreementMetaAccordion = ({ )}
{agreement?.division_directors && agreement?.division_directors.length > 0 ? ( -
+
Division Director(s)
{agreement.division_directors.map((director, index) => (
)} {agreement?.team_leaders && agreement?.team_leaders.length > 0 ? ( -
+
Team Leader(s)
{agreement.team_leaders.map((leader, index) => (
{ } return ( -
+
Team Members
{teamMemberRows.map((row, rowIndex) => (
{ // Single column layout for 3 or fewer team members return ( -
+
Team Members
{teamMembers.map((member) => (
Date: Thu, 28 May 2026 14:07:38 -0600 Subject: [PATCH 3/4] test: fix e2e test failure --- frontend/cypress/e2e/reviewAgreement.cy.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/cypress/e2e/reviewAgreement.cy.js b/frontend/cypress/e2e/reviewAgreement.cy.js index eabe9f3d43..6ecb241b38 100644 --- a/frontend/cypress/e2e/reviewAgreement.cy.js +++ b/frontend/cypress/e2e/reviewAgreement.cy.js @@ -12,7 +12,7 @@ afterEach(() => { }); describe("agreement change accordion", () => { - it("check agreement meta-data", () => { + it.only("check agreement meta-data", () => { cy.visit("/agreements/review/10"); cy.get("h1").contains("Request BL Status Change"); @@ -43,8 +43,8 @@ describe("agreement change accordion", () => { cy.get("span").should("have.length", 4); cy.get("span").eq(0).should("contain", "Chris Fortunato"); cy.get("span").eq(1).should("contain", "Amelia Popham"); - cy.get("span").eq(2).should("contain", "Dave Director"); - cy.get("span").eq(3).should("contain", "System Owner"); + cy.get("span").eq(2).should("contain", "System Owner"); + cy.get("span").eq(3).should("contain", "Dave Director"); }); cy.get('[data-cy="agreement-meta-Descriptive Study"]').contains("Descriptive Study"); cy.get('[data-cy="agreement-meta-Impact Study"]').contains("Impact Study"); From 933169085f4a7001b74df2534b7fd9a3657dd2eb Mon Sep 17 00:00:00 2001 From: weimiao67 Date: Fri, 29 May 2026 09:19:50 -0600 Subject: [PATCH 4/4] test: remove .only from agreement meta-data test --- frontend/cypress/e2e/reviewAgreement.cy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/cypress/e2e/reviewAgreement.cy.js b/frontend/cypress/e2e/reviewAgreement.cy.js index 6ecb241b38..9154cae877 100644 --- a/frontend/cypress/e2e/reviewAgreement.cy.js +++ b/frontend/cypress/e2e/reviewAgreement.cy.js @@ -12,7 +12,7 @@ afterEach(() => { }); describe("agreement change accordion", () => { - it.only("check agreement meta-data", () => { + it("check agreement meta-data", () => { cy.visit("/agreements/review/10"); cy.get("h1").contains("Request BL Status Change");