From a1ed181c24b2eabb09a6cd506ed6d9c203c0732f Mon Sep 17 00:00:00 2001 From: Robert Sese <734194+rsese@users.noreply.github.com> Date: Wed, 22 Oct 2025 19:48:37 -0500 Subject: [PATCH] add carousel item version check (#58134) --- src/frame/middleware/resolve-recommended.ts | 6 ++- src/frame/tests/resolve-recommended.test.ts | 50 +++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/frame/middleware/resolve-recommended.ts b/src/frame/middleware/resolve-recommended.ts index 774585f7a510..81124bf5355f 100644 --- a/src/frame/middleware/resolve-recommended.ts +++ b/src/frame/middleware/resolve-recommended.ts @@ -132,7 +132,11 @@ async function resolveRecommended( try { const foundPage = tryResolveArticlePath(rawPath, page?.relativePath, req) - if (foundPage) { + if ( + foundPage && + (!req.context?.currentVersion || + foundPage.applicableVersions.includes(req.context.currentVersion)) + ) { const href = getPageHref(foundPage) const category = foundPage.relativePath ? foundPage.relativePath.split('/').slice(0, -1).filter(Boolean) diff --git a/src/frame/tests/resolve-recommended.test.ts b/src/frame/tests/resolve-recommended.test.ts index d3324608e282..05bc6c94280a 100644 --- a/src/frame/tests/resolve-recommended.test.ts +++ b/src/frame/tests/resolve-recommended.test.ts @@ -29,6 +29,8 @@ describe('resolveRecommended middleware', () => { }, }, redirects: {}, + currentVersion: 'free-pro-team@latest', + currentLanguage: 'en', ...contextData, }, }) as ExtendedRequest @@ -316,4 +318,52 @@ describe('resolveRecommended middleware', () => { ]) expect(mockNext).toHaveBeenCalled() }) + + test('should filter out articles not available in current version', async () => { + // Create a test page that is only available in fpt, not ghec + const fptOnlyPage: Partial = { + mtime: Date.now(), + title: 'FPT Only Article', + rawTitle: 'FPT Only Article', + intro: 'This article is only for FPT', + rawIntro: 'This article is only for FPT', + relativePath: 'test/fpt-only.md', + fullPath: '/full/path/test/fpt-only.md', + languageCode: 'en', + documentType: 'article', + markdown: 'FPT only content', + versions: { fpt: '*' }, // Only available in free-pro-team + applicableVersions: ['free-pro-team@latest'], // Not available in ghec + permalinks: [ + { + languageCode: 'en', + pageVersion: 'free-pro-team@latest', + title: 'FPT Only Article', + href: '/en/test/fpt-only', + hrefWithoutLanguage: '/test/fpt-only', + }, + ], + renderProp: vi.fn().mockResolvedValue('rendered'), + renderTitle: vi.fn().mockResolvedValue('FPT Only Article'), + render: vi.fn().mockResolvedValue('rendered content'), + buildRedirects: vi.fn().mockReturnValue({}), + } + + mockFindPage.mockReturnValue(fptOnlyPage as any) + + // Create a request context where we're viewing the GHEC version + const req = createMockRequest( + { rawRecommended: ['/test/fpt-only'] }, + { + currentVersion: 'enterprise-cloud@latest', // Current context is GHEC, not FPT + currentLanguage: 'en', + }, + ) + + await resolveRecommended(req, mockRes, mockNext) + + // The recommended array should be empty since the article isn't available in enterprise-cloud + expect((req.context!.page as any).recommended).toEqual([]) + expect(mockNext).toHaveBeenCalled() + }) })