Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 33 additions & 20 deletions frontend/cypress/e2e/reviewAgreement.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -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", "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");
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);
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -171,10 +174,52 @@ const AgreementMetaAccordion = ({
</dl>
)}
<div className="display-flex">
<dl className="grid-col-4 margin-0">
{renderTerm("division-directors", "Division Director(s)", NO_DATA)}
</dl>
<dl className="grid-col-4 margin-0">{renderTerm("team-leaders", "Team Leader(s)", NO_DATA)}</dl>
{agreement?.division_directors && agreement?.division_directors.length > 0 ? (
<dl
className="grid-col-4 margin-0 margin-top-2"
data-cy="agreement-meta-division-directors"
>
<dt className="margin-0 text-base-dark grid-col-12">Division Director(s)</dt>
{agreement.division_directors.map((director, index) => (
<dd
key={index}
className={`text-semibold margin-0 margin-top-05 ${
MORE_THAN_THREE_DIVISION_DIRECTORS ? "grid-col-6" : "grid-col-12"
}`}
data-cy={`agreement-meta-division-director-${index}`}
>
{director}
</dd>
))}
</dl>
) : (
<dl className="grid-col-4 margin-0">
{renderTerm("division-directors", "Division Director(s)", NO_DATA)}
</dl>
)}
{agreement?.team_leaders && agreement?.team_leaders.length > 0 ? (
<dl
className="grid-col-4 margin-0 margin-top-2"
data-cy="agreement-meta-team-leaders"
>
<dt className="margin-0 text-base-dark grid-col-12">Team Leader(s)</dt>
{agreement.team_leaders.map((leader, index) => (
<dd
key={index}
className={`text-semibold margin-0 margin-top-05 ${
MORE_THAN_THREE_TEAM_LEADERS ? "grid-col-6" : "grid-col-12"
}`}
data-cy={`agreement-meta-team-leader-${index}`}
>
{leader}
</dd>
))}
</dl>
) : (
<dl className="grid-col-4 margin-0">
{renderTerm("team-leaders", "Team Leader(s)", NO_DATA)}
</dl>
)}
</div>
<div className="display-flex">
<dl className="grid-col-4 margin-0">
Expand Down Expand Up @@ -221,7 +266,10 @@ const TeamMembers = ({ teamMembers, renderTerm }) => {
}

return (
<dl className="margin-0 margin-top-2">
<dl
className="margin-0 margin-top-2"
data-cy="agreement-meta-team-members"
>
<dt className="margin-0 text-base-dark grid-col-12">Team Members</dt>
{teamMemberRows.map((row, rowIndex) => (
<dd
Expand All @@ -248,7 +296,10 @@ const TeamMembers = ({ teamMembers, renderTerm }) => {

// Single column layout for 3 or fewer team members
return (
<dl className="margin-0 margin-top-2">
<dl
className="margin-0 margin-top-2"
data-cy="agreement-meta-team-members"
>
<dt className="margin-0 text-base-dark grid-col-12">Team Members</dt>
{teamMembers.map((member) => (
<dd
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
<AgreementMetaAccordion
agreement={agreement}
instructions="test instructions"
projectOfficerName="John Doe"
convertCodeForDisplay={convertCodeForDisplay}
/>
);

expect(screen.getByText("Division Director(s)")).toBeInTheDocument();
expect(screen.getByText("Jane Smith")).toBeInTheDocument();
});

it("should display team leader names when present", () => {
render(
<AgreementMetaAccordion
agreement={agreement}
instructions="test instructions"
projectOfficerName="John Doe"
convertCodeForDisplay={convertCodeForDisplay}
/>
);

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(
<AgreementMetaAccordion
agreement={agreementWithoutDDs}
instructions="test instructions"
projectOfficerName="John Doe"
convertCodeForDisplay={convertCodeForDisplay}
/>
);

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(
<AgreementMetaAccordion
agreement={agreementWithoutTLs}
instructions="test instructions"
projectOfficerName="John Doe"
convertCodeForDisplay={convertCodeForDisplay}
/>
);

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 = {
Expand Down
2 changes: 2 additions & 0 deletions frontend/src/tests/data.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down