From 26266c041c60e968efda6c225944936d4f76c00e Mon Sep 17 00:00:00 2001 From: Steve Astels Date: Fri, 26 Oct 2018 13:51:40 -0400 Subject: [PATCH] Refactor card footer (#1373) --- __tests__/components/benefit_card_test.js | 4 +- __tests__/components/benefit_list_test.js | 2 + __tests__/components/benefit_pane_test.js | 8 ++-- __tests__/components/card_footer_test.js | 26 ++++++---- __tests__/fixtures/eligibilityPaths.js | 12 ++--- __tests__/pages/all-benefits_test.js | 2 + components/card_footer.js | 48 ++++++++++++++----- store.js | 2 +- utils/airtable_es2015.js | 2 +- ...able_constants.js => hardcoded_strings.js} | 3 ++ 10 files changed, 75 insertions(+), 34 deletions(-) rename utils/{airtable_constants.js => hardcoded_strings.js} (67%) diff --git a/__tests__/components/benefit_card_test.js b/__tests__/components/benefit_card_test.js index 165eb94cb..c01f0c170 100644 --- a/__tests__/components/benefit_card_test.js +++ b/__tests__/components/benefit_card_test.js @@ -5,6 +5,7 @@ import eligibilityPathsFixture from "../fixtures/eligibilityPaths"; import { BenefitCard } from "../../components/benefit_cards"; import benefitsFixture from "../fixtures/benefits"; import needsFixture from "../fixtures/needs"; +import multipleChoiceOptionsFixture from "../fixtures/multiple_choice_options"; const { axe, toHaveNoViolations } = require("jest-axe"); expect.extend(toHaveNoViolations); @@ -49,7 +50,8 @@ describe("BenefitCard", () => { selectedNeeds: {}, benefits: benefitsFixture, favouriteBenefits: [], - eligibilityPaths: eligibilityPathsFixture + eligibilityPaths: eligibilityPathsFixture, + multipleChoiceOptions: multipleChoiceOptionsFixture }; props.store = mockStore(reduxData); diff --git a/__tests__/components/benefit_list_test.js b/__tests__/components/benefit_list_test.js index 0d37e46cd..fc1b5e760 100644 --- a/__tests__/components/benefit_list_test.js +++ b/__tests__/components/benefit_list_test.js @@ -6,6 +6,7 @@ expect.extend(toHaveNoViolations); import benefitsFixture from "../fixtures/benefits"; import eligibilityPathsFixture from "../fixtures/eligibilityPaths"; +import multipleChoiceOptionsFixture from "../fixtures/multiple_choice_options"; import configureStore from "redux-mock-store"; import needsFixture from "../fixtures/needs"; @@ -31,6 +32,7 @@ describe("BenefitList", () => { benefits: benefitsFixture, favouriteBenefits: [], eligibilityPaths: eligibilityPathsFixture, + multipleChoiceOptions: multipleChoiceOptionsFixture, needs: needsFixture, selectedNeeds: {} }; diff --git a/__tests__/components/benefit_pane_test.js b/__tests__/components/benefit_pane_test.js index b9b9e4b61..430d26c9b 100644 --- a/__tests__/components/benefit_pane_test.js +++ b/__tests__/components/benefit_pane_test.js @@ -9,6 +9,7 @@ import benefitsFixture from "../fixtures/benefits"; import eligibilityPathsFixture from "../fixtures/eligibilityPaths"; import needsFixture from "../fixtures/needs"; import questionsFixture from "../fixtures/questions"; +import multipleChoiceOptionsFixture from "../fixtures/multiple_choice_options"; const { axe, toHaveNoViolations } = require("jest-axe"); expect.extend(toHaveNoViolations); @@ -51,6 +52,7 @@ describe("BenefitsPane", () => { benefits: benefitsFixture, favouriteBenefits: [], eligibilityPaths: eligibilityPathsFixture, + multipleChoiceOptions: multipleChoiceOptionsFixture, filteredBenefits: benefitsFixture, needs: needsFixture, searchString: "", @@ -118,10 +120,10 @@ describe("BenefitsPane", () => { ).toEqual(0); }); - it("returns 1 if one selectedEligibilty is selected", () => { + it("returns 1 if one selectedEligibility is selected", () => { mounted().setProps({ profileFilters: { - patronType: eligibilityPathsFixture[0].patronType + patronType: "p1" } }); expect( @@ -148,7 +150,7 @@ describe("BenefitsPane", () => { mounted().setProps({ selectedNeeds: needsSelection }); mounted().setProps({ profileFilters: { - patronType: eligibilityPathsFixture[0].patronType + patronType: "p1" } }); expect( diff --git a/__tests__/components/card_footer_test.js b/__tests__/components/card_footer_test.js index 4f8e9e697..a12bf5f95 100644 --- a/__tests__/components/card_footer_test.js +++ b/__tests__/components/card_footer_test.js @@ -2,6 +2,7 @@ import React from "react"; import { mount } from "enzyme"; import configureStore from "redux-mock-store"; import eligibilityPathsFixture from "../fixtures/eligibilityPaths"; +import multipleChoiceOptionsFixture from "../fixtures/multiple_choice_options"; import { CardFooter } from "../../components/card_footer"; import benefitsFixture from "../fixtures/benefits"; const { axe, toHaveNoViolations } = require("jest-axe"); @@ -19,7 +20,8 @@ describe("CardFooter", () => { mockStore = configureStore(); reduxData = { benefits: benefitsFixture, - eligibilityPaths: eligibilityPathsFixture + eligibilityPaths: eligibilityPathsFixture, + multipleChoiceOptions: multipleChoiceOptionsFixture }; props.store = mockStore(reduxData); @@ -90,14 +92,20 @@ describe("CardFooter", () => { expect(mounted.state().open).toEqual(true); }); - it("has a correct getBenefitIds function", () => { - expect( - mount() - .instance() - .getBenefitIds(reduxData.eligibilityPaths) - ).toEqual({ - veteran: new Set(["benefit_0", "benefit_2"]), - family: new Set(["benefit_2"]) + describe("getBenefitIds", () => { + it("finds service person and family benefits", () => { + expect( + mount() + .instance() + .getBenefitIds( + reduxData.eligibilityPaths, + ["mco_p2", "mco_p3"], + ["mco_p2"] + ) + ).toEqual({ + veteran: new Set(["benefit_1", "benefit_2", "benefit_3"]), + family: new Set(["benefit_2"]) + }); }); }); diff --git a/__tests__/fixtures/eligibilityPaths.js b/__tests__/fixtures/eligibilityPaths.js index 9899a6fc9..d29e4ee83 100644 --- a/__tests__/fixtures/eligibilityPaths.js +++ b/__tests__/fixtures/eligibilityPaths.js @@ -2,26 +2,22 @@ const eligibilityPathsFixture = [ { id: "ep_0", requirements: ["mco_p1", "mco_s1"], - benefits: ["benefit_0", "benefit_2"], - patronType: "service-person" + benefits: ["benefit_0", "benefit_2"] }, { id: "ep_1", requirements: ["mco_p2"], - benefits: ["benefit_2"], - patronType: "family" + benefits: ["benefit_2"] }, { id: "ep_2", requirements: ["mco_p3"], - benefits: ["benefit_1", "benefit_3"], - patronType: "organization" + benefits: ["benefit_1", "benefit_3"] }, { id: "ep_3", requirements: ["mco_p1", "mco_s2"], - benefits: ["benefit_3", "benefit_1"], - patronType: "organization" + benefits: ["benefit_3", "benefit_1"] } ]; diff --git a/__tests__/pages/all-benefits_test.js b/__tests__/pages/all-benefits_test.js index 9f080afd0..c9a598c95 100644 --- a/__tests__/pages/all-benefits_test.js +++ b/__tests__/pages/all-benefits_test.js @@ -7,6 +7,7 @@ import { AllBenefits } from "../../pages/all-benefits"; import benefitsFixture from "../fixtures/benefits"; import eligibilityPathsFixture from "../fixtures/eligibilityPaths"; import needsFixture from "../fixtures/needs"; +import multipleChoiceOptionsFixture from "../fixtures/multiple_choice_options"; import translate from "../fixtures/translate"; import configureStore from "redux-mock-store"; @@ -46,6 +47,7 @@ describe("AllBenefits", () => { cookiesDisabled: false, benefits: benefitsFixture, eligibilityPaths: eligibilityPathsFixture, + multipleChoiceOptions: multipleChoiceOptionsFixture, needs: needsFixture, searchString: "", selectedNeeds: {}, diff --git a/components/card_footer.js b/components/card_footer.js index 11000e5b7..fbf348fd0 100644 --- a/components/card_footer.js +++ b/components/card_footer.js @@ -8,6 +8,7 @@ import EmbeddedBenefitCard from "./embedded_benefit_card"; import { cx, css } from "react-emotion"; import { connect } from "react-redux"; import { globalTheme } from "../theme"; +var constants = require("../utils/hardcoded_strings"); const headerDesc = css` flex-grow: 1; @@ -117,17 +118,25 @@ export class CardFooter extends Component { return matchingBenefits; }; - getBenefitIds = eligibilityPaths => { + getBenefitIds = ( + eligibilityPaths, + servicePersonOptionIds, + familyOptionIds + ) => { let veteranBenefitIds = []; let familyBenefitIds = []; eligibilityPaths.forEach(ep => { - if (ep.patronType === "service-person") { - veteranBenefitIds = veteranBenefitIds.concat(ep.benefits); - } - if (ep.patronType === "family") { - familyBenefitIds = familyBenefitIds.concat(ep.benefits); - } + servicePersonOptionIds.forEach(id => { + if (ep.requirements && ep.requirements.indexOf(id) !== -1) { + veteranBenefitIds = veteranBenefitIds.concat(ep.benefits); + } + }); + familyOptionIds.forEach(id => { + if (ep.requirements && ep.requirements.indexOf(id) !== -1) { + familyBenefitIds = familyBenefitIds.concat(ep.benefits); + } + }); }); return { veteran: new Set(veteranBenefitIds), @@ -140,7 +149,22 @@ export class CardFooter extends Component { const childBenefits = benefit.childBenefits ? benefits.filter(ab => benefit.childBenefits.indexOf(ab.id) > -1) : []; - const benefitIds = this.getBenefitIds(this.props.eligibilityPaths); + + const servicePersonOptionIds = this.props.multipleChoiceOptions + .filter( + mco => constants.servicePersonOptions.indexOf(mco.variable_name) !== -1 + ) + .map(mco => mco.id); + + const familyOptionIds = this.props.multipleChoiceOptions + .filter(mco => constants.familyOptions.indexOf(mco.variable_name) !== -1) + .map(mco => mco.id); + + const benefitIds = this.getBenefitIds( + this.props.eligibilityPaths, + servicePersonOptionIds, + familyOptionIds + ); const veteranBenefits = this.getMatchingBenefits( childBenefits, benefitIds.veteran @@ -229,15 +253,17 @@ export class CardFooter extends Component { } const mapStateToProps = reduxState => { return { + benefits: reduxState.benefits, eligibilityPaths: reduxState.eligibilityPaths, - benefits: reduxState.benefits + multipleChoiceOptions: reduxState.multipleChoiceOptions }; }; CardFooter.propTypes = { - benefit: PropTypes.object.isRequired, benefits: PropTypes.array.isRequired, - t: PropTypes.func.isRequired, eligibilityPaths: PropTypes.array.isRequired, + multipleChoiceOptions: PropTypes.array.isRequired, + benefit: PropTypes.object.isRequired, + t: PropTypes.func.isRequired, store: PropTypes.object }; diff --git a/store.js b/store.js index 707095597..1bd9a864f 100644 --- a/store.js +++ b/store.js @@ -2,7 +2,7 @@ import lunr from "lunr"; import stemmerSupport from "lunr-languages/lunr.stemmer.support.js"; import fr from "lunr-languages/lunr.fr.js"; import { createStore } from "redux"; -import airtableConstants from "./utils/airtable_constants"; +import airtableConstants from "./utils/hardcoded_strings"; stemmerSupport(lunr); fr(lunr); diff --git a/utils/airtable_es2015.js b/utils/airtable_es2015.js index fe46911c8..65892c56d 100644 --- a/utils/airtable_es2015.js +++ b/utils/airtable_es2015.js @@ -4,7 +4,7 @@ const Logger = require("./logger").default; exports.hydrateFromAirtable = exports.writeFeedback = undefined; -var airtableConstants = require("./airtable_constants"); +var airtableConstants = require("./hardcoded_strings"); var readKey = process.env.AIRTABLE_READ_KEY; var writeKey = process.env.AIRTABLE_WRITE_KEY; var baseKey = process.env.AIRTABLE_BASE_KEY || "appoFDwVvNMRSaO6o"; diff --git a/utils/airtable_constants.js b/utils/hardcoded_strings.js similarity index 67% rename from utils/airtable_constants.js rename to utils/hardcoded_strings.js index bb1147633..9c3dc5856 100644 --- a/utils/airtable_constants.js +++ b/utils/hardcoded_strings.js @@ -9,3 +9,6 @@ exports.tableNames = [ "questionDisplayLogic", "questionClearLogic" ]; + +exports.servicePersonOptions = ["veteran", "servingMember"]; +exports.familyOptions = ["family"];