-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
VATEAM-88634: Create a normalization layer for Digital Forms (#2215)
* Add normalizeForms step to postProcessDigitalForm * Add subtitle to normalized form * Add OMB Number to normalized form * Normalize chapters for each form * Add additional fields for Name and Date of Birth step * Fix import spec * Remove redundant JSON parsing * Remove JSON conversion from returned value * Add formID and rename id to cmsId * Remove subTitle * Refactor normalizeForms method * Refactor normalizeChapters * Defend against malformed query responses * Remove unused import
- Loading branch information
1 parent
66f5048
commit e3d84e6
Showing
3 changed files
with
252 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
51 changes: 50 additions & 1 deletion
51
src/site/stages/build/drupal/static-data-files/digitalForm/postProcessDigitalForm.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; |
174 changes: 171 additions & 3 deletions
174
...ite/stages/build/drupal/static-data-files/digitalForm/postProcessDigitalForm.unit.spec.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
}); | ||
}); | ||
}); | ||
}); |