angular/aio/scripts/deploy-to-firebase/post-deploy-actions.mjs
George Kalpakas cd359259f4 feat(docs-infra): add post-deploy actions for testing more redirect configs (#43963)
Add `deploy-to-firebase` post-deploy actions to allow testing various
redirect configs.
In a future commit, this will allow testing redirects for the `stable`,
`rc` and `next` deployments via the Firebase config file (without
requiring changes in the Firebase console or DNS).

PR Close #43963
2021-10-29 15:05:03 -07:00

95 lines
3.4 KiB
JavaScript

import sh from 'shelljs';
import u from './utils.mjs';
// Exports
const exp = {
testNoActiveRcDeployment,
testPwaScore,
};
Object.keys(u.ORIGINS).forEach(originLabel => {
const testRedirectFn = generateFn_testRedirectTo(originLabel);
exp[testRedirectFn.name] = testRedirectFn;
});
export default exp;
// Helpers
function generateFn_testRedirectTo(originLabel) {
const destinationOrigin = u.ORIGINS[originLabel];
const functionName = `testRedirectTo${originLabel}`;
return u.nameFunction(functionName, function ({deployedUrl}) {
u.logSectionHeader(`Verify deployed version redirects to '${destinationOrigin}'.`);
// Ensure a request for `ngsw.json` is redirected to `<destinationOrigin>/ngsw.json`.
testUrlRedirect('ngsw.json', deployedUrl, destinationOrigin);
// Ensure a request for `foo/bar` is redirected to `<destinationOrigin>/foo/bar`.
testUrlRedirect('foo/bar?baz=qux', deployedUrl, destinationOrigin);
});
}
function testNoActiveRcDeployment({deployedUrl}) {
const destinationOrigin = u.ORIGINS.Stable;
u.logSectionHeader(
`Verify deployed RC version redirects to '${destinationOrigin}' (and disables old ` +
'ServiceWorker).');
// Ensure a request for `ngsw.json` returns 404.
testUrlNotFound('ngsw.json', deployedUrl);
// Ensure a request for `foo/bar` is redirected to `https://angular.io/foo/bar`.
testUrlRedirect('foo/bar?baz=qux', deployedUrl, destinationOrigin);
}
function testPwaScore({deployedUrl, minPwaScore}) {
u.logSectionHeader('Run PWA-score tests.');
u.yarn(`test-pwa-score "${deployedUrl}" "${minPwaScore}"`);
}
function testUrlNotFound(relativeUrl, sourceOrigin) {
// Strip leading/trailing slashes.
relativeUrl = relativeUrl.replace(/^\//, '');
sourceOrigin = sourceOrigin.replace(/\/$/, '');
const sourceUrl = `${sourceOrigin}/${relativeUrl}`;
const expectedStatusCode = '404';
const testScript = `https.get('${sourceUrl}', res => console.log(res.statusCode))`;
const actualStatusCode = sh.exec(`node --eval "${testScript}"`, {silent: true}).trim();
if (actualStatusCode !== expectedStatusCode) {
throw new Error(
`Expected '${sourceUrl}' to return a status code of '${expectedStatusCode}', but it ` +
`returned '${actualStatusCode}'.`);
}
}
function testUrlRedirect(relativeUrl, sourceOrigin, destinationOrigin) {
// Strip leading/trailing slashes.
relativeUrl = relativeUrl.replace(/^\//, '');
sourceOrigin = sourceOrigin.replace(/\/$/, '');
destinationOrigin = destinationOrigin.replace(/\/$/, '');
const sourceUrl = `${sourceOrigin}/${relativeUrl}`;
const expectedStatusCode = '302';
const expectedDestinationUrl = `${destinationOrigin}/${relativeUrl}`;
const testScript =
`https.get('${sourceUrl}', res => console.log(res.statusCode, res.headers.location))`;
const [actualStatusCode, actualDestinationUrl] =
sh.exec(`node --eval "${testScript}"`, {silent: true}).trim().split(' ');
if (actualStatusCode !== expectedStatusCode) {
throw new Error(
`Expected '${sourceUrl}' to return a status code of '${expectedStatusCode}', but it ` +
`returned '${actualStatusCode}'.`);
} else if (actualDestinationUrl !== expectedDestinationUrl) {
const actualBehavior = (actualDestinationUrl === 'undefined') ?
'not redirected' : `redirected to '${actualDestinationUrl}'`;
throw new Error(
`Expected '${sourceUrl}' to be redirected to '${expectedDestinationUrl}', but it was ` +
`${actualBehavior}.`);
}
}