diff --git a/dotcom-rendering/src/model/enhance-product-summary.test.ts b/dotcom-rendering/src/model/enhance-product-summary.test.ts index 7e345f3e8c8..fd6bcc4be68 100644 --- a/dotcom-rendering/src/model/enhance-product-summary.test.ts +++ b/dotcom-rendering/src/model/enhance-product-summary.test.ts @@ -224,6 +224,7 @@ describe('enhanceProductSummary', () => { pageId: allowedPageId, serverSideABTests: { 'thefilter-at-a-glance-redesign': 'carousel' }, renderingTarget: 'Web', + filterAtAGlanceEnabled: true, })(input); const carousel = findCarousel(output); @@ -265,6 +266,7 @@ describe('enhanceProductSummary', () => { pageId: allowedPageId, serverSideABTests: { 'thefilter-at-a-glance-redesign': 'stacked' }, renderingTarget: 'Web', + filterAtAGlanceEnabled: true, })(input); const stacked = findStacked(output); @@ -306,6 +308,49 @@ describe('enhanceProductSummary', () => { pageId: allowedPageId, serverSideABTests: { 'thefilter-at-a-glance-redesign': 'stacked' }, renderingTarget: 'Apps', + filterAtAGlanceEnabled: true, + })(input); + + const stacked = findStacked(output); + + expect(stacked).toBeUndefined(); + }); + + it('does not return stacked cards when the filterAtAGlance switch is OFF', () => { + const allowedPageId = + 'thefilter/test-article-example-for-product-summary'; + + const input = [ + atAGlanceHeading(), + linkElement( + 'https://www.homebase.co.uk/en-uk/tower-airx-t17166-5l-grey-single-basket-air-fryer-digital-air-fryer/p/0757395', + 'Buy now', + ), + linkElement( + 'https://www.lakeland.co.uk/27537/lakeland-slimline-air-fryer-black-8l', + 'Buy now', + ), + linkElement( + 'https://ninjakitchen.co.uk/product/ninja-double-stack-xl-9-5l-air-fryer-sl400uk-zidSL400UK', + 'Buy now', + ), + dividerElement(), + productElement([ + 'https://www.homebase.co.uk/en-uk/tower-airx-t17166-5l-grey-single-basket-air-fryer-digital-air-fryer/p/0757395', + ]), + productElement([ + 'https://www.lakeland.co.uk/27537/lakeland-slimline-air-fryer-black-8l', + ]), + productElement([ + 'https://ninjakitchen.co.uk/product/ninja-double-stack-xl-9-5l-air-fryer-sl400uk-zidSL400UK', + ]), + ]; + + const output = enhanceProductSummary({ + pageId: allowedPageId, + serverSideABTests: { 'thefilter-at-a-glance-redesign': 'stacked' }, + renderingTarget: 'Web', + filterAtAGlanceEnabled: false, })(input); const stacked = findStacked(output); diff --git a/dotcom-rendering/src/model/enhance-product-summary.ts b/dotcom-rendering/src/model/enhance-product-summary.ts index 01c6b59d7fb..c741dd3e462 100644 --- a/dotcom-rendering/src/model/enhance-product-summary.ts +++ b/dotcom-rendering/src/model/enhance-product-summary.ts @@ -180,17 +180,20 @@ export const enhanceProductSummary = pageId, serverSideABTests, renderingTarget, + filterAtAGlanceEnabled, }: { pageId: string; serverSideABTests?: Record; renderingTarget: RenderingTarget; + filterAtAGlanceEnabled: boolean; }) => (elements: FEElement[]): FEElement[] => { const abTestVariant = serverSideABTests?.['thefilter-at-a-glance-redesign']; - // do nothing if article is not on allow list / not in the test / variant is 'control' / renderingTarget is Apps + // do nothing if article is not on allow list / not in the test / variant is 'control' / renderingTarget is Apps / filterAtAGlance switch is OFF if ( + filterAtAGlanceEnabled && abTestVariant && isCarouselOrStacked(abTestVariant) && isEligibleForSummary(pageId) && diff --git a/dotcom-rendering/src/model/enhanceBlocks.ts b/dotcom-rendering/src/model/enhanceBlocks.ts index ddc7f8c6076..b8d63221638 100644 --- a/dotcom-rendering/src/model/enhanceBlocks.ts +++ b/dotcom-rendering/src/model/enhanceBlocks.ts @@ -1,6 +1,7 @@ import { isUndefined } from '@guardian/libs'; import { type ArticleFormat } from '../lib/articleFormat'; import type { Block } from '../types/blocks'; +import type { Switches } from '../types/config'; import type { FEElement, ImageBlockElement, @@ -37,6 +38,7 @@ type Options = { shouldHideAds: boolean; pageId: string; serverSideABTests?: Record; + switches?: Switches; }; const enhanceNewsletterSignup = @@ -101,6 +103,7 @@ export const enhanceElements = pageId: options.pageId, serverSideABTests: options.serverSideABTests, renderingTarget: options.renderingTarget, + filterAtAGlanceEnabled: !!options.switches?.filterAtAGlance, }), ].reduce( (enhancedBlocks, enhancer) => enhancer(enhancedBlocks), diff --git a/dotcom-rendering/src/server/handler.article.apps.ts b/dotcom-rendering/src/server/handler.article.apps.ts index 199ffae2529..e3639bf5d7a 100644 --- a/dotcom-rendering/src/server/handler.article.apps.ts +++ b/dotcom-rendering/src/server/handler.article.apps.ts @@ -55,6 +55,7 @@ export const handleAppsBlocks: RequestHandler = ({ body }, res) => { hasAffiliateLinksDisclaimer: false, shouldHideAds, pageId, + switches, }); const html = renderAppsBlocks({ blocks: enhancedBlocks, diff --git a/dotcom-rendering/src/server/handler.article.web.ts b/dotcom-rendering/src/server/handler.article.web.ts index af9be3118cf..2d4b3a4a7a0 100644 --- a/dotcom-rendering/src/server/handler.article.web.ts +++ b/dotcom-rendering/src/server/handler.article.web.ts @@ -60,6 +60,7 @@ export const handleBlocks: RequestHandler = ({ body }, res) => { shouldHideAds, pageId, serverSideABTests, + switches, }); const html = renderBlocks({ blocks: enhancedBlocks, diff --git a/dotcom-rendering/src/types/article.ts b/dotcom-rendering/src/types/article.ts index 808923e3629..fce46392341 100644 --- a/dotcom-rendering/src/types/article.ts +++ b/dotcom-rendering/src/types/article.ts @@ -105,6 +105,7 @@ export const enhanceArticleType = ( shouldHideAds: data.shouldHideAds, pageId: data.pageId, serverSideABTests: data.config.serverSideABTests, + switches: data.config.switches, }); const crosswordBlock = buildCrosswordBlock(data);