From 6b018307ecb12f74cebea07873833823b31f5daa Mon Sep 17 00:00:00 2001 From: docubot <67483024+docubot@users.noreply.github.com> Date: Wed, 31 May 2023 04:50:31 -0700 Subject: [PATCH 1/3] [Expected 2023-05-30] Update CodeQL CLI manual for CodeQL CLI 2.13.3 (#37223) Co-authored-by: Felicity Chapman --- .../codeql-cli-manual/database-bundle.md | 7 + .../codeql-cli/codeql-cli-manual/index.md | 1 + .../codeql-cli-manual/pack-bundle.md | 7 + .../codeql-cli/codeql-cli-manual/pack-ci.md | 9 +- .../codeql-cli-manual/pack-create.md | 7 + .../codeql-cli-manual/pack-publish.md | 7 + .../resolve-extensions-by-pack.md | 149 ++++++++++++++++++ 7 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 content/code-security/codeql-cli/codeql-cli-manual/resolve-extensions-by-pack.md diff --git a/content/code-security/codeql-cli/codeql-cli-manual/database-bundle.md b/content/code-security/codeql-cli/codeql-cli-manual/database-bundle.md index 2add0cac5a..f0ff77b854 100644 --- a/content/code-security/codeql-cli/codeql-cli-manual/database-bundle.md +++ b/content/code-security/codeql-cli/codeql-cli-manual/database-bundle.md @@ -50,6 +50,13 @@ that results, logs, TRAP, or similar should be included. Include any precomputed query results in the bundle. +#### `--include-temp` + +Includes the "temp" directory, where any generated packs, queries, and +suites are located. + +Available since `v2.13.3`. + #### `--include-uncompressed-source` Include an uncompressed version of the source archive directory. This is diff --git a/content/code-security/codeql-cli/codeql-cli-manual/index.md b/content/code-security/codeql-cli/codeql-cli-manual/index.md index 4ca603b71e..0af2a1a084 100644 --- a/content/code-security/codeql-cli/codeql-cli-manual/index.md +++ b/content/code-security/codeql-cli/codeql-cli-manual/index.md @@ -74,6 +74,7 @@ children: - /query-run - /resolve-database - /resolve-extensions + - /resolve-extensions-by-pack - /resolve-extractor - /resolve-files - /resolve-languages diff --git a/content/code-security/codeql-cli/codeql-cli-manual/pack-bundle.md b/content/code-security/codeql-cli/codeql-cli-manual/pack-bundle.md index db308559c6..1a8816c928 100644 --- a/content/code-security/codeql-cli/codeql-cli-manual/pack-bundle.md +++ b/content/code-security/codeql-cli/codeql-cli-manual/pack-bundle.md @@ -74,6 +74,13 @@ directory. This will reduce the size of the pack and the time it takes to create it, but will require compilation before the pack can be run. Only meaningful for query packs. +#### `--no-validate-extensions` + +\[Advanced] Avoid validating data extensions as part of the compile +step. + +Available since `v2.13.3`. + #### `--no-overwrite` \[Advanced] Avoid recompiling and overwriting any existing compiled diff --git a/content/code-security/codeql-cli/codeql-cli-manual/pack-ci.md b/content/code-security/codeql-cli/codeql-cli-manual/pack-ci.md index 73ef79c604..267ff0cbc8 100644 --- a/content/code-security/codeql-cli/codeql-cli-manual/pack-ci.md +++ b/content/code-security/codeql-cli/codeql-cli-manual/pack-ci.md @@ -32,8 +32,8 @@ codeql pack ci [--force] ... -- ## Description -\[Experimental] Install dependencies for this pack, verifying that the -existing lock file is up to date. +\[Experimental] Clean install dependencies for this pack, verifying +that the existing lock file is up to date. This command installs the dependencies of the pack, using the versions specified in the codeql-pack.lock.yml file. If any of the versions @@ -41,6 +41,11 @@ specified in the lock file are incompatible with the version constraints specified in the qlpack.yml file, or if no lock file is present, this command fails. +This command is similar to `codeql pack install`, except it's meant to +be used in automated environments such as test platforms, continuous +integration, and deployment -- or any situation where you want to make +sure you're doing a clean install of your dependencies. + Available since `v2.12.4`. ## Primary options diff --git a/content/code-security/codeql-cli/codeql-cli-manual/pack-create.md b/content/code-security/codeql-cli/codeql-cli-manual/pack-create.md index 8bcf950b74..754d9dc050 100644 --- a/content/code-security/codeql-cli/codeql-cli-manual/pack-create.md +++ b/content/code-security/codeql-cli/codeql-cli-manual/pack-create.md @@ -76,6 +76,13 @@ directory. This will reduce the size of the pack and the time it takes to create it, but will require compilation before the pack can be run. Only meaningful for query packs. +#### `--no-validate-extensions` + +\[Advanced] Avoid validating data extensions as part of the compile +step. + +Available since `v2.13.3`. + #### `--no-overwrite` \[Advanced] Avoid recompiling and overwriting any existing compiled diff --git a/content/code-security/codeql-cli/codeql-cli-manual/pack-publish.md b/content/code-security/codeql-cli/codeql-cli-manual/pack-publish.md index 9c5f41c3cd..313a72eda7 100644 --- a/content/code-security/codeql-cli/codeql-cli-manual/pack-publish.md +++ b/content/code-security/codeql-cli/codeql-cli-manual/pack-publish.md @@ -75,6 +75,13 @@ directory. This will reduce the size of the pack and the time it takes to create it, but will require compilation before the pack can be run. Only meaningful for query packs. +#### `--no-validate-extensions` + +\[Advanced] Avoid validating data extensions as part of the compile +step. + +Available since `v2.13.3`. + #### `--no-overwrite` \[Advanced] Avoid recompiling and overwriting any existing compiled diff --git a/content/code-security/codeql-cli/codeql-cli-manual/resolve-extensions-by-pack.md b/content/code-security/codeql-cli/codeql-cli-manual/resolve-extensions-by-pack.md new file mode 100644 index 0000000000..3681444740 --- /dev/null +++ b/content/code-security/codeql-cli/codeql-cli-manual/resolve-extensions-by-pack.md @@ -0,0 +1,149 @@ +--- +title: resolve extensions-by-pack +intro: |- + [Experimental] [Deep plumbing] Determine accessible extensions for + the given paths to pack roots. This includes machine learning models and + data extensions. +versions: + fpt: '*' + ghae: '*' + ghec: '*' + ghes: '*' +topics: + - Advanced Security + - Code scanning + - CodeQL +type: reference +product: '{% data reusables.gated-features.codeql %}' +autogenerated: codeql-cli +--- + + + +{% data reusables.codeql-cli.man-pages-version-note %} + +## Synopsis + +```shell{:copy} +codeql resolve extensions-by-pack ... -- ... +``` + +## Description + +\[Experimental] \[Deep plumbing] Determine accessible extensions for +the given paths to pack roots. This includes machine learning models and +data extensions. + +This plumbing command resolves the set of data extensions and +GitHub-created machine learning models that are available to the paths +passed in as command line arguments. + +Available since `v2.13.3`. + +## Primary options + +#### `...` + +The path to the root of the packs to resolve extensions for. + +#### `--search-path=[:...]` + +A list of directories under which QL packs may be found. Each directory +can either be a QL pack (or bundle of packs containing a +`.codeqlmanifest.json` file at the root) or the immediate parent of one +or more such directories. + +If the path contains more than one directory, their order defines +precedence between them: when a pack name that must be resolved is +matched in more than one of the directory trees, the one given first +wins. + +Pointing this at a checkout of the open-source CodeQL repository ought +to work when querying one of the languages that live there. + +If you have checked out the CodeQL repository as a sibling of the +unpacked CodeQL toolchain, you don't need to give this option; such +sibling directories will always be searched for QL packs that cannot be +found otherwise. (If this default does not work, it is strongly +recommended to set up `--search-path` once and for all in a per-user +configuration file). + +(Note: On Windows the path separator is `;`). + +#### `--additional-packs=[:...]` + +If this list of directories is given, they will be searched for packs +before the ones in `--search-path`. The order between these doesn't +matter; it is an error if a pack name is found in two different places +through this list. + +This is useful if you're temporarily developing a new version of a pack +that also appears in the default path. On the other hand, it is *not +recommended* to override this option in a config file; some internal +actions will add this option on the fly, overriding any configured +value. + +(Note: On Windows the path separator is `;`). + +### Options for configuring the CodeQL package manager + +#### `--registries-auth-stdin` + +Authenticate to GitHub Enterprise Server Container registries by passing +a comma-separated list of \=\ pairs. + +For example, you can pass +`https://containers.GHEHOSTNAME1/v2/=TOKEN1,https://containers.GHEHOSTNAME2/v2/=TOKEN2` +to authenticate to two GitHub Enterprise Server instances. + +This overrides the CODEQL\_REGISTRIES\_AUTH and GITHUB\_TOKEN environment +variables. If you only need to authenticate to the github.com Container +registry, you can instead authenticate using the simpler +`--github-auth-stdin` option. + +#### `--github-auth-stdin` + +Authenticate to the github.com Container registry by passing a +github.com GitHub Apps token or personal access token via standard +input. + +To authenticate to GitHub Enterprise Server Container registries, pass +`--registries-auth-stdin` or use the CODEQL\_REGISTRIES\_AUTH environment +variable. + +This overrides the GITHUB\_TOKEN environment variable. + +### Common options + +#### `-h, --help` + +Show this help text. + +#### `-J=` + +\[Advanced] Give option to the JVM running the command. + +(Beware that options containing spaces will not be handled correctly.) + +#### `-v, --verbose` + +Incrementally increase the number of progress messages printed. + +#### `-q, --quiet` + +Incrementally decrease the number of progress messages printed. + +#### `--verbosity=` + +\[Advanced] Explicitly set the verbosity level to one of errors, +warnings, progress, progress+, progress++, progress+++. Overrides `-v` +and `-q`. + +#### `--logdir=` + +\[Advanced] Write detailed logs to one or more files in the given +directory, with generated names that include timestamps and the name of +the running subcommand. + +(To write a log file with a name you have full control over, instead +give `--log-to-stderr` and redirect stderr as desired.) From cb2091fb34fffdcdd0f93f82228b1aa75689c118 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Wed, 31 May 2023 08:05:37 -0400 Subject: [PATCH 2/3] Present a manifest JSON file with icons (#37292) --- .../images/site/apple-touch-icon-114x114.png | Bin 0 -> 10058 bytes .../images/site/apple-touch-icon-120x120.png | Bin 0 -> 10942 bytes .../images/site/apple-touch-icon-144x144.png | Bin 0 -> 14426 bytes .../images/site/apple-touch-icon-152x152.png | Bin 0 -> 16740 bytes .../images/site/apple-touch-icon-180x180.png | Bin 0 -> 21128 bytes .../images/site/apple-touch-icon-192x192.png | Bin 0 -> 3015 bytes .../images/site/apple-touch-icon-512x512.png | Bin 0 -> 9825 bytes assets/images/site/apple-touch-icon-57x57.png | Bin 0 -> 3325 bytes assets/images/site/apple-touch-icon-60x60.png | Bin 0 -> 3625 bytes assets/images/site/apple-touch-icon-72x72.png | Bin 0 -> 4474 bytes assets/images/site/apple-touch-icon-76x76.png | Bin 0 -> 5103 bytes middleware/helmet.js | 1 + middleware/index.js | 2 + middleware/manifest-json.js | 52 ++++++++++++++++++ pages/_app.tsx | 2 + script/find-orphaned-assets.js | 11 ++++ tests/rendering/manifest.js | 41 ++++++++++++++ tests/rendering/server.js | 2 + 18 files changed, 111 insertions(+) create mode 100644 assets/images/site/apple-touch-icon-114x114.png create mode 100644 assets/images/site/apple-touch-icon-120x120.png create mode 100644 assets/images/site/apple-touch-icon-144x144.png create mode 100644 assets/images/site/apple-touch-icon-152x152.png create mode 100644 assets/images/site/apple-touch-icon-180x180.png create mode 100644 assets/images/site/apple-touch-icon-192x192.png create mode 100644 assets/images/site/apple-touch-icon-512x512.png create mode 100644 assets/images/site/apple-touch-icon-57x57.png create mode 100644 assets/images/site/apple-touch-icon-60x60.png create mode 100644 assets/images/site/apple-touch-icon-72x72.png create mode 100644 assets/images/site/apple-touch-icon-76x76.png create mode 100644 middleware/manifest-json.js create mode 100644 tests/rendering/manifest.js diff --git a/assets/images/site/apple-touch-icon-114x114.png b/assets/images/site/apple-touch-icon-114x114.png new file mode 100644 index 0000000000000000000000000000000000000000..852036939689a9d5eb9e4ae4e6f2286bed905034 GIT binary patch literal 10058 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 literal 0 HcmV?d00001 diff --git a/assets/images/site/apple-touch-icon-152x152.png b/assets/images/site/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..751d286a522143950c333aa4f07cf72d30754dc6 GIT binary patch literal 16740 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 JY9alA{{a{erIP>v literal 0 HcmV?d00001 diff --git a/assets/images/site/apple-touch-icon-180x180.png b/assets/images/site/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..12b4fb0b2321babedfd999fbbcea5330b3dad9dc GIT binary patch literal 21128 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 JPDHLkV1l_fd2av! literal 0 HcmV?d00001 diff --git a/assets/images/site/apple-touch-icon-512x512.png b/assets/images/site/apple-touch-icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..8d76a12f5e6343819d59ecad5551415cfb2252c5 GIT binary patch literal 9825 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 literal 0 HcmV?d00001 diff --git a/assets/images/site/apple-touch-icon-57x57.png b/assets/images/site/apple-touch-icon-57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f3340bd79b6b739454b2d31f8c9330b75a9913 GIT binary patch literal 3325 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 Hu0mjf7H3if literal 0 HcmV?d00001 diff --git a/assets/images/site/apple-touch-icon-60x60.png b/assets/images/site/apple-touch-icon-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..695434160d566adb36e0fa783562859f2073ced3 GIT binary patch literal 3625 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 vlTmya26XwB<%e00000NkvXXu0mjf*bCh? literal 0 HcmV?d00001 diff --git a/assets/images/site/apple-touch-icon-72x72.png b/assets/images/site/apple-touch-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..678617e1703c85345a8180e410892f8ce36fa845 GIT binary patch literal 4474 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 M07*qoM6N<$f+C)%;Q#;t literal 0 HcmV?d00001 diff --git a/assets/images/site/apple-touch-icon-76x76.png b/assets/images/site/apple-touch-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..a71c93f36c57115fc1dc1526ddd552f5ed64f41f GIT binary patch literal 5103 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 RPHF%E002ovPDHLkV1h>2>8=0( literal 0 HcmV?d00001 diff --git a/middleware/helmet.js b/middleware/helmet.js index 3990584a44..ab6a74ce05 100644 --- a/middleware/helmet.js +++ b/middleware/helmet.js @@ -48,6 +48,7 @@ const DEFAULT_OPTIONS = { frameAncestors: isDev ? ['*'] : [...GITHUB_DOMAINS], styleSrc: ["'self'", "'unsafe-inline'", 'data:', AZURE_STORAGE_URL], childSrc: ["'self'"], // exception for search in deprecated GHE versions + manifestSrc: ["'self'"], upgradeInsecureRequests: isDev ? null : [], }, }, diff --git a/middleware/index.js b/middleware/index.js index 945dff4dab..114123e6b6 100644 --- a/middleware/index.js +++ b/middleware/index.js @@ -30,6 +30,7 @@ import archivedEnterpriseVersionsAssets from './archived-enterprise-versions-ass import api from './api/index.js' import healthz from './healthz.js' import productIcons from './product-icons.js' +import manifestJson from './manifest-json.js' import remoteIP from './remote-ip.js' import buildInfo from './build-info.js' import archivedEnterpriseVersions from './archived-enterprise-versions.js' @@ -248,6 +249,7 @@ export default function (app) { app.get('/_ip', instrument(remoteIP, './remoteIP')) app.get('/_build', instrument(buildInfo, './buildInfo')) app.use('/producticons', instrument(productIcons, './product-icons')) + app.use('/manifest.json', asyncMiddleware(instrument(manifestJson, './manifest'))) // Things like `/api` sets their own Fastly surrogate keys. // Now that the `req.language` is known, set it for the remaining endpoints diff --git a/middleware/manifest-json.js b/middleware/manifest-json.js new file mode 100644 index 0000000000..1e65d9e74b --- /dev/null +++ b/middleware/manifest-json.js @@ -0,0 +1,52 @@ +import fs from 'fs' +import path from 'path' + +import { defaultCacheControl } from './cache-control.js' + +const ICONS = [ + './assets/images/site/apple-touch-icon-57x57.png', + './assets/images/site/apple-touch-icon-60x60.png', + './assets/images/site/apple-touch-icon-72x72.png', + './assets/images/site/apple-touch-icon-76x76.png', + './assets/images/site/apple-touch-icon-114x114.png', + './assets/images/site/apple-touch-icon-120x120.png', + './assets/images/site/apple-touch-icon-144x144.png', + './assets/images/site/apple-touch-icon-152x152.png', + './assets/images/site/apple-touch-icon-180x180.png', + './assets/images/site/apple-touch-icon-192x192.png', + './assets/images/site/apple-touch-icon-512x512.png', +] + +export default async function manifestJson(req, res) { + // This is modelled after https://github.com/manifest.json + const manifest = { + // In the future we might want to have a different manifest for each + // language. Particularly, the `name` property. + // But as of May 2023, this is overkill because all translations's + // home page refer to the name of the site as "GitHub Docs". + // For example, on https://docs.github.com/ja the `` + // is "GitHub Docs". + name: 'GitHub Docs', + short_name: 'GitHub Docs', + start_url: '/', + display: 'standalone', + icons: [], + } + for (const icon of ICONS) { + for (const sizes of path.basename(icon).match(/\d+x\d+/g)) { + const stats = fs.statSync(icon) + const split = icon.slice(1).split(path.sep) + const hash = `${stats.size}` + split.splice(2, 0, `cb-${hash}`) + const src = split.join('/') + const type = path.extname(icon) === '.png' ? 'image/png' : undefined + manifest.icons.push({ + sizes, + src, + type, + }) + } + } + defaultCacheControl(res) + res.json(manifest) +} diff --git a/pages/_app.tsx b/pages/_app.tsx index b61e3182a1..11afb5b7e8 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -75,6 +75,8 @@ const MyApp = ({ Component, pageProps, languagesContext }: MyAppProps) => { <link rel="alternate icon" type="image/png" href="/assets/cb-600/images/site/favicon.png" /> <link rel="icon" type="image/svg+xml" href="/assets/cb-803/images/site/favicon.svg" /> + <link href="/manifest.json" rel="manifest" /> + <meta name="google-site-verification" content="OgdQc0GZfjDI52wDv1bkMT-SLpBUo_h5nn9mI9L22xQ" diff --git a/script/find-orphaned-assets.js b/script/find-orphaned-assets.js index 76542aee24..5d89d833ef 100755 --- a/script/find-orphaned-assets.js +++ b/script/find-orphaned-assets.js @@ -18,6 +18,17 @@ import languages from '../lib/languages.js' const EXCEPTIONS = new Set([ 'assets/images/site/favicon.ico', 'assets/images/site/apple-touch-icon.png', + 'assets/images/site/apple-touch-icon-114x114.png', + 'assets/images/site/apple-touch-icon-120x120.png', + 'assets/images/site/apple-touch-icon-144x144.png', + 'assets/images/site/apple-touch-icon-152x152.png', + 'assets/images/site/apple-touch-icon-180x180.png', + 'assets/images/site/apple-touch-icon-192x192.png', + 'assets/images/site/apple-touch-icon-512x512.png', + 'assets/images/site/apple-touch-icon-57x57.png', + 'assets/images/site/apple-touch-icon-60x60.png', + 'assets/images/site/apple-touch-icon-72x72.png', + 'assets/images/site/apple-touch-icon-76x76.png', ]) function isExceptionPath(imagePath) { diff --git a/tests/rendering/manifest.js b/tests/rendering/manifest.js new file mode 100644 index 0000000000..de55118fc7 --- /dev/null +++ b/tests/rendering/manifest.js @@ -0,0 +1,41 @@ +import sharp from 'sharp' + +import { SURROGATE_ENUMS } from '../../middleware/set-fastly-surrogate-key.js' +import { get, getDOM } from '../helpers/e2etest.js' + +describe('manifest', () => { + test('download manifest from HTML and check content', async () => { + const $ = await getDOM('/') + const url = $('link[rel="manifest"]').attr('href') + const res = await get(url) + expect(res.statusCode).toBe(200) + + // Check that it can be cached at the CDN + expect(res.headers['set-cookie']).toBeUndefined() + expect(res.headers['cache-control']).toContain('public') + expect(res.headers['cache-control']).toMatch(/max-age=[1-9]/) + expect(res.headers['surrogate-control']).toContain('public') + expect(res.headers['surrogate-control']).toMatch(/max-age=[1-9]/) + expect(res.headers['surrogate-key']).toBe(`${SURROGATE_ENUMS.DEFAULT} no-language`) + + const manifest = JSON.parse(res.body) + expect(manifest.name).toBe('GitHub Docs') + expect(manifest.short_name).toBe('GitHub Docs') + expect(manifest.start_url).toBe('/') + expect(manifest.display).toBe('standalone') + expect(manifest.icons.length).toBeGreaterThan(0) + await Promise.all( + manifest.icons.map(async (icon) => { + const res = await get(icon.src, { responseType: 'buffer' }) + expect(res.statusCode).toBe(200) + expect(res.headers['content-type']).toBe(icon.type) + // The `sizes` should match the payload + const image = sharp(res.body) + const [width, height] = icon.sizes.split('x').map((s) => parseInt(s)) + const dimensions = await image.metadata() + expect(dimensions.width).toBe(width) + expect(dimensions.height).toBe(height) + }) + ) + }) +}) diff --git a/tests/rendering/server.js b/tests/rendering/server.js index abf8d5c053..d097dcf538 100644 --- a/tests/rendering/server.js +++ b/tests/rendering/server.js @@ -135,6 +135,8 @@ describe('server', () => { expect(csp.get('style-src').includes("'self'")).toBe(true) expect(csp.get('style-src').includes("'unsafe-inline'")).toBe(true) + + expect(csp.get('manifest-src').includes("'self'")).toBe(true) }) test('sets Fastly cache control headers', async () => { From efc6880bb1d2b19efea37b063eb3ef14d8037339 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson <peterbe@github.com> Date: Wed, 31 May 2023 08:12:49 -0400 Subject: [PATCH 3/3] Test pageinfo with fixture based translations (#37310) --- src/pageinfo/tests/pageinfo.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/pageinfo/tests/pageinfo.js b/src/pageinfo/tests/pageinfo.js index c4707ca55d..488ffece04 100644 --- a/src/pageinfo/tests/pageinfo.js +++ b/src/pageinfo/tests/pageinfo.js @@ -16,6 +16,12 @@ describe('pageinfo api', () => { 'WARNING: The pageinfo tests require the ROOT environment variable to be set to the fixture root' ) } + // Ditto for fixture-based translations to work + if (!process.env.TRANSLATIONS_FIXTURE_ROOT) { + console.warn( + 'WARNING: The pageinfo tests require the TRANSLATIONS_FIXTURE_ROOT environment variable to be set' + ) + } }) test('redirects without version suffix', async () => { @@ -195,4 +201,29 @@ describe('pageinfo api', () => { const { error } = JSON.parse(res.body) expect(error).toBe("'pathname' can not contain whitespace") }) + + describe('translations', () => { + test('Japanese page', async () => { + const res = await get(makeURL('/ja/get-started/quickstart/hello-world')) + expect(res.statusCode).toBe(200) + const { info } = JSON.parse(res.body) + expect(info.product).toBe('Get started') + expect(info.title).toBe('こんにちは World') + expect(info.intro).toBe('この Hello World 演習に従って、GitHub の使用を開始します。') + }) + + test('falls back to English if translation is not present', async () => { + const enRes = await get(makeURL('/en/get-started/quickstart')) + expect(enRes.statusCode).toBe(200) + // This page doesn't have a Japanese translation. I.e. it doesn't + // even exist on disk. So it'll fall back to English. + const translationRes = await get(makeURL('/ja/get-started/quickstart')) + expect(translationRes.statusCode).toBe(200) + const en = JSON.parse(enRes.body) + const translation = JSON.parse(translationRes.body) + expect(en.title).toBe(translation.title) + expect(en.intro).toBe(translation.intro) + expect(en.product).toBe(translation.product) + }) + }) })