diff --git a/src/forms-opportunities/oppty-handlers/accessibility-handler.js b/src/forms-opportunities/oppty-handlers/accessibility-handler.js
index df1a57901..6131e276f 100644
--- a/src/forms-opportunities/oppty-handlers/accessibility-handler.js
+++ b/src/forms-opportunities/oppty-handlers/accessibility-handler.js
@@ -153,9 +153,9 @@ async function createOrUpdateOpportunity(auditId, siteId, a11yData, context, opp
const a11yOpptyData = filteredA11yData.map((a11yOpty) => {
const a11yIssues = a11yOpty.a11yIssues.map((issue) => ({
...issue,
- successCriterias: issue.successCriterias.map(
- (criteria) => getSuccessCriteriaDetails(criteria),
- ),
+ successCriterias: Array.isArray(issue.successCriterias) && issue.successCriterias.length > 0
+ ? issue.successCriterias.map((criteria) => getSuccessCriteriaDetails(criteria))
+ : [],
}));
return {
form: a11yOpty.form,
diff --git a/test/audits/forms/accessibility-handler.test.js b/test/audits/forms/accessibility-handler.test.js
index 852dc68c7..f52c07d9a 100644
--- a/test/audits/forms/accessibility-handler.test.js
+++ b/test/audits/forms/accessibility-handler.test.js
@@ -137,6 +137,88 @@ describe('Forms Opportunities - Accessibility Handler', () => {
});
});
+ describe('successCriterias normalization', () => {
+ it('should set successCriterias to [] when missing or empty', async () => {
+ // Arrange
+ const message = {
+ auditId: 'test-audit-id',
+ siteId: 'test-site-id',
+ data: {
+ a11y: [{
+ form: 'https://example.com/form-empty',
+ formSource: '#form-empty',
+ a11yIssues: [
+ {
+ issue: 'Issue without criteria',
+ level: 'error',
+ successCriterias: null,
+ htmlWithIssues: ['
broken
'],
+ recommendation: 'Fix it',
+ },
+ {
+ issue: 'Issue with empty criteria',
+ level: 'error',
+ successCriterias: [],
+ htmlWithIssues: ['broken'],
+ recommendation: 'Fix it too',
+ },
+ ],
+ }],
+ },
+ };
+
+ const sandbox = sinon.createSandbox();
+ const context = new MockContextBuilder()
+ .withSandbox(sandbox)
+ .withOverrides({
+ dataAccess: {
+ Opportunity: {
+ allBySiteIdAndStatus: sandbox.stub().resolves([]),
+ create: sandbox.stub().resolves({ getId: () => 'new-oppty-id' }),
+ findById: sandbox.stub().resolves(null),
+ },
+ Site: {
+ findById: sandbox.stub().resolves({
+ getDeliveryType: sinon.stub().returns('aem'),
+ getBaseURL: sinon.stub().returns('https://example.com'),
+ }),
+ },
+ },
+ sqs: {
+ sendMessage: sandbox.stub().resolves(),
+ },
+ env: {
+ QUEUE_SPACECAT_TO_MYSTIQUE: 'test-queue',
+ },
+ log: {
+ info: sinon.stub(),
+ error: sinon.stub(),
+ debug: sinon.stub(),
+ },
+ })
+ .build();
+
+ // Import with stubbed isAuditEnabledForSite
+ const accessibilityHandlerModule = await esmock('../../../src/forms-opportunities/oppty-handlers/accessibility-handler.js', {
+ '../../../src/common/audit-utils.js': {
+ isAuditEnabledForSite: sandbox.stub().resolves(false),
+ },
+ });
+
+ // Act
+ await accessibilityHandlerModule.default(message, context);
+
+ // Assert
+ expect(context.dataAccess.Opportunity.create).to.have.been.calledOnce;
+ const createdArg = context.dataAccess.Opportunity.create.getCall(0).args[0];
+ const createdIssues = createdArg.data.accessibility[0].a11yIssues;
+ expect(createdIssues[0].successCriterias).to.deep.equal([]);
+ expect(createdIssues[1].successCriterias).to.deep.equal([]);
+
+ sandbox.restore();
+ });
+ });
+
describe('createAccessibilityOpportunity', () => {
let context;
const siteId = 'test-site-id';