[all] Fix test fixture pkg names and increase retry (#3935)

Fixes test warnings from `jest-hast-map`:

```
[now-static-build] Running yarn test-integration-once
$ jest --env node --verbose --runInBand test/integration.test.js
jest-haste-map: Haste module naming collision: 12-create-react-app
  The following files share their name; please adjust your hasteImpl:
    * <rootDir>/test/fixtures/12-create-react-app/package.json
    * <rootDir>/test/fixtures/26-ejected-cra/package.json

jest-haste-map: Haste module naming collision: gatsby-starter-default
  The following files share their name; please adjust your hasteImpl:
    * <rootDir>/test/fixtures/10-gatsby/package.json
    * <rootDir>/test/fixtures/10-gatsby-without-build-script/package.json

jest-haste-map: Haste module naming collision: gohugo-default-theme
  The following files share their name; please adjust your hasteImpl:
    * <rootDir>/test/fixtures/31-hugo/themes/ananke/package.json
    * <rootDir>/test/fixtures/46-hugo-with-framework/themes/ananke/package.json

jest-haste-map: Haste module naming collision: gohugo-default-styles
  The following files share their name; please adjust your hasteImpl:
    * <rootDir>/test/fixtures/31-hugo/themes/ananke/src/package.json
    * <rootDir>/test/fixtures/46-hugo-with-framework/themes/ananke/src/package.json

jest-haste-map: Haste module naming collision: 47-nuxt-with-custom-output
  The following files share their name; please adjust your hasteImpl:
    * <rootDir>/test/fixtures/47-nuxt-with-custom-output/package.json
    * <rootDir>/test/fixtures/48-nuxt-without-framework/package.json
```

Also increased test retry to 5.
This commit is contained in:
Steven
2020-03-18 16:37:19 -04:00
committed by GitHub
parent 95daf0e292
commit 99368b4248
17 changed files with 63 additions and 71 deletions

View File

@@ -1,6 +1,6 @@
{ {
"private": true, "private": true,
"name": "gatsby-starter-default", "name": "gatsby",
"version": "1.0.0", "version": "1.0.0",
"dependencies": { "dependencies": {
"gatsby": "^2.18.14", "gatsby": "^2.18.14",

View File

@@ -1,5 +1,5 @@
{ {
"name": "gridsomee", "name": "gridsome",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "gridsome build", "build": "gridsome build",

View File

@@ -18,7 +18,7 @@ module.exports = {
{ {
resolve: `gatsby-plugin-manifest`, resolve: `gatsby-plugin-manifest`,
options: { options: {
name: `gatsby-starter-default`, name: `05-zero-config-gatsby`,
short_name: `starter`, short_name: `starter`,
start_url: `/`, start_url: `/`,
background_color: `#663399`, background_color: `#663399`,

View File

@@ -1,5 +1,5 @@
{ {
"name": "gatsby-starter-default", "name": "05-zero-config-gatsby",
"private": true, "private": true,
"description": "A simple starter to get up and developing quickly with Gatsby", "description": "A simple starter to get up and developing quickly with Gatsby",
"version": "0.1.0", "version": "0.1.0",

View File

@@ -18,7 +18,7 @@ module.exports = {
{ {
resolve: `gatsby-plugin-manifest`, resolve: `gatsby-plugin-manifest`,
options: { options: {
name: `gatsby-starter-default`, name: `05-gatsby`,
short_name: `starter`, short_name: `starter`,
start_url: `/`, start_url: `/`,
background_color: `#663399`, background_color: `#663399`,

View File

@@ -1,5 +1,5 @@
{ {
"name": "gatsby-starter-default", "name": "05-gatsby",
"private": true, "private": true,
"description": "A simple starter to get up and developing quickly with Gatsby", "description": "A simple starter to get up and developing quickly with Gatsby",
"version": "0.1.0", "version": "0.1.0",

View File

@@ -1,5 +1,5 @@
{ {
"name": "gohugo-default-theme", "name": "08-gohugo-default-theme",
"version": "1.0.0", "version": "1.0.0",
"description": "Base Theme to start Hugo Sites", "description": "Base Theme to start Hugo Sites",
"main": "index.js", "main": "index.js",

View File

@@ -20,6 +20,7 @@ import logo from '../src/util/output/logo';
import sleep from '../src/util/sleep'; import sleep from '../src/util/sleep';
import pkg from '../package'; import pkg from '../package';
import prepareFixtures from './helpers/prepare'; import prepareFixtures from './helpers/prepare';
import { fetchTokenWithRetry } from '../../../test/lib/deployment/now-deploy';
// log command when running `execa` // log command when running `execa`
function execa(file, args, options) { function execa(file, args, options) {
@@ -70,25 +71,6 @@ const waitForDeployment = async href => {
} }
}; };
function fetchTokenWithRetry(url, retries = 3) {
return retry(
async () => {
const res = await fetch(url);
if (!res.ok) {
throw new Error(
`Failed to fetch ${url}, received status ${res.status}`
);
}
const data = await res.json();
return data.token;
},
{ retries, factor: 1 }
);
}
function fetchTokenInformation(token, retries = 3) { function fetchTokenInformation(token, retries = 3) {
const url = `https://api.zeit.co/www/user`; const url = `https://api.zeit.co/www/user`;
const headers = { Authorization: `Bearer ${token}` }; const headers = { Authorization: `Bearer ${token}` };

View File

@@ -18,7 +18,7 @@ module.exports = {
{ {
resolve: `gatsby-plugin-manifest`, resolve: `gatsby-plugin-manifest`,
options: { options: {
name: `gatsby-starter-default`, name: `10-gatsby-without-build-script`,
short_name: `starter`, short_name: `starter`,
start_url: `/`, start_url: `/`,
background_color: `#663399`, background_color: `#663399`,

View File

@@ -1,5 +1,5 @@
{ {
"name": "gatsby-starter-default", "name": "10-gatsby-without-build-script",
"private": true, "private": true,
"description": "A simple starter to get up and developing quickly with Gatsby", "description": "A simple starter to get up and developing quickly with Gatsby",
"version": "0.1.0", "version": "0.1.0",

View File

@@ -18,7 +18,7 @@ module.exports = {
{ {
resolve: `gatsby-plugin-manifest`, resolve: `gatsby-plugin-manifest`,
options: { options: {
name: `gatsby-starter-default`, name: `10-gatsby`,
short_name: `starter`, short_name: `starter`,
start_url: `/`, start_url: `/`,
background_color: `#663399`, background_color: `#663399`,

View File

@@ -1,5 +1,5 @@
{ {
"name": "gatsby-starter-default", "name": "10-gatsby",
"private": true, "private": true,
"description": "A simple starter to get up and developing quickly with Gatsby", "description": "A simple starter to get up and developing quickly with Gatsby",
"version": "0.1.0", "version": "0.1.0",

View File

@@ -1,5 +1,5 @@
{ {
"name": "12-create-react-app", "name": "26-ejected-cra",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"dependencies": { "dependencies": {

View File

@@ -1,5 +1,5 @@
{ {
"name": "gohugo-default-theme", "name": "31-gohugo-default-theme",
"version": "1.0.0", "version": "1.0.0",
"description": "Base Theme to start Hugo Sites", "description": "Base Theme to start Hugo Sites",
"main": "index.js", "main": "index.js",

View File

@@ -1,5 +1,5 @@
{ {
"name": "gohugo-default-theme", "name": "46-gohugo-default-theme",
"version": "2.5.5", "version": "2.5.5",
"description": "Base Theme to start Hugo Sites", "description": "Base Theme to start Hugo Sites",
"main": "index.js", "main": "index.js",

View File

@@ -1,5 +1,5 @@
{ {
"name": "47-nuxt-with-custom-output", "name": "48-nuxt-without-framework",
"version": "1.0.0", "version": "1.0.0",
"main": "pages/index.js", "main": "pages/index.js",
"scripts": { "scripts": {

View File

@@ -1,14 +1,16 @@
const assert = require('assert'); const assert = require('assert');
const { createHash } = require('crypto'); const { createHash } = require('crypto');
const path = require('path'); const path = require('path');
const _fetch = require('node-fetch');
const fetch = require('./fetch-retry.js'); const fetch = require('./fetch-retry.js');
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
const str = 'aHR0cHM6Ly9hcGktdG9rZW4tZmFjdG9yeS56ZWl0LnNo'; const str = 'aHR0cHM6Ly9hcGktdG9rZW4tZmFjdG9yeS56ZWl0LnNo';
async function nowDeploy (bodies, randomness) { async function nowDeploy(bodies, randomness) {
const files = Object.keys(bodies) const files = Object.keys(bodies)
.filter((n) => n !== 'now.json') .filter(n => n !== 'now.json')
.map((n) => ({ .map(n => ({
sha: digestOfFile(bodies[n]), sha: digestOfFile(bodies[n]),
size: bodies[n].length, size: bodies[n].length,
file: n, file: n,
@@ -35,7 +37,7 @@ async function nowDeploy (bodies, randomness) {
}; };
if (process.env.FORCE_BUILD_IN_REGION) { if (process.env.FORCE_BUILD_IN_REGION) {
const { builds=[] } = nowDeployPayload; const { builds = [] } = nowDeployPayload;
builds.forEach(b => { builds.forEach(b => {
if (!b.config) { if (!b.config) {
b.config = {}; b.config = {};
@@ -55,7 +57,8 @@ async function nowDeploy (bodies, randomness) {
{ {
const json = await deploymentPost(nowDeployPayload); const json = await deploymentPost(nowDeployPayload);
if (json.error && json.error.code === 'missing_files') throw new Error('Missing files'); if (json.error && json.error.code === 'missing_files')
throw new Error('Missing files');
deploymentId = json.id; deploymentId = json.id;
deploymentUrl = json.url; deploymentUrl = json.url;
} }
@@ -65,21 +68,22 @@ async function nowDeploy (bodies, randomness) {
for (let i = 0; i < 750; i += 1) { for (let i = 0; i < 750; i += 1) {
const { state } = await deploymentGet(deploymentId); const { state } = await deploymentGet(deploymentId);
if (state === 'ERROR') throw new Error(`State of ${deploymentUrl} is ${state}`); if (state === 'ERROR')
throw new Error(`State of ${deploymentUrl} is ${state}`);
if (state === 'READY') break; if (state === 'READY') break;
await new Promise((r) => setTimeout(r, 1000)); await new Promise(r => setTimeout(r, 1000));
} }
return { deploymentId, deploymentUrl }; return { deploymentId, deploymentUrl };
} }
function digestOfFile (body) { function digestOfFile(body) {
return createHash('sha1') return createHash('sha1')
.update(body) .update(body)
.digest('hex'); .digest('hex');
} }
async function filePost (body, digest) { async function filePost(body, digest) {
assert(Buffer.isBuffer(body)); assert(Buffer.isBuffer(body));
const headers = { const headers = {
@@ -102,13 +106,13 @@ async function filePost (body, digest) {
if (json.error) { if (json.error) {
const { status, statusText, headers } = resp; const { status, statusText, headers } = resp;
const { message } = json.error; const { message } = json.error;
console.log('Fetch Error', { url , status, statusText, headers, digest }); console.log('Fetch Error', { url, status, statusText, headers, digest });
throw new Error(message); throw new Error(message);
} }
return json; return json;
} }
async function deploymentPost (payload) { async function deploymentPost(payload) {
const url = '/v6/now/deployments?forceNew=1'; const url = '/v6/now/deployments?forceNew=1';
const resp = await fetchWithAuth(url, { const resp = await fetchWithAuth(url, {
method: 'POST', method: 'POST',
@@ -120,30 +124,30 @@ async function deploymentPost (payload) {
if (json.error) { if (json.error) {
const { status, statusText, headers } = resp; const { status, statusText, headers } = resp;
const { message } = json.error; const { message } = json.error;
console.log('Fetch Error', { url , status, statusText, headers }); console.log('Fetch Error', { url, status, statusText, headers });
throw new Error(message); throw new Error(message);
} }
return json; return json;
} }
async function deploymentGet (deploymentId) { async function deploymentGet(deploymentId) {
const url = `/v3/now/deployments/${deploymentId}`; const url = `/v3/now/deployments/${deploymentId}`;
const resp = await fetchWithAuth(url); const resp = await fetchWithAuth(url);
const json = await resp.json(); const json = await resp.json();
if (json.error) { if (json.error) {
const { status, statusText, headers } = resp; const { status, statusText, headers } = resp;
const { message } = json.error; const { message } = json.error;
console.log('Fetch Error', { url , status, statusText, headers }); console.log('Fetch Error', { url, status, statusText, headers });
throw new Error(message); throw new Error(message);
} }
return json return json;
} }
let token; let token;
let currentCount = 0; let currentCount = 0;
const MAX_COUNT = 10; const MAX_COUNT = 10;
async function fetchWithAuth (url, opts = {}) { async function fetchWithAuth(url, opts = {}) {
if (!opts.headers) opts.headers = {}; if (!opts.headers) opts.headers = {};
if (!opts.headers.Authorization) { if (!opts.headers.Authorization) {
@@ -166,28 +170,33 @@ async function fetchWithAuth (url, opts = {}) {
return await fetchApi(url, opts); return await fetchApi(url, opts);
} }
function fetchTokenWithRetry (url, retries = 3) { async function fetchTokenWithRetry(url, retries = 5) {
return new Promise(async (resolve, reject) => {
try { try {
const res = await fetch(url); const res = await _fetch(url);
if (!res.ok) {
throw new Error(`Unexpected status from token factory: ${res.status}`);
}
const data = await res.json(); const data = await res.json();
resolve(data.token); if (!data) {
throw new Error(`Unexpected response from token factory: no body`);
}
if (!data.token) {
const text = JSON.stringify(data);
throw new Error(`Unexpected response from token factory: ${text}`);
}
return data.token;
} catch (error) { } catch (error) {
console.log(`Failed to fetch token. Retries remaining: ${retries}`); console.log(`Failed to fetch token. Retries remaining: ${retries}`);
if (retries === 0) { if (retries === 0) {
reject(error); console.log(error);
return; throw error;
} }
setTimeout(() => { await sleep(500);
fetchTokenWithRetry(url, retries - 1) return fetchTokenWithRetry(url, retries - 1);
.then(resolve)
.catch(reject);
}, 500);
} }
});
} }
async function fetchApi (url, opts = {}) { async function fetchApi(url, opts = {}) {
const apiHost = process.env.API_HOST || 'api.zeit.co'; const apiHost = process.env.API_HOST || 'api.zeit.co';
const urlWithHost = `https://${apiHost}${url}`; const urlWithHost = `https://${apiHost}${url}`;
const { method = 'GET', body } = opts; const { method = 'GET', body } = opts;
@@ -212,4 +221,5 @@ module.exports = {
fetchApi, fetchApi,
fetchWithAuth, fetchWithAuth,
nowDeploy, nowDeploy,
fetchTokenWithRetry,
}; };