* testing out a rest operations sidebar * cleanup * renamed 5 files * renamed 5 files * set redirect_from on 5 files * renamed 1 files * renamed 1 files * renamed 3 files * renamed 1 files * renamed 1 files * renamed 3 files * renamed 1 files * renamed 2 files * renamed 1 files * renamed 4 files * renamed 15 files * renamed 2 files * renamed 6 files * renamed 1 files * renamed 4 files * renamed 7 files * renamed 1 files * renamed 3 files * renamed 3 files * renamed 1 files * renamed 5 files * renamed 1 files * renamed 1 files * renamed 3 files * renamed 4 files * renamed 1 files * renamed 1 files * renamed 2 files * renamed 4 files * renamed 1 files * renamed 1 files * renamed 1 files * renamed 6 files * renamed 6 files * renamed 4 files * move files * adding more * updating to add restcontext and start of removing data/reusables/rest-reference * removed data/reusables * add a RestMiniTocItem and updating the filtering to add a subcategory so all manually added H3s are in mini tocs in addition to operations * remove console log * [WIP]: REST New Proposal Sidebar (#26471) * saving * update sidebar * remove console log * update guides and overview * import Category for category level rest pages * update undefined restOperations * update restOperationData category and subcategory levels" * minor updates * update get mini toc items function * updating REST context for sidebar * updating rest data * remove console logs * WIP: mini-toc-ing the sidebar Co-authored-by: Robert Sese <rsese@github.com> * A little cleanup * Fix first subcategory link and add some comments * updating anchor links in sidebar * adding updates * remove standalone * update product and maptopic pages using article context * add conditional link wrapper * fix sidebar toggle and versions for enterprise admin * update versions per subcategory * Highlight sidebar link for current page * Update miniToc hash links and hash change tracking * fix unique key in CollapsibleSection * Fix list markup * remove title * update permissions * Hide minitocs on landing (#26594) * hide minitocs on landing page * simplify page components and remove minitoc from sidebar for guides/overview * fix carats and category fix * remove id Co-authored-by: Grace Park <gracepark@github.com> * updating content based on versions script check with the OpenAPI * update script and content files * update script and content/rest files * update to add TocLanding * update script * update index files * add codespaces repository-secrets * remove openapi schema check script * remove minitocs at the top * add h2 about the {title} api * fix tests/unit/openapi-schema.js * Fix linting tests * fix search/topics test * fix tests/unit/pages test * update rest/reference links in components * run prettier * Update components/rest/RestReferencePage.tsx Co-authored-by: Rachael Sewell <rachmari@github.com> * Update components/rest/RestReferencePage.tsx Co-authored-by: Rachael Sewell <rachmari@github.com> * Update pages/[versionId]/rest/[category]/[subcategory].tsx Co-authored-by: Rachael Sewell <rachmari@github.com> * Update pages/[versionId]/rest/[category]/[subcategory].tsx Co-authored-by: Rachael Sewell <rachmari@github.com> * Update pages/[versionId]/rest/[category]/[subcategory].tsx Co-authored-by: Rachael Sewell <rachmari@github.com> * Update pages/[versionId]/rest/[category]/[subcategory].tsx Co-authored-by: Rachael Sewell <rachmari@github.com> * Update tests/unit/openapi-schema.js Co-authored-by: Rachael Sewell <rachmari@github.com> * updating comment location * remove dependabot override * remove path-utils current product update for rest * run linter * remove dependabot.md and remove h2 heading on restreference * update the correct product to rest for rest pages * adding comments for updates to path-utils * remove console log * REST sidebar: handle legacy v3 redirects (#26686) * Add script to handle legacy v3 REST redirects * Run the script * Handle a redirect to a redirect * Update REST test URLs * 'await' and test runs subcategory of checks * Update REST URLs for routing/developer-site-redirects tests * Update developer-redirects fixture with new REST URLs * Resolve merge conflicts * Update rest-redirects fixture with new REST URLs * Fix broken links with REST pages re-org * redirectTo could be undefined * Fix script for posterity, can't redirect paths with hashes * Remove invalid hash redirects * Typically don't need to save one-off scripts * Undo redirect changes (not necessary for handling v3 redirects) * Remove script-added redirects * Update old v3 redirects with new REST URLs * No more GHES search indexing page * 'org' not 'organization' * Update fixture data for new REST URLs * revert any content directory changes Co-authored-by: Grace Park <gracepark@github.com> Co-authored-by: Rachael Sewell <rachmari@github.com> * Adding test rest (#26750) * add test to check openapi schema versions and content rest frontmatter versions * update lib/redirects * fix test and add error messages * adding repository secrets * adding repository-secrets.md * Revert "update lib/redirects" This reverts commit 3aafe28265764d5bc09c0c478c8e0ca099c8fbcf. * remove lib/redirects changes and console logs * Update lib/rest/index.js Co-authored-by: Rachael Sewell <rachmari@github.com> * update unique key * Rest client side redirects (#26754) * adding tags subcategory for the rest content repos category * run prettier * bug fix for anchor scrolls" (#26892) * updating width size for rest reference page * Rest sidebar consolidation (#26862) * refactor sidebar * fix articlecontext provider issue on rest product landing page for all versions * fix a bug, create new component * revert change to create new component and fix bug Co-authored-by: Rachael Sewell <rachmari@github.com> * Set currentAnchor with a hashchange handler (#26923) * Rest sidebar design tweaks (#26807) * Rest sidebar design tweaks * tweak color to subtle * use muted color and margin for line * update to design feedback Co-authored-by: Grace Park <gracepark@github.com> * Remove cheerio from rest-collapsible (#26948) * remove cheerio from rest-collapsible * update type * adding endswith instead * use productId instead * one off edge case for secret-scanning * Reorganize subcategory and category, Update pre -> div, Add RestContext (#26950) * reorganize subcategory and category * add RestContext * update comment * update for endpoints page * add comment * move object to restcontext * remove effectiveDate in restcontext * remove width calculation for rest reference page * fix adding manual writer's minitocs to sidebar * update with feedback * update comment * update isRestReferencePage * remove page component and fix bug * adding back rest/index.tsx Co-authored-by: Rachael Sewell <rachmari@github.com> * update content/rest" * add back design tweak * update to div * update margins on rest api reference * remove page component * adding tests * separate product from rest sidebar (#27065) * separate product from rest sidebar * Use ProductCollapsibleSections for product pages * fix tests Co-authored-by: Robert Sese <rsese@github.com> Co-authored-by: Grace Park <gracepark@github.com> * Rest sidebar translations (#27052) * update translations * remove general test Co-authored-by: Robert Sese <rsese@github.com> Co-authored-by: Rachael Sewell <rachmari@github.com>
128 lines
5.2 KiB
JavaScript
128 lines
5.2 KiB
JavaScript
import { jest } from '@jest/globals'
|
|
import path from 'path'
|
|
import enterpriseServerReleases from '../../lib/enterprise-server-releases.js'
|
|
import { get } from '../helpers/e2etest.js'
|
|
import readJsonFile from '../../lib/read-json-file.js'
|
|
|
|
jest.useFakeTimers('legacy')
|
|
|
|
describe('developer redirects', () => {
|
|
jest.setTimeout(10 * 60 * 1000)
|
|
|
|
beforeAll(async () => {
|
|
// The first page load takes a long time so let's get it out of the way in
|
|
// advance to call out that problem specifically rather than misleadingly
|
|
// attributing it to the first test
|
|
await get('/v4')
|
|
})
|
|
|
|
describe('redirects /v4 requests to /graphql', () => {
|
|
test('graphql homepage', async () => {
|
|
const res = await get('/v4')
|
|
expect(res.statusCode).toBe(302)
|
|
const expectedFinalPath = '/en/graphql'
|
|
expect(res.headers.location).toBe(expectedFinalPath)
|
|
})
|
|
|
|
test('graphql enterprise homepage', async () => {
|
|
const res = await get('/enterprise/v4', { followAllRedirects: true })
|
|
expect(res.statusCode).toBe(200)
|
|
const finalPath = new URL(res.url).pathname
|
|
const expectedFinalPath = `/en/enterprise-server@${enterpriseServerReleases.latest}/graphql`
|
|
expect(finalPath).toBe(expectedFinalPath)
|
|
})
|
|
|
|
test('graphql overview paths', async () => {
|
|
const oldPath = '/v4/breaking_changes'
|
|
const newPath = '/graphql/overview/breaking-changes'
|
|
const res = await get(oldPath)
|
|
expect(res.statusCode).toBe(302)
|
|
expect(res.headers.location).toBe(`/en${newPath}`)
|
|
|
|
const enterpriseRes = await get(`/enterprise${oldPath}`, { followAllRedirects: true })
|
|
expect(enterpriseRes.statusCode).toBe(200)
|
|
const finalPath = new URL(enterpriseRes.url).pathname
|
|
const expectedFinalPath = path.join(
|
|
'/',
|
|
`enterprise-server@${enterpriseServerReleases.latest}`,
|
|
newPath
|
|
)
|
|
expect(finalPath).toBe(`/en${expectedFinalPath}`)
|
|
})
|
|
|
|
test('graphql reference paths with child pages', async () => {
|
|
const sclarRes = await get('/en/v4/scalar/boolean')
|
|
expect(sclarRes.statusCode).toBe(301)
|
|
const sclarResFinalPath = '/en/graphql/reference/scalars#boolean'
|
|
expect(sclarRes.headers.location).toBe(sclarResFinalPath)
|
|
|
|
const enumRes = await get('/en/v4/enum/searchtype')
|
|
expect(enumRes.statusCode).toBe(301)
|
|
const enumResFinalPath = '/en/graphql/reference/enums#searchtype'
|
|
expect(enumRes.headers.location).toBe(enumResFinalPath)
|
|
})
|
|
})
|
|
|
|
test('redirects /v3 requests to /rest', async () => {
|
|
let expectedFinalPath
|
|
let res = await get('/v3')
|
|
expect(res.statusCode).toBe(302)
|
|
expectedFinalPath = '/en/rest'
|
|
expect(res.headers.location).toBe(expectedFinalPath)
|
|
|
|
// REST subresources like activity notifications don't have their own page
|
|
// any more, so redirect to an anchor on the resource page
|
|
res = await get('/en/v3/activity')
|
|
expect(res.statusCode).toBe(301)
|
|
expectedFinalPath = '/en/rest/activity'
|
|
expect(res.headers.location).toBe(expectedFinalPath)
|
|
|
|
// REST subresources like activity notifications don't have their own page
|
|
// any more, so redirect to an anchor on the resource page
|
|
res = await get('/en/v3/activity/notifications')
|
|
expect(res.statusCode).toBe(301)
|
|
expectedFinalPath = '/en/rest/activity/notifications'
|
|
expect(res.headers.location).toBe(expectedFinalPath)
|
|
|
|
// trailing slashes are handled separately by the `slashes` module;
|
|
// any request to a /v3 URL with a trailing slash will be redirected twice
|
|
res = await get('/en/v3/activity/notifications/')
|
|
expect(res.statusCode).toBe(301)
|
|
expect(res.headers.location).toBe('/en/v3/activity/notifications')
|
|
|
|
// non-reference redirects (e.g. guides)
|
|
res = await get('/en/v3/guides/basics-of-authentication')
|
|
expect(res.statusCode).toBe(301)
|
|
expectedFinalPath = '/en/rest/guides/basics-of-authentication'
|
|
expect(res.headers.location).toBe(expectedFinalPath)
|
|
})
|
|
|
|
describe('fixtures', () => {
|
|
test.each(['developer', 'rest', 'graphql'])('%s redirects', async (label) => {
|
|
const FIXTURES = {
|
|
developer: './tests/fixtures/developer-redirects.json',
|
|
rest: './tests/fixtures/rest-redirects.json',
|
|
graphql: './tests/fixtures/graphql-redirects.json',
|
|
}
|
|
if (!(label in FIXTURES)) throw new Error('unrecognized label')
|
|
const fixtures = readJsonFile(FIXTURES[label])
|
|
// Don't use a `Promise.all()` because it's actually slower
|
|
// because of all the eventloop context switching.
|
|
for (let [oldPath, newPath] of Object.entries(fixtures)) {
|
|
// REST and GraphQL developer Enterprise paths with a version are only supported up to 2.21.
|
|
// We make an exception to always redirect versionless paths to the latest version.
|
|
newPath = newPath.replace(
|
|
'/enterprise-server/',
|
|
`/enterprise-server@${enterpriseServerReleases.latest}/`
|
|
)
|
|
const res = await get(oldPath)
|
|
const sameFirstPrefix = oldPath.split('/')[1] === newPath.split('/')[1]
|
|
expect(res.statusCode, `${oldPath} did not redirect to ${newPath}`).toBe(
|
|
sameFirstPrefix ? 301 : 302
|
|
)
|
|
expect(res.headers.location).toBe(newPath)
|
|
}
|
|
})
|
|
})
|
|
})
|