updates/test.js
2020-03-09 22:00:55 +01:00

332 lines
8.9 KiB
JavaScript

"use strict";
const createTestServer = require("create-test-server");
const del = require("del");
const execa = require("execa");
const tempy = require("tempy");
const {join} = require("path");
const {test, expect, beforeAll, afterAll} = global;
const {writeFile, readFile} = require("fs").promises;
const packageJson = require("./fixtures/test.json");
const testDir = tempy.directory();
let npmServer, githubServer, githubApiUrl;
const dependencyTypes = [
"dependencies",
"devDependencies",
"peerDependencies",
"optionalDependencies",
];
const testPackages = [];
for (const dependencyType of dependencyTypes) {
for (const name of Object.keys(packageJson[dependencyType] || [])) {
testPackages.push(name);
}
}
beforeAll(async () => {
npmServer = await createTestServer(); // npm api response
githubServer = await createTestServer(); // github api response
for (const packageName of testPackages) {
const name = packageName.replace(/\//g, "%2f");
const path = join(__dirname, `fixtures/npm/${name}.json`);
npmServer.get(`/${name}`, await readFile(path));
}
const commits = await readFile(join(__dirname, "fixtures/github/updates-commits.json"));
const tags = await readFile(join(__dirname, "fixtures/github/updates-tags.json"));
githubServer.get("/repos/silverwind/updates/commits", commits);
githubServer.get("/repos/silverwind/updates/git/refs/tags", tags);
githubApiUrl = githubServer.sslUrl;
await writeFile(join(testDir, ".npmrc"), `registry=${npmServer.sslUrl}`); // Fake registry
await writeFile(join(testDir, "package.json"), JSON.stringify(packageJson, null, 2)); // Copy fixture
});
afterAll(async () => {
await Promise.all([
del(testDir, {force: true}),
npmServer && npmServer.close(),
githubServer && githubServer.close(),
]);
});
function makeTest(args, expected) {
return async () => {
const argsArr = [...args.split(/\s+/), "-G", githubApiUrl];
const {stdout} = await execa(join(__dirname, "updates.js"), argsArr, {cwd: testDir});
const {results} = JSON.parse(stdout);
// Parse results, with custom validation for the dynamic "age" property
for (const dependencyType of dependencyTypes) {
for (const [dependencyName, data] of Object.entries(expected[dependencyType] || {})) {
for (const [key, value] of Object.entries(data || {})) {
const resultValue = results[dependencyType][dependencyName][key];
if (key === "age") {
expect(resultValue).toBeInstanceOf(String);
expect(resultValue.length > 0).toBeTruthy();
} else {
expect(resultValue).toEqual(value);
}
}
}
}
};
}
test("latest", makeTest("-j", {
dependencies: {
"gulp-sourcemaps": {
old: "2.0.0",
new: "2.6.5",
info: "https://github.com/gulp-sourcemaps/gulp-sourcemaps",
},
"prismjs": {
old: "1.0.0",
new: "1.17.1",
info: "https://github.com/LeaVerou/prism",
},
"svgstore": {
old: "^3.0.0",
new: "^3.0.0-2",
info: "https://github.com/svgstore/svgstore",
},
"html-webpack-plugin": {
old: "4.0.0-alpha.2",
new: "4.0.0-beta.11",
info: "https://github.com/jantimon/html-webpack-plugin",
},
"noty": {
old: "3.1.0",
new: "3.2.0-beta",
info: "https://github.com/needim/noty",
},
"jpeg-buffer-orientation": {
old: "0.0.0",
new: "2.0.3",
info: "https://github.com/fisker/jpeg-buffer-orientation",
},
"styled-components": {
old: "2.5.0-1",
new: "5.0.0-rc.2",
info: "https://github.com/styled-components/styled-components",
},
"@babel/preset-env": {
old: "7.0.0",
new: "7.7.6",
info: "https://github.com/babel/babel/tree/master/packages/babel-preset-env",
},
"updates": {
old: "6941e05",
new: "537ccb7",
info: "https://github.com/silverwind/updates",
},
},
peerDependencies: {
"@babel/preset-env": {
old: "~6.0.0",
new: "~7.7.6",
info: "https://github.com/babel/babel/tree/master/packages/babel-preset-env"
}
},
}));
test("greatest", makeTest("-j -g", {
dependencies: {
"gulp-sourcemaps": {
old: "2.0.0",
new: "2.6.5",
info: "https://github.com/gulp-sourcemaps/gulp-sourcemaps",
},
"prismjs": {
old: "1.0.0",
new: "1.17.1",
info: "https://github.com/LeaVerou/prism",
},
"html-webpack-plugin": {
old: "4.0.0-alpha.2",
new: "4.0.0-beta.11",
info: "https://github.com/jantimon/html-webpack-plugin",
},
"noty": {
old: "3.1.0",
new: "3.1.4",
info: "https://github.com/needim/noty",
},
"jpeg-buffer-orientation": {
old: "0.0.0",
new: "2.0.3",
info: "https://github.com/fisker/jpeg-buffer-orientation",
},
"styled-components": {
old: "2.5.0-1",
new: "5.0.0-rc.2",
info: "https://github.com/styled-components/styled-components",
},
"@babel/preset-env": {
old: "7.0.0",
new: "7.7.6",
info: "https://github.com/babel/babel/tree/master/packages/babel-preset-env",
},
"updates": {
old: "6941e05",
new: "537ccb7",
info: "https://github.com/silverwind/updates",
},
},
peerDependencies: {
"@babel/preset-env": {
old: "~6.0.0",
new: "~7.7.6",
info: "https://github.com/babel/babel/tree/master/packages/babel-preset-env"
}
}
}));
test("prerelease", makeTest("-j -g -p", {
dependencies: {
"gulp-sourcemaps": {
old: "2.0.0",
new: "2.6.5",
info: "https://github.com/gulp-sourcemaps/gulp-sourcemaps",
},
"prismjs": {
old: "1.0.0",
new: "1.17.1",
info: "https://github.com/LeaVerou/prism",
},
"svgstore": {
old: "^3.0.0",
new: "^3.0.0-2",
info: "https://github.com/svgstore/svgstore",
},
"html-webpack-plugin": {
old: "4.0.0-alpha.2",
new: "4.0.0-beta.11",
info: "https://github.com/jantimon/html-webpack-plugin",
},
"noty": {
old: "3.1.0",
new: "3.2.0-beta",
info: "https://github.com/needim/noty",
},
"jpeg-buffer-orientation": {
old: "0.0.0",
new: "2.0.3",
info: "https://github.com/fisker/jpeg-buffer-orientation",
},
"styled-components": {
old: "2.5.0-1",
new: "5.0.0-rc.2",
info: "https://github.com/styled-components/styled-components",
},
"@babel/preset-env": {
old: "7.0.0",
new: "7.7.6",
info: "https://github.com/babel/babel/tree/master/packages/babel-preset-env",
},
"updates": {
old: "6941e05",
new: "537ccb7",
info: "https://github.com/silverwind/updates",
},
},
peerDependencies: {
"@babel/preset-env": {
old: "~6.0.0",
new: "~7.7.6",
info: "https://github.com/babel/babel/tree/master/packages/babel-preset-env"
}
},
}));
test("release", makeTest("-j -R", {
dependencies: {
"gulp-sourcemaps": {
old: "2.0.0",
new: "2.6.5",
info: "https://github.com/gulp-sourcemaps/gulp-sourcemaps",
},
"prismjs": {
old: "1.0.0",
new: "1.17.1",
info: "https://github.com/LeaVerou/prism",
},
"svgstore": {
old: "^3.0.0",
new: "^2.0.3",
info: "https://github.com/svgstore/svgstore",
},
"html-webpack-plugin": {
old: "4.0.0-alpha.2",
new: "3.2.0",
info: "https://github.com/jantimon/html-webpack-plugin",
},
"noty": {
old: "3.1.0",
new: "3.1.4",
info: "https://github.com/needim/noty",
},
"jpeg-buffer-orientation": {
old: "0.0.0",
new: "2.0.3",
info: "https://github.com/fisker/jpeg-buffer-orientation",
},
"styled-components": {
old: "2.5.0-1",
new: "4.4.1",
info: "https://github.com/styled-components/styled-components",
},
"@babel/preset-env": {
old: "7.0.0",
new: "7.7.6",
info: "https://github.com/babel/babel/tree/master/packages/babel-preset-env",
},
"updates": {
old: "6941e05",
new: "537ccb7",
info: "https://github.com/silverwind/updates",
},
},
peerDependencies: {
"@babel/preset-env": {
old: "~6.0.0",
new: "~7.7.6",
info: "https://github.com/babel/babel/tree/master/packages/babel-preset-env"
},
},
}));
test("patch", makeTest("-j -P", {
dependencies: {
"gulp-sourcemaps": {
old: "2.0.0",
new: "2.0.1",
info: "https://github.com/floridoo/gulp-sourcemaps",
},
"svgstore": {
old: "^3.0.0",
new: "^3.0.0-2",
info: "https://github.com/svgstore/svgstore",
},
"html-webpack-plugin": {
old: "4.0.0-alpha.2",
new: "4.0.0-beta.11",
info: "https://github.com/jantimon/html-webpack-plugin",
},
"noty": {
old: "3.1.0",
new: "3.1.4",
info: "https://github.com/needim/noty",
},
"updates": {
old: "6941e05",
new: "537ccb7",
info: "https://github.com/silverwind/updates",
},
},
}));