Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/commands/doctor.js1
-rw-r--r--package-lock.json191
-rw-r--r--package.json1
-rw-r--r--tap-snapshots/test/lib/commands/doctor.js.test.cjs1333
-rw-r--r--test/fixtures/clean-snapshot.js2
-rw-r--r--test/fixtures/mock-logs.js22
-rw-r--r--test/fixtures/mock-npm.js4
-rw-r--r--test/fixtures/tnock.js15
-rw-r--r--test/lib/commands/doctor.js1379
9 files changed, 1909 insertions, 1039 deletions
diff --git a/lib/commands/doctor.js b/lib/commands/doctor.js
index 9af4c4cd6..14fda024b 100644
--- a/lib/commands/doctor.js
+++ b/lib/commands/doctor.js
@@ -129,6 +129,7 @@ class Doctor extends BaseCommand {
if (!this.npm.silent) {
this.npm.output(table(outTable, tableOpts))
if (!allOk) {
+ // TODO is this really needed?
console.error('')
}
}
diff --git a/package-lock.json b/package-lock.json
index 3f9fb7c81..f70c2e884 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -167,6 +167,7 @@
"@npmcli/template-oss": "^2.9.2",
"eslint": "^8.3.0",
"licensee": "^8.2.0",
+ "nock": "^13.2.4",
"spawk": "^1.7.1",
"tap": "^15.1.6"
},
@@ -5331,14 +5332,14 @@
}
},
"node_modules/nock": {
- "version": "12.0.3",
- "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz",
- "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==",
+ "version": "13.2.4",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.4.tgz",
+ "integrity": "sha512-8GPznwxcPNCH/h8B+XZcKjYPXnUV5clOKCjAqyjsiqA++MpNx9E9+t8YPp0MbThO+KauRo7aZJ1WuIZmOrT2Ug==",
"dev": true,
"dependencies": {
"debug": "^4.1.0",
"json-stringify-safe": "^5.0.1",
- "lodash": "^4.17.13",
+ "lodash.set": "^4.3.2",
"propagate": "^2.0.0"
},
"engines": {
@@ -10435,21 +10436,6 @@
"node": "^12.13.0 || ^14.15.0 || >=16"
}
},
- "workspaces/arborist/node_modules/nock": {
- "version": "13.2.1",
- "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.1.tgz",
- "integrity": "sha512-CoHAabbqq/xZEknubuyQMjq6Lfi5b7RtK6SoNK6m40lebGp3yiMagWtIoYaw2s9sISD7wPuCfwFpivVHX/35RA==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.0",
- "json-stringify-safe": "^5.0.1",
- "lodash.set": "^4.3.2",
- "propagate": "^2.0.0"
- },
- "engines": {
- "node": ">= 10.13"
- }
- },
"workspaces/libnpmaccess": {
"version": "6.0.1",
"license": "ISC",
@@ -10468,6 +10454,21 @@
"node": "^12.13.0 || ^14.15.0 || >=16"
}
},
+ "workspaces/libnpmaccess/node_modules/nock": {
+ "version": "12.0.3",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz",
+ "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.13",
+ "propagate": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ }
+ },
"workspaces/libnpmdiff": {
"version": "4.0.1",
"license": "ISC",
@@ -10622,6 +10623,21 @@
"node": "^12.13.0 || ^14.15.0 || >=16"
}
},
+ "workspaces/libnpmorg/node_modules/nock": {
+ "version": "12.0.3",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz",
+ "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.13",
+ "propagate": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ }
+ },
"workspaces/libnpmpack": {
"version": "4.0.1",
"license": "ISC",
@@ -10639,21 +10655,6 @@
"node": "^12.13.0 || ^14.15.0 || >=16"
}
},
- "workspaces/libnpmpack/node_modules/nock": {
- "version": "13.2.1",
- "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.1.tgz",
- "integrity": "sha512-CoHAabbqq/xZEknubuyQMjq6Lfi5b7RtK6SoNK6m40lebGp3yiMagWtIoYaw2s9sISD7wPuCfwFpivVHX/35RA==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.0",
- "json-stringify-safe": "^5.0.1",
- "lodash.set": "^4.3.2",
- "propagate": "^2.0.0"
- },
- "engines": {
- "node": ">= 10.13"
- }
- },
"workspaces/libnpmpublish": {
"version": "6.0.1",
"license": "ISC",
@@ -10675,6 +10676,21 @@
"node": "^12.13.0 || ^14.15.0 || >=16"
}
},
+ "workspaces/libnpmpublish/node_modules/nock": {
+ "version": "12.0.3",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz",
+ "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.13",
+ "propagate": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ }
+ },
"workspaces/libnpmsearch": {
"version": "5.0.1",
"license": "ISC",
@@ -10765,6 +10781,21 @@
"node": "^12.13.0 || ^14.15.0 || >=16"
}
},
+ "workspaces/libnpmteam/node_modules/nock": {
+ "version": "12.0.3",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz",
+ "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.13",
+ "propagate": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ }
+ },
"workspaces/libnpmversion": {
"version": "3.0.1",
"license": "ISC",
@@ -11340,20 +11371,6 @@
"tcompare": "^5.0.6",
"treeverse": "^1.0.4",
"walk-up-path": "^1.0.0"
- },
- "dependencies": {
- "nock": {
- "version": "13.2.1",
- "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.1.tgz",
- "integrity": "sha512-CoHAabbqq/xZEknubuyQMjq6Lfi5b7RtK6SoNK6m40lebGp3yiMagWtIoYaw2s9sISD7wPuCfwFpivVHX/35RA==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "json-stringify-safe": "^5.0.1",
- "lodash.set": "^4.3.2",
- "propagate": "^2.0.0"
- }
- }
}
},
"@npmcli/ci-detect": {
@@ -14285,6 +14302,20 @@
"npm-package-arg": "^9.0.0",
"npm-registry-fetch": "^13.0.0",
"tap": "^15.1.0"
+ },
+ "dependencies": {
+ "nock": {
+ "version": "12.0.3",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz",
+ "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.13",
+ "propagate": "^2.0.0"
+ }
+ }
}
},
"libnpmdiff": {
@@ -14399,6 +14430,20 @@
"nock": "^12.0.1",
"npm-registry-fetch": "^13.0.0",
"tap": "^15.0.0"
+ },
+ "dependencies": {
+ "nock": {
+ "version": "12.0.3",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz",
+ "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.13",
+ "propagate": "^2.0.0"
+ }
+ }
}
},
"libnpmpack": {
@@ -14410,20 +14455,6 @@
"npm-package-arg": "^9.0.0",
"pacote": "^13.0.2",
"tap": "^15.0.0"
- },
- "dependencies": {
- "nock": {
- "version": "13.2.1",
- "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.1.tgz",
- "integrity": "sha512-CoHAabbqq/xZEknubuyQMjq6Lfi5b7RtK6SoNK6m40lebGp3yiMagWtIoYaw2s9sISD7wPuCfwFpivVHX/35RA==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "json-stringify-safe": "^5.0.1",
- "lodash.set": "^4.3.2",
- "propagate": "^2.0.0"
- }
- }
}
},
"libnpmpublish": {
@@ -14439,6 +14470,20 @@
"semver": "^7.1.3",
"ssri": "^8.0.1",
"tap": "^15"
+ },
+ "dependencies": {
+ "nock": {
+ "version": "12.0.3",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz",
+ "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.13",
+ "propagate": "^2.0.0"
+ }
+ }
}
},
"libnpmsearch": {
@@ -14507,6 +14552,20 @@
"nock": "^12.0.1",
"npm-registry-fetch": "^13.0.0",
"tap": "^15"
+ },
+ "dependencies": {
+ "nock": {
+ "version": "12.0.3",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz",
+ "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.13",
+ "propagate": "^2.0.0"
+ }
+ }
}
},
"libnpmversion": {
@@ -14908,14 +14967,14 @@
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
},
"nock": {
- "version": "12.0.3",
- "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz",
- "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==",
+ "version": "13.2.4",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.4.tgz",
+ "integrity": "sha512-8GPznwxcPNCH/h8B+XZcKjYPXnUV5clOKCjAqyjsiqA++MpNx9E9+t8YPp0MbThO+KauRo7aZJ1WuIZmOrT2Ug==",
"dev": true,
"requires": {
"debug": "^4.1.0",
"json-stringify-safe": "^5.0.1",
- "lodash": "^4.17.13",
+ "lodash.set": "^4.3.2",
"propagate": "^2.0.0"
}
},
diff --git a/package.json b/package.json
index d353ff311..beba6cf7d 100644
--- a/package.json
+++ b/package.json
@@ -204,6 +204,7 @@
"@npmcli/template-oss": "^2.9.2",
"eslint": "^8.3.0",
"licensee": "^8.2.0",
+ "nock": "^13.2.4",
"spawk": "^1.7.1",
"tap": "^15.1.6"
},
diff --git a/tap-snapshots/test/lib/commands/doctor.js.test.cjs b/tap-snapshots/test/lib/commands/doctor.js.test.cjs
new file mode 100644
index 000000000..89599185d
--- /dev/null
+++ b/tap-snapshots/test/lib/commands/doctor.js.test.cjs
@@ -0,0 +1,1333 @@
+/* IMPORTANT
+ * This snapshot file is auto-generated, but designed for humans.
+ * It should be checked into source control and tracked carefully.
+ * Re-generate by setting TAP_SNAPSHOT=1 and running tests.
+ * Make sure to inspect the output below. Do not ignore changes!
+ */
+'use strict'
+exports[`test/lib/commands/doctor.js TAP all clear > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP all clear > output 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP all clear in color > everything is ok in color 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP all clear in color > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP cacache badContent > corrupted cache content 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 2 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP cacache badContent > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 1,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 2
+ }
+ ),
+ ],
+ ],
+ "warn": Array [
+ Array [
+ "verifyCachedFiles",
+ "Corrupted content removed: 1",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Cache issues have been fixed",
+ ],
+ ],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP cacache missingContent > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 1,
+ "verifiedContent": 2
+ }
+ ),
+ ],
+ ],
+ "warn": Array [
+ Array [
+ "verifyCachedFiles",
+ "Missing content: 1",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Cache issues have been fixed",
+ ],
+ ],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP cacache missingContent > missing content 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 2 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP cacache reclaimedCount > content garbage collected 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 2 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP cacache reclaimedCount > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 1,
+ "missingContent": 0,
+ "verifiedContent": 2
+ }
+ ),
+ ],
+ ],
+ "warn": Array [
+ Array [
+ "verifyCachedFiles",
+ "Content garbage-collected: 1 (undefined bytes)",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Cache issues have been fixed",
+ ],
+ ],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP error reading directory > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [
+ Array [
+ "checkFilesPermission",
+ "error reading directory {CWD}/test/lib/commands/tap-testdir-doctor-error-reading-directory/cache",
+ ],
+ Array [
+ "checkFilesPermission",
+ "error reading directory {CWD}/test/lib/commands/tap-testdir-doctor-error-reading-directory/prefix/node_modules",
+ ],
+ Array [
+ "checkFilesPermission",
+ "error reading directory {CWD}/test/lib/commands/tap-testdir-doctor-error-reading-directory/global/lib/node_modules",
+ ],
+ Array [
+ "checkFilesPermission",
+ "error reading directory {CWD}/test/lib/commands/tap-testdir-doctor-error-reading-directory/prefix/node_modules/.bin",
+ ],
+ Array [
+ "checkFilesPermission",
+ "error reading directory {CWD}/test/lib/commands/tap-testdir-doctor-error-reading-directory/global/bin",
+ ],
+ ],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP error reading directory > readdir error 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-error-reading-directory/cache (should be owned by current user)
+Perms check on local node_modules not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-error-reading-directory/prefix/node_modules (should be owned by current user)
+Perms check on global node_modules not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-error-reading-directory/global/lib/node_modules
+Perms check on local bin folder not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-error-reading-directory/prefix/node_modules/.bin
+Perms check on global bin folder not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-error-reading-directory/global/bin
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP incorrect owner > incorrect owner 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache (should be owned by current user)
+Perms check on local node_modules not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/prefix/node_modules (should be owned by current user)
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP incorrect owner > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_logs",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/content-v2",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/index-v5",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/tmp",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_logs/{DATE}-debug-0.log",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/content-v2/sha512",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/index-v5/5e",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/index-v5/af",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/content-v2/sha512/{sha}",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/content-v2/sha512/{sha}",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/index-v5/5e/be",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/index-v5/af/03",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/content-v2/sha512/{sha}",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/content-v2/sha512/{sha}",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/index-v5/5e/be/ccdeeea0a01ebb0e365e566161f7c68ddcbbe04206d8542742d98875f03f",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/index-v5/af/03/5c781820370e585dc2323edbbc80669bf714da5b47d56510c7d0bd7521ee",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/content-v2/sha512/{sha}",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/cache/_cacache/content-v2/sha512/{sha}",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/prefix/node_modules",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/prefix/node_modules/.bin",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/prefix/node_modules/testDir",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/prefix/node_modules/testLink",
+ ],
+ Array [
+ "checkFilesPermission",
+ "should be owner of {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-owner/prefix/node_modules/testDir/testFile",
+ ],
+ ],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP incorrect permissions > incorrect owner 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-permissions/cache (should be owned by current user)
+Perms check on local node_modules not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-permissions/prefix/node_modules (should be owned by current user)
+Perms check on global node_modules not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-permissions/global/lib/node_modules
+Perms check on local bin folder not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-permissions/prefix/node_modules/.bin
+Perms check on global bin folder not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-permissions/global/bin
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP incorrect permissions > logs 1`] = `
+Object {
+ "error": Array [
+ Array [
+ "checkFilesPermission",
+ "Missing permissions on {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-permissions/cache (expect: readable)",
+ ],
+ Array [
+ "checkFilesPermission",
+ "Missing permissions on {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-permissions/prefix/node_modules (expect: readable, writable)",
+ ],
+ Array [
+ "checkFilesPermission",
+ "Missing permissions on {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-permissions/global/lib/node_modules (expect: readable)",
+ ],
+ Array [
+ "checkFilesPermission",
+ "Missing permissions on {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-permissions/prefix/node_modules/.bin (expect: readable, writable, executable)",
+ ],
+ Array [
+ "checkFilesPermission",
+ "Missing permissions on {CWD}/test/lib/commands/tap-testdir-doctor-incorrect-permissions/global/bin (expect: executable)",
+ ],
+ ],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP missing git > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [
+ Array [
+ Error: test error,
+ ],
+ ],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP missing git > missing git 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git not ok Install git and ensure it's in your PATH.
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP missing global directories > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [
+ Array [
+ "checkFilesPermission",
+ "error getting info for {CWD}/test/lib/commands/tap-testdir-doctor-missing-global-directories/global/lib/node_modules",
+ ],
+ Array [
+ "checkFilesPermission",
+ "error getting info for {CWD}/test/lib/commands/tap-testdir-doctor-missing-global-directories/global/bin",
+ ],
+ ],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP missing global directories > missing global directories 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-missing-global-directories/global/lib/node_modules
+Perms check on local bin folder ok
+Perms check on global bin folder not ok Check the permissions of files in {CWD}/test/lib/commands/tap-testdir-doctor-missing-global-directories/global/bin
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP node out of date - current > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP node out of date - current > node is out of date 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v not ok Use node v2.0.1 (current: v2.0.0)
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP node out of date - lts > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP node out of date - lts > node is out of date 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v not ok Use node v1.0.0 (current: v0.0.1)
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP non-default registry > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP non-default registry > non default registry 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry not ok Try \`npm config set registry=https://registry.npmjs.org/\`
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP npm out of date > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP npm out of date > npm is out of date 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v not ok Use npm v2.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP ping 404 > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP ping 404 > ping 404 1`] = `
+Check Value Recommendation/Notes
+npm ping not ok 404 404 Not Found - GET https://registry.npmjs.org/-/ping?write=true
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP ping 404 in color > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP ping 404 in color > ping 404 in color 1`] = `
+Check Value Recommendation/Notes
+npm ping not ok 404 404 Not Found - GET https://registry.npmjs.org/-/ping?write=true
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP ping exception with code > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP ping exception with code > ping failure 1`] = `
+Check Value Recommendation/Notes
+npm ping not ok request to https://registry.npmjs.org/-/ping?write=true failed, reason: Test Error
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP ping exception without code > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP ping exception without code > ping failure 1`] = `
+Check Value Recommendation/Notes
+npm ping not ok request to https://registry.npmjs.org/-/ping?write=true failed, reason: Test Error
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Perms check on cached files ok
+Perms check on local node_modules ok
+Perms check on global node_modules ok
+Perms check on local bin folder ok
+Perms check on global bin folder ok
+Verify cache contents ok verified 0 tarballs
+`
+
+exports[`test/lib/commands/doctor.js TAP silent > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP silent > output 1`] = `
+
+`
+
+exports[`test/lib/commands/doctor.js TAP windows skips permissions checks > logs 1`] = `
+Object {
+ "error": Array [],
+ "info": Array [
+ Array [
+ "Running checkup",
+ ],
+ Array [
+ "checkPing",
+ "Pinging registry",
+ ],
+ Array [
+ "getLatestNpmVersion",
+ "Getting npm package information",
+ ],
+ Array [
+ "getLatestNodejsVersion",
+ "Getting Node.js release information",
+ ],
+ Array [
+ "getGitPath",
+ "Finding git in your PATH",
+ ],
+ Array [
+ "verifyCachedFiles",
+ "Verifying the npm cache",
+ ],
+ Array [
+ "verifyCachedFiles",
+ String(
+ Verification complete. Stats: {
+ "badContentCount": 0,
+ "reclaimedCount": 0,
+ "missingContent": 0,
+ "verifiedContent": 0
+ }
+ ),
+ ],
+ ],
+ "warn": Array [],
+}
+`
+
+exports[`test/lib/commands/doctor.js TAP windows skips permissions checks > no permissions checks 1`] = `
+Check Value Recommendation/Notes
+npm ping ok
+npm -v ok current: v1.0.0, latest: v1.0.0
+node -v ok current: v1.0.0, recommended: v1.0.0
+npm config get registry ok using default registry (https://registry.npmjs.org/)
+which git ok /path/to/git
+Verify cache contents ok verified 0 tarballs
+`
diff --git a/test/fixtures/clean-snapshot.js b/test/fixtures/clean-snapshot.js
index 037155eea..b0ea28cee 100644
--- a/test/fixtures/clean-snapshot.js
+++ b/test/fixtures/clean-snapshot.js
@@ -10,7 +10,7 @@ const cleanCwd = (path) => normalizePath(path)
.replace(new RegExp(normalizePath(process.cwd()), 'g'), '{CWD}')
const cleanDate = (str) =>
- str.replace(/\d{4}-\d{2}-\d{2}T\d{2}[_:]\d{2}[_:]\d{2}[_:]\d{3}Z/g, '{DATE}')
+ str.replace(/\d{4}-\d{2}-\d{2}T\d{2}[_:]\d{2}[_:]\d{2}[_:.]\d{3}Z/g, '{DATE}')
module.exports = {
normalizePath,
diff --git a/test/fixtures/mock-logs.js b/test/fixtures/mock-logs.js
index 80037c6ff..706c9a305 100644
--- a/test/fixtures/mock-logs.js
+++ b/test/fixtures/mock-logs.js
@@ -60,7 +60,27 @@ const mockLogs = (otherMocks = {}) => {
return acc
}, {}),
// except collect timing logs
- { timing: (...args) => logs.push(['timing', ...args]) },
+ {
+ timing: (...args) => logs.push(['timing', ...args]),
+ newItem: () => {
+ return {
+ info: (...p) => {
+ logs.push(['info', ...p])
+ },
+ warn: (...p) => {
+ logs.push(['warn', ...p])
+ },
+ error: (...p) => {
+ logs.push(['error', ...p])
+ },
+ silly: (...p) => {
+ logs.push(['silly', ...p])
+ },
+ completeWork: () => {},
+ finish: () => {},
+ }
+ },
+ },
otherMocks.npmlog
)),
}
diff --git a/test/fixtures/mock-npm.js b/test/fixtures/mock-npm.js
index b00f072dc..ea608d664 100644
--- a/test/fixtures/mock-npm.js
+++ b/test/fixtures/mock-npm.js
@@ -51,7 +51,7 @@ const LoadMockNpm = async (t, {
load = init,
prefixDir = {},
cacheDir = {},
- globalDir = {},
+ globalPrefixDir = {},
config = {},
mocks = {},
globals = null,
@@ -79,7 +79,7 @@ const LoadMockNpm = async (t, {
// Set log level as early as possible since
setLoglevel(t, config.loglevel)
- const dir = t.testdir({ prefix: prefixDir, cache: cacheDir, global: globalDir })
+ const dir = t.testdir({ prefix: prefixDir, cache: cacheDir, global: globalPrefixDir })
const prefix = path.join(dir, 'prefix')
const cache = path.join(dir, 'cache')
const globalPrefix = path.join(dir, 'global')
diff --git a/test/fixtures/tnock.js b/test/fixtures/tnock.js
new file mode 100644
index 000000000..c5acec510
--- /dev/null
+++ b/test/fixtures/tnock.js
@@ -0,0 +1,15 @@
+'use strict'
+
+const nock = require('nock')
+
+// TODO (other tests actually make network calls today, which is bad)
+// nock.disableNetConnect()
+
+module.exports = tnock
+function tnock (t, host) {
+ const server = nock(host)
+ t.teardown(function () {
+ server.done()
+ })
+ return server
+}
diff --git a/test/lib/commands/doctor.js b/test/lib/commands/doctor.js
index dee2110ff..25c3bea0d 100644
--- a/test/lib/commands/doctor.js
+++ b/test/lib/commands/doctor.js
@@ -1,1022 +1,463 @@
const t = require('tap')
-
-const { join } = require('path')
+const { load: loadMockNpm } = require('../../fixtures/mock-npm')
+const tnock = require('../../fixtures/tnock.js')
const fs = require('fs')
-const ansiTrim = require('../../../lib/utils/ansi-trim.js')
+
+const { cleanCwd, cleanDate } = require('../../fixtures/clean-snapshot.js')
+
+const cleanCacheSha = (str) =>
+ str.replace(/content-v2\/sha512\/[^"]+/g, 'content-v2/sha512/{sha}')
+
+t.cleanSnapshot = p => cleanCacheSha(cleanDate(cleanCwd(p)))
+
+// TODO mockglobals!
const isWindows = require('../../../lib/utils/is-windows.js')
-const { fake: mockNpm } = require('../../fixtures/mock-npm')
+
+const processVersion = process.version
+// TODO mockglobals!
+t.beforeEach(() => {
+ Object.defineProperty(process, 'version', { value: 'v1.0.0' })
+})
+
+const consoleErrorFn = console.error
+let consoleError = false
+console.error = () => {
+ consoleError = true
+}
+t.teardown(() => {
+ Object.defineProperty(process, 'version', { value: processVersion })
+ console.error = consoleErrorFn
+})
+
+t.afterEach(() => {
+ consoleError = false
+})
// getuid and getgid do not exist in windows, so we shim them
// to return 0, as that is the value that lstat will assign the
// gid and uid properties for fs.Stats objects
+// TODO mockglobals!
if (isWindows) {
process.getuid = () => 0
process.getgid = () => 0
}
-const output = []
-
-let pingError
-const ping = async () => {
- if (pingError) {
- throw pingError
- }
-}
-
-let whichError = null
-const which = async () => {
- if (whichError) {
- throw whichError
+const npmManifest = (version) => {
+ return {
+ name: 'npm',
+ versions: {
+ [version]: {
+ name: 'npm',
+ version: version,
+ },
+ },
+ time: {
+ [version]: new Date(),
+ },
+ 'dist-tags': { latest: version },
}
- return '/path/to/git'
}
const nodeVersions = [
- { version: 'v14.0.0', lts: false },
- { version: 'v13.0.0', lts: false },
- // it's necessary to allow tests in node 10.x to not mark 12.x as lts
- { version: 'v12.0.0', lts: false },
- { version: 'v10.13.0', lts: 'Dubnium' },
+ { version: 'v2.0.1', lts: false },
+ { version: 'v2.0.0', lts: false },
+ { version: 'v1.0.0', lts: 'NpmTestium' },
]
-const fetch = async () => {
- return {
- json: async () => {
- return nodeVersions
+const dirs = {
+ prefixDir: {
+ node_modules: {
+ testLink: t.fixture('symlink', './testDir'),
+ testDir: {
+ testFile: 'test contents',
+ },
+ '.bin': {},
},
- }
-}
-
-const logs = {
- info: [],
-}
-
-const clearLogs = () => {
- output.length = 0
- for (const key in logs) {
- if (Array.isArray(logs[key])) {
- logs[key].length = 0
- } else {
- delete logs[key]
- }
- }
-}
-
-const npm = mockNpm({
- flatOptions: {
- registry: 'https://registry.npmjs.org/',
- },
- config: {
- loglevel: 'info',
},
- version: '7.1.0',
- output: data => {
- output.push(data)
- },
-})
-
-let latestNpm = npm.version
-const pacote = {
- manifest: async () => {
- return { version: latestNpm }
- },
-}
-
-let verifyResponse = { verifiedCount: 1, verifiedContent: 1 }
-const cacache = {
- verify: async () => {
- return verifyResponse
+ globalPrefixDir: {
+ bin: {},
+ lib: {
+ node_modules: {
+ },
+ },
},
}
const mocks = {
- '../../../lib/utils/is-windows.js': false,
- '../../../lib/utils/ping.js': ping,
- cacache,
- pacote,
- 'make-fetch-happen': fetch,
- which,
- 'proc-log': {
- info: msg => {
- logs.info.push(msg)
- },
- },
- npmlog: {
- newItem: name => {
- logs[name] = {}
- return {
- info: (_, msg) => {
- if (!logs[name].info) {
- logs[name].info = []
- }
- logs[name].info.push(msg)
- },
- warn: (_, msg) => {
- if (!logs[name].warn) {
- logs[name].warn = []
- }
- logs[name].warn.push(msg)
- },
- error: (_, msg) => {
- if (!logs[name].error) {
- logs[name].error = []
- }
- logs[name].error.push(msg)
- },
- silly: (_, msg) => {
- if (!logs[name].silly) {
- logs[name].silly = []
- }
- logs[name].silly.push(msg)
- },
- completeWork: () => {},
- finish: () => {
- logs[name].finished = true
- },
- }
- },
- level: 'error',
- levels: {
- info: 1,
- error: 0,
+ '../../package.json': { version: '1.0.0' },
+ '../../lib/utils/is-windows.js': false,
+ which: async () => '/path/to/git',
+ cacache: {
+ verify: () => {
+ return { badContentCount: 0, reclaimedCount: 0, missingContent: 0, verifiedContent: 0 }
},
},
-
}
-const Doctor = t.mock('../../../lib/commands/doctor.js', {
- ...mocks,
+t.test('all clear', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks,
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await npm.exec('doctor', [])
+ t.matchSnapshot(joinedOutput(), 'output')
+ t.notOk(consoleError, 'console.error not called')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
})
-const doctor = new Doctor(npm)
-
-const origVersion = process.version
-t.test('node versions', t => {
- t.plan(nodeVersions.length)
-
- nodeVersions.forEach(({ version }) => {
- t.test(`${version}:`, vt => {
- Object.defineProperty(process, 'version', { value: version })
- vt.teardown(() => {
- Object.defineProperty(process, 'version', { value: origVersion })
- })
-
- vt.test(`${version}: npm doctor checks ok`, async st => {
- const dir = st.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
-
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- clearLogs()
- })
-
- await doctor.exec([])
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: { finished: true },
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.match(output, /npm ping\s*ok/, 'ping output is ok')
- st.match(output, /npm -v\s*ok/, 'npm -v output is ok')
- st.match(output, /node -v\s*ok/, 'node -v output is ok')
- st.match(
- output,
- /npm config get registry\s*ok\s*using default/,
- 'npm config get registry output is ok'
- )
- st.match(output, /which git\s*ok/, 'which git output is ok')
- st.match(output, /cached files\s*ok/, 'cached files are ok')
- st.match(output, /local node_modules\s*ok/, 'local node_modules are ok')
- st.match(output, /global node_modules\s*ok/, 'global node_modules are ok')
- st.match(output, /local bin folder\s*ok/, 'local bin is ok')
- st.match(output, /global bin folder\s*ok/, 'global bin is ok')
- st.match(output, /cache contents\s*ok/, 'cache contents is ok')
- })
-
- vt.test('npm doctor supports silent', async st => {
- const dir = st.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
- npm.config.set('loglevel', 'silent')
-
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- npm.config.set('loglevel', 'info')
- clearLogs()
- })
-
- await doctor.exec([])
-
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: { finished: true },
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.strictSame(output, [], 'did not print output')
- })
-
- vt.test('npm doctor supports color', async st => {
- const dir = st.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
- npm.color = true
- pingError = { message: 'generic error' }
- const _consoleError = console.error
- console.error = () => {}
-
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- delete npm.color
- pingError = null
- console.error = _consoleError
- clearLogs()
- })
-
- await st.rejects(doctor.exec([]), /Some problems found/, 'detected the ping error')
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: { finished: true },
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.match(output, /npm ping.*not ok/, 'ping output is ok')
- st.match(output, /npm -v.*ok/, 'npm -v output is ok')
- st.match(output, /node -v.*ok/, 'node -v output is ok')
- st.match(
- output,
- /npm config get registry.*ok.*using default/,
- 'npm config get registry output is ok'
- )
- st.match(output, /which git.*ok/, 'which git output is ok')
- st.match(output, /cached files.*ok/, 'cached files are ok')
- st.match(output, /local node_modules.*ok/, 'local node_modules are ok')
- st.match(output, /global node_modules.*ok/, 'global node_modules are ok')
- st.match(output, /local bin folder.*ok/, 'local bin is ok')
- st.match(output, /global bin folder.*ok/, 'global bin is ok')
- st.match(output, /cache contents.*ok/, 'cache contents is ok')
- st.not(output[0], ansiTrim(output[0]), 'output should contain color codes')
- })
-
- vt.test('npm doctor skips some tests in windows', async st => {
- const WinDoctor = t.mock('../../../lib/commands/doctor.js', {
- ...mocks,
- '../../../lib/utils/is-windows.js': true,
- })
- const winDoctor = new WinDoctor(npm)
-
- const dir = st.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
-
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- clearLogs()
- })
-
- await winDoctor.exec([])
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: undefined,
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.match(output, /npm ping\s*ok/, 'ping output is ok')
- st.match(output, /npm -v\s*ok/, 'npm -v output is ok')
- st.match(output, /node -v\s*ok/, 'node -v output is ok')
- st.match(
- output,
- /npm config get registry\s*ok\s*using default/,
- 'npm config get registry output is ok'
- )
- st.match(output, /which git\s*ok/, 'which git output is ok')
- st.match(output, /cache contents\s*ok/, 'cache contents is ok')
- })
-
- vt.test('npm doctor ping error E{3}', async st => {
- const dir = st.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
- pingError = { code: 'E111', message: 'this error is 111' }
- const consoleError = console.error
- // we just print an empty line here, so swallow it and ignore
- console.error = () => {}
-
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- pingError = null
- console.error = consoleError
- clearLogs()
- })
-
- await st.rejects(doctor.exec([]), /Some problems found/, 'detected the ping error')
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: { finished: true },
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.match(
- output,
- /npm ping\s*not ok\s*111 this error is 111/,
- 'ping output contains trimmed error'
- )
- st.match(output, /npm -v\s*ok/, 'npm -v output is ok')
- st.match(output, /node -v\s*ok/, 'node -v output is ok')
- st.match(
- output,
- /npm config get registry\s*ok\s*using default/,
- 'npm config get registry output is ok'
- )
- st.match(output, /which git\s*ok/, 'which git output is ok')
- st.match(output, /cached files\s*ok/, 'cached files are ok')
- st.match(output, /local node_modules\s*ok/, 'local node_modules are ok')
- st.match(output, /global node_modules\s*ok/, 'global node_modules are ok')
- st.match(output, /local bin folder\s*ok/, 'local bin is ok')
- st.match(output, /global bin folder\s*ok/, 'global bin is ok')
- st.match(output, /cache contents\s*ok/, 'cache contents is ok')
- })
-
- vt.test('npm doctor generic ping error', async st => {
- const dir = st.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
- pingError = { message: 'generic error' }
- const consoleError = console.error
- // we just print an empty line here, so swallow it and ignore
- console.error = () => {}
-
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- pingError = null
- console.error = consoleError
- clearLogs()
- })
-
- await st.rejects(doctor.exec([]), /Some problems found/, 'detected the ping error')
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: { finished: true },
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.match(output, /npm ping\s*not ok\s*generic error/, 'ping output contains trimmed error')
- st.match(output, /npm -v\s*ok/, 'npm -v output is ok')
- st.match(output, /node -v\s*ok/, 'node -v output is ok')
- st.match(
- output,
- /npm config get registry\s*ok\s*using default/,
- 'npm config get registry output is ok'
- )
- st.match(output, /which git\s*ok/, 'which git output is ok')
- st.match(output, /cached files\s*ok/, 'cached files are ok')
- st.match(output, /local node_modules\s*ok/, 'local node_modules are ok')
- st.match(output, /global node_modules\s*ok/, 'global node_modules are ok')
- st.match(output, /local bin folder\s*ok/, 'local bin is ok')
- st.match(output, /global bin folder\s*ok/, 'global bin is ok')
- st.match(output, /cache contents\s*ok/, 'cache contents is ok')
- })
-
- vt.test('npm doctor outdated npm version', async st => {
- const dir = st.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
- latestNpm = '7.1.1'
- const consoleError = console.error
- // we just print an empty line here, so swallow it and ignore
- console.error = () => {}
-
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- latestNpm = npm.version
- console.error = consoleError
- clearLogs()
- })
- await st.rejects(doctor.exec([]), /Some problems found/, 'detected the out of date npm')
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: { finished: true },
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.match(output, /npm ping\s*ok/, 'ping output is ok')
- st.match(output, /npm -v\s*not ok/, 'npm -v output is not ok')
- st.match(output, /node -v\s*ok/, 'node -v output is ok')
- st.match(
- output,
- /npm config get registry\s*ok\s*using default/,
- 'npm config get registry output is ok'
- )
- st.match(output, /which git\s*ok/, 'which git output is ok')
- st.match(output, /cached files\s*ok/, 'cached files are ok')
- st.match(output, /local node_modules\s*ok/, 'local node_modules are ok')
- st.match(output, /global node_modules\s*ok/, 'global node_modules are ok')
- st.match(output, /local bin folder\s*ok/, 'local bin is ok')
- st.match(output, /global bin folder\s*ok/, 'global bin is ok')
- st.match(output, /cache contents\s*ok/, 'cache contents is ok')
- })
-
- vt.test('npm doctor file permission checks', async st => {
- const dir = st.testdir({
- cache: {
- one: 'one',
- link: st.fixture('symlink', './baddir'),
- unreadable: 'unreadable',
- baddir: {},
- },
- local: {
- two: 'two',
- notmine: 'notmine',
- },
- global: {
- three: 'three',
- broken: 'broken',
- },
- localBin: {
- four: 'four',
- five: 'five',
- },
- globalBin: {
- six: 'six',
- seven: 'seven',
- },
- })
-
- const _fsLstat = fs.lstat
- fs.lstat = (p, cb) => {
- let err = null
- let stat = null
-
- try {
- stat = fs.lstatSync(p)
- } catch (err) {
- return cb(err)
- }
-
- switch (p) {
- case join(dir, 'local', 'notmine'):
- stat.uid += 1
- stat.gid += 1
- break
- case join(dir, 'global', 'broken'):
- err = new Error('broken')
- break
- }
-
- return cb(err, stat)
- }
-
- const _fsReaddir = fs.readdir
- fs.readdir = (p, cb) => {
- let err = null
- let result = null
-
- try {
- result = fs.readdirSync(p)
- } catch (err) {
- return cb(err)
- }
-
- if (p === join(dir, 'cache', 'baddir')) {
- err = new Error('broken')
- }
-
- return cb(err, result)
- }
-
- const _fsAccess = fs.access
- fs.access = (p, mask, cb) => {
- const err = new Error('failed')
- switch (p) {
- case join(dir, 'cache', 'unreadable'):
- case join(dir, 'localBin', 'four'):
- case join(dir, 'globalBin', 'six'):
- return cb(err)
- default:
- return cb(null)
- }
- }
-
- const Doctor = t.mock('../../../lib/commands/doctor.js', {
- ...mocks,
- fs,
- })
- const doctor = new Doctor(npm)
- // it's necessary to allow tests in node 10.x to not mark 12.x as lted
-
- npm.cache = npm.flatOptions.cache = join(dir, 'cache')
- npm.localDir = join(dir, 'local')
- npm.globalDir = join(dir, 'global')
- npm.localBin = join(dir, 'localBin')
- npm.globalBin = join(dir, 'globalBin')
- const _consoleError = console.error
- console.error = () => {}
-
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- console.error = _consoleError
- fs.lstat = _fsLstat
- fs.readdir = _fsReaddir
- fs.access = _fsAccess
- clearLogs()
- })
-
- await st.rejects(doctor.exec([]), /Some problems found/, 'identified problems')
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [join(dir, 'cache')]: { finished: true },
- [join(dir, 'local')]: { finished: true },
- [join(dir, 'global')]: { finished: true },
- [join(dir, 'localBin')]: { finished: true },
- [join(dir, 'globalBin')]: { finished: true },
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.match(output, /npm ping\s*ok/, 'ping output is ok')
- st.match(output, /npm -v\s*ok/, 'npm -v output is ok')
- st.match(output, /node -v\s*ok/, 'node -v output is ok')
- st.match(
- output,
- /npm config get registry\s*ok\s*using default/,
- 'npm config get registry output is ok'
- )
- st.match(output, /which git\s*ok/, 'which git output is ok')
- st.match(output, /cached files\s*not ok/, 'cached files are not ok')
- st.match(output, /local node_modules\s*not ok/, 'local node_modules are not ok')
- st.match(output, /global node_modules\s*not ok/, 'global node_modules are not ok')
- st.match(output, /local bin folder\s*not ok/, 'local bin is not ok')
- st.match(output, /global bin folder\s*not ok/, 'global bin is not ok')
- st.match(output, /cache contents\s*ok/, 'cache contents is ok')
- })
-
- vt.test('npm doctor missing git', async st => {
- const dir = st.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
- whichError = new Error('boom')
- const consoleError = console.error
- // we just print an empty line here, so swallow it and ignore
- console.error = () => {}
-
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- whichError = null
- console.error = consoleError
- clearLogs()
- })
-
- await st.rejects(doctor.exec([]), /Some problems found/, 'detected the missing git')
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: { finished: true },
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.match(output, /npm ping\s*ok/, 'ping output is ok')
- st.match(output, /npm -v\s*ok/, 'npm -v output is ok')
- st.match(output, /node -v\s*ok/, 'node -v output is ok')
- st.match(
- output,
- /npm config get registry\s*ok\s*using default/,
- 'npm config get registry output is ok'
- )
- st.match(output, /which git\s*not ok/, 'which git output is not ok')
- st.match(output, /cached files\s*ok/, 'cached files are ok')
- st.match(output, /local node_modules\s*ok/, 'local node_modules are ok')
- st.match(output, /global node_modules\s*ok/, 'global node_modules are ok')
- st.match(output, /local bin folder\s*ok/, 'local bin is ok')
- st.match(output, /global bin folder\s*ok/, 'global bin is ok')
- st.match(output, /cache contents\s*ok/, 'cache contents is ok')
- })
-
- vt.test('npm doctor cache verification showed bad content', async st => {
- const dir = st.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
- const _verifyResponse = verifyResponse
- verifyResponse = {
- ...verifyResponse,
- badContentCount: 1,
- }
- const consoleError = console.error
- // we just print an empty line here, so swallow it and ignore
- console.error = () => {}
-
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- verifyResponse = _verifyResponse
- console.error = consoleError
- clearLogs()
- })
+t.test('all clear in color', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks,
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ npm.config.set('color', 'always')
+ await npm.exec('doctor', [])
+ t.matchSnapshot(joinedOutput(), 'everything is ok in color')
+ t.notOk(consoleError, 'console.error not called')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- // cache verification problems get fixed and so do not throw an error
- await doctor.exec([])
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: { finished: true },
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.match(output, /npm ping\s*ok/, 'ping output is ok')
- st.match(output, /npm -v\s*ok/, 'npm -v output is ok')
- st.match(output, /node -v\s*ok/, 'node -v output is ok')
- st.match(
- output,
- /npm config get registry\s*ok\s*using default/,
- 'npm config get registry output is ok'
- )
- st.match(output, /which git\s*ok/, 'which git output is ok')
- st.match(output, /cached files\s*ok/, 'cached files are ok')
- st.match(output, /local node_modules\s*ok/, 'local node_modules are ok')
- st.match(output, /global node_modules\s*ok/, 'global node_modules are ok')
- st.match(output, /local bin folder\s*ok/, 'local bin is ok')
- st.match(output, /global bin folder\s*ok/, 'global bin is ok')
- st.match(output, /cache contents\s*ok/, 'cache contents is not ok')
- })
+t.test('silent', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks,
+ config: {
+ loglevel: 'silent',
+ },
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await npm.exec('doctor', [])
+ t.matchSnapshot(joinedOutput(), 'output')
+ t.notOk(consoleError, 'console.error not called')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
+t.test('ping 404', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks,
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(404, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'ping 404')
+ t.ok(consoleError, 'console.error called')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- vt.test('npm doctor cache verification showed reclaimed content', async st => {
- const dir = st.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
- const _verifyResponse = verifyResponse
- verifyResponse = {
- ...verifyResponse,
- reclaimedCount: 1,
- reclaimedSize: 100,
- }
- const consoleError = console.error
- // we just print an empty line here, so swallow it and ignore
- console.error = () => {}
+t.test('ping 404 in color', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks,
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(404, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ npm.config.set('color', 'always')
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'ping 404 in color')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- verifyResponse = _verifyResponse
- console.error = consoleError
- clearLogs()
- })
+t.test('ping exception with code', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks,
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').replyWithError({ message: 'Test Error', code: 'TEST' })
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'ping failure')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- // cache verification problems get fixed and so do not throw an error
- await doctor.exec([])
+t.test('ping exception without code', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks,
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').replyWithError({ message: 'Test Error', code: false })
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'ping failure')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: { finished: true },
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.match(output, /npm ping\s*ok/, 'ping output is ok')
- st.match(output, /npm -v\s*ok/, 'npm -v output is ok')
- st.match(output, /node -v\s*ok/, 'node -v output is ok')
- st.match(
- output,
- /npm config get registry\s*ok\s*using default/,
- 'npm config get registry output is ok'
- )
- st.match(output, /which git\s*ok/, 'which git output is ok')
- st.match(output, /cached files\s*ok/, 'cached files are ok')
- st.match(output, /local node_modules\s*ok/, 'local node_modules are ok')
- st.match(output, /global node_modules\s*ok/, 'global node_modules are ok')
- st.match(output, /local bin folder\s*ok/, 'local bin is ok')
- st.match(output, /global bin folder\s*ok/, 'global bin is ok')
- st.match(output, /cache contents\s*ok/, 'cache contents is not ok')
- })
+t.test('npm out of date', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks,
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest('2.0.0'))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'npm is out of date')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- vt.test('npm doctor cache verification showed missing content', async st => {
- const dir = t.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
- const _verifyResponse = verifyResponse
- verifyResponse = {
- ...verifyResponse,
- missingContent: 1,
- }
- const consoleError = console.error
- // we just print an empty line here, so swallow it and ignore
- console.error = () => {}
+t.test('node out of date - lts', async t => {
+ Object.defineProperty(process, 'version', { value: 'v0.0.1' })
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks,
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'node is out of date')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- verifyResponse = _verifyResponse
- console.error = consoleError
- clearLogs()
- })
+t.test('node out of date - current', async t => {
+ Object.defineProperty(process, 'version', { value: 'v2.0.0' })
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks,
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'node is out of date')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- // cache verification problems get fixed and so do not throw an error
- await doctor.exec([])
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: { finished: true },
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.match(output, /npm ping\s*ok/, 'ping output is ok')
- st.match(output, /npm -v\s*ok/, 'npm -v output is ok')
- st.match(output, /node -v\s*ok/, 'node -v output is ok')
- st.match(
- output,
- /npm config get registry\s*ok\s*using default/,
- 'npm config get registry output is ok'
- )
- st.match(output, /which git\s*ok/, 'which git output is ok')
- st.match(output, /cached files\s*ok/, 'cached files are ok')
- st.match(output, /local node_modules\s*ok/, 'local node_modules are ok')
- st.match(output, /global node_modules\s*ok/, 'global node_modules are ok')
- st.match(output, /local bin folder\s*ok/, 'local bin is ok')
- st.match(output, /global bin folder\s*ok/, 'global bin is ok')
- st.match(output, /cache contents\s*ok/, 'cache contents is not ok')
- })
+t.test('non-default registry', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks,
+ config: { registry: 'http://some-other-url.npmjs.org' },
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'non default registry')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- vt.test('npm doctor not using default registry', async st => {
- const dir = st.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
- const _currentRegistry = npm.flatOptions.registry
- npm.flatOptions.registry = 'https://google.com'
- const consoleError = console.error
- // we just print an empty line here, so swallow it and ignore
- console.error = () => {}
+t.test('missing git', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks: {
+ ...mocks,
+ which: async () => {
+ throw new Error('test error')
+ },
+ },
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'missing git')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- npm.flatOptions.registry = _currentRegistry
- console.error = consoleError
- clearLogs()
- })
+t.test('windows skips permissions checks', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks: {
+ ...mocks,
+ '../../lib/utils/is-windows.js': true,
+ },
+ prefixDir: {},
+ globalPrefixDir: {},
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await npm.exec('doctor', [])
+ t.matchSnapshot(joinedOutput(), 'no permissions checks')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- await st.rejects(
- doctor.exec([]),
- /Some problems found/,
- 'detected the non-default registry'
- )
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: { finished: true },
- verifyCachedFiles: { finished: true },
- },
- 'trackers all finished'
- )
- st.match(output, /npm ping\s*ok/, 'ping output is ok')
- st.match(output, /npm -v\s*ok/, 'npm -v output is ok')
- st.match(output, /node -v\s*ok/, 'node -v output is ok')
- st.match(
- output,
- /npm config get registry\s*not ok/,
- 'npm config get registry output is not ok'
- )
- st.match(output, /which git\s*ok/, 'which git output is ok')
- st.match(output, /cached files\s*ok/, 'cached files are ok')
- st.match(output, /local node_modules\s*ok/, 'local node_modules are ok')
- st.match(output, /global node_modules\s*ok/, 'global node_modules are ok')
- st.match(output, /local bin folder\s*ok/, 'local bin is ok')
- st.match(output, /global bin folder\s*ok/, 'global bin is ok')
- st.match(output, /cache contents\s*ok/, 'cache contents is ok')
- })
+t.test('missing global directories', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks,
+ prefixDir: dirs.prefixDir,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'missing global directories')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- vt.end()
- })
+t.test('incorrect owner', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks: {
+ ...mocks,
+ fs: {
+ ...fs,
+ lstat: (p, cb) => {
+ const stat = fs.lstatSync(p)
+ stat.uid += 1
+ stat.gid += 1
+ return cb(null, stat)
+ },
+ },
+ },
+ ...dirs,
})
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'incorrect owner')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
})
-t.test('outdated node version', vt => {
- vt.plan(1)
- const version = 'v10.0.0'
+t.test('incorrect permissions', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks: {
+ ...mocks,
+ fs: {
+ ...fs,
+ access: () => {
+ throw new Error('Test Error')
+ },
+ },
+ },
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'incorrect owner')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- Object.defineProperty(process, 'version', { value: version })
- vt.teardown(() => {
- Object.defineProperty(process, 'version', { value: origVersion })
+t.test('error reading directory', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks: {
+ ...mocks,
+ fs: {
+ ...fs,
+ readdir: () => {
+ throw new Error('Test Error')
+ },
+ },
+ },
+ ...dirs,
})
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await t.rejects(npm.exec('doctor', []))
+ t.matchSnapshot(joinedOutput(), 'readdir error')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- vt.test('npm doctor outdated nodejs version', async st => {
- const dir = st.testdir()
- npm.cache = npm.flatOptions.cache = dir
- npm.localDir = dir
- npm.globalDir = dir
- npm.localBin = dir
- npm.globalBin = dir
- nodeVersions.push({ version: process.version.replace(/\d+(-.*)?$/, '999'), lts: false })
- const consoleError = console.error
- // we just print an empty line here, so swallow it and ignore
- console.error = () => {}
+t.test('cacache badContent', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks: {
+ ...mocks,
+ cacache: {
+ verify: async () => {
+ return { badContentCount: 1, reclaimedCount: 0, missingContent: 0, verifiedContent: 2 }
+ },
+ },
+ },
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await npm.exec('doctor', [])
+ t.matchSnapshot(joinedOutput(), 'corrupted cache content')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- st.teardown(() => {
- delete npm.cache
- delete npm.flatOptions.cache
- delete npm.localDir
- delete npm.globalDir
- delete npm.localBin
- delete npm.globalBin
- nodeVersions.pop()
- console.error = consoleError
- clearLogs()
- })
+t.test('cacache reclaimedCount', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks: {
+ ...mocks,
+ cacache: {
+ verify: async () => {
+ return { badContentCount: 0, reclaimedCount: 1, missingContent: 0, verifiedContent: 2 }
+ },
+ },
+ },
+ ...dirs,
+ })
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await npm.exec('doctor', [])
+ t.matchSnapshot(joinedOutput(), 'content garbage collected')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
+})
- await st.rejects(doctor.exec([]), /Some problems found/, 'detected the out of date nodejs')
- st.match(
- logs,
- {
- checkPing: { finished: true },
- getLatestNpmVersion: { finished: true },
- getLatestNodejsVersion: { finished: true },
- getGitPath: { finished: true },
- [dir]: { finished: true },
- verifyCachedFiles: { finished: true },
+t.test('cacache missingContent', async t => {
+ const { joinedOutput, logs, npm } = await loadMockNpm(t, {
+ mocks: {
+ ...mocks,
+ cacache: {
+ verify: async () => {
+ return { badContentCount: 0, reclaimedCount: 0, missingContent: 1, verifiedContent: 2 }
+ },
},
- 'trackers all finished'
- )
- st.match(output, /npm ping\s*ok/, 'ping output is ok')
- st.match(output, /npm -v\s*ok/, 'npm -v output is ok')
- st.match(output, /node -v\s*not ok/, 'node -v output is not ok')
- st.match(
- output,
- /npm config get registry\s*ok\s*using default/,
- 'npm config get registry output is ok'
- )
- st.match(output, /which git\s*ok/, 'which git output is ok')
- st.match(output, /cached files\s*ok/, 'cached files are ok')
- st.match(output, /local node_modules\s*ok/, 'local node_modules are ok')
- st.match(output, /global node_modules\s*ok/, 'global node_modules are ok')
- st.match(output, /local bin folder\s*ok/, 'local bin is ok')
- st.match(output, /global bin folder\s*ok/, 'global bin is ok')
- st.match(output, /cache contents\s*ok/, 'cache contents is ok')
+ },
+ ...dirs,
})
+ tnock(t, npm.config.get('registry'))
+ .get('/-/ping?write=true').reply(200, '{}')
+ .get('/npm').reply(200, npmManifest(npm.version))
+ tnock(t, 'https://nodejs.org')
+ .get('/dist/index.json').reply(200, nodeVersions)
+ await npm.exec('doctor', [])
+ t.matchSnapshot(joinedOutput(), 'missing content')
+ t.matchSnapshot({ info: logs.info, warn: logs.warn, error: logs.error }, 'logs')
})