From 2a6acbf0594eb3bef61a602f7199be56ad9337d6 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Mon, 8 Apr 2024 16:34:26 -0400 Subject: [PATCH] Make early-access link 404 in client-side nav (#50044) --- .github/workflows/local-dev.yml | 6 ++++++ src/early-access/middleware/early-access-links.js | 15 +++++++++++++++ src/early-access/tests/early-access-rendering.js | 5 +++++ src/fixtures/tests/playwright-local-dev.spec.ts | 15 +++++++++++++++ src/frame/middleware/index.js | 2 +- 5 files changed, 42 insertions(+), 1 deletion(-) diff --git a/.github/workflows/local-dev.yml b/.github/workflows/local-dev.yml index 73a9e0b292..885c9f6ea6 100644 --- a/.github/workflows/local-dev.yml +++ b/.github/workflows/local-dev.yml @@ -24,6 +24,11 @@ jobs: - name: Install dependencies run: npm install + - uses: ./.github/actions/get-docs-early-access + if: ${{ github.repository == 'github/docs-internal' }} + with: + token: ${{ secrets.DOCS_BOT_PAT_READPUBLICKEY }} + # Note that we don't check out docs-early-access, Elasticsearch, # or any remote translations. Nothing fancy here! @@ -42,6 +47,7 @@ jobs: # tests not exiting at the end with a non-zero. Otherwise, # by default failures are marked as "flaky" instead of "failed". PLAYWRIGHT_RETRIES: 0 + TEST_EARLY_ACCESS: ${{ github.repository == 'github/docs-internal' }} run: npm run playwright-test -- playwright-local-dev - name: Start server in the background diff --git a/src/early-access/middleware/early-access-links.js b/src/early-access/middleware/early-access-links.js index e3f19b51b5..101cd47e5e 100644 --- a/src/early-access/middleware/early-access-links.js +++ b/src/early-access/middleware/early-access-links.js @@ -1,6 +1,21 @@ import { uniq } from 'lodash-es' export default function earlyAccessContext(req, res, next) { + // Use req.pagePath instead of req.path because req.path is the path + // normalized after "converting" that `/_next/data/...` path to the + // equivalent path if it had *not* been a client-side routing fetch. + const url = req.pagePath.split('/').slice(2) + if ( + !( + // Is it `/early-access` or `/enterprise-cloud@latest/early-access`? + ( + (url.length === 2 && url[1] === 'early-access') || + (url.length === 1 && url[0] === 'early-access') + ) + ) + ) { + return next() + } if (process.env.NODE_ENV !== 'development') { return next(404) } diff --git a/src/early-access/tests/early-access-rendering.js b/src/early-access/tests/early-access-rendering.js index 51502bd5cf..1228850036 100644 --- a/src/early-access/tests/early-access-rendering.js +++ b/src/early-access/tests/early-access-rendering.js @@ -29,6 +29,11 @@ describe('rendering early-access', () => { expect(res.statusCode).toBe(404) }) + testViaActionsOnly('the enterprise-cloud TOC is always 404', async () => { + const res = await get('/en/enterprise-cloud@latest/early-access') + expect(res.statusCode).toBe(404) + }) + testViaActionsOnly('TOCs display on category pages', async () => { const $ = await getDOM('/en/early-access/github/enforcing-best-practices-with-github-policies') expect($('ul a').length).toBeGreaterThan(5) diff --git a/src/fixtures/tests/playwright-local-dev.spec.ts b/src/fixtures/tests/playwright-local-dev.spec.ts index 84b5cc4d33..24dfaeb9f6 100644 --- a/src/fixtures/tests/playwright-local-dev.spec.ts +++ b/src/fixtures/tests/playwright-local-dev.spec.ts @@ -13,6 +13,8 @@ import { test, expect } from '@playwright/test' +const TEST_EARLY_ACCESS = Boolean(JSON.parse(process.env.TEST_EARLY_ACCESS || 'false')) + test('view home page', async ({ page }) => { await page.goto('/') await expect(page).toHaveTitle(/GitHub Docs/) @@ -32,3 +34,16 @@ test('search "git" and get results', async ({ page }) => { await page.getByTestId('site-search-input').press('Enter') await expect(page.getByRole('heading', { name: /\d+ Search results for "git"/ })).toBeVisible() }) + +test('view the early-access links page', async ({ page }) => { + if (!TEST_EARLY_ACCESS) return + + await page.goto('/early-access') + await expect(page).toHaveURL(/\/en\/early-access/) + await page.getByRole('heading', { name: 'Early Access documentation' }).click() + const links = await page.$$eval( + '#article-contents ul li a', + (elements: HTMLAnchorElement[]) => elements, + ) + expect(links.length).toBeGreaterThan(0) +}) diff --git a/src/frame/middleware/index.js b/src/frame/middleware/index.js index e63a6a6866..c8b7179408 100644 --- a/src/frame/middleware/index.js +++ b/src/frame/middleware/index.js @@ -251,7 +251,7 @@ export default function (app) { app.use(haltOnDroppedConnection) app.use(robots) - app.use(/(\/.*)?\/early-access$/, earlyAccessLinks) + app.use(earlyAccessLinks) app.use('/categories.json', asyncMiddleware(categoriesForSupport)) app.get('/_500', asyncMiddleware(triggerError))