diff --git a/src/site/stages/build/drupal/static-data-files/digitalForm/index.unit.spec.js b/src/site/stages/build/drupal/static-data-files/digitalForm/index.unit.spec.js index d95a670227..bd504fb47e 100644 --- a/src/site/stages/build/drupal/static-data-files/digitalForm/index.unit.spec.js +++ b/src/site/stages/build/drupal/static-data-files/digitalForm/index.unit.spec.js @@ -16,7 +16,37 @@ describe('digitalForm', () => { describe('postProcess', () => { it('imports postProcessDigitalForm', () => { - expect(() => postProcess('test result')).to.not.throw(); + const queryResult = { + data: { + nodeQuery: { + entities: [ + { + nid: 71002, + entityLabel: 'Form with One Step', + fieldVaFormNumber: '11111', + fieldOmbNumber: '1111-1111', + fieldChapters: [ + { + entity: { + entityId: '157904', + type: { + entity: { + entityId: 'digital_form_name_and_date_of_bi', + entityLabel: 'Name and Date of Birth', + }, + }, + fieldTitle: 'The Only Step', + fieldIncludeDateOfBirth: true, + }, + }, + ], + }, + ], + }, + }, + }; + + expect(() => postProcess(queryResult)).to.not.throw(); }); }); }); diff --git a/src/site/stages/build/drupal/static-data-files/digitalForm/postProcessDigitalForm.js b/src/site/stages/build/drupal/static-data-files/digitalForm/postProcessDigitalForm.js index 71fabf2199..3541cb8a8b 100644 --- a/src/site/stages/build/drupal/static-data-files/digitalForm/postProcessDigitalForm.js +++ b/src/site/stages/build/drupal/static-data-files/digitalForm/postProcessDigitalForm.js @@ -1,3 +1,52 @@ -const postProcessDigitalForm = queryResult => queryResult; +const { logDrupal } = require('../../utilities-drupal'); + +const extractAdditionalFields = entity => { + const additionalFields = {}; + + if (entity.type.entity.entityId === 'digital_form_name_and_date_of_bi') { + additionalFields.includeDateOfBirth = entity.fieldIncludeDateOfBirth; + } + + return additionalFields; +}; +const extractForms = resultObject => resultObject?.data?.nodeQuery?.entities; + +const normalizeChapter = ({ entity }) => { + return { + id: parseInt(entity.entityId, 10), + chapterTitle: entity.fieldTitle, + type: entity.type.entity.entityId, + pageTitle: entity.type.entity.entityLabel, + additionalFields: extractAdditionalFields(entity), + }; +}; + +const normalizeForm = (form, logger = logDrupal) => { + try { + return { + cmsId: form.nid, + formId: form.fieldVaFormNumber, + title: form.entityLabel, + ombNumber: form.fieldOmbNumber, + chapters: form.fieldChapters.map(normalizeChapter), + }; + } catch (error) { + logger(`There was an error with this form: ${error}`); + return {}; + } +}; + +const postProcessDigitalForm = (queryResult, logger = logDrupal) => { + // queryResult was already parsed by graphQLApiClient + const forms = extractForms(queryResult); + + // will be turned into JSON by writeProcessedDataFilesToCache + if (forms) { + return forms.map(form => normalizeForm(form, logger)); + } + + logger(`Malformed result query: ${queryResult}`); + return []; +}; module.exports.postProcessDigitalForm = postProcessDigitalForm; diff --git a/src/site/stages/build/drupal/static-data-files/digitalForm/postProcessDigitalForm.unit.spec.js b/src/site/stages/build/drupal/static-data-files/digitalForm/postProcessDigitalForm.unit.spec.js index d0be9f34fc..d693ef648b 100644 --- a/src/site/stages/build/drupal/static-data-files/digitalForm/postProcessDigitalForm.unit.spec.js +++ b/src/site/stages/build/drupal/static-data-files/digitalForm/postProcessDigitalForm.unit.spec.js @@ -1,12 +1,180 @@ /* eslint-disable @department-of-veterans-affairs/axe-check-required */ import { expect } from 'chai'; +import sinon from 'sinon'; const { postProcessDigitalForm } = require('./postProcessDigitalForm'); describe('postProcessDigitalForm', () => { - it('returns queryResult with no changes', () => { - const queryResult = { data: { form: {} } }; - expect(postProcessDigitalForm(queryResult)).to.eq(queryResult); + context('with a well-formed query result', () => { + const queryResult = { + data: { + nodeQuery: { + entities: [ + { + nid: 71002, + entityLabel: 'Form with One Step', + fieldVaFormNumber: '11111', + fieldOmbNumber: '1111-1111', + fieldChapters: [ + { + entity: { + entityId: '157904', + type: { + entity: { + entityId: 'digital_form_name_and_date_of_bi', + entityLabel: 'Name and Date of Birth', + }, + }, + fieldTitle: 'The Only Step', + fieldIncludeDateOfBirth: true, + }, + }, + ], + }, + { + nid: 71004, + entityLabel: 'Form with Two Steps', + fieldVaFormNumber: '222222', + fieldOmbNumber: '1212-1212', + fieldChapters: [ + { + entity: { + entityId: '157906', + type: { + entity: { + entityId: 'digital_form_name_and_date_of_bi', + entityLabel: 'Name and Date of Birth', + }, + }, + fieldTitle: 'First Step', + fieldIncludeDateOfBirth: true, + }, + }, + { + entity: { + entityId: '157907', + type: { + entity: { + entityId: 'digital_form_name_and_date_of_bi', + entityLabel: 'Name and Date of Birth', + }, + }, + fieldTitle: 'Second Step', + fieldIncludeDateOfBirth: false, + }, + }, + ], + }, + ], + }, + }, + }; + let processedResult; + + beforeEach(() => { + processedResult = postProcessDigitalForm(queryResult); + }); + + it('returns a normalized JSON object', () => { + const testForm = processedResult[1]; + const testChapter = testForm.chapters[1]; + + expect(processedResult.length).to.eq(2); + expect(testForm.cmsId).to.eq(71004); + expect(testForm.formId).to.eq('222222'); + expect(testForm.title).to.eq('Form with Two Steps'); + expect(testForm.ombNumber).to.eq('1212-1212'); + expect(testForm.chapters.length).to.eq(2); + expect(testChapter.id).to.eq(157907); + expect(testChapter.chapterTitle).to.eq('Second Step'); + expect(testChapter.type).to.eq('digital_form_name_and_date_of_bi'); + expect(testChapter.pageTitle).to.eq('Name and Date of Birth'); + expect(Object.keys(testChapter.additionalFields).length).to.eq(1); + }); + + context('with a Name and Date of Birth step', () => { + it('includes the appropriate fields', () => { + const { additionalFields } = processedResult[1].chapters[1]; + + expect(additionalFields.includeDateOfBirth).to.eq(false); + }); + }); + }); + + context('with a malformed query result', () => { + let queryResult; + let processedResult; + let logger; + + beforeEach(() => { + logger = sinon.spy(); + }); + + context('when the entire query is bad', () => { + beforeEach(() => { + queryResult = { + wrongKey: 'oops! bad data!', + }; + processedResult = postProcessDigitalForm(queryResult, logger); + }); + + it('logs the error', () => { + expect(logger.calledOnce).to.eq(true); + }); + + it('returns an empty array', () => { + expect(processedResult.length).to.eq(0); + }); + }); + + context('when only one form is malformed', () => { + beforeEach(() => { + queryResult = { + data: { + nodeQuery: { + entities: [ + { + nid: 71002, + entityLabel: 'Form with One Step', + fieldVaFormNumber: '11111', + fieldOmbNumber: '1111-1111', + fieldChapters: [ + { + entity: { + entityId: '157904', + type: { + entity: { + entityId: 'digital_form_name_and_date_of_bi', + entityLabel: 'Name and Date of Birth', + }, + }, + fieldTitle: 'The Only Step', + fieldIncludeDateOfBirth: true, + }, + }, + ], + }, + { + nid: '71004', + entityLabel: 'This form has problems', + fieldVaFormNumber: 222222, + fieldChapters: 'no chapters', + }, + ], + }, + }, + }; + processedResult = postProcessDigitalForm(queryResult, logger); + }); + + it('logs the error', () => { + expect(logger.calledOnce).to.eq(true); + }); + + it('returns the other forms', () => { + expect(processedResult[0].cmsId).to.eq(71002); + }); + }); }); });