add tests for github dependencies
This commit is contained in:
parent
537ccb7218
commit
4c375f2cf1
2372
fixtures/github-responses/updates-commits.json
Normal file
2372
fixtures/github-responses/updates-commits.json
Normal file
File diff suppressed because it is too large
Load Diff
1302
fixtures/github-responses/updates-tags.json
Normal file
1302
fixtures/github-responses/updates-tags.json
Normal file
File diff suppressed because it is too large
Load Diff
1
fixtures/registry-responses/updates.json
Normal file
1
fixtures/registry-responses/updates.json
Normal file
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
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",
|
||||
},
|
||||
},
|
||||
}));
|
||||
|
30
updates.js
30
updates.js
@ -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\//, ""));
|
||||
|
Loading…
Reference in New Issue
Block a user