add tests for github dependencies

This commit is contained in:
silverwind 2020-03-08 19:12:16 +01:00
parent 537ccb7218
commit 4c375f2cf1
Signed by: silverwind
GPG Key ID: 2E62B41C93869443
6 changed files with 3754 additions and 26 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -7,7 +7,8 @@
"noty": "3.1.0",
"jpeg-buffer-orientation": "0.0.0",
"styled-components": "2.5.0-1",
"@babel/preset-env": "7.0.0"
"@babel/preset-env": "7.0.0",
"updates": "https://github.com/silverwind/updates/tarball/6941e05"
},
"peerDependencies": {
"@babel/preset-env": "~6.0.0"

72
test.js

@ -4,13 +4,13 @@ const createTestServer = require("create-test-server");
const del = require("del");
const execa = require("execa");
const tempy = require("tempy");
const {join} = require("path");
const {join, resolve} = 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 server;
let registryServer, githubServer, githubApiUrl;
const dependencyTypes = [
"dependencies",
@ -27,29 +27,42 @@ for (const dependencyType of dependencyTypes) {
}
beforeAll(async () => {
server = await createTestServer();
// Server response
// registry response
registryServer = await createTestServer();
for (const packageName of testPackages) {
const name = packageName.replace(/\//g, "%2f");
const path = join(__dirname, "fixtures", "registry-responses", `${name}.json`);
const text = await readFile(path, "utf8");
server.get(`/${name}`, text);
registryServer.get(`/${name}`, await readFile(path, "utf8"));
}
const {sslUrl: registry} = server;
await writeFile(join(testDir, ".npmrc"), `registry=${registry}`); // Fake registry
// registry response
githubServer = await createTestServer();
githubServer.get(
"/repos/silverwind/updates/commits",
await readFile(resolve(__dirname, "fixtures/github-responses/updates-commits.json"), "utf8"),
);
githubServer.get(
"/repos/silverwind/updates/git/refs/tags",
await readFile(resolve(__dirname, "fixtures/github-responses/updates-tags.json"), "utf8"),
);
githubApiUrl = githubServer.sslUrl;
await writeFile(join(testDir, ".npmrc"), `registry=${registryServer.sslUrl}`); // Fake registry
await writeFile(join(testDir, "package.json"), JSON.stringify(packageJson, null, 2)); // Copy fixture
});
afterAll(async () => {
await del(testDir, {force: true});
if (server) await server.close();
await Promise.all([
del(testDir, {force: true}),
registryServer && registryServer.close(),
githubServer && githubServer.close(),
]);
});
function makeTest(args, expected) {
return async () => {
const {stdout} = await execa(join(__dirname, "updates.js"), args.split(/\s+/), {cwd: testDir});
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
@ -110,7 +123,12 @@ test("latest", makeTest("-j", {
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": {
@ -157,7 +175,12 @@ test("greatest", makeTest("-j -g", {
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": {
@ -209,7 +232,12 @@ test("prerelease", makeTest("-j -g -p", {
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": {
@ -261,14 +289,19 @@ test("release", makeTest("-j -R", {
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"
}
},
},
}));
@ -294,5 +327,10 @@ test("patch", makeTest("-j -P", {
new: "3.1.4",
info: "https://github.com/needim/noty",
},
"updates": {
old: "6941e05",
new: "537ccb7",
info: "https://github.com/silverwind/updates",
},
},
}));

@ -38,7 +38,7 @@ const esc = str => str.replace(/[|\\{}()[\]^$+*?.-]/g, "\\$&");
const hostedGitInfo = memoize(fromUrl);
const registryAuthToken = memoize(rat);
const registryUrl = memoize(ru);
const normalizeRegistryUrl = memoize(url => url.endsWith("/") ? url.substring(0, url.length - 1) : url);
const normalizeUrl = memoize(url => url.endsWith("/") ? url.substring(0, url.length - 1) : url);
const args = minimist(process.argv.slice(2), {
boolean: [
@ -55,6 +55,7 @@ const args = minimist(process.argv.slice(2), {
"d", "allow-downgrade",
"f", "file",
"g", "greatest",
"G", "githubapi",
"m", "minor",
"P", "patch",
"p", "prerelease",
@ -70,6 +71,7 @@ const args = minimist(process.argv.slice(2), {
e: "exclude",
f: "file",
g: "greatest",
G: "githubapi",
h: "help",
i: "include",
j: "json",
@ -142,8 +144,9 @@ const allowDowngrade = parseMixedArg(args["allow-downgrade"]);
const defaultRegistry = "https://registry.npmjs.org";
const npmrc = rc("npm", {registry: defaultRegistry});
const authTokenOpts = {npmrc, recursive: true};
const registry = normalizeRegistryUrl(args.registry || npmrc.registry);
const registry = normalizeUrl(args.registry || npmrc.registry);
const maxSockets = typeof args.sockets === "number" ? args.sockets : MAX_SOCKETS;
const githubApiUrl = args.githubapi ? normalizeUrl(args.githubapi) : "https://api.github.com";
let packageFile;
const deps = {};
@ -271,7 +274,7 @@ function findSync(filename, dir, stopDir) {
if ((stopDir && path === stopDir) || parent === dir) {
return null;
} else {
return find(filename, parent, stopDir);
return findSync(filename, parent, stopDir);
}
}
@ -280,7 +283,7 @@ function getAuthAndRegistry(name, registry) {
return [registryAuthToken(registry, authTokenOpts), registry];
} else {
const scope = (/@[a-z0-9][\w-.]+/.exec(name) || [])[0];
const url = normalizeRegistryUrl(registryUrl(scope, npmrc));
const url = normalizeUrl(registryUrl(scope, npmrc));
if (url !== registry) {
try {
const newAuth = registryAuthToken(url, authTokenOpts);
@ -360,6 +363,17 @@ function finish(obj, opts = {}) {
output.error = obj.stack;
}
for (const value of Object.values(deps)) {
if ("oldPrint" in value) {
value.old = value.oldPrint;
delete value.oldPrint;
}
if ("newPrint" in value) {
value.new = value.newPrint;
delete value.newPrint;
}
}
if (args.json) {
if (!hadError) {
output.results = {};
@ -437,8 +451,8 @@ function formatDeps() {
const [_type, name] = key.split(sep);
arr.push([
name,
highlightDiff(data.oldPrint || data.old, data.newPrint || data.new, false),
highlightDiff(data.newPrint || data.new, data.oldPrint || data.old, true),
highlightDiff(data.old, data.new, false),
highlightDiff(data.new, data.old, true),
data.age || "",
data.info,
]);
@ -590,7 +604,7 @@ async function checkUrlDep([key, dep], {useGreatest} = {}) {
if (!user || !repo || !oldRef) return;
if (hashRe.test(oldRef)) {
const res = await fetch(`https://api.github.com/repos/${user}/${repo}/commits`);
const res = await fetch(`${githubApiUrl}/repos/${user}/${repo}/commits`);
if (!res || !res.ok) return;
const data = await res.json();
let {sha: newRef, commit} = data[0];
@ -609,7 +623,7 @@ async function checkUrlDep([key, dep], {useGreatest} = {}) {
return {key, newRange, user, repo, oldRef, newRef, newDate};
}
} else { // TODO: newDate support
const res = await fetch(`https://api.github.com/repos/${user}/${repo}/git/refs/tags`);
const res = await fetch(`${githubApiUrl}/repos/${user}/${repo}/git/refs/tags`);
if (!res || !res.ok) return;
const data = await res.json();
const tags = data.map(entry => entry.ref.replace(/^refs\/tags\//, ""));