From 6238ea3ea657f7ff04892ee112be5515721704a4 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Thu, 17 Nov 2022 19:03:55 +0100 Subject: [PATCH] test all release notes in jest (#32716) --- .../contextualizers/ghae-release-notes.js | 11 ++-- .../contextualizers/ghes-release-notes.js | 14 ++++-- tests/rendering/release-notes.js | 50 +++++++++++++++++++ 3 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 tests/rendering/release-notes.js diff --git a/middleware/contextualizers/ghae-release-notes.js b/middleware/contextualizers/ghae-release-notes.js index 708f37297085..f8a7d56bdc75 100644 --- a/middleware/contextualizers/ghae-release-notes.js +++ b/middleware/contextualizers/ghae-release-notes.js @@ -1,3 +1,5 @@ +import { merge } from 'lodash-es' + import { formatReleases, renderPatchNotes } from '../../lib/release-notes-utils.js' import { getDeepDataByLanguage } from '../../lib/get-data.js' import { allVersions } from '../../lib/all-versions.js' @@ -10,10 +12,11 @@ export default async function ghaeReleaseNotesContext(req, res, next) { ) return next() - let ghaeReleaseNotes = getDeepDataByLanguage('release-notes.github-ae', req.language) - if ((!ghaeReleaseNotes || Object.keys(ghaeReleaseNotes).length === 0) && req.language !== 'en') { - ghaeReleaseNotes = getDeepDataByLanguage('release-notes.github-ae', 'en') - } + const ghaeReleaseNotesEnglish = getDeepDataByLanguage('release-notes.github-ae', 'en') + const ghaeReleaseNotesTranslated = getDeepDataByLanguage('release-notes.github-ae', req.language) + const ghaeReleaseNotes = {} + merge(ghaeReleaseNotes, ghaeReleaseNotesEnglish) + merge(ghaeReleaseNotes, ghaeReleaseNotesTranslated) // internalLatestRelease is set in lib/all-versions, e.g., '3.5' but UI still displays '@latest'. let requestedRelease = req.context.currentVersionObj.internalLatestRelease diff --git a/middleware/contextualizers/ghes-release-notes.js b/middleware/contextualizers/ghes-release-notes.js index 6da18ec6b215..6917d4fc3d90 100644 --- a/middleware/contextualizers/ghes-release-notes.js +++ b/middleware/contextualizers/ghes-release-notes.js @@ -1,3 +1,5 @@ +import { merge } from 'lodash-es' + import { formatReleases, renderPatchNotes } from '../../lib/release-notes-utils.js' import { all } from '../../lib/enterprise-server-releases.js' import { getDeepDataByLanguage } from '../../lib/get-data.js' @@ -7,10 +9,14 @@ export default async function ghesReleaseNotesContext(req, res, next) { const [requestedPlan, requestedRelease] = req.context.currentVersion.split('@') if (requestedPlan !== 'enterprise-server') return next() - let ghesReleaseNotes = getDeepDataByLanguage('release-notes.enterprise-server', req.language) - if ((!ghesReleaseNotes || Object.keys(ghesReleaseNotes).length === 0) && req.language !== 'en') { - ghesReleaseNotes = getDeepDataByLanguage('release-notes.enterprise-server', 'en') - } + const ghesReleaseNotesEnglish = getDeepDataByLanguage('release-notes.enterprise-server', 'en') + const ghesReleaseNotesTranslated = getDeepDataByLanguage( + 'release-notes.enterprise-server', + req.language + ) + const ghesReleaseNotes = {} + merge(ghesReleaseNotes, ghesReleaseNotesEnglish) + merge(ghesReleaseNotes, ghesReleaseNotesTranslated) // If the requested GHES release isn't found in data/release-notes/enterprise-server/*, // and it IS a valid GHES release, try being helpful and redirecting to the old location. diff --git a/tests/rendering/release-notes.js b/tests/rendering/release-notes.js new file mode 100644 index 000000000000..d462cb6b59b9 --- /dev/null +++ b/tests/rendering/release-notes.js @@ -0,0 +1,50 @@ +import { describe, jest } from '@jest/globals' + +import enterpriseServerReleases from '../../lib/enterprise-server-releases.js' +import { get } from '../helpers/e2etest.js' +import languages from '../../lib/languages.js' +import Page from '../../lib/page.js' + +describe('server', () => { + jest.setTimeout(60 * 1000) + + test('basic redirecting', async () => { + const res = await get('/admin/release-notes') + expect(res.statusCode).toBe(302) + expect(res.headers.location).toBe( + // Note that English is the default fallback for redirects + `/en/enterprise-server@${enterpriseServerReleases.latest}/admin/release-notes` + ) + }) + test('basic rendering', async () => { + const res = await get('/admin/release-notes', { followAllRedirects: true }) + expect(res.statusCode).toBe(200) + }) + + test('every version that has release-notes', async () => { + // The English content page's `versions:` frontmatter is the source + // of (convenient) truth about which versions of this page is available. + const page = await Page.init({ + basePath: 'content', + relativePath: 'admin/release-notes.md', + languageCode: 'en', + }) + const testLanguages = [] + for (const [langCode, langObj] of Object.entries(languages)) { + if (!langObj.wip) { + testLanguages.push(langCode) + } + } + await Promise.all( + page.applicableVersions.map(async (version) => { + await Promise.all( + testLanguages.map(async (language) => { + const url = `/${language}/${version}/admin/release-notes` + const res = await get(url) + expect(res.statusCode).toBe(200) + }) + ) + }) + ) + }) +})