diff --git a/src/experimentation-opportunities/guidance-high-organic-low-ctr-handler.js b/src/experimentation-opportunities/guidance-high-organic-low-ctr-handler.js index 19503364b..7dfb5c535 100644 --- a/src/experimentation-opportunities/guidance-high-organic-low-ctr-handler.js +++ b/src/experimentation-opportunities/guidance-high-organic-low-ctr-handler.js @@ -11,6 +11,7 @@ */ import { notFound, ok } from '@adobe/spacecat-shared-http-utils'; +import { isNonEmptyArray } from '@adobe/spacecat-shared-utils'; import { convertToOpportunityEntity } from './opportunity-data-mapper.js'; /** @@ -25,6 +26,25 @@ function hasManuallyModifiedSuggestions(suggestions) { }); } +/** + * remove variationEditPageUrl from the variations other than Original + * @param {Array} variations - Array of variation objects + * @returns {Array} - updated Array of variation objects + */ +function updateVariations(variations) { + if (isNonEmptyArray(variations)) { + return variations.map((variation) => { + if (variation?.name === 'Original') { + return variation; + } + // eslint-disable-next-line no-unused-vars + const { variationEditPageUrl, ...variationWithOutEditUrl } = variation; + return variationWithOutEditUrl; + }); + } + return []; +} + export default async function handler(message, context) { const { log, dataAccess } = context; const { Audit, Opportunity, Suggestion } = dataAccess; @@ -79,6 +99,9 @@ export default async function handler(message, context) { await Promise.all(existingSuggestions.map((suggestion) => suggestion.remove())); } + // update suggestions + const updatedVariations = updateVariations(suggestions); + // map the suggestions received from M to PSS const suggestionData = { opportunityId: opportunity.getId(), @@ -86,7 +109,7 @@ export default async function handler(message, context) { rank: 1, status: 'NEW', data: { - variations: suggestions, + variations: updatedVariations, }, kpiDeltas: { estimatedKPILift: 0, diff --git a/test/fixtures/experimentation-opportunities/high-organic-low-ctr-guidance.json b/test/fixtures/experimentation-opportunities/high-organic-low-ctr-guidance.json index 3788e7dee..6913159e4 100644 --- a/test/fixtures/experimentation-opportunities/high-organic-low-ctr-guidance.json +++ b/test/fixtures/experimentation-opportunities/high-organic-low-ctr-guidance.json @@ -17,7 +17,7 @@ { "name": "Original", "changes": [], - "variationEditPageUrl": "", + "variationEditPageUrl": "https://example.com/edit/original", "id": "original", "variationPageUrl": "https://main--wknd--hlxsites.hlx.live/", "explanation": "", diff --git a/test/guidance-handlers/high-organic-low-ctr.test.js b/test/guidance-handlers/high-organic-low-ctr.test.js index 0e1e05e02..83c59d4dc 100644 --- a/test/guidance-handlers/high-organic-low-ctr.test.js +++ b/test/guidance-handlers/high-organic-low-ctr.test.js @@ -143,9 +143,19 @@ describe('high-organic-low-ctr guidance handler tests', () => { expect(Suggestion.create).to.have.been.calledOnce; const suggestionArg = Suggestion.create.getCall(0).args[0]; expect(suggestionArg.type).to.equal('CONTENT_UPDATE'); - expect(suggestionArg.data.variations).to.deep.equal( - guidanceMsgFromMystique.data.suggestions, + // Verify that variations have variationEditPageUrl removed + expect(suggestionArg.data.variations).to.have.lengthOf( + guidanceMsgFromMystique.data.suggestions.length, ); + suggestionArg.data.variations.forEach((variation, index) => { + if (variation.name !== 'Original') { + expect(variation).to.not.have.property('variationEditPageUrl'); + } else { + expect(variation).to.have.property('variationEditPageUrl'); + } + expect(variation.id).to.equal(guidanceMsgFromMystique.data.suggestions[index].id); + expect(variation.name).to.equal(guidanceMsgFromMystique.data.suggestions[index].name); + }); }); it('should update existing opportunity if found', async () => { @@ -357,4 +367,48 @@ describe('high-organic-low-ctr guidance handler tests', () => { expect(legacyOpportunity.save).to.have.been.called; expect(Suggestion.create).to.have.been.calledOnce; }); + + it('should remove variationEditPageUrl when saving suggestions for variations other than Original', async () => { + Opportunity.allBySiteId.resolves([]); + const message = { + auditId: 'audit-id', + siteId: 'site-id', + data: { + url: 'https://abc.com/abc-adoption/account', + guidance: guidanceMsgFromMystique.data.guidance, + suggestions: guidanceMsgFromMystique.data.suggestions, + }, + }; + + await handler(message, context); + + expect(Suggestion.create).to.have.been.calledOnce; + const suggestionArg = Suggestion.create.getCall(0).args[0]; + + // Verify that variations exist in the created suggestion + expect(suggestionArg.data.variations).to.be.an('array'); + expect(suggestionArg.data.variations).to.have.lengthOf(2); + + // Verify that variationEditPageUrl is removed from all variations + suggestionArg.data.variations.forEach((variation) => { + if (variation.name === 'Original') { + expect( + variation.variationEditPageUrl, + ).to.equal(guidanceMsgFromMystique.data.suggestions[0].variationEditPageUrl); + return; + } + expect(variation).to.not.have.property('variationEditPageUrl'); + // Verify other properties are still present + expect(variation).to.have.property('name'); + expect(variation).to.have.property('id'); + expect(variation).to.have.property('variationPageUrl'); + expect(variation).to.have.property('previewImage'); + }); + + // Verify specific variations are correct + expect(suggestionArg.data.variations[0].name).to.equal('Original'); + expect(suggestionArg.data.variations[0].id).to.equal('original'); + expect(suggestionArg.data.variations[1].name).to.equal('Variation 1'); + expect(suggestionArg.data.variations[1].id).to.equal('variation-1'); + }); });