Skip to content

Commit

Permalink
MLR E2E Updates (#11389)
Browse files Browse the repository at this point in the history
Co-authored-by: Nicholas Summers <nick@coforma.io>
I'm not resolving nick's 22 comments
  • Loading branch information
Nick Summers committed Aug 1, 2023
1 parent 366cba6 commit 5dccb72
Show file tree
Hide file tree
Showing 24 changed files with 944 additions and 645 deletions.
28 changes: 14 additions & 14 deletions .github/workflows/deploy.yml
Expand Up @@ -22,12 +22,9 @@ jobs:
run: ./.github/build-vars.sh set_values
env:
CODE_CLIMATE_ID: ${{ secrets.CODE_CLIMATE_ID }}
- name: read .nvmrc
id: node_version
run: echo ::set-output name=NODE_VERSION::$(cat .nvmrc)
- uses: actions/setup-node@v1
- uses: actions/setup-node@v3
with:
node-version: ${{ steps.node_version.outputs.NODE_VERSION }}
node-version-file: ".nvmrc"
- uses: actions/cache@v2
with:
path: |
Expand Down Expand Up @@ -89,12 +86,9 @@ jobs:
run: ./.github/github-lock.sh $branch_name
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: read .nvmrc
id: node_version
run: echo ::set-output name=NODE_VERSION::$(cat .nvmrc)
- uses: actions/setup-node@v1
- uses: actions/setup-node@v3
with:
node-version: ${{ steps.node_version.outputs.NODE_VERSION }}
node-version-file: ".nvmrc"
- uses: actions/cache@v2
with:
path: |
Expand Down Expand Up @@ -131,9 +125,11 @@ jobs:
if: ${{ github.ref != 'refs/heads/production' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Checkout
uses: actions/checkout@v3

- name: Run Cypress Tests
uses: cypress-io/github-action@v4.2.0
uses: cypress-io/github-action@v5
with:
working-directory: tests/cypress
spec: |
Expand All @@ -148,6 +144,7 @@ jobs:
CYPRESS_STATE_USER_PASSWORD: ${{ secrets.CYPRESS_STATE_USER_PASSWORD }}
CYPRESS_ADMIN_USER_EMAIL: ${{ secrets.CYPRESS_ADMIN_USER_EMAIL }}
CYPRESS_ADMIN_USER_PASSWORD: ${{ secrets.CYPRESS_ADMIN_USER_PASSWORD }}

- name: Upload screenshots
uses: actions/upload-artifact@v2
if: failure()
Expand All @@ -163,9 +160,11 @@ jobs:
if: ${{ github.ref != 'refs/heads/production' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Checkout
uses: actions/checkout@v3

- name: Check Project A11y
uses: cypress-io/github-action@v4.2.0
uses: cypress-io/github-action@v5
with:
working-directory: tests/cypress
spec: tests/accessibility/*.feature
Expand All @@ -179,6 +178,7 @@ jobs:
CYPRESS_ADMIN_USER_EMAIL: ${{ secrets.CYPRESS_ADMIN_USER_EMAIL }}
CYPRESS_ADMIN_USER_PASSWORD: ${{ secrets.CYPRESS_ADMIN_USER_PASSWORD }}
RUN_PA11Y: true

- name: Upload screenshots
uses: actions/upload-artifact@v2
if: failure()
Expand Down
Expand Up @@ -25,8 +25,8 @@ describe("ExportedEntityDetailsTable", () => {

const expectedTextContent = [
"N/A",
"mock modal overlay text field",
"1",
"mock text field",
"mock number field",
"Not answered; required",
];

Expand Down
1 change: 1 addition & 0 deletions services/ui-src/src/components/index.ts
Expand Up @@ -98,6 +98,7 @@ export { ModalDrawerReportPage } from "./reports/ModalDrawerReportPage";
export { ModalOverlayReportPage } from "./reports/ModalOverlayReportPage";
export { ReportPageFooter } from "./reports/ReportPageFooter";
export { ReportContext, ReportProvider } from "./reports/ReportProvider";
export { EntityContext, EntityProvider } from "./reports/EntityProvider";
// statusing
export { StatusTable } from "./statusing/StatusTable";
// tables
Expand Down
199 changes: 135 additions & 64 deletions services/ui-src/src/components/overlays/EntityDetailsOverlay.test.tsx
@@ -1,82 +1,153 @@
import { EntityProvider } from "components/reports/EntityProvider";
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
// components
import { EntityDetailsOverlay } from "./EntityDetailsOverlay";
// utils
import {
mockMlrReportContext,
mockAdminUser,
mockEntityDetailsContext,
mockMLRReportEntityStartedFieldData,
mockModalOverlayForm,
mockStateUser,
RouterWrappedComponent,
} from "utils/testing/setupJest";
import { EntityDetailsOverlay } from "./EntityDetailsOverlay";
import form from "../../forms/mlr/mlr.json";
import { EntityType, FormJson } from "types";
import { render } from "@testing-library/react";
import { axe } from "jest-axe";
import userEvent from "@testing-library/user-event";
import { ReportContext } from "components/reports/ReportProvider";

const formJSON: FormJson = form.routes[1].overlayForm!;
const mockClose = jest.fn();
const mockSidebarHidden = jest.fn();

const overlayProps = {
entityType: "program" as EntityType,
verbiage: {},
form: formJSON,
selectedEntity: mockMlrReportContext.report.fieldData.program[1],
closeEntityDetailsOverlay: mockClose,
setSidebarHidden: mockSidebarHidden,
};

const mockUpdate = jest.fn();
const mockedReportContext = {
...mockMlrReportContext,
updateReport: mockUpdate,
};

const entityDetailsOverlay = (
import { useUser } from "utils";
// verbiage
import accordionVerbiage from "../../verbiage/pages/accordion";
import overlayVerbiage from "../../verbiage/pages/overlays";
import { EntityContext } from "components";

const mockCloseEntityDetailsOverlay = jest.fn();
const mockOnSubmit = jest.fn();

jest.mock("utils/auth/useUser");
const mockedUseUser = useUser as jest.MockedFunction<typeof useUser>;

const entityDetailsOverlayComponentStateUser = (
<RouterWrappedComponent>
<ReportContext.Provider value={mockedReportContext}>
<EntityProvider>
<EntityDetailsOverlay {...overlayProps} />
</EntityProvider>
</ReportContext.Provider>
<EntityContext.Provider value={mockEntityDetailsContext}>
<EntityDetailsOverlay
closeEntityDetailsOverlay={mockCloseEntityDetailsOverlay}
entityType={"program"}
entities={[mockMLRReportEntityStartedFieldData.program[0]]}
form={mockModalOverlayForm}
onSubmit={mockOnSubmit}
disabled={false}
selectedEntity={mockMLRReportEntityStartedFieldData.program[0]}
/>
</EntityContext.Provider>
</RouterWrappedComponent>
);

describe("Test EntityDetailsOverlay", () => {
it("Should show a close button", async () => {
const { findByText } = render(entityDetailsOverlay);
expect(await findByText("Return to MLR Reporting")).toBeVisible();
});
const entityDetailsOverlayComponentAdminUser = (
<RouterWrappedComponent>
<EntityContext.Provider value={mockEntityDetailsContext}>
<EntityDetailsOverlay
closeEntityDetailsOverlay={mockCloseEntityDetailsOverlay}
entityType={"program"}
entities={[mockMLRReportEntityStartedFieldData.program[0]]}
form={mockModalOverlayForm}
onSubmit={mockOnSubmit}
disabled={true}
selectedEntity={mockMLRReportEntityStartedFieldData.program[0]}
/>
</EntityContext.Provider>
</RouterWrappedComponent>
);

it("Should invoke the close function when you click the close button.", async () => {
const { findByText } = render(entityDetailsOverlay);
const closeButton = await findByText("Return to MLR Reporting");
await userEvent.click(closeButton);
expect(mockClose).toHaveBeenCalled();
describe("Test EntityDetailsOverlayV2 (empty state)", () => {
beforeEach(() => {
jest.clearAllMocks();
});

it("Should set the sidebar hidden on load", () => {
render(entityDetailsOverlay);
expect(mockSidebarHidden).toHaveBeenCalledWith(true);
const user = userEvent.setup();
const selectedEntity = mockMLRReportEntityStartedFieldData.program[0];

it("should render the initial view for a state user", async () => {
mockedUseUser.mockReturnValue(mockStateUser);
render(entityDetailsOverlayComponentStateUser);

// Close out of the Overlay it opened
const closeButton = screen.getByText("Return to MLR Reporting");
expect(closeButton).toBeVisible();

// Check if header is visible on load - H2
expect(
screen.getByText(overlayVerbiage.MLR.intro.subsection)
).toBeVisible();

// Check if accordion is showing
const accordionHeader = accordionVerbiage.MLR.formIntro.buttonLabel;
expect(screen.getByText(accordionHeader)).toBeVisible();

// Check if MLR Report For is showing the correct Entity Data
const reportPlanName = selectedEntity.report_planName;
const reportProgramName = selectedEntity.report_programName;
const eligibilityGroup = selectedEntity.report_eligibilityGroup[0].value;
const reportingPeriod = `${selectedEntity.report_reportingPeriodStartDate} to ${selectedEntity.report_reportingPeriodEndDate}`;

expect(screen.getByText(reportPlanName)).toBeVisible();
expect(screen.getByText(reportProgramName)).toBeVisible();
expect(screen.getByText(eligibilityGroup)).toBeVisible();
expect(screen.getByText(reportingPeriod)).toBeVisible();

// Make sure footer button appears correctly
const saveAndReturn = screen.getByText("Save & return");
expect(saveAndReturn).toBeVisible();
});

it("Should set the sidebar visible on unmount", () => {
const { unmount } = render(entityDetailsOverlay);
unmount();
expect(mockSidebarHidden).toHaveBeenCalledWith(false);
it("should render the initial view for an admin", async () => {
mockedUseUser.mockReturnValue(mockAdminUser);
render(entityDetailsOverlayComponentAdminUser);

// Close out of the Overlay it opened
const closeButton = screen.getByText("Return to MLR Reporting");
expect(closeButton).toBeVisible();

// Check if header is visible on load - H2
expect(
screen.getByText(overlayVerbiage.MLR.intro.subsection)
).toBeVisible();

// Check if accordion is showing
const accordionHeader = accordionVerbiage.MLR.formIntro.buttonLabel;
expect(screen.getByText(accordionHeader)).toBeVisible();

// Check if MLR Report For is showing the correct Entity Data
const reportPlanName = selectedEntity.report_planName;
const reportProgramName = selectedEntity.report_programName;
const eligibilityGroup = selectedEntity.report_eligibilityGroup[0].value;
const reportingPeriod = `${selectedEntity.report_reportingPeriodStartDate} to ${selectedEntity.report_reportingPeriodEndDate}`;

expect(screen.getByText(reportPlanName)).toBeVisible();
expect(screen.getByText(reportProgramName)).toBeVisible();
expect(screen.getByText(eligibilityGroup)).toBeVisible();
expect(screen.getByText(reportingPeriod)).toBeVisible();

// Make sure footer button appears correctly for admins
const returnButton = screen.getByText("Return");
expect(returnButton).toBeVisible();
});

it("Should submit entity info when clicking submit", async () => {
const { findByText } = render(entityDetailsOverlay);
const submitButton = await findByText("Save & return");
await userEvent.click(submitButton);
expect(mockSidebarHidden).toHaveBeenCalledWith(false);
expect(mockClose).toHaveBeenCalled();
it("should call the close overlay function when clicking Return to MLR", async () => {
// Set as State User
mockedUseUser.mockReturnValue(mockStateUser);
render(entityDetailsOverlayComponentStateUser);

// Close out of the Overlay it opened
const closeButton = screen.getByText("Return to MLR Reporting");
await user.click(closeButton);
expect(mockCloseEntityDetailsOverlay).toBeCalled();
});
});

describe("Test EntityDetailsOverlay accessibility", () => {
it("Should not have basic accessibility issues", async () => {
const { container } = render(entityDetailsOverlay);
const results = await axe(container);
expect(results).toHaveNoViolations();
it("should call the close overlay function when clicking Return to MLR as an Admin", async () => {
// Set as State User
mockedUseUser.mockReturnValue(mockAdminUser);
render(entityDetailsOverlayComponentAdminUser);

// Close out of the Overlay it opened
const closeButton = screen.getByText("Return to MLR Reporting");
await user.click(closeButton);
expect(mockCloseEntityDetailsOverlay).toBeCalled();
});
});

0 comments on commit 5dccb72

Please sign in to comment.