Skip to content

Commit

Permalink
VATEAM-88634: Create a normalization layer for Digital Forms (#2215)
Browse files Browse the repository at this point in the history
* 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
derekhouck authored and ryguyk committed Sep 12, 2024
1 parent 01edd06 commit fd22547
Show file tree
Hide file tree
Showing 3 changed files with 252 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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();
});
});
});
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;
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);
});
});
});
});

0 comments on commit fd22547

Please sign in to comment.