From a211d30e205374c3bf0499390c9b022cc000848d Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 19 Jun 2020 21:46:39 +0800 Subject: [PATCH 01/49] trying to test non cli --- index.js | 2 ++ lib/AddDependencies.js | 14 +++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 1e8cf44..70cbff6 100755 --- a/index.js +++ b/index.js @@ -9,3 +9,5 @@ app.addDependencies().then(app.saveToPackage.bind(app)).catch((error) => { console.error('\x1b[31m%s\x1b[0m', error); process.exit(1); }); + +export default AddDependencies; \ No newline at end of file diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index 8b78554..32a3904 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -3,12 +3,16 @@ const semver = require('semver'); const Files = require('./Files'); class AddDependencies { - constructor() { + constructor(dependencies = [], + target = 'dependencies', + overwrite = true, + packageFilePath = './package.json' + ) { this.result = {}; - this.dependencies = []; - this.target = 'dependencies'; - this.overwrite = true; - this.packageFilePath = './package.json'; + this.dependencies = dependencies; + this.target = target; + this.overwrite = overwrite; + this.packageFilePath = packageFilePath; } addDependencies() { From 9d892b51156eaa68c28e6c1874dde45b2aad3c7a Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 19 Jun 2020 22:45:07 +0800 Subject: [PATCH 02/49] lets try this --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 70cbff6..8886b89 100755 --- a/index.js +++ b/index.js @@ -10,4 +10,4 @@ app.addDependencies().then(app.saveToPackage.bind(app)).catch((error) => { process.exit(1); }); -export default AddDependencies; \ No newline at end of file +module.exports = AddDependencies; \ No newline at end of file From 2f81d1afc6e59d3450a0cd6f5fe89d7db273584a Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 19 Jun 2020 22:45:07 +0800 Subject: [PATCH 03/49] addeding a log to test --- index.js | 2 +- lib/AddDependencies.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 70cbff6..8886b89 100755 --- a/index.js +++ b/index.js @@ -10,4 +10,4 @@ app.addDependencies().then(app.saveToPackage.bind(app)).catch((error) => { process.exit(1); }); -export default AddDependencies; \ No newline at end of file +module.exports = AddDependencies; \ No newline at end of file diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index 32a3904..cf02644 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -8,6 +8,7 @@ class AddDependencies { overwrite = true, packageFilePath = './package.json' ) { + console.log(dependencies) this.result = {}; this.dependencies = dependencies; this.target = target; From 94adce39b491aceed7fedc195ed428b9a3f5bd26 Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 19 Jun 2020 23:06:42 +0800 Subject: [PATCH 04/49] lets just try using lib --- index.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/index.js b/index.js index 8886b89..8a48ac7 100755 --- a/index.js +++ b/index.js @@ -8,6 +8,4 @@ const app = new AddDependencies(); app.addDependencies().then(app.saveToPackage.bind(app)).catch((error) => { console.error('\x1b[31m%s\x1b[0m', error); process.exit(1); -}); - -module.exports = AddDependencies; \ No newline at end of file +}); \ No newline at end of file From 4a75de5c3fcae60c256a91af2a00de79d1c8f227 Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 19 Jun 2020 23:18:46 +0800 Subject: [PATCH 05/49] * added the ability to simply call run --- lib/AddDependencies.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index cf02644..341bcf3 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -8,7 +8,6 @@ class AddDependencies { overwrite = true, packageFilePath = './package.json' ) { - console.log(dependencies) this.result = {}; this.dependencies = dependencies; this.target = target; @@ -61,7 +60,15 @@ class AddDependencies { console.log(`Adding packages to '${this.target}'...`); - return Promise.all(this.dependencies.map((dep) => this.runNpmShow(dep))); + return this.mapDependencies(); + } + + mapDependencies() { + return Promise.all(this.dependencies.map((dep) => this.runNpmShow(dep))) + } + + run(){ + return this.mapDependencies().then(() => this.saveToPackage()) } runNpmShow(dep) { From 8113b0cc9fec359958fecf05b0bb988cf02da6e0 Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 19 Jun 2020 23:38:15 +0800 Subject: [PATCH 06/49] added readme change --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index fe23119..8457fa6 100644 --- a/README.md +++ b/README.md @@ -46,3 +46,20 @@ or with `npx`: ```sh $ npx add-dependencies /home/user/project/package.json moment@2.0.0 react@16.8 redux eslint --dev ``` + +or via nodejs + +```js +const npmAdd = require('add-dependencies/lib/AddDependencies'); +const dependencies = [ + 'package1', + 'package2', + 'package3', +]; +const target = 'dependencies'; +const overwrite = false; +const packageFilePath = 'package.json'; +new npmAdd(dependencies, target, overwrite, packageFilePath) + .run() + .then(() => console.log('completed')); +``` \ No newline at end of file From ccf627a9e67f973c4c18302504e7d4bd7306f0c4 Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 19 Jun 2020 23:39:41 +0800 Subject: [PATCH 07/49] one more readme modifcaiton --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8457fa6..04298cc 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ $ npm install add-dependencies [-g] ### Usage -Run: +Run (for `nodejs` see Example): ```sh $ add-dependencies [package_file] [target] [--no-overwrite] From 522d8d3ea7e76627523867adc7ff0c52d9593ca9 Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 19 Jun 2020 23:43:32 +0800 Subject: [PATCH 08/49] revert removal of new line --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 8a48ac7..1e8cf44 100755 --- a/index.js +++ b/index.js @@ -8,4 +8,4 @@ const app = new AddDependencies(); app.addDependencies().then(app.saveToPackage.bind(app)).catch((error) => { console.error('\x1b[31m%s\x1b[0m', error); process.exit(1); -}); \ No newline at end of file +}); From 169bf72441ac6687bb308b0b5ff10e67fe8cca66 Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 00:08:38 +0800 Subject: [PATCH 09/49] added constants to support the specification of target from nodejs side --- lib/AddDependencies.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index 341bcf3..fa4fa8d 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -172,4 +172,12 @@ class AddDependencies { } } -module.exports = AddDependencies; +module.exports = { + CONSTANTS: { + DEPENDENCIES: 'dependencies', + DEV_DEPENDENCIES: 'devDependencies', + PEER_DEPENDENCIES: 'peerDependencies', + OPTIONAL_DEPENDENCIES: 'optionalDependencies', + }, + default: AddDependencies +}; From 8bcf0cdc943b6583eb08631e406d99fd908e0fdf Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 00:13:41 +0800 Subject: [PATCH 10/49] readme update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 04298cc..55089cd 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ const dependencies = [ 'package2', 'package3', ]; -const target = 'dependencies'; +const target = npmAdd.CONSTANTS.DEPENDENCIES; const overwrite = false; const packageFilePath = 'package.json'; new npmAdd(dependencies, target, overwrite, packageFilePath) From c8636cd7c60e87132ddd54793ed469be8b362c5b Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 00:52:12 +0800 Subject: [PATCH 11/49] fix to how i defined constants --- lib/AddDependencies.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index fa4fa8d..e377036 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -170,14 +170,15 @@ class AddDependencies { process.exit(1); }); } + + static get CONSTANTS() { + return { + DEPENDENCIES: 'dependencies', + DEV_DEPENDENCIES: 'devDependencies', + PEER_DEPENDENCIES: 'peerDependencies', + OPTIONAL_DEPENDENCIES: 'optionalDependencies', + }; + } } -module.exports = { - CONSTANTS: { - DEPENDENCIES: 'dependencies', - DEV_DEPENDENCIES: 'devDependencies', - PEER_DEPENDENCIES: 'peerDependencies', - OPTIONAL_DEPENDENCIES: 'optionalDependencies', - }, - default: AddDependencies -}; +module.exports = AddDependencies; From d077c7f89e4b4ad5ee3be2fd5ff6b37a68cacb13 Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 13:19:34 +0800 Subject: [PATCH 12/49] * added editorconfig * added eslintrc * added packagejson changes to support linting * QOL changes :) --- .editorconfig | 5 +++++ .eslintrc.js | 24 ++++++++++++++++++++++++ package.json | 8 ++++++++ 3 files changed, 37 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintrc.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..e85cf81 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,5 @@ +[*] +indent_size = 2 +indent_style = space +max_line_length = 120 +tab_width = 2 \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..64c3b03 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,24 @@ +module.exports = { + extends: ['eslint:recommended', 'prettier'], // extending recommended config and config derived from eslint-config-prettier + plugins: ['prettier'], // extending recommended config and config derived from eslint-config-prettier + env: { + browser: true, + node: true, + amd: true, + es6: true, + commonjs: true, + jest: true, + }, + parser: 'babel-eslint', + rules: { + 'prettier/prettier': [ + // customizing prettier rules (unfortunately not many of them are customizable) + 'error', + { + singleQuote: true, + tabWidth: 2, + }, + ], + eqeqeq: ['error', 'always'], // adding some custom ESLint rules + }, +}; diff --git a/package.json b/package.json index 6fa9dc1..b68ba97 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "homepage": "https://github.com/arfeo/npm-add-dependencies#readme", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" + "lint": "eslint --fix --ext js lib/**.js index.js" }, "keywords": [ "dependencies", @@ -28,5 +29,12 @@ "dependencies": { "npm-run": "^5.0.1", "semver": "^6.3.0" + }, + "devDependencies": { + "eslint": "^7.3.0", + "babel-eslint": "^10.1.0", + "eslint-config-prettier": "^3.3.0", + "eslint-plugin-prettier": "^3.0.0", + "prettier": "^2.0.5" } } From 2e95ed86b878c785ca0ffa2fa7ff867f548b7bbc Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 13:19:56 +0800 Subject: [PATCH 13/49] * added a change to attempt to see if we can use require now --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b68ba97..5de0b67 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "license": "MIT", "preferGlobal": true, "bin": { - "add-dependencies": "index.js" + "add-dependencies": "cli-index.js" }, "dependencies": { "npm-run": "^5.0.1", From eb051d0a59d55a6965de9f4d92ba4cb19d857e00 Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 13:20:35 +0800 Subject: [PATCH 14/49] and the file change itself --- cli-index.js | 17 +++++++++++++++++ index.js | 11 +---------- 2 files changed, 18 insertions(+), 10 deletions(-) create mode 100755 cli-index.js diff --git a/cli-index.js b/cli-index.js new file mode 100755 index 0000000..7f37807 --- /dev/null +++ b/cli-index.js @@ -0,0 +1,17 @@ +#!/usr/bin/env node +const AddDependencies = require('./lib/AddDependencies'); + +console.log( + '\x1b[33m%s\x1b[0m', + 'This script adds dependencies (latest or specified versions) to the package.json file skipping the installation process.' +); + +const app = new AddDependencies(); + +app + .addDependencies() + .then(app.saveToPackage.bind(app)) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error); + process.exit(1); + }); diff --git a/index.js b/index.js index 1e8cf44..23c368d 100755 --- a/index.js +++ b/index.js @@ -1,11 +1,2 @@ #!/usr/bin/env node -const AddDependencies = require('./lib/AddDependencies'); - -console.log('\x1b[33m%s\x1b[0m', 'This script adds dependencies (latest or specified versions) to the package.json file skipping the installation process.'); - -const app = new AddDependencies(); - -app.addDependencies().then(app.saveToPackage.bind(app)).catch((error) => { - console.error('\x1b[31m%s\x1b[0m', error); - process.exit(1); -}); +module.exports = require('./lib/AddDependencies'); From 5330db5914b8c1e6629725e10f8059cd2d27f2ea Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 13:27:56 +0800 Subject: [PATCH 15/49] so it turns out a - breaks npm install haha --- cli-index.js => cliIndex.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cli-index.js => cliIndex.js (100%) diff --git a/cli-index.js b/cliIndex.js similarity index 100% rename from cli-index.js rename to cliIndex.js From aac19ec723eae731579921e3bf98f06f27f8fdff Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 13:31:36 +0800 Subject: [PATCH 16/49] missed line opps --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5de0b67..7132303 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "license": "MIT", "preferGlobal": true, "bin": { - "add-dependencies": "cli-index.js" + "add-dependencies": "cliIndex.js" }, "dependencies": { "npm-run": "^5.0.1", From a20a4c458953ec032ee19143d6259312488fb9fe Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 13:32:32 +0800 Subject: [PATCH 17/49] alright?.. lets try a roll back --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7132303..b68ba97 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "license": "MIT", "preferGlobal": true, "bin": { - "add-dependencies": "cliIndex.js" + "add-dependencies": "index.js" }, "dependencies": { "npm-run": "^5.0.1", From 2af5ad1581da56bc83a5e23dc66c7784df4552f2 Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 13:34:32 +0800 Subject: [PATCH 18/49] hmm --- cliIndex.js | 17 ----------------- index.js | 17 ++++++++++++++++- sindex.js | 2 ++ 3 files changed, 18 insertions(+), 18 deletions(-) delete mode 100755 cliIndex.js create mode 100755 sindex.js diff --git a/cliIndex.js b/cliIndex.js deleted file mode 100755 index 7f37807..0000000 --- a/cliIndex.js +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env node -const AddDependencies = require('./lib/AddDependencies'); - -console.log( - '\x1b[33m%s\x1b[0m', - 'This script adds dependencies (latest or specified versions) to the package.json file skipping the installation process.' -); - -const app = new AddDependencies(); - -app - .addDependencies() - .then(app.saveToPackage.bind(app)) - .catch((error) => { - console.error('\x1b[31m%s\x1b[0m', error); - process.exit(1); - }); diff --git a/index.js b/index.js index 23c368d..7f37807 100755 --- a/index.js +++ b/index.js @@ -1,2 +1,17 @@ #!/usr/bin/env node -module.exports = require('./lib/AddDependencies'); +const AddDependencies = require('./lib/AddDependencies'); + +console.log( + '\x1b[33m%s\x1b[0m', + 'This script adds dependencies (latest or specified versions) to the package.json file skipping the installation process.' +); + +const app = new AddDependencies(); + +app + .addDependencies() + .then(app.saveToPackage.bind(app)) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error); + process.exit(1); + }); diff --git a/sindex.js b/sindex.js new file mode 100755 index 0000000..23c368d --- /dev/null +++ b/sindex.js @@ -0,0 +1,2 @@ +#!/usr/bin/env node +module.exports = require('./lib/AddDependencies'); From cf6b8110e3e5bccc4c1351a760d82f12fcabf886 Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 13:39:57 +0800 Subject: [PATCH 19/49] ah.. opps my cheery pick of line borked package json --- cli-index.js | 17 +++++++++++++++++ index.js | 17 +---------------- sindex.js | 2 -- 3 files changed, 18 insertions(+), 18 deletions(-) create mode 100755 cli-index.js delete mode 100755 sindex.js diff --git a/cli-index.js b/cli-index.js new file mode 100755 index 0000000..7f37807 --- /dev/null +++ b/cli-index.js @@ -0,0 +1,17 @@ +#!/usr/bin/env node +const AddDependencies = require('./lib/AddDependencies'); + +console.log( + '\x1b[33m%s\x1b[0m', + 'This script adds dependencies (latest or specified versions) to the package.json file skipping the installation process.' +); + +const app = new AddDependencies(); + +app + .addDependencies() + .then(app.saveToPackage.bind(app)) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error); + process.exit(1); + }); diff --git a/index.js b/index.js index 7f37807..23c368d 100755 --- a/index.js +++ b/index.js @@ -1,17 +1,2 @@ #!/usr/bin/env node -const AddDependencies = require('./lib/AddDependencies'); - -console.log( - '\x1b[33m%s\x1b[0m', - 'This script adds dependencies (latest or specified versions) to the package.json file skipping the installation process.' -); - -const app = new AddDependencies(); - -app - .addDependencies() - .then(app.saveToPackage.bind(app)) - .catch((error) => { - console.error('\x1b[31m%s\x1b[0m', error); - process.exit(1); - }); +module.exports = require('./lib/AddDependencies'); diff --git a/sindex.js b/sindex.js deleted file mode 100755 index 23c368d..0000000 --- a/sindex.js +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -module.exports = require('./lib/AddDependencies'); From a1fcc18c671f11ad7de0ff26e77ccd88629ee124 Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 13:40:12 +0800 Subject: [PATCH 20/49] adding inital tests --- __tests__/cli-index.js | 3 +++ __tests__/index.js | 3 +++ __tests__/lib/AddDependencies.js | 3 +++ __tests__/lib/Files.js | 3 +++ jest.config.js | 5 +++++ package.json | 4 +++- 6 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 __tests__/cli-index.js create mode 100644 __tests__/index.js create mode 100644 __tests__/lib/AddDependencies.js create mode 100644 __tests__/lib/Files.js create mode 100644 jest.config.js diff --git a/__tests__/cli-index.js b/__tests__/cli-index.js new file mode 100644 index 0000000..1c63b16 --- /dev/null +++ b/__tests__/cli-index.js @@ -0,0 +1,3 @@ +test('first test', () => { + expect(true).toBeTruthy(); +}); diff --git a/__tests__/index.js b/__tests__/index.js new file mode 100644 index 0000000..1c63b16 --- /dev/null +++ b/__tests__/index.js @@ -0,0 +1,3 @@ +test('first test', () => { + expect(true).toBeTruthy(); +}); diff --git a/__tests__/lib/AddDependencies.js b/__tests__/lib/AddDependencies.js new file mode 100644 index 0000000..1c63b16 --- /dev/null +++ b/__tests__/lib/AddDependencies.js @@ -0,0 +1,3 @@ +test('first test', () => { + expect(true).toBeTruthy(); +}); diff --git a/__tests__/lib/Files.js b/__tests__/lib/Files.js new file mode 100644 index 0000000..1c63b16 --- /dev/null +++ b/__tests__/lib/Files.js @@ -0,0 +1,3 @@ +test('first test', () => { + expect(true).toBeTruthy(); +}); diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..c72f9f8 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,5 @@ +const { defaults } = require('jest-config'); +module.exports = { + verbose: true, + moduleFileExtensions: [...defaults.moduleFileExtensions], +}; diff --git a/package.json b/package.json index b68ba97..34016a6 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ }, "homepage": "https://github.com/arfeo/npm-add-dependencies#readme", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "jest", "lint": "eslint --fix --ext js lib/**.js index.js" }, "keywords": [ @@ -31,6 +31,8 @@ "semver": "^6.3.0" }, "devDependencies": { + "jest": "^26.0.1", + "jest-config": "^26.0.1", "eslint": "^7.3.0", "babel-eslint": "^10.1.0", "eslint-config-prettier": "^3.3.0", From ea876d7905d798409e9a1835fc4d75de1befe784 Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 13:41:10 +0800 Subject: [PATCH 21/49] added linting changes --- lib/AddDependencies.js | 82 ++++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index e377036..35b6db9 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -3,11 +3,7 @@ const semver = require('semver'); const Files = require('./Files'); class AddDependencies { - constructor(dependencies = [], - target = 'dependencies', - overwrite = true, - packageFilePath = './package.json' - ) { + constructor(dependencies = [], target = 'dependencies', overwrite = true, packageFilePath = './package.json') { this.result = {}; this.dependencies = dependencies; this.target = target; @@ -64,11 +60,11 @@ class AddDependencies { } mapDependencies() { - return Promise.all(this.dependencies.map((dep) => this.runNpmShow(dep))) + return Promise.all(this.dependencies.map((dep) => this.runNpmShow(dep))); } - run(){ - return this.mapDependencies().then(() => this.saveToPackage()) + run() { + return this.mapDependencies().then(() => this.saveToPackage()); } runNpmShow(dep) { @@ -93,12 +89,16 @@ class AddDependencies { break; } } else if (operators.length > 1 && specifiedVersions.length > 1) { - if (semver.cmp(version, operators[0], specifiedVersions[0]) && semver.cmp(version, operators[1], specifiedVersions[1])) { + if ( + semver.cmp(version, operators[0], specifiedVersions[0]) && + semver.cmp(version, operators[1], specifiedVersions[1]) + ) { this.result[depName] = `${depVersion}`; break; } } } + // eslint-disable-next-line } catch (e) {} if (undefined === this.result[depName]) { @@ -137,38 +137,44 @@ class AddDependencies { } saveToPackage() { - Files.readFromFile(this.packageFilePath).then(async (data) => { - let json; - - try { - json = JSON.parse(data); - } catch (e) { - console.error('\x1b[31m%s\x1b[0m', `Could not parse ${this.packageFilePath}. Stop.`); - process.exit(1); - } - - this.result = this.overwrite - ? Object.assign(json[this.target] || {}, this.result) - : Object.assign(this.result, json[this.target] || {}); - - this.result = Object.keys(this.result).sort().reduce((res, key) => { - res[key] = this.result[key]; - - return res; - }, {}); - - json[this.target] = this.result; + Files.readFromFile(this.packageFilePath) + .then(async (data) => { + let json; + + try { + json = JSON.parse(data); + } catch (e) { + console.error('\x1b[31m%s\x1b[0m', `Could not parse ${this.packageFilePath}. Stop.`); + process.exit(1); + } - Files.writeToFile(this.packageFilePath, JSON.stringify(json, null, 2)).then(() => { - console.log('\x1b[32m%s\x1b[0m', 'Done.'); - }).catch(() => { - console.error('\x1b[31m%s\x1b[0m', `Could not write to ${this.packageFilePath}. Stop.`); + this.result = this.overwrite + ? Object.assign(json[this.target] || {}, this.result) + : Object.assign(this.result, json[this.target] || {}); + + this.result = Object.keys(this.result) + .sort() + .reduce((res, key) => { + res[key] = this.result[key]; + + return res; + }, {}); + + json[this.target] = this.result; + + Files.writeToFile(this.packageFilePath, JSON.stringify(json, null, 2)) + .then(() => { + console.log('\x1b[32m%s\x1b[0m', 'Done.'); + }) + .catch(() => { + console.error('\x1b[31m%s\x1b[0m', `Could not write to ${this.packageFilePath}. Stop.`); + process.exit(1); + }); + }) + .catch(() => { + console.error('\x1b[31m%s\x1b[0m', `Could not read from ${this.packageFilePath}. Stop.`); process.exit(1); }); - }).catch(() => { - console.error('\x1b[31m%s\x1b[0m', `Could not read from ${this.packageFilePath}. Stop.`); - process.exit(1); - }); } static get CONSTANTS() { From 22a6c239e0fb1117bea632e54515f2062692cc84 Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 20 Jun 2020 13:45:05 +0800 Subject: [PATCH 22/49] * npm ignore updates * added the clie index again now that package json isnt borked --- .npmignore | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.npmignore b/.npmignore index d0ec7f4..870bddb 100644 --- a/.npmignore +++ b/.npmignore @@ -3,3 +3,7 @@ ISSUE_TEMPLATE.md PULL_REQUEST_TEMPLATE.md yarn.lock package-lock.json +__tests__ +.editorconfig +.eslintrc.js +jest.config.js \ No newline at end of file diff --git a/package.json b/package.json index 34016a6..0d4593b 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "license": "MIT", "preferGlobal": true, "bin": { - "add-dependencies": "index.js" + "add-dependencies": "cli-index.js" }, "dependencies": { "npm-run": "^5.0.1", From 9545544bb21779594ecb8fc080f31ff6531baa44 Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 21 Jun 2020 01:13:57 +0800 Subject: [PATCH 23/49] * committing initial tests before testing the removal incase i lose something * one slight change to AddDeps to support promise trickle down --- .npmignore | 2 +- __tests__/index.js | 159 ++++++++++++++++++++++++++++++++++++++++- jest.config.js | 8 ++- jest.setup.js | 6 ++ jest.teardown.js | 11 +++ lib/AddDependencies.js | 2 +- package.json | 4 +- 7 files changed, 184 insertions(+), 8 deletions(-) create mode 100644 jest.setup.js create mode 100644 jest.teardown.js diff --git a/.npmignore b/.npmignore index 870bddb..5f41e20 100644 --- a/.npmignore +++ b/.npmignore @@ -6,4 +6,4 @@ package-lock.json __tests__ .editorconfig .eslintrc.js -jest.config.js \ No newline at end of file +jest.* \ No newline at end of file diff --git a/__tests__/index.js b/__tests__/index.js index 1c63b16..440ae48 100644 --- a/__tests__/index.js +++ b/__tests__/index.js @@ -1,3 +1,158 @@ -test('first test', () => { - expect(true).toBeTruthy(); +const path = require('path'); +const Files = require('../lib/Files'); +const md5 = require('blueimp-md5'); +const { TEST_JSON_DIR } = require('../jest.config'); + +const ClassForTesting = require('../index'); + +// no params +const defaultExpect = { + dependencies: [], + target: 'dependencies', + overwrite: true, + packageFilePath: './package.json', +}; + +const generateDefaultPackageJson = () => { + return Files.readFromFile(path.resolve(__dirname, '../', 'package.json')).then((defaultPackageJsonString) => { + const defaultPackageJson = JSON.parse(defaultPackageJsonString); + defaultPackageJson.dependencies = { jest: '26.0.0' }; + defaultPackageJson.devDependencies = { jest: '26.0.0' }; + defaultPackageJson.optionalDependencies = { jest: '26.0.0' }; + defaultPackageJson.peerDependencies = { jest: '26.0.0' }; + defaultPackageJson.name = ''; + return defaultPackageJson; + }); +}; + +test('defaults', async (done) => { + const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + }; + const classForTesting = new ClassForTesting([], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); + expect(classForTesting).toMatchObject(testExpectObject); + generateDefaultPackageJson().then((defaultPackageJson) => + Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => + classForTesting.run().then(() => + Files.readFromFile(packageJson).then((expectedJson) => { + try { + expect(JSON.parse(expectedJson)).toEqual(defaultPackageJson); + done(); + } catch (e) { + done(e); + } + }) + ) + ) + ); }); + +test('with dependencies with override', async (done) => { + const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + dependencies: ['jest@26.0.1'], + }; + const classForTesting = new ClassForTesting( + ['jest@26.0.1'], + ClassForTesting.CONSTANTS.DEPENDENCIES, + true, + packageJson + ); + expect(classForTesting).toMatchObject(testExpectObject); + generateDefaultPackageJson().then((defaultPackageJson) => + Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => + classForTesting.run().then(() => + Files.readFromFile(packageJson).then((expectedJson) => { + defaultPackageJson.dependencies.jest = '26.0.1'; + try { + expect(JSON.parse(expectedJson)).toEqual(defaultPackageJson); + done(); + } catch (e) { + done(e); + } + }) + ) + ) + ); +}); + +test('no overwrite', async (done) => { + const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); + const classForTesting = new ClassForTesting([], ClassForTesting.CONSTANTS.DEPENDENCIES, false, packageJson); + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + overwrite: false, + }; + expect(classForTesting).toMatchObject(testExpectObject); + generateDefaultPackageJson().then((defaultPackageJson) => { + Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => + classForTesting.run().then(() => + Files.readFromFile(packageJson).then((expectedJson) => { + try { + expect(JSON.parse(expectedJson)).toEqual(defaultPackageJson); + done(); + } catch (e) { + done(e); + } + }) + ) + ); + }); +}); +// // package path +// test('package path', async () => { +// const classForTesting = new ClassForTesting( +// [], +// ClassForTesting.CONSTANTS.DEPENDENCIES, +// true, +// 'a/deeper/folder/package.json' +// ); +// const testExpectOverrides = { +// packageFilePath: 'a/deeper/folder/package.json', +// }; +// expect(classForTesting).toMatchObject({ ...defaultExpect, ...testExpectOverrides }); +// }); +// // deps +// test('deps', async () => { +// const dependencies = ['jquery']; +// const classForTesting = new ClassForTesting(dependencies, ClassForTesting.CONSTANTS.DEPENDENCIES); +// const testExpectOverrides = { +// dependencies, +// }; +// expect(classForTesting).toMatchObject({ ...defaultExpect, ...testExpectOverrides }); +// }); +// // dev deps +// test('dev deps', async () => { +// const dependencies = ['jquery']; +// const classForTesting = new ClassForTesting(dependencies, ClassForTesting.CONSTANTS.DEV_DEPENDENCIES); +// const testExpectOverrides = { +// dependencies, +// target: 'devDependencies', +// }; +// expect(classForTesting).toMatchObject({ ...defaultExpect, ...testExpectOverrides }); +// }); +// // optional deps +// test('optional deps', async () => { +// const dependencies = ['jquery']; +// const classForTesting = new ClassForTesting(dependencies, ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES); +// const testExpectOverrides = { +// dependencies, +// target: 'optionalDependencies', +// }; +// expect(classForTesting).toMatchObject({ ...defaultExpect, ...testExpectOverrides }); +// }); +// // peer deps +// test('peer deps', async () => { +// const dependencies = ['jquery']; +// const classForTesting = new ClassForTesting(dependencies, ClassForTesting.CONSTANTS.PEER_DEPENDENCIES); +// const testExpectOverrides = { +// dependencies, +// target: 'peerDependencies', +// }; +// expect(classForTesting).toMatchObject({ ...defaultExpect, ...testExpectOverrides }); +// }); diff --git a/jest.config.js b/jest.config.js index c72f9f8..9d6f5ae 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,9 @@ -const { defaults } = require('jest-config'); +const path = require('path'); +const TEST_JSON_DIR = path.resolve(__dirname, '__tests__', 'testJsonFolder'); + module.exports = { verbose: true, - moduleFileExtensions: [...defaults.moduleFileExtensions], + TEST_JSON_DIR, + globalSetup: './jest.setup.js', + globalTeardown: './jest.teardown.js', }; diff --git a/jest.setup.js b/jest.setup.js new file mode 100644 index 0000000..1e361be --- /dev/null +++ b/jest.setup.js @@ -0,0 +1,6 @@ +const fs = require('fs'); +const { TEST_JSON_DIR } = require('./jest.config'); + +module.exports = async () => { + fs.mkdirSync(TEST_JSON_DIR); +}; diff --git a/jest.teardown.js b/jest.teardown.js new file mode 100644 index 0000000..25b97a9 --- /dev/null +++ b/jest.teardown.js @@ -0,0 +1,11 @@ +const fs = require('fs'); +const path = require('path'); +const { TEST_JSON_DIR } = require('./jest.config'); + +module.exports = async () => { + fs.readdir(TEST_JSON_DIR, (_, files) => + files.forEach((file) => + fs.unlink(path.resolve(TEST_JSON_DIR, file), () => fs.rmdir(path, () => console.log('all deleted'))) + ) + ); +}; diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index 35b6db9..18d4c79 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -137,7 +137,7 @@ class AddDependencies { } saveToPackage() { - Files.readFromFile(this.packageFilePath) + return Files.readFromFile(this.packageFilePath) .then(async (data) => { let json; diff --git a/package.json b/package.json index 0d4593b..5e8b490 100644 --- a/package.json +++ b/package.json @@ -31,12 +31,12 @@ "semver": "^6.3.0" }, "devDependencies": { + "blueimp-md5": "^2.16.0", "jest": "^26.0.1", - "jest-config": "^26.0.1", "eslint": "^7.3.0", "babel-eslint": "^10.1.0", "eslint-config-prettier": "^3.3.0", "eslint-plugin-prettier": "^3.0.0", "prettier": "^2.0.5" } -} +} \ No newline at end of file From c49936eee185ba0e56bd46cd50b1de04716297f6 Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 21 Jun 2020 01:18:57 +0800 Subject: [PATCH 24/49] *tear down fixed * its getting there! --- jest.teardown.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jest.teardown.js b/jest.teardown.js index 25b97a9..7f58c09 100644 --- a/jest.teardown.js +++ b/jest.teardown.js @@ -5,7 +5,9 @@ const { TEST_JSON_DIR } = require('./jest.config'); module.exports = async () => { fs.readdir(TEST_JSON_DIR, (_, files) => files.forEach((file) => - fs.unlink(path.resolve(TEST_JSON_DIR, file), () => fs.rmdir(path, () => console.log('all deleted'))) + fs.unlink(path.resolve(TEST_JSON_DIR, file), () => + fs.rmdir(TEST_JSON_DIR, () => console.log(`test files deleted`)) + ) ) ); }; From b6eeeb63007735b9b68d2f936971e7596d68e388 Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 21 Jun 2020 10:29:51 +0800 Subject: [PATCH 25/49] final iteration of the index.js top level test --- __tests__/index.js | 225 ++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 131 insertions(+), 96 deletions(-) diff --git a/__tests__/index.js b/__tests__/index.js index 440ae48..e0dd8ea 100644 --- a/__tests__/index.js +++ b/__tests__/index.js @@ -25,20 +25,15 @@ const generateDefaultPackageJson = () => { }); }; -test('defaults', async (done) => { - const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); - const testExpectObject = { - ...defaultExpect, - packageFilePath: packageJson, - }; - const classForTesting = new ClassForTesting([], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); +const writeJsonAndVerify = async (done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides) => { expect(classForTesting).toMatchObject(testExpectObject); generateDefaultPackageJson().then((defaultPackageJson) => Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => classForTesting.run().then(() => - Files.readFromFile(packageJson).then((expectedJson) => { + Files.readFromFile(packageJson).then((jsonResult) => { + const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; try { - expect(JSON.parse(expectedJson)).toEqual(defaultPackageJson); + expect(JSON.parse(jsonResult)).toEqual(expectedJson); done(); } catch (e) { done(e); @@ -47,31 +42,25 @@ test('defaults', async (done) => { ) ) ); -}); +}; -test('with dependencies with override', async (done) => { +test('run() fail to make sure tests themselves work', async (done) => { const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); - const testExpectObject = { - ...defaultExpect, - packageFilePath: packageJson, - dependencies: ['jest@26.0.1'], - }; - const classForTesting = new ClassForTesting( - ['jest@26.0.1'], - ClassForTesting.CONSTANTS.DEPENDENCIES, - true, - packageJson - ); - expect(classForTesting).toMatchObject(testExpectObject); + const classForTesting = new ClassForTesting(['jquery'], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); + try { + // expect(classForTesting).toMatchObject(testExpectObject); + } catch (e) { + expect(e).toBeTruthy(); + } generateDefaultPackageJson().then((defaultPackageJson) => Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => classForTesting.run().then(() => - Files.readFromFile(packageJson).then((expectedJson) => { - defaultPackageJson.dependencies.jest = '26.0.1'; + Files.readFromFile(packageJson).then(() => { try { - expect(JSON.parse(expectedJson)).toEqual(defaultPackageJson); + // expect(JSON.parse(expectedJson)).toEqual(defaultPackageJson); done(); } catch (e) { + expect(e).toBeTruthy(); done(e); } }) @@ -80,79 +69,125 @@ test('with dependencies with override', async (done) => { ); }); -test('no overwrite', async (done) => { +test('run() with defaults', async (done) => { const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); - const classForTesting = new ClassForTesting([], ClassForTesting.CONSTANTS.DEPENDENCIES, false, packageJson); const testExpectObject = { ...defaultExpect, packageFilePath: packageJson, + }; + const classForTesting = new ClassForTesting([], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); + writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject).then(); +}); + +test('run() with dependencies with override', async (done) => { + const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); + const dependencies = ['jest@26.0.1']; + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + dependencies: dependencies, + }; + const classForTesting = new ClassForTesting(dependencies, ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); + const expectedJsonOverrides = { + dependencies: { + jest: '26.0.1', + }, + }; + writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); +}); + +test('run() with no overwrite', async (done) => { + const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); + const dependencies = ['jest@26.0.1']; + + const classForTesting = new ClassForTesting(dependencies, ClassForTesting.CONSTANTS.DEPENDENCIES, false, packageJson); + const testExpectObject = { + ...defaultExpect, + dependencies: dependencies, + packageFilePath: packageJson, overwrite: false, }; - expect(classForTesting).toMatchObject(testExpectObject); - generateDefaultPackageJson().then((defaultPackageJson) => { - Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => - classForTesting.run().then(() => - Files.readFromFile(packageJson).then((expectedJson) => { - try { - expect(JSON.parse(expectedJson)).toEqual(defaultPackageJson); - done(); - } catch (e) { - done(e); - } - }) - ) - ); - }); + const expectedJsonOverrides = {}; + writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); +}); + +test('run() with package path', async (done) => { + const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); + const classForTesting = new ClassForTesting([], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + }; + const expectedJsonOverrides = {}; + writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); +}); + +test('run() with dev dependencies overwrite with caret', async (done) => { + const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); + const dependencies = ['jest@^26.0.1']; + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.DEV_DEPENDENCIES, + true, + packageJson + ); + const testExpectObject = { + ...defaultExpect, + dependencies: dependencies, + packageFilePath: packageJson, + target: 'devDependencies', + }; + + const expectedJsonOverrides = { + devDependencies: { + jest: '^26.0.1', + }, + }; + writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); +}); + +test('run() with optional dependencies overwrite lower', async (done) => { + const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); + const dependencies = ['jest@25.0.0']; + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES, + true, + packageJson + ); + const testExpectObject = { + ...defaultExpect, + dependencies: dependencies, + packageFilePath: packageJson, + target: 'optionalDependencies', + }; + const expectedJsonOverrides = { + optionalDependencies: { + jest: '25.0.0', + }, + }; + writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); +}); + +test('run() with peer dependencies overwrite', async (done) => { + const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); + const dependencies = ['jest@26.0.1']; + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.PEER_DEPENDENCIES, + true, + packageJson + ); + const testExpectObject = { + ...defaultExpect, + dependencies: dependencies, + packageFilePath: packageJson, + target: 'peerDependencies', + }; + const expectedJsonOverrides = { + peerDependencies: { + jest: '26.0.1', + }, + }; + writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); }); -// // package path -// test('package path', async () => { -// const classForTesting = new ClassForTesting( -// [], -// ClassForTesting.CONSTANTS.DEPENDENCIES, -// true, -// 'a/deeper/folder/package.json' -// ); -// const testExpectOverrides = { -// packageFilePath: 'a/deeper/folder/package.json', -// }; -// expect(classForTesting).toMatchObject({ ...defaultExpect, ...testExpectOverrides }); -// }); -// // deps -// test('deps', async () => { -// const dependencies = ['jquery']; -// const classForTesting = new ClassForTesting(dependencies, ClassForTesting.CONSTANTS.DEPENDENCIES); -// const testExpectOverrides = { -// dependencies, -// }; -// expect(classForTesting).toMatchObject({ ...defaultExpect, ...testExpectOverrides }); -// }); -// // dev deps -// test('dev deps', async () => { -// const dependencies = ['jquery']; -// const classForTesting = new ClassForTesting(dependencies, ClassForTesting.CONSTANTS.DEV_DEPENDENCIES); -// const testExpectOverrides = { -// dependencies, -// target: 'devDependencies', -// }; -// expect(classForTesting).toMatchObject({ ...defaultExpect, ...testExpectOverrides }); -// }); -// // optional deps -// test('optional deps', async () => { -// const dependencies = ['jquery']; -// const classForTesting = new ClassForTesting(dependencies, ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES); -// const testExpectOverrides = { -// dependencies, -// target: 'optionalDependencies', -// }; -// expect(classForTesting).toMatchObject({ ...defaultExpect, ...testExpectOverrides }); -// }); -// // peer deps -// test('peer deps', async () => { -// const dependencies = ['jquery']; -// const classForTesting = new ClassForTesting(dependencies, ClassForTesting.CONSTANTS.PEER_DEPENDENCIES); -// const testExpectOverrides = { -// dependencies, -// target: 'peerDependencies', -// }; -// expect(classForTesting).toMatchObject({ ...defaultExpect, ...testExpectOverrides }); -// }); diff --git a/package.json b/package.json index 5e8b490..0de933d 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ }, "homepage": "https://github.com/arfeo/npm-add-dependencies#readme", "scripts": { - "test": "jest", + "test": "jest --silent", "lint": "eslint --fix --ext js lib/**.js index.js" }, "keywords": [ From 2193b083fea4a18d4c92610f90380585a1ae4cb8 Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 21 Jun 2020 11:08:31 +0800 Subject: [PATCH 26/49] * added another refactor to make tests look cleaner * refactored cli to see if it can use run too --- .npmignore | 3 +- __mocks__/argv.js | 1 + __mocks__/utils.js | 75 +++++++++++ __tests__/cli-index.js | 6 +- __tests__/index.js | 288 +++++++++++++++++------------------------ cli-index.js | 19 ++- jest.teardown.js | 6 +- 7 files changed, 217 insertions(+), 181 deletions(-) create mode 100644 __mocks__/argv.js create mode 100644 __mocks__/utils.js diff --git a/.npmignore b/.npmignore index 5f41e20..4da2c47 100644 --- a/.npmignore +++ b/.npmignore @@ -6,4 +6,5 @@ package-lock.json __tests__ .editorconfig .eslintrc.js -jest.* \ No newline at end of file +jest.* +__mocks__ \ No newline at end of file diff --git a/__mocks__/argv.js b/__mocks__/argv.js new file mode 100644 index 0000000..a7858e6 --- /dev/null +++ b/__mocks__/argv.js @@ -0,0 +1 @@ +module.exports = (inputs) => (process.argv = inputs); diff --git a/__mocks__/utils.js b/__mocks__/utils.js new file mode 100644 index 0000000..431bc15 --- /dev/null +++ b/__mocks__/utils.js @@ -0,0 +1,75 @@ +const path = require('path'); +const Files = require('../lib/Files'); +const { TEST_JSON_DIR } = require('../jest.config'); +const md5 = require('blueimp-md5'); + +// no params +const defaultExpect = { + dependencies: [], + target: 'dependencies', + overwrite: true, + packageFilePath: './package.json', +}; + +const generateDefaultPackageJson = () => { + return Files.readFromFile(path.resolve(__dirname, '../', 'package.json')).then((defaultPackageJsonString) => { + const defaultPackageJson = JSON.parse(defaultPackageJsonString); + defaultPackageJson.dependencies = { jest: '26.0.0' }; + defaultPackageJson.devDependencies = { jest: '26.0.0' }; + defaultPackageJson.optionalDependencies = { jest: '26.0.0' }; + defaultPackageJson.peerDependencies = { jest: '26.0.0' }; + defaultPackageJson.name = ''; + return defaultPackageJson; + }); +}; + +const runAndVerify = async (done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides) => { + expect(classForTesting).toMatchObject(testExpectObject); + generateDefaultPackageJson().then((defaultPackageJson) => + Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => + classForTesting.run().then(() => + Files.readFromFile(packageJson).then((jsonResult) => { + const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; + try { + expect(JSON.parse(jsonResult)).toEqual(expectedJson); + done(); + } catch (e) { + done(e); + } + }) + ) + ) + ); +}; + +const runAndVerifyWithFailures = async (done, classForTesting, packageJson) => { + try { + // expect(classForTesting).toMatchObject(testExpectObject); + } catch (e) { + expect(e).toBeTruthy(); + } + generateDefaultPackageJson().then((defaultPackageJson) => + Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => + classForTesting.run().then(() => + Files.readFromFile(packageJson).then(() => { + try { + // expect(JSON.parse(expectedJson)).toEqual(defaultPackageJson); + done(); + } catch (e) { + expect(e).toBeTruthy(); + done(e); + } + }) + ) + ) + ); +}; + +const generateRandomFilename = async () => path.resolve(TEST_JSON_DIR, md5((Math.random() + Math.random()).toString())); + +module.exports = { + defaultExpect, + runAndVerify, + runAndVerifyWithFailures, + generateRandomFilename, +}; diff --git a/__tests__/cli-index.js b/__tests__/cli-index.js index 1c63b16..9a3b6a3 100644 --- a/__tests__/cli-index.js +++ b/__tests__/cli-index.js @@ -1,3 +1,5 @@ -test('first test', () => { - expect(true).toBeTruthy(); +const argv = require('../__mocks__/argv'); + +test('test argv mock', () => { + expect(argv(['--arg1', 'value1'])).toEqual(['--arg1', 'value1']); }); diff --git a/__tests__/index.js b/__tests__/index.js index e0dd8ea..5997809 100644 --- a/__tests__/index.js +++ b/__tests__/index.js @@ -1,193 +1,149 @@ -const path = require('path'); -const Files = require('../lib/Files'); -const md5 = require('blueimp-md5'); -const { TEST_JSON_DIR } = require('../jest.config'); - const ClassForTesting = require('../index'); - -// no params -const defaultExpect = { - dependencies: [], - target: 'dependencies', - overwrite: true, - packageFilePath: './package.json', -}; - -const generateDefaultPackageJson = () => { - return Files.readFromFile(path.resolve(__dirname, '../', 'package.json')).then((defaultPackageJsonString) => { - const defaultPackageJson = JSON.parse(defaultPackageJsonString); - defaultPackageJson.dependencies = { jest: '26.0.0' }; - defaultPackageJson.devDependencies = { jest: '26.0.0' }; - defaultPackageJson.optionalDependencies = { jest: '26.0.0' }; - defaultPackageJson.peerDependencies = { jest: '26.0.0' }; - defaultPackageJson.name = ''; - return defaultPackageJson; - }); -}; - -const writeJsonAndVerify = async (done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides) => { - expect(classForTesting).toMatchObject(testExpectObject); - generateDefaultPackageJson().then((defaultPackageJson) => - Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => - classForTesting.run().then(() => - Files.readFromFile(packageJson).then((jsonResult) => { - const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; - try { - expect(JSON.parse(jsonResult)).toEqual(expectedJson); - done(); - } catch (e) { - done(e); - } - }) - ) - ) - ); -}; +const { runAndVerifyWithFailures, runAndVerify, generateRandomFilename, defaultExpect } = require('../__mocks__/utils'); test('run() fail to make sure tests themselves work', async (done) => { - const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); - const classForTesting = new ClassForTesting(['jquery'], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); - try { - // expect(classForTesting).toMatchObject(testExpectObject); - } catch (e) { - expect(e).toBeTruthy(); - } - generateDefaultPackageJson().then((defaultPackageJson) => - Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => - classForTesting.run().then(() => - Files.readFromFile(packageJson).then(() => { - try { - // expect(JSON.parse(expectedJson)).toEqual(defaultPackageJson); - done(); - } catch (e) { - expect(e).toBeTruthy(); - done(e); - } - }) - ) - ) - ); + generateRandomFilename().then((packageJson) => { + const classForTesting = new ClassForTesting(['jquery'], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); + runAndVerifyWithFailures(done, classForTesting, packageJson).then(); + }); }); test('run() with defaults', async (done) => { - const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); - const testExpectObject = { - ...defaultExpect, - packageFilePath: packageJson, - }; - const classForTesting = new ClassForTesting([], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); - writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject).then(); + generateRandomFilename().then((packageJson) => { + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + }; + const classForTesting = new ClassForTesting([], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); + runAndVerify(done, classForTesting, packageJson, testExpectObject).then(); + }); }); test('run() with dependencies with override', async (done) => { - const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); - const dependencies = ['jest@26.0.1']; - const testExpectObject = { - ...defaultExpect, - packageFilePath: packageJson, - dependencies: dependencies, - }; - const classForTesting = new ClassForTesting(dependencies, ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); - const expectedJsonOverrides = { - dependencies: { - jest: '26.0.1', - }, - }; - writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + generateRandomFilename().then((packageJson) => { + const dependencies = ['jest@26.0.1']; + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + dependencies: dependencies, + }; + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.DEPENDENCIES, + true, + packageJson + ); + const expectedJsonOverrides = { + dependencies: { + jest: '26.0.1', + }, + }; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + }); }); test('run() with no overwrite', async (done) => { - const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); - const dependencies = ['jest@26.0.1']; + generateRandomFilename().then((packageJson) => { + const dependencies = ['jest@26.0.1']; - const classForTesting = new ClassForTesting(dependencies, ClassForTesting.CONSTANTS.DEPENDENCIES, false, packageJson); - const testExpectObject = { - ...defaultExpect, - dependencies: dependencies, - packageFilePath: packageJson, - overwrite: false, - }; - const expectedJsonOverrides = {}; - writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.DEPENDENCIES, + false, + packageJson + ); + const testExpectObject = { + ...defaultExpect, + dependencies: dependencies, + packageFilePath: packageJson, + overwrite: false, + }; + const expectedJsonOverrides = {}; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + }); }); test('run() with package path', async (done) => { - const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); - const classForTesting = new ClassForTesting([], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); - const testExpectObject = { - ...defaultExpect, - packageFilePath: packageJson, - }; - const expectedJsonOverrides = {}; - writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + generateRandomFilename().then((packageJson) => { + const classForTesting = new ClassForTesting([], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + }; + const expectedJsonOverrides = {}; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + }); }); test('run() with dev dependencies overwrite with caret', async (done) => { - const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); - const dependencies = ['jest@^26.0.1']; - const classForTesting = new ClassForTesting( - dependencies, - ClassForTesting.CONSTANTS.DEV_DEPENDENCIES, - true, - packageJson - ); - const testExpectObject = { - ...defaultExpect, - dependencies: dependencies, - packageFilePath: packageJson, - target: 'devDependencies', - }; + generateRandomFilename().then((packageJson) => { + const dependencies = ['jest@^26.0.1']; + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.DEV_DEPENDENCIES, + true, + packageJson + ); + const testExpectObject = { + ...defaultExpect, + dependencies: dependencies, + packageFilePath: packageJson, + target: 'devDependencies', + }; - const expectedJsonOverrides = { - devDependencies: { - jest: '^26.0.1', - }, - }; - writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + const expectedJsonOverrides = { + devDependencies: { + jest: '^26.0.1', + }, + }; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + }); }); test('run() with optional dependencies overwrite lower', async (done) => { - const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); - const dependencies = ['jest@25.0.0']; - const classForTesting = new ClassForTesting( - dependencies, - ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES, - true, - packageJson - ); - const testExpectObject = { - ...defaultExpect, - dependencies: dependencies, - packageFilePath: packageJson, - target: 'optionalDependencies', - }; - const expectedJsonOverrides = { - optionalDependencies: { - jest: '25.0.0', - }, - }; - writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + generateRandomFilename().then((packageJson) => { + const dependencies = ['jest@25.0.0']; + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES, + true, + packageJson + ); + const testExpectObject = { + ...defaultExpect, + dependencies: dependencies, + packageFilePath: packageJson, + target: 'optionalDependencies', + }; + const expectedJsonOverrides = { + optionalDependencies: { + jest: '25.0.0', + }, + }; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + }); }); test('run() with peer dependencies overwrite', async (done) => { - const packageJson = path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); - const dependencies = ['jest@26.0.1']; - const classForTesting = new ClassForTesting( - dependencies, - ClassForTesting.CONSTANTS.PEER_DEPENDENCIES, - true, - packageJson - ); - const testExpectObject = { - ...defaultExpect, - dependencies: dependencies, - packageFilePath: packageJson, - target: 'peerDependencies', - }; - const expectedJsonOverrides = { - peerDependencies: { - jest: '26.0.1', - }, - }; - writeJsonAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + generateRandomFilename().then((packageJson) => { + const dependencies = ['jest@26.0.1']; + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.PEER_DEPENDENCIES, + true, + packageJson + ); + const testExpectObject = { + ...defaultExpect, + dependencies: dependencies, + packageFilePath: packageJson, + target: 'peerDependencies', + }; + const expectedJsonOverrides = { + peerDependencies: { + jest: '26.0.1', + }, + }; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + }); }); diff --git a/cli-index.js b/cli-index.js index 7f37807..be65c60 100755 --- a/cli-index.js +++ b/cli-index.js @@ -8,10 +8,15 @@ console.log( const app = new AddDependencies(); -app - .addDependencies() - .then(app.saveToPackage.bind(app)) - .catch((error) => { - console.error('\x1b[31m%s\x1b[0m', error); - process.exit(1); - }); +app.run().catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error); + process.exit(1); +}); + +// app +// .addDependencies() +// .then(app.saveToPackage.bind(app)) +// .catch((error) => { +// console.error('\x1b[31m%s\x1b[0m', error); +// process.exit(1); +// }); diff --git a/jest.teardown.js b/jest.teardown.js index 7f58c09..82cf07c 100644 --- a/jest.teardown.js +++ b/jest.teardown.js @@ -4,10 +4,6 @@ const { TEST_JSON_DIR } = require('./jest.config'); module.exports = async () => { fs.readdir(TEST_JSON_DIR, (_, files) => - files.forEach((file) => - fs.unlink(path.resolve(TEST_JSON_DIR, file), () => - fs.rmdir(TEST_JSON_DIR, () => console.log(`test files deleted`)) - ) - ) + files.forEach((file) => fs.unlink(path.resolve(TEST_JSON_DIR, file), () => fs.rmdir(TEST_JSON_DIR, () => () => _))) ); }; From 84944cca15583bf43537063ebd014152a7dd4c80 Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 21 Jun 2020 14:36:15 +0800 Subject: [PATCH 27/49] added cli mocking inital files * argv mocked * figured out how to mock things like process.exit correctly --- __mocks__/argv.js | 2 +- __mocks__/utils.js | 67 ++++++++-- __tests__/cli-index.js | 163 +++++++++++++++++++++++- __tests__/index.js | 273 ++++++++++++++++++++++------------------- cli-index.js | 8 -- lib/AddDependencies.js | 6 +- 6 files changed, 364 insertions(+), 155 deletions(-) diff --git a/__mocks__/argv.js b/__mocks__/argv.js index a7858e6..3e17c55 100644 --- a/__mocks__/argv.js +++ b/__mocks__/argv.js @@ -1 +1 @@ -module.exports = (inputs) => (process.argv = inputs); +module.exports = async (inputs = '') => (process.argv = inputs.split(' ')); diff --git a/__mocks__/utils.js b/__mocks__/utils.js index 431bc15..713b802 100644 --- a/__mocks__/utils.js +++ b/__mocks__/utils.js @@ -1,11 +1,12 @@ const path = require('path'); const Files = require('../lib/Files'); +const argv = require('./argv'); const { TEST_JSON_DIR } = require('../jest.config'); const md5 = require('blueimp-md5'); // no params const defaultExpect = { - dependencies: [], + dependencies: ['jest@26.0.0'], target: 'dependencies', overwrite: true, packageFilePath: './package.json', @@ -23,6 +24,29 @@ const generateDefaultPackageJson = () => { }); }; +const cliRunAndVerify = async (done, testExpectObject, expectedJsonOverrides) => { + generateRandomFilename().then((packageJson) => { + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + }; + // require('../cli-index') + generateDefaultPackageJson().then((defaultPackageJson) => { + Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => + Files.readFromFile(packageJson).then((jsonResult) => { + const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; + try { + expect(JSON.parse(jsonResult)).toEqual(expectedJson); + done(); + } catch (e) { + done(e); + } + }) + ); + }); + }); +}; + const runAndVerify = async (done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides) => { expect(classForTesting).toMatchObject(testExpectObject); generateDefaultPackageJson().then((defaultPackageJson) => @@ -42,21 +66,36 @@ const runAndVerify = async (done, classForTesting, packageJson, testExpectObject ); }; -const runAndVerifyWithFailures = async (done, classForTesting, packageJson) => { - try { - // expect(classForTesting).toMatchObject(testExpectObject); - } catch (e) { - expect(e).toBeTruthy(); - } +const cliRunAndVerifyWithFailures = async (done, inputsString) => { + jest.spyOn(process, 'exit').mockImplementation(() => {}); + generateRandomFilename().then((packageJson) => { + argv(inputsString + ` ${packageJson}`).then(() => { + generateDefaultPackageJson().then((defaultPackageJson) => { + Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => { + require('../cli-index'); + try { + // add test to test log + expect(process.exit).toHaveBeenCalledWith(1); + done(); + } catch (e) { + done(e); + } + }); + }); + }); + }); +}; + +const runAndVerifyWithFailures = async (done, classForTesting, packageJson, testExpectObject) => { + expect(classForTesting).not.toEqual(testExpectObject); generateDefaultPackageJson().then((defaultPackageJson) => Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => classForTesting.run().then(() => - Files.readFromFile(packageJson).then(() => { + Files.readFromFile(packageJson).then((expectedJson) => { try { - // expect(JSON.parse(expectedJson)).toEqual(defaultPackageJson); + expect(JSON.parse(expectedJson)).not.toEqual(defaultPackageJson); done(); } catch (e) { - expect(e).toBeTruthy(); done(e); } }) @@ -65,11 +104,17 @@ const runAndVerifyWithFailures = async (done, classForTesting, packageJson) => { ); }; -const generateRandomFilename = async () => path.resolve(TEST_JSON_DIR, md5((Math.random() + Math.random()).toString())); +const generateRandomFilename = async () => + path.resolve( + TEST_JSON_DIR, + md5(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)) + ); module.exports = { defaultExpect, runAndVerify, runAndVerifyWithFailures, generateRandomFilename, + cliRunAndVerifyWithFailures, + cliRunAndVerify, }; diff --git a/__tests__/cli-index.js b/__tests__/cli-index.js index 9a3b6a3..5dfcb76 100644 --- a/__tests__/cli-index.js +++ b/__tests__/cli-index.js @@ -1,5 +1,164 @@ const argv = require('../__mocks__/argv'); +const { + cliRunAndVerifyWithFailures, + cliRunAndVerify, + generateRandomFilename, + defaultExpect, +} = require('../__mocks__/utils'); -test('test argv mock', () => { - expect(argv(['--arg1', 'value1'])).toEqual(['--arg1', 'value1']); +describe('cli run()', async () => { + test('test argv mock', (done) => { + argv('--arg1 value1').then((input) => { + expect(input).toEqual(['--arg1', 'value1']); + done(); + }); + }); + + test('cli fail to make sure tests themselves work', async (done) => { + cliRunAndVerifyWithFailures(done, 'dependencies').then(); + }); + + // test('cli with defaults', async (done) => { + // generateRandomFilename().then((packageJson) => { + // const testExpectObject = { + // ...defaultExpect, + // packageFilePath: packageJson, + // }; + // cliRunAndVerify(done, testExpectObject).then(); + // }); + // }); + // + // test('run() with dependencies with override', async (done) => { + // generateRandomFilename().then((packageJson) => { + // const dependencies = ['jest@26.0.1']; + // const testExpectObject = { + // ...defaultExpect, + // packageFilePath: packageJson, + // dependencies: dependencies, + // }; + // const classForTesting = new ClassForTesting( + // dependencies, + // ClassForTesting.CONSTANTS.DEPENDENCIES, + // true, + // packageJson + // ); + // const expectedJsonOverrides = { + // dependencies: { + // jest: '26.0.1', + // }, + // }; + // runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + // }); + // }); + // + // test('run() with no overwrite', async (done) => { + // generateRandomFilename().then((packageJson) => { + // const dependencies = ['jest@26.0.1']; + // + // const classForTesting = new ClassForTesting( + // dependencies, + // ClassForTesting.CONSTANTS.DEPENDENCIES, + // false, + // packageJson + // ); + // const testExpectObject = { + // ...defaultExpect, + // dependencies: dependencies, + // packageFilePath: packageJson, + // overwrite: false, + // }; + // const expectedJsonOverrides = {}; + // runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + // }); + // }); + // + // test('run() with package path', async (done) => { + // generateRandomFilename().then((packageJson) => { + // const classForTesting = new ClassForTesting( + // ['jest@26.0.0'], + // ClassForTesting.CONSTANTS.DEPENDENCIES, + // true, + // packageJson + // ); + // const testExpectObject = { + // ...defaultExpect, + // packageFilePath: packageJson, + // }; + // const expectedJsonOverrides = {}; + // runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + // }); + // }); + // + // test('run() with dev dependencies overwrite with caret', async (done) => { + // generateRandomFilename().then((packageJson) => { + // const dependencies = ['jest@^26.0.1']; + // const classForTesting = new ClassForTesting( + // dependencies, + // ClassForTesting.CONSTANTS.DEV_DEPENDENCIES, + // true, + // packageJson + // ); + // const testExpectObject = { + // ...defaultExpect, + // dependencies: dependencies, + // packageFilePath: packageJson, + // target: 'devDependencies', + // }; + // + // const expectedJsonOverrides = { + // devDependencies: { + // jest: '^26.0.1', + // }, + // }; + // runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + // }); + // }); + // + // test('run() with optional dependencies overwrite lower', async (done) => { + // generateRandomFilename().then((packageJson) => { + // const dependencies = ['jest@25.0.0']; + // const classForTesting = new ClassForTesting( + // dependencies, + // ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES, + // true, + // packageJson + // ); + // const testExpectObject = { + // ...defaultExpect, + // dependencies: dependencies, + // packageFilePath: packageJson, + // target: 'optionalDependencies', + // }; + // const expectedJsonOverrides = { + // optionalDependencies: { + // jest: '25.0.0', + // }, + // }; + // runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + // }); + // }); + // + // test('run() with peer dependencies overwrite', async (done) => { + // generateRandomFilename().then((packageJson) => { + // const dependencies = ['jest@26.0.1']; + // const classForTesting = new ClassForTesting( + // dependencies, + // ClassForTesting.CONSTANTS.PEER_DEPENDENCIES, + // true, + // packageJson + // ); + // const testExpectObject = { + // ...defaultExpect, + // dependencies: dependencies, + // packageFilePath: packageJson, + // target: 'peerDependencies', + // }; + // const expectedJsonOverrides = { + // peerDependencies: { + // jest: '26.0.1', + // }, + // }; + // runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + // }); + // }); }); diff --git a/__tests__/index.js b/__tests__/index.js index 5997809..8c82e4e 100644 --- a/__tests__/index.js +++ b/__tests__/index.js @@ -1,149 +1,166 @@ const ClassForTesting = require('../index'); const { runAndVerifyWithFailures, runAndVerify, generateRandomFilename, defaultExpect } = require('../__mocks__/utils'); -test('run() fail to make sure tests themselves work', async (done) => { - generateRandomFilename().then((packageJson) => { - const classForTesting = new ClassForTesting(['jquery'], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); - runAndVerifyWithFailures(done, classForTesting, packageJson).then(); +// todo add a test for connection timeout this made me think i had fucked it allll up :D +describe('nodeJS run()', async () => { + test('fail to make sure tests themselves work', async (done) => { + generateRandomFilename().then((packageJson) => { + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + }; + const classForTesting = new ClassForTesting(['jest'], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); + runAndVerifyWithFailures(done, classForTesting, packageJson, testExpectObject).then(); + }); }); -}); -test('run() with defaults', async (done) => { - generateRandomFilename().then((packageJson) => { - const testExpectObject = { - ...defaultExpect, - packageFilePath: packageJson, - }; - const classForTesting = new ClassForTesting([], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); - runAndVerify(done, classForTesting, packageJson, testExpectObject).then(); + test('with defaults', async (done) => { + generateRandomFilename().then((packageJson) => { + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + }; + const classForTesting = new ClassForTesting( + ['jest@26.0.0'], + ClassForTesting.CONSTANTS.DEPENDENCIES, + true, + packageJson + ); + runAndVerify(done, classForTesting, packageJson, testExpectObject).then(); + }); }); -}); -test('run() with dependencies with override', async (done) => { - generateRandomFilename().then((packageJson) => { - const dependencies = ['jest@26.0.1']; - const testExpectObject = { - ...defaultExpect, - packageFilePath: packageJson, - dependencies: dependencies, - }; - const classForTesting = new ClassForTesting( - dependencies, - ClassForTesting.CONSTANTS.DEPENDENCIES, - true, - packageJson - ); - const expectedJsonOverrides = { - dependencies: { - jest: '26.0.1', - }, - }; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + test('with dependencies with override', async (done) => { + generateRandomFilename().then((packageJson) => { + const dependencies = ['jest@26.0.1']; + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + dependencies: dependencies, + }; + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.DEPENDENCIES, + true, + packageJson + ); + const expectedJsonOverrides = { + dependencies: { + jest: '26.0.1', + }, + }; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + }); }); -}); -test('run() with no overwrite', async (done) => { - generateRandomFilename().then((packageJson) => { - const dependencies = ['jest@26.0.1']; + test('with no overwrite', async (done) => { + generateRandomFilename().then((packageJson) => { + const dependencies = ['jest@26.0.1']; - const classForTesting = new ClassForTesting( - dependencies, - ClassForTesting.CONSTANTS.DEPENDENCIES, - false, - packageJson - ); - const testExpectObject = { - ...defaultExpect, - dependencies: dependencies, - packageFilePath: packageJson, - overwrite: false, - }; - const expectedJsonOverrides = {}; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.DEPENDENCIES, + false, + packageJson + ); + const testExpectObject = { + ...defaultExpect, + dependencies: dependencies, + packageFilePath: packageJson, + overwrite: false, + }; + const expectedJsonOverrides = {}; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + }); }); -}); -test('run() with package path', async (done) => { - generateRandomFilename().then((packageJson) => { - const classForTesting = new ClassForTesting([], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); - const testExpectObject = { - ...defaultExpect, - packageFilePath: packageJson, - }; - const expectedJsonOverrides = {}; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + test('with package path', async (done) => { + generateRandomFilename().then((packageJson) => { + const classForTesting = new ClassForTesting( + ['jest@26.0.0'], + ClassForTesting.CONSTANTS.DEPENDENCIES, + true, + packageJson + ); + const testExpectObject = { + ...defaultExpect, + packageFilePath: packageJson, + }; + const expectedJsonOverrides = {}; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + }); }); -}); -test('run() with dev dependencies overwrite with caret', async (done) => { - generateRandomFilename().then((packageJson) => { - const dependencies = ['jest@^26.0.1']; - const classForTesting = new ClassForTesting( - dependencies, - ClassForTesting.CONSTANTS.DEV_DEPENDENCIES, - true, - packageJson - ); - const testExpectObject = { - ...defaultExpect, - dependencies: dependencies, - packageFilePath: packageJson, - target: 'devDependencies', - }; + test('with dev dependencies overwrite with caret', async (done) => { + generateRandomFilename().then((packageJson) => { + const dependencies = ['jest@^26.0.1']; + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.DEV_DEPENDENCIES, + true, + packageJson + ); + const testExpectObject = { + ...defaultExpect, + dependencies: dependencies, + packageFilePath: packageJson, + target: 'devDependencies', + }; - const expectedJsonOverrides = { - devDependencies: { - jest: '^26.0.1', - }, - }; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + const expectedJsonOverrides = { + devDependencies: { + jest: '^26.0.1', + }, + }; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + }); }); -}); -test('run() with optional dependencies overwrite lower', async (done) => { - generateRandomFilename().then((packageJson) => { - const dependencies = ['jest@25.0.0']; - const classForTesting = new ClassForTesting( - dependencies, - ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES, - true, - packageJson - ); - const testExpectObject = { - ...defaultExpect, - dependencies: dependencies, - packageFilePath: packageJson, - target: 'optionalDependencies', - }; - const expectedJsonOverrides = { - optionalDependencies: { - jest: '25.0.0', - }, - }; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + test('with optional dependencies overwrite lower', async (done) => { + generateRandomFilename().then((packageJson) => { + const dependencies = ['jest@25.0.0']; + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES, + true, + packageJson + ); + const testExpectObject = { + ...defaultExpect, + dependencies: dependencies, + packageFilePath: packageJson, + target: 'optionalDependencies', + }; + const expectedJsonOverrides = { + optionalDependencies: { + jest: '25.0.0', + }, + }; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + }); }); -}); -test('run() with peer dependencies overwrite', async (done) => { - generateRandomFilename().then((packageJson) => { - const dependencies = ['jest@26.0.1']; - const classForTesting = new ClassForTesting( - dependencies, - ClassForTesting.CONSTANTS.PEER_DEPENDENCIES, - true, - packageJson - ); - const testExpectObject = { - ...defaultExpect, - dependencies: dependencies, - packageFilePath: packageJson, - target: 'peerDependencies', - }; - const expectedJsonOverrides = { - peerDependencies: { - jest: '26.0.1', - }, - }; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + test('with peer dependencies overwrite', async (done) => { + generateRandomFilename().then((packageJson) => { + const dependencies = ['jest@26.0.1']; + const classForTesting = new ClassForTesting( + dependencies, + ClassForTesting.CONSTANTS.PEER_DEPENDENCIES, + true, + packageJson + ); + const testExpectObject = { + ...defaultExpect, + dependencies: dependencies, + packageFilePath: packageJson, + target: 'peerDependencies', + }; + const expectedJsonOverrides = { + peerDependencies: { + jest: '26.0.1', + }, + }; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + }); }); }); diff --git a/cli-index.js b/cli-index.js index be65c60..90d20fb 100755 --- a/cli-index.js +++ b/cli-index.js @@ -12,11 +12,3 @@ app.run().catch((error) => { console.error('\x1b[31m%s\x1b[0m', error); process.exit(1); }); - -// app -// .addDependencies() -// .then(app.saveToPackage.bind(app)) -// .catch((error) => { -// console.error('\x1b[31m%s\x1b[0m', error); -// process.exit(1); -// }); diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index 18d4c79..25ffd6d 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -56,15 +56,11 @@ class AddDependencies { console.log(`Adding packages to '${this.target}'...`); - return this.mapDependencies(); - } - - mapDependencies() { return Promise.all(this.dependencies.map((dep) => this.runNpmShow(dep))); } run() { - return this.mapDependencies().then(() => this.saveToPackage()); + return this.addDependencies().then(() => this.saveToPackage()); } runNpmShow(dep) { From 2d4de75d3eea3f1eca1873c472aa6ce3074c66aa Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 21 Jun 2020 23:10:54 +0800 Subject: [PATCH 28/49] moved around tests for cleaner postioning various fixes to reduce false positives tried testing cli failed started the class level tests --- __tests__/lib/Files.js | 3 --- jest.setup.js | 6 ----- package.json | 2 +- {__mocks__ => tests/__mocks__}/argv.js | 0 {__mocks__ => tests/__mocks__}/utils.js | 26 +++++++++---------- {__tests__ => tests/__tests__}/cli-index.js | 20 +++++++++----- {__tests__ => tests/__tests__}/index.js | 7 ++--- .../__tests__}/lib/AddDependencies.js | 0 tests/__tests__/lib/Files.js | 11 ++++++++ tests/config/jest.global.setup.js | 5 ++++ .../config/jest.global.teardown.js | 2 +- tests/config/jest.setup.js | 4 +++ jest.config.js => tests/jest.config.js | 5 ++-- 13 files changed, 55 insertions(+), 36 deletions(-) delete mode 100644 __tests__/lib/Files.js delete mode 100644 jest.setup.js rename {__mocks__ => tests/__mocks__}/argv.js (100%) rename {__mocks__ => tests/__mocks__}/utils.js (83%) rename {__tests__ => tests/__tests__}/cli-index.js (88%) rename {__tests__ => tests/__tests__}/index.js (97%) rename {__tests__ => tests/__tests__}/lib/AddDependencies.js (100%) create mode 100644 tests/__tests__/lib/Files.js create mode 100644 tests/config/jest.global.setup.js rename jest.teardown.js => tests/config/jest.global.teardown.js (82%) create mode 100644 tests/config/jest.setup.js rename jest.config.js => tests/jest.config.js (52%) diff --git a/__tests__/lib/Files.js b/__tests__/lib/Files.js deleted file mode 100644 index 1c63b16..0000000 --- a/__tests__/lib/Files.js +++ /dev/null @@ -1,3 +0,0 @@ -test('first test', () => { - expect(true).toBeTruthy(); -}); diff --git a/jest.setup.js b/jest.setup.js deleted file mode 100644 index 1e361be..0000000 --- a/jest.setup.js +++ /dev/null @@ -1,6 +0,0 @@ -const fs = require('fs'); -const { TEST_JSON_DIR } = require('./jest.config'); - -module.exports = async () => { - fs.mkdirSync(TEST_JSON_DIR); -}; diff --git a/package.json b/package.json index 0de933d..d07bb6c 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ }, "homepage": "https://github.com/arfeo/npm-add-dependencies#readme", "scripts": { - "test": "jest --silent", + "test": "jest --config ./tests/jest.config.js", "lint": "eslint --fix --ext js lib/**.js index.js" }, "keywords": [ diff --git a/__mocks__/argv.js b/tests/__mocks__/argv.js similarity index 100% rename from __mocks__/argv.js rename to tests/__mocks__/argv.js diff --git a/__mocks__/utils.js b/tests/__mocks__/utils.js similarity index 83% rename from __mocks__/utils.js rename to tests/__mocks__/utils.js index 713b802..1abbb09 100644 --- a/__mocks__/utils.js +++ b/tests/__mocks__/utils.js @@ -1,5 +1,5 @@ const path = require('path'); -const Files = require('../lib/Files'); +const Files = require('../../lib/Files'); const argv = require('./argv'); const { TEST_JSON_DIR } = require('../jest.config'); const md5 = require('blueimp-md5'); @@ -13,7 +13,7 @@ const defaultExpect = { }; const generateDefaultPackageJson = () => { - return Files.readFromFile(path.resolve(__dirname, '../', 'package.json')).then((defaultPackageJsonString) => { + return Files.readFromFile(path.resolve(__dirname, '../..', 'package.json')).then((defaultPackageJsonString) => { const defaultPackageJson = JSON.parse(defaultPackageJsonString); defaultPackageJson.dependencies = { jest: '26.0.0' }; defaultPackageJson.devDependencies = { jest: '26.0.0' }; @@ -24,25 +24,22 @@ const generateDefaultPackageJson = () => { }); }; -const cliRunAndVerify = async (done, testExpectObject, expectedJsonOverrides) => { +const cliRunAndVerify = async (done, expectedJsonOverrides) => { generateRandomFilename().then((packageJson) => { - const testExpectObject = { - ...defaultExpect, - packageFilePath: packageJson, - }; - // require('../cli-index') generateDefaultPackageJson().then((defaultPackageJson) => { - Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => + Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => { + require('../../cli-index'); Files.readFromFile(packageJson).then((jsonResult) => { const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; try { expect(JSON.parse(jsonResult)).toEqual(expectedJson); + expect(console.log.mock.calls[console.log.mock.calls.length - 1][1]).toEqual('Done.'); done(); } catch (e) { done(e); } - }) - ); + }); + }); }); }); }; @@ -56,6 +53,7 @@ const runAndVerify = async (done, classForTesting, packageJson, testExpectObject const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; try { expect(JSON.parse(jsonResult)).toEqual(expectedJson); + expect(console.log.mock.calls[console.log.mock.calls.length - 1][1]).toEqual('Done.'); done(); } catch (e) { done(e); @@ -67,14 +65,16 @@ const runAndVerify = async (done, classForTesting, packageJson, testExpectObject }; const cliRunAndVerifyWithFailures = async (done, inputsString) => { - jest.spyOn(process, 'exit').mockImplementation(() => {}); generateRandomFilename().then((packageJson) => { argv(inputsString + ` ${packageJson}`).then(() => { generateDefaultPackageJson().then((defaultPackageJson) => { Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => { - require('../cli-index'); + require('../../cli-index'); try { // add test to test log + expect(console.error.mock.calls[console.error.mock.calls.length - 1][1]).toEqual( + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); } catch (e) { diff --git a/__tests__/cli-index.js b/tests/__tests__/cli-index.js similarity index 88% rename from __tests__/cli-index.js rename to tests/__tests__/cli-index.js index 5dfcb76..fe39a11 100644 --- a/__tests__/cli-index.js +++ b/tests/__tests__/cli-index.js @@ -1,4 +1,5 @@ const argv = require('../__mocks__/argv'); +const addDependenciesNonCli = require('../../index'); const { cliRunAndVerifyWithFailures, cliRunAndVerify, @@ -6,10 +7,10 @@ const { defaultExpect, } = require('../__mocks__/utils'); -describe('cli run()', async () => { +describe('cli run()', () => { test('test argv mock', (done) => { - argv('--arg1 value1').then((input) => { - expect(input).toEqual(['--arg1', 'value1']); + argv(`../package.json ${addDependenciesNonCli.CONSTANTS.DEPENDENCIES} jest@26.0.1`).then((input) => { + expect(input).toEqual(['../package.json', addDependenciesNonCli.CONSTANTS.DEPENDENCIES, 'jest@26.0.1']); done(); }); }); @@ -20,13 +21,18 @@ describe('cli run()', async () => { // test('cli with defaults', async (done) => { // generateRandomFilename().then((packageJson) => { - // const testExpectObject = { - // ...defaultExpect, - // packageFilePath: packageJson, + // const expectedJsonOverrides = { + // dependencies: { + // jest: '26.0.1', + // }, // }; - // cliRunAndVerify(done, testExpectObject).then(); + // // todo the argv are just being lost?.... they exist until i call require + // argv(`${packageJson} ${addDependenciesNonCli.CONSTANTS.DEV_DEPENDENCIES} jest@26.0.1`).then((input) => { + // cliRunAndVerify(done, expectedJsonOverrides).then(); + // }); // }); // }); + // // test('run() with dependencies with override', async (done) => { // generateRandomFilename().then((packageJson) => { diff --git a/__tests__/index.js b/tests/__tests__/index.js similarity index 97% rename from __tests__/index.js rename to tests/__tests__/index.js index 8c82e4e..b27122e 100644 --- a/__tests__/index.js +++ b/tests/__tests__/index.js @@ -1,8 +1,8 @@ -const ClassForTesting = require('../index'); +const ClassForTesting = require('../../index'); const { runAndVerifyWithFailures, runAndVerify, generateRandomFilename, defaultExpect } = require('../__mocks__/utils'); // todo add a test for connection timeout this made me think i had fucked it allll up :D -describe('nodeJS run()', async () => { +describe('nodeJS run()', () => { test('fail to make sure tests themselves work', async (done) => { generateRandomFilename().then((packageJson) => { const testExpectObject = { @@ -26,7 +26,8 @@ describe('nodeJS run()', async () => { true, packageJson ); - runAndVerify(done, classForTesting, packageJson, testExpectObject).then(); + const expectedJsonOverrides = {}; + runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); }); }); diff --git a/__tests__/lib/AddDependencies.js b/tests/__tests__/lib/AddDependencies.js similarity index 100% rename from __tests__/lib/AddDependencies.js rename to tests/__tests__/lib/AddDependencies.js diff --git a/tests/__tests__/lib/Files.js b/tests/__tests__/lib/Files.js new file mode 100644 index 0000000..103341a --- /dev/null +++ b/tests/__tests__/lib/Files.js @@ -0,0 +1,11 @@ +const Files = require('../../../lib/Files'); +const path = require('path'); + +describe('readFromFile Tests', () => { + test('file exists', async (done) => { + Files.readFromFile(path.resolve('..', '..', '..', 'package,json')).then((string) => { + expect(string).toContain({ name: 'add-dependencies' }); + done(); + }); + }); +}); diff --git a/tests/config/jest.global.setup.js b/tests/config/jest.global.setup.js new file mode 100644 index 0000000..bdca9c4 --- /dev/null +++ b/tests/config/jest.global.setup.js @@ -0,0 +1,5 @@ +const fs = require('fs'); +const { TEST_JSON_DIR } = require('../jest.config'); +module.exports = () => { + fs.mkdirSync(TEST_JSON_DIR); +}; diff --git a/jest.teardown.js b/tests/config/jest.global.teardown.js similarity index 82% rename from jest.teardown.js rename to tests/config/jest.global.teardown.js index 82cf07c..c513bf9 100644 --- a/jest.teardown.js +++ b/tests/config/jest.global.teardown.js @@ -1,6 +1,6 @@ const fs = require('fs'); const path = require('path'); -const { TEST_JSON_DIR } = require('./jest.config'); +const { TEST_JSON_DIR } = require('../jest.config'); module.exports = async () => { fs.readdir(TEST_JSON_DIR, (_, files) => diff --git a/tests/config/jest.setup.js b/tests/config/jest.setup.js new file mode 100644 index 0000000..011502f --- /dev/null +++ b/tests/config/jest.setup.js @@ -0,0 +1,4 @@ +jest.spyOn(process, 'exit').mockImplementation(() => {}); +jest.spyOn(console, 'error').mockImplementation(() => {}); +jest.spyOn(console, 'log').mockImplementation(() => {}); +jest.spyOn(console, 'warn').mockImplementation(() => {}); diff --git a/jest.config.js b/tests/jest.config.js similarity index 52% rename from jest.config.js rename to tests/jest.config.js index 9d6f5ae..a855c49 100644 --- a/jest.config.js +++ b/tests/jest.config.js @@ -4,6 +4,7 @@ const TEST_JSON_DIR = path.resolve(__dirname, '__tests__', 'testJsonFolder'); module.exports = { verbose: true, TEST_JSON_DIR, - globalSetup: './jest.setup.js', - globalTeardown: './jest.teardown.js', + setupFilesAfterEnv: ['./config/jest.setup.js'], + globalSetup: './config/jest.global.setup.js', + globalTeardown: './config/jest.global.teardown.js', }; From 0aa9192eac43582d5be443a8f19e52959e3d798b Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 21 Jun 2020 23:13:25 +0800 Subject: [PATCH 29/49] disable failing trest --- tests/__tests__/lib/Files.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/__tests__/lib/Files.js b/tests/__tests__/lib/Files.js index 103341a..99e38c5 100644 --- a/tests/__tests__/lib/Files.js +++ b/tests/__tests__/lib/Files.js @@ -2,10 +2,10 @@ const Files = require('../../../lib/Files'); const path = require('path'); describe('readFromFile Tests', () => { - test('file exists', async (done) => { - Files.readFromFile(path.resolve('..', '..', '..', 'package,json')).then((string) => { - expect(string).toContain({ name: 'add-dependencies' }); - done(); - }); - }); + // test('file exists', async (done) => { + // Files.readFromFile(path.resolve('..', '..', '..', 'package,json')).then((string) => { + // expect(string).toContain({ name: 'add-dependencies' }); + // done(); + // }); + // }); }); From c88c5fd14bb2065f75f71ad93945d8785852da69 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 22 Jun 2020 22:30:35 +0800 Subject: [PATCH 30/49] Files tests --- lib/Files.js | 4 +- tests/__tests__/lib/AddDependencies.js | 6 ++- tests/__tests__/lib/Files.js | 72 +++++++++++++++++++++++--- 3 files changed, 71 insertions(+), 11 deletions(-) diff --git a/lib/Files.js b/lib/Files.js index cf38db2..ab8a6d9 100644 --- a/lib/Files.js +++ b/lib/Files.js @@ -5,7 +5,7 @@ class Files { return new Promise((resolve, reject) => { fs.readFile(filePath, (err, data) => { if (err) { - return reject(); + return reject(err); } return resolve(data.toString()); @@ -17,7 +17,7 @@ class Files { return new Promise((resolve, reject) => { fs.writeFile(filePath, fileContent, (err) => { if (err) { - return reject(); + return reject(err); } return resolve(); diff --git a/tests/__tests__/lib/AddDependencies.js b/tests/__tests__/lib/AddDependencies.js index 1c63b16..764779d 100644 --- a/tests/__tests__/lib/AddDependencies.js +++ b/tests/__tests__/lib/AddDependencies.js @@ -1,3 +1,5 @@ -test('first test', () => { - expect(true).toBeTruthy(); +describe('test run()', () => { + test('This doesnt need to be tested as its tested by the index and cli-index tests', () => { + expect(true).toBeTruthy(); + }); }); diff --git a/tests/__tests__/lib/Files.js b/tests/__tests__/lib/Files.js index 99e38c5..69f4964 100644 --- a/tests/__tests__/lib/Files.js +++ b/tests/__tests__/lib/Files.js @@ -1,11 +1,69 @@ const Files = require('../../../lib/Files'); +const fs = require('fs'); const path = require('path'); +const { generateRandomFilename } = require('../../__mocks__/utils'); -describe('readFromFile Tests', () => { - // test('file exists', async (done) => { - // Files.readFromFile(path.resolve('..', '..', '..', 'package,json')).then((string) => { - // expect(string).toContain({ name: 'add-dependencies' }); - // done(); - // }); - // }); +describe('readFromFile() Tests', () => { + test('file exists', async (done) => { + Files.readFromFile(path.resolve('package.json')) + .then((string) => { + expect(string).toContain('"name": "add-dependencies"'); + done(); + }) + .catch((e) => { + done(e); + }); + }); + + test('throw when file doesnt exist', async (done) => { + Files.readFromFile(path.resolve('gffgdssdfggfsdgfsdgfdgfd')) + .then(() => {}) + .catch((e) => { + expect(e.code).toEqual('ENOENT'); + done(); + }); + }); +}); + +describe('writeToFile() Tests', () => { + test('file exists and updates', async (done) => { + generateRandomFilename().then((randomFilename) => + fs.writeFile(randomFilename, 'something', (err) => { + Files.writeToFile(randomFilename, 'something else') + .then(() => + fs.readFile(randomFilename, (err, string) => { + expect(string.toString()).toContain('something else'); + done(err); + }) + ) + .catch((e) => { + done(e); + }); + }) + ); + }); + + test('creates when file doesnt exist', async (done) => { + generateRandomFilename().then((randomFilename) => { + Files.writeToFile(randomFilename, 'something else') + .then(() => + fs.readFile(randomFilename, (err, string) => { + expect(string.toString()).toContain('something else'); + done(err); + }) + ) + .catch((e) => { + done(e); + }); + }); + }); + + test('throw when folder doesnt exist', async (done) => { + Files.writeToFile(path.resolve('some', 'random', 'folder.txt'), 'something else') + .then(() => {}) + .catch((e) => { + expect(e.code).toEqual('ENOENT'); + done(); + }); + }); }); From dc4d700901420b82022f70e91a45b59d8c75d3b5 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 22 Jun 2020 22:41:34 +0800 Subject: [PATCH 31/49] added another return to avoid the race conditions occurring during testing --- lib/AddDependencies.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index 25ffd6d..f93b84b 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -158,7 +158,7 @@ class AddDependencies { json[this.target] = this.result; - Files.writeToFile(this.packageFilePath, JSON.stringify(json, null, 2)) + return Files.writeToFile(this.packageFilePath, JSON.stringify(json, null, 2)) .then(() => { console.log('\x1b[32m%s\x1b[0m', 'Done.'); }) From 37a6ecec1146c261c99b2ace0474721c945ef424 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 22 Jun 2020 22:51:36 +0800 Subject: [PATCH 32/49] small change to add commit message for draft pr fixes #18 fixes #20 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 55089cd..f0948c9 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ If no `package_file` argument passed, the script searches for a `package.json` f Use `--no-overwrite` flag to prevent already existing packages in `package.json` from being overwritten. -Example: +Example: ```sh $ add-dependencies /home/user/project/package.json moment@2.0.0 react@16.8 redux eslint --dev From 556305f782e823b7cd2ea1ffb04e47ed36d447b0 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 22 Jun 2020 23:00:42 +0800 Subject: [PATCH 33/49] npmignore rejig --- .npmignore | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.npmignore b/.npmignore index 4da2c47..69321ae 100644 --- a/.npmignore +++ b/.npmignore @@ -3,8 +3,6 @@ ISSUE_TEMPLATE.md PULL_REQUEST_TEMPLATE.md yarn.lock package-lock.json -__tests__ .editorconfig .eslintrc.js -jest.* -__mocks__ \ No newline at end of file +tests \ No newline at end of file From af8a420bf9a72c1c242816c403f7802e4f8231ba Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 22 Jun 2020 23:01:33 +0800 Subject: [PATCH 34/49] readme fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f0948c9..4831d04 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ $ npx add-dependencies /home/user/project/package.json moment@2.0.0 react@16.8 r or via nodejs ```js -const npmAdd = require('add-dependencies/lib/AddDependencies'); +const npmAdd = require('add-dependencies'); const dependencies = [ 'package1', 'package2', From 4a1e2821cad1ee2edb41615e1cb668999b10a04f Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 22 Jun 2020 23:08:15 +0800 Subject: [PATCH 35/49] simplification of random filename as its not needed to be so complex --- package.json | 2 +- tests/__mocks__/utils.js | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index d07bb6c..aa63546 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "homepage": "https://github.com/arfeo/npm-add-dependencies#readme", "scripts": { "test": "jest --config ./tests/jest.config.js", - "lint": "eslint --fix --ext js lib/**.js index.js" + "lint": "eslint --fix --ext js lib/**.js index.js cli-index.js" }, "keywords": [ "dependencies", diff --git a/tests/__mocks__/utils.js b/tests/__mocks__/utils.js index 1abbb09..bc7f328 100644 --- a/tests/__mocks__/utils.js +++ b/tests/__mocks__/utils.js @@ -104,11 +104,7 @@ const runAndVerifyWithFailures = async (done, classForTesting, packageJson, test ); }; -const generateRandomFilename = async () => - path.resolve( - TEST_JSON_DIR, - md5(Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)) - ); +const generateRandomFilename = async () => path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); module.exports = { defaultExpect, From 74d32fca5a69853b3f5a08b1b78a9c59f6151aa6 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 22 Jun 2020 23:11:43 +0800 Subject: [PATCH 36/49] unneeded anon func? --- tests/config/jest.global.teardown.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/config/jest.global.teardown.js b/tests/config/jest.global.teardown.js index c513bf9..b27463f 100644 --- a/tests/config/jest.global.teardown.js +++ b/tests/config/jest.global.teardown.js @@ -4,6 +4,6 @@ const { TEST_JSON_DIR } = require('../jest.config'); module.exports = async () => { fs.readdir(TEST_JSON_DIR, (_, files) => - files.forEach((file) => fs.unlink(path.resolve(TEST_JSON_DIR, file), () => fs.rmdir(TEST_JSON_DIR, () => () => _))) + files.forEach((file) => fs.unlink(path.resolve(TEST_JSON_DIR, file), () => fs.rmdir(TEST_JSON_DIR, () => {}))) ); }; From f7fd558b8e96803df02ccab5fab2d0ae54e60b0e Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2020 16:52:50 +0800 Subject: [PATCH 37/49] * removal of argv mock * addition of npm argv mock * fixed console.logs being shared between tests * finished majority of tests just cli-index to go * added a return if no dep passed to runNpmShow to avoid .split error --- lib/AddDependencies.js | 4 + package.json | 1 + tests/__mocks__/argv.js | 1 - tests/__mocks__/utils.js | 15 +- tests/__tests__/cli-index.js | 6 +- tests/__tests__/lib/AddDependencies.js | 447 +++++++++++++++++++++++++ tests/config/jest.setup.js | 17 +- 7 files changed, 476 insertions(+), 15 deletions(-) delete mode 100644 tests/__mocks__/argv.js diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index f93b84b..d9d174e 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -64,6 +64,10 @@ class AddDependencies { } runNpmShow(dep) { + if (!dep) { + console.error('\x1b[31m%s\x1b[0m', `No Dependency Provided to runNpmShow()`); + return new Promise((resolve) => resolve()); + } const depSplit = dep.split('@'); const [depName, depVersion] = dep.charAt(0) !== '@' ? depSplit : [`@${depSplit[1]}`, depSplit[2]]; diff --git a/package.json b/package.json index aa63546..229751b 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ }, "devDependencies": { "blueimp-md5": "^2.16.0", + "mock-argv": "^1.1.7", "jest": "^26.0.1", "eslint": "^7.3.0", "babel-eslint": "^10.1.0", diff --git a/tests/__mocks__/argv.js b/tests/__mocks__/argv.js deleted file mode 100644 index 3e17c55..0000000 --- a/tests/__mocks__/argv.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = async (inputs = '') => (process.argv = inputs.split(' ')); diff --git a/tests/__mocks__/utils.js b/tests/__mocks__/utils.js index bc7f328..7d957d8 100644 --- a/tests/__mocks__/utils.js +++ b/tests/__mocks__/utils.js @@ -1,6 +1,6 @@ const path = require('path'); const Files = require('../../lib/Files'); -const argv = require('./argv'); +const argv = require('mock-argv'); const { TEST_JSON_DIR } = require('../jest.config'); const md5 = require('blueimp-md5'); @@ -33,7 +33,7 @@ const cliRunAndVerify = async (done, expectedJsonOverrides) => { const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; try { expect(JSON.parse(jsonResult)).toEqual(expectedJson); - expect(console.log.mock.calls[console.log.mock.calls.length - 1][1]).toEqual('Done.'); + expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); done(); } catch (e) { done(e); @@ -53,7 +53,7 @@ const runAndVerify = async (done, classForTesting, packageJson, testExpectObject const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; try { expect(JSON.parse(jsonResult)).toEqual(expectedJson); - expect(console.log.mock.calls[console.log.mock.calls.length - 1][1]).toEqual('Done.'); + expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); done(); } catch (e) { done(e); @@ -66,15 +66,13 @@ const runAndVerify = async (done, classForTesting, packageJson, testExpectObject const cliRunAndVerifyWithFailures = async (done, inputsString) => { generateRandomFilename().then((packageJson) => { - argv(inputsString + ` ${packageJson}`).then(() => { + argv([inputsString, packageJson], () => { generateDefaultPackageJson().then((defaultPackageJson) => { Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => { require('../../cli-index'); try { // add test to test log - expect(console.error.mock.calls[console.error.mock.calls.length - 1][1]).toEqual( - 'No dependencies passed. Stop.' - ); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); expect(process.exit).toHaveBeenCalledWith(1); done(); } catch (e) { @@ -94,6 +92,8 @@ const runAndVerifyWithFailures = async (done, classForTesting, packageJson, test Files.readFromFile(packageJson).then((expectedJson) => { try { expect(JSON.parse(expectedJson)).not.toEqual(defaultPackageJson); + // expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + // expect(process.exit).toHaveBeenCalledWith(1); done(); } catch (e) { done(e); @@ -111,6 +111,7 @@ module.exports = { runAndVerify, runAndVerifyWithFailures, generateRandomFilename, + generateDefaultPackageJson, cliRunAndVerifyWithFailures, cliRunAndVerify, }; diff --git a/tests/__tests__/cli-index.js b/tests/__tests__/cli-index.js index fe39a11..b0c3a01 100644 --- a/tests/__tests__/cli-index.js +++ b/tests/__tests__/cli-index.js @@ -1,4 +1,4 @@ -const argv = require('../__mocks__/argv'); +const argv = require('mock-argv'); const addDependenciesNonCli = require('../../index'); const { cliRunAndVerifyWithFailures, @@ -9,8 +9,8 @@ const { describe('cli run()', () => { test('test argv mock', (done) => { - argv(`../package.json ${addDependenciesNonCli.CONSTANTS.DEPENDENCIES} jest@26.0.1`).then((input) => { - expect(input).toEqual(['../package.json', addDependenciesNonCli.CONSTANTS.DEPENDENCIES, 'jest@26.0.1']); + argv(['../package.json', addDependenciesNonCli.CONSTANTS.DEPENDENCIES, 'jest@26.0.1'], () => { + expect(process.argv).toContain('../package.json', addDependenciesNonCli.CONSTANTS.DEPENDENCIES, 'jest@26.0.1'); done(); }); }); diff --git a/tests/__tests__/lib/AddDependencies.js b/tests/__tests__/lib/AddDependencies.js index 764779d..5b9b3a2 100644 --- a/tests/__tests__/lib/AddDependencies.js +++ b/tests/__tests__/lib/AddDependencies.js @@ -1,5 +1,452 @@ +const argv = require('mock-argv'); +const ClassForTesting = require('../../../index'); +const { generateRandomFilename, generateDefaultPackageJson } = require('../../__mocks__/utils'); +const Files = require('../../../lib/Files'); + describe('test run()', () => { test('This doesnt need to be tested as its tested by the index and cli-index tests', () => { expect(true).toBeTruthy(); }); }); + +describe('test addDependencies()', () => { + test('None', (done) => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.result).toEqual({}); + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEPENDENCIES); + expect(npmAdd.overwrite).toEqual(true); + expect(npmAdd.packageFilePath).toEqual('./package.json'); + expect(npmAdd.dependencies).toEqual([]); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + + test('-D', (done) => { + argv(['-D'], () => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEV_DEPENDENCIES); + expect(npmAdd.result).toEqual({}); + expect(npmAdd.overwrite).toEqual(true); + expect(npmAdd.packageFilePath).toEqual('./package.json'); + expect(npmAdd.dependencies).toEqual([]); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + }); + test('--save-dev', (done) => { + argv(['--save-dev'], () => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEV_DEPENDENCIES); + expect(npmAdd.result).toEqual({}); + expect(npmAdd.overwrite).toEqual(true); + expect(npmAdd.packageFilePath).toEqual('./package.json'); + expect(npmAdd.dependencies).toEqual([]); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + }); + test('--dev', (done) => { + argv(['--dev'], () => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEV_DEPENDENCIES); + expect(npmAdd.result).toEqual({}); + expect(npmAdd.overwrite).toEqual(true); + expect(npmAdd.packageFilePath).toEqual('./package.json'); + expect(npmAdd.dependencies).toEqual([]); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + }); + + test('-P', (done) => { + argv(['-P'], () => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.PEER_DEPENDENCIES); + expect(npmAdd.result).toEqual({}); + expect(npmAdd.overwrite).toEqual(true); + expect(npmAdd.packageFilePath).toEqual('./package.json'); + expect(npmAdd.dependencies).toEqual([]); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + }); + test('--save-peer', (done) => { + argv(['--save-peer'], () => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.PEER_DEPENDENCIES); + expect(npmAdd.result).toEqual({}); + expect(npmAdd.overwrite).toEqual(true); + expect(npmAdd.packageFilePath).toEqual('./package.json'); + expect(npmAdd.dependencies).toEqual([]); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + }); + test('--peer', (done) => { + argv(['--peer'], () => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.PEER_DEPENDENCIES); + expect(npmAdd.result).toEqual({}); + expect(npmAdd.overwrite).toEqual(true); + expect(npmAdd.packageFilePath).toEqual('./package.json'); + expect(npmAdd.dependencies).toEqual([]); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + }); + + test('-O', (done) => { + argv(['-O'], () => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES); + expect(npmAdd.result).toEqual({}); + expect(npmAdd.overwrite).toEqual(true); + expect(npmAdd.packageFilePath).toEqual('./package.json'); + expect(npmAdd.dependencies).toEqual([]); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + }); + test('--save-optional', (done) => { + argv(['--save-optional'], () => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES); + expect(npmAdd.result).toEqual({}); + expect(npmAdd.overwrite).toEqual(true); + expect(npmAdd.packageFilePath).toEqual('./package.json'); + expect(npmAdd.dependencies).toEqual([]); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + }); + test('--optional', (done) => { + argv(['--optional'], () => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES); + expect(npmAdd.result).toEqual({}); + expect(npmAdd.overwrite).toEqual(true); + expect(npmAdd.packageFilePath).toEqual('./package.json'); + expect(npmAdd.dependencies).toEqual([]); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + }); + + test('--no-overwrite', (done) => { + argv(['--no-overwrite'], () => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.overwrite).toEqual(false); + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEPENDENCIES); + expect(npmAdd.result).toEqual({}); + expect(npmAdd.packageFilePath).toEqual('./package.json'); + expect(npmAdd.dependencies).toEqual([]); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + }); + + test('package.json', (done) => { + argv(['../../../package.json'], () => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.packageFilePath).toEqual('../../../package.json'); + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEPENDENCIES); + expect(npmAdd.result).toEqual({}); + expect(npmAdd.overwrite).toEqual(true); + expect(npmAdd.dependencies).toEqual([]); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + }); + + test('some packages', (done) => { + const deps = ['jquery', 'semver@^6.3.0', 'npm-run@~5.0.1']; + argv(['jquery', 'semver@^6.3.0', 'npm-run@~5.0.1'], () => { + const npmAdd = new ClassForTesting(); + npmAdd.addDependencies().then(() => { + expect(npmAdd.dependencies).toEqual(deps); + expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEPENDENCIES); + expect(npmAdd.result).toEqual({ + jquery: '^3.5.1', + 'npm-run': '~5.0.1', + semver: '^6.3.0', + }); + expect(npmAdd.overwrite).toEqual(true); + expect(npmAdd.packageFilePath).toEqual('./package.json'); + expect(console.log).toBeCalledWith(`Adding packages to '${npmAdd.target}'...`); + done(); + }); + }); + }); +}); + +describe('test runNpmShow()', () => { + test('no dep', (done) => { + const npmAdd = new ClassForTesting(); + npmAdd.runNpmShow().then(() => { + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', `No Dependency Provided to runNpmShow()`); + done(); + }); + }); + + test('non existent dep', (done) => { + const depName = 'dffdsfdsdsfzfsfafdsfdsafdsadfsa'; + const npmAdd = new ClassForTesting(); + npmAdd.runNpmShow('dffdsfdsdsfzfsfafdsfdsafdsadfsa').then(() => { + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', `Could not fetch version info for: ${depName}. Skip.`); + done(); + }); + }); + + test('non existent dep with version', (done) => { + const depName = 'dffdsfdsdsfzfsfafdsfdsafdsadfsa'; + const npmAdd = new ClassForTesting(); + npmAdd.runNpmShow(`${depName}@1.2.3`).then(() => { + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', `Could not fetch version info for: ${depName}. Skip.`); + done(); + }); + }); + + test('dep no version', (done) => { + const depName = 'jquery'; + const npmAdd = new ClassForTesting(); + npmAdd.runNpmShow(depName).then(() => { + expect(console.log).toBeCalledWith(expect.stringContaining(`Processed: ${depName}, latest version:`)); + done(); + }); + }); + + test('dep with @', (done) => { + const depName = 'jquery'; + const version = '3.5.1'; + const npmAdd = new ClassForTesting(); + npmAdd.runNpmShow(`${depName}@3.5.1`).then(() => { + expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: ${version}`); + done(); + }); + }); + + test('dep with @ invalid version', (done) => { + const depName = 'jquery'; + const npmAdd = new ClassForTesting(); + npmAdd.runNpmShow(`${depName}@1.2.3`).then(() => { + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + `Could not obtain the specified version for: ${depName}. Skip.` + ); + done(); + }); + }); + + test('dep with ^', (done) => { + const depName = 'jquery'; + const npmAdd = new ClassForTesting(); + npmAdd.runNpmShow(`${depName}@^2.0.0`).then(() => { + expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: ^2.0.0`); + done(); + }); + }); + + test('dep with <', (done) => { + const depName = 'jquery'; + const npmAdd = new ClassForTesting(); + npmAdd.runNpmShow(`${depName}@<2.2.4`).then(() => { + expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: <2.2.4`); + done(); + }); + }); + + test('dep with <=', (done) => { + const depName = 'jquery'; + const npmAdd = new ClassForTesting(); + npmAdd.runNpmShow(`${depName}@<=2.2.4`).then(() => { + expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: <=2.2.4`); + done(); + }); + }); + + test('dep with >', (done) => { + const depName = 'jquery'; + const npmAdd = new ClassForTesting(); + npmAdd.runNpmShow(`${depName}@>2.2.3`).then(() => { + expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: >2.2.3`); + done(); + }); + }); + + test('dep with >=', (done) => { + const depName = 'jquery'; + const npmAdd = new ClassForTesting(); + npmAdd.runNpmShow(`${depName}@>=2.2.4`).then(() => { + expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: >=2.2.4`); + done(); + }); + }); + + test('dep with ~', (done) => { + const depName = 'jquery'; + const npmAdd = new ClassForTesting(); + npmAdd.runNpmShow(`${depName}@~2.2.0`).then(() => { + expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: ~2.2.0`); + done(); + }); + }); +}); + +describe('test saveToPackage()', () => { + test('packageFilePath does not exist', (done) => { + // generateRandomFilename().then((fileName) => + // generateDefaultPackageJson().then((defaultPackageJson) => + // Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)) + // ) + // ); + const npmAdd = new ClassForTesting(); + npmAdd.packageFilePath = 'asdsadasda/package.json'; + npmAdd.saveToPackage().then(() => { + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', `Could not read from ${npmAdd.packageFilePath}. Stop.`); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }); + + test('not json', (done) => { + generateRandomFilename().then((fileName) => + Files.writeToFile(fileName, 'i am random text').then(() => { + const npmAdd = new ClassForTesting(); + npmAdd.packageFilePath = fileName; + npmAdd.saveToPackage().then(() => { + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', `Could not parse ${npmAdd.packageFilePath}. Stop.`); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + }); + }) + ); + }); + + test('json with no packages', (done) => { + generateRandomFilename().then((fileName) => + generateDefaultPackageJson().then((defaultPackageJson) => { + defaultPackageJson.dependencies = {}; + defaultPackageJson.devDependencies = {}; + defaultPackageJson.optionalDependencies = {}; + defaultPackageJson.peerDependencies = {}; + Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)).then(() => { + const npmAdd = new ClassForTesting(); + npmAdd.packageFilePath = fileName; + npmAdd.result['jest'] = '26.0.0'; + const expectedJsonOverrides = { + dependencies: { + jest: '26.0.0', + }, + }; + npmAdd.saveToPackage().then(() => + Files.readFromFile(fileName).then((jsonResult) => { + const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; + expect(JSON.parse(jsonResult)).toEqual(expectedJson); + expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); + done(); + }) + ); + }); + }) + ); + }); + + test('json with packages and overwrite', (done) => { + generateRandomFilename().then((fileName) => + generateDefaultPackageJson().then((defaultPackageJson) => { + Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)).then(() => { + const npmAdd = new ClassForTesting(); + npmAdd.packageFilePath = fileName; + npmAdd.result['jest'] = '26.0.1'; + const expectedJsonOverrides = { + dependencies: { + jest: '26.0.1', + }, + }; + npmAdd.saveToPackage().then(() => + Files.readFromFile(fileName).then((jsonResult) => { + const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; + expect(JSON.parse(jsonResult)).toEqual(expectedJson); + expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); + done(); + }) + ); + }); + }) + ); + }); + + test('json with packages no overwrite', (done) => { + generateRandomFilename().then((fileName) => + generateDefaultPackageJson().then((defaultPackageJson) => { + Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)).then(() => { + const npmAdd = new ClassForTesting(); + npmAdd.packageFilePath = fileName; + npmAdd.overwrite = false; + npmAdd.result['jest'] = '26.0.1'; + npmAdd.saveToPackage().then(() => + Files.readFromFile(fileName).then((jsonResult) => { + expect(JSON.parse(jsonResult)).toEqual(defaultPackageJson); + expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); + done(); + }) + ); + }); + }) + ); + }); +}); + +describe('test CONSTANTS()', () => { + test('dependencies', () => { + expect(ClassForTesting.CONSTANTS.DEPENDENCIES).toEqual('dependencies'); + }); + + test('devDependencies', () => { + expect(ClassForTesting.CONSTANTS.DEV_DEPENDENCIES).toEqual('devDependencies'); + }); + + test('peerDependencies', () => { + expect(ClassForTesting.CONSTANTS.PEER_DEPENDENCIES).toEqual('peerDependencies'); + }); + + test('optionalDependencies', () => { + expect(ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES).toEqual('optionalDependencies'); + }); +}); diff --git a/tests/config/jest.setup.js b/tests/config/jest.setup.js index 011502f..e156be4 100644 --- a/tests/config/jest.setup.js +++ b/tests/config/jest.setup.js @@ -1,4 +1,13 @@ -jest.spyOn(process, 'exit').mockImplementation(() => {}); -jest.spyOn(console, 'error').mockImplementation(() => {}); -jest.spyOn(console, 'log').mockImplementation(() => {}); -jest.spyOn(console, 'warn').mockImplementation(() => {}); +beforeEach(() => { + console.log = jest.fn(); + process.exit = jest.fn(); + console.error = jest.fn(); + console.warn = jest.fn(); +}); + +afterEach(() => { + console.log = jest.fn(); + process.exit = jest.fn(); + console.error = jest.fn(); + console.warn = jest.fn(); +}); From aa83793eb8ee5e1fe124891b6e24d7fc41da4622 Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 6 Jul 2020 17:44:34 +0800 Subject: [PATCH 38/49] * slight refactors to utils * tried testing toplevel cli-index again but i think its a lost casue --- tests/__mocks__/utils.js | 46 +++++++++++--------------- tests/__tests__/cli-index.js | 64 ++++++++++++++++-------------------- 2 files changed, 48 insertions(+), 62 deletions(-) diff --git a/tests/__mocks__/utils.js b/tests/__mocks__/utils.js index 7d957d8..a7f5921 100644 --- a/tests/__mocks__/utils.js +++ b/tests/__mocks__/utils.js @@ -24,32 +24,30 @@ const generateDefaultPackageJson = () => { }); }; -const cliRunAndVerify = async (done, expectedJsonOverrides) => { - generateRandomFilename().then((packageJson) => { - generateDefaultPackageJson().then((defaultPackageJson) => { - Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => { - require('../../cli-index'); - Files.readFromFile(packageJson).then((jsonResult) => { - const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; - try { - expect(JSON.parse(jsonResult)).toEqual(expectedJson); - expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); - done(); - } catch (e) { - done(e); - } - }); +const cliRunAndVerify = async (done, packageJsonFilename, expectedJsonOverrides) => { + generateDefaultPackageJson().then((defaultPackageJson) => { + Files.writeToFile(packageJsonFilename, JSON.stringify(defaultPackageJson)).then(() => { + require('../../cli-index'); + Files.readFromFile(packageJsonFilename).then((jsonResult) => { + const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; + try { + expect(JSON.parse(jsonResult)).toEqual(expectedJson); + expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); + done(); + } catch (e) { + done(e); + } }); }); }); }; -const runAndVerify = async (done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides) => { +const runAndVerify = async (done, classForTesting, packageJsonFilename, testExpectObject, expectedJsonOverrides) => { expect(classForTesting).toMatchObject(testExpectObject); generateDefaultPackageJson().then((defaultPackageJson) => - Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => + Files.writeToFile(packageJsonFilename, JSON.stringify(defaultPackageJson)).then(() => classForTesting.run().then(() => - Files.readFromFile(packageJson).then((jsonResult) => { + Files.readFromFile(packageJsonFilename).then((jsonResult) => { const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; try { expect(JSON.parse(jsonResult)).toEqual(expectedJson); @@ -90,14 +88,10 @@ const runAndVerifyWithFailures = async (done, classForTesting, packageJson, test Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => classForTesting.run().then(() => Files.readFromFile(packageJson).then((expectedJson) => { - try { - expect(JSON.parse(expectedJson)).not.toEqual(defaultPackageJson); - // expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); - // expect(process.exit).toHaveBeenCalledWith(1); - done(); - } catch (e) { - done(e); - } + expect(JSON.parse(expectedJson)).not.toEqual(defaultPackageJson); + // expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + // expect(process.exit).toHaveBeenCalledWith(1); + done(); }) ) ) diff --git a/tests/__tests__/cli-index.js b/tests/__tests__/cli-index.js index b0c3a01..26754c4 100644 --- a/tests/__tests__/cli-index.js +++ b/tests/__tests__/cli-index.js @@ -8,6 +8,10 @@ const { } = require('../__mocks__/utils'); describe('cli run()', () => { + test('Hmm its just too hard to test cli context run, lets assume its good with sub tests', () => { + expect(true).toBeTruthy(); + }); + test('test argv mock', (done) => { argv(['../package.json', addDependenciesNonCli.CONSTANTS.DEPENDENCIES, 'jest@26.0.1'], () => { expect(process.argv).toContain('../package.json', addDependenciesNonCli.CONSTANTS.DEPENDENCIES, 'jest@26.0.1'); @@ -19,43 +23,31 @@ describe('cli run()', () => { cliRunAndVerifyWithFailures(done, 'dependencies').then(); }); - // test('cli with defaults', async (done) => { - // generateRandomFilename().then((packageJson) => { - // const expectedJsonOverrides = { - // dependencies: { - // jest: '26.0.1', - // }, - // }; - // // todo the argv are just being lost?.... they exist until i call require - // argv(`${packageJson} ${addDependenciesNonCli.CONSTANTS.DEV_DEPENDENCIES} jest@26.0.1`).then((input) => { - // cliRunAndVerify(done, expectedJsonOverrides).then(); - // }); - // }); - // }); + test('cli with defaults', async (done) => { + generateRandomFilename().then((packageJson) => { + argv([packageJson], () => { + expect(true).toBeTruthy(); + cliRunAndVerify(done, packageJson).then(); + }); + }); + }); - // - // test('run() with dependencies with override', async (done) => { - // generateRandomFilename().then((packageJson) => { - // const dependencies = ['jest@26.0.1']; - // const testExpectObject = { - // ...defaultExpect, - // packageFilePath: packageJson, - // dependencies: dependencies, - // }; - // const classForTesting = new ClassForTesting( - // dependencies, - // ClassForTesting.CONSTANTS.DEPENDENCIES, - // true, - // packageJson - // ); - // const expectedJsonOverrides = { - // dependencies: { - // jest: '26.0.1', - // }, - // }; - // runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); - // }); - // }); + test('run() with dependencies with override', async (done) => { + const expectedJsonOverrides = { + dependencies: { + jest: '26.0.1', + }, + }; + generateRandomFilename().then((packageJson) => + argv([packageJson, 'jest@26.0.1'], () => { + expect(process.argv).toContain(packageJson); + expect(process.argv).toContain('jest@26.0.1'); + done(); + // todo there is a race condition occurring when we call "require" to when expect fires + // cliRunAndVerify(done, packageJson, expectedJsonOverrides).then(); + }) + ); + }); // // test('run() with no overwrite', async (done) => { // generateRandomFilename().then((packageJson) => { From 3f1780960d791d974d38ba611fbd0c6fff14b6c3 Mon Sep 17 00:00:00 2001 From: Phyzical Date: Mon, 26 Oct 2020 19:49:35 +0800 Subject: [PATCH 39/49] Trying-To-Support-non-cli: adding linting fixes --- .editorconfig | 3 ++- .npmignore | 2 +- cli-index.js | 1 + index.js | 1 + lib/AddDependencies.js | 9 +++---- package.json | 2 +- tests/__mocks__/utils.js | 33 +++++++++++++++++++------- tests/__tests__/cli-index.js | 3 ++- tests/__tests__/index.js | 10 ++++++-- tests/__tests__/lib/AddDependencies.js | 27 +++++++++++++++------ tests/__tests__/lib/Files.js | 4 +++- 11 files changed, 69 insertions(+), 26 deletions(-) diff --git a/.editorconfig b/.editorconfig index e85cf81..538eb56 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,4 +2,5 @@ indent_size = 2 indent_style = space max_line_length = 120 -tab_width = 2 \ No newline at end of file +tab_width = 2 +insert_final_newline = true diff --git a/.npmignore b/.npmignore index 69321ae..c442bae 100644 --- a/.npmignore +++ b/.npmignore @@ -5,4 +5,4 @@ yarn.lock package-lock.json .editorconfig .eslintrc.js -tests \ No newline at end of file +tests diff --git a/cli-index.js b/cli-index.js index 90d20fb..7dfd00a 100755 --- a/cli-index.js +++ b/cli-index.js @@ -1,4 +1,5 @@ #!/usr/bin/env node + const AddDependencies = require('./lib/AddDependencies'); console.log( diff --git a/index.js b/index.js index 23c368d..5a848c4 100755 --- a/index.js +++ b/index.js @@ -1,2 +1,3 @@ #!/usr/bin/env node + module.exports = require('./lib/AddDependencies'); diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index d9d174e..231cd39 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -102,7 +102,8 @@ class AddDependencies { } catch (e) {} if (undefined === this.result[depName]) { - console.error('\x1b[31m%s\x1b[0m', `Could not obtain the specified version for: ${depName}. Skip.`); + console.error('\x1b[31m%s\x1b[0m', + `Could not obtain the specified version for: ${depName}. Skip.`); } else { console.log(`Processed: ${depName}, specified version: ${depVersion}`); } @@ -148,9 +149,9 @@ class AddDependencies { process.exit(1); } - this.result = this.overwrite - ? Object.assign(json[this.target] || {}, this.result) - : Object.assign(this.result, json[this.target] || {}); + this.result = this.overwrite ? + Object.assign(json[this.target] || {}, this.result) : + Object.assign(this.result, json[this.target] || {}); this.result = Object.keys(this.result) .sort() diff --git a/package.json b/package.json index 229751b..95cb63d 100644 --- a/package.json +++ b/package.json @@ -40,4 +40,4 @@ "eslint-plugin-prettier": "^3.0.0", "prettier": "^2.0.5" } -} \ No newline at end of file +} diff --git a/tests/__mocks__/utils.js b/tests/__mocks__/utils.js index a7f5921..1fff120 100644 --- a/tests/__mocks__/utils.js +++ b/tests/__mocks__/utils.js @@ -1,7 +1,9 @@ const path = require('path'); const Files = require('../../lib/Files'); const argv = require('mock-argv'); -const { TEST_JSON_DIR } = require('../jest.config'); +const { + TEST_JSON_DIR +} = require('../jest.config'); const md5 = require('blueimp-md5'); // no params @@ -15,10 +17,18 @@ const defaultExpect = { const generateDefaultPackageJson = () => { return Files.readFromFile(path.resolve(__dirname, '../..', 'package.json')).then((defaultPackageJsonString) => { const defaultPackageJson = JSON.parse(defaultPackageJsonString); - defaultPackageJson.dependencies = { jest: '26.0.0' }; - defaultPackageJson.devDependencies = { jest: '26.0.0' }; - defaultPackageJson.optionalDependencies = { jest: '26.0.0' }; - defaultPackageJson.peerDependencies = { jest: '26.0.0' }; + defaultPackageJson.dependencies = { + jest: '26.0.0' + }; + defaultPackageJson.devDependencies = { + jest: '26.0.0' + }; + defaultPackageJson.optionalDependencies = { + jest: '26.0.0' + }; + defaultPackageJson.peerDependencies = { + jest: '26.0.0' + }; defaultPackageJson.name = ''; return defaultPackageJson; }); @@ -29,7 +39,10 @@ const cliRunAndVerify = async (done, packageJsonFilename, expectedJsonOverrides) Files.writeToFile(packageJsonFilename, JSON.stringify(defaultPackageJson)).then(() => { require('../../cli-index'); Files.readFromFile(packageJsonFilename).then((jsonResult) => { - const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; + const expectedJson = { + ...defaultPackageJson, + ...expectedJsonOverrides + }; try { expect(JSON.parse(jsonResult)).toEqual(expectedJson); expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); @@ -48,7 +61,10 @@ const runAndVerify = async (done, classForTesting, packageJsonFilename, testExpe Files.writeToFile(packageJsonFilename, JSON.stringify(defaultPackageJson)).then(() => classForTesting.run().then(() => Files.readFromFile(packageJsonFilename).then((jsonResult) => { - const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; + const expectedJson = { + ...defaultPackageJson, + ...expectedJsonOverrides + }; try { expect(JSON.parse(jsonResult)).toEqual(expectedJson); expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); @@ -70,7 +86,8 @@ const cliRunAndVerifyWithFailures = async (done, inputsString) => { require('../../cli-index'); try { // add test to test log - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.'); expect(process.exit).toHaveBeenCalledWith(1); done(); } catch (e) { diff --git a/tests/__tests__/cli-index.js b/tests/__tests__/cli-index.js index 26754c4..7a15d4c 100644 --- a/tests/__tests__/cli-index.js +++ b/tests/__tests__/cli-index.js @@ -14,7 +14,8 @@ describe('cli run()', () => { test('test argv mock', (done) => { argv(['../package.json', addDependenciesNonCli.CONSTANTS.DEPENDENCIES, 'jest@26.0.1'], () => { - expect(process.argv).toContain('../package.json', addDependenciesNonCli.CONSTANTS.DEPENDENCIES, 'jest@26.0.1'); + expect(process.argv).toContain('../package.json', addDependenciesNonCli.CONSTANTS.DEPENDENCIES, + 'jest@26.0.1'); done(); }); }); diff --git a/tests/__tests__/index.js b/tests/__tests__/index.js index b27122e..c125155 100644 --- a/tests/__tests__/index.js +++ b/tests/__tests__/index.js @@ -1,5 +1,10 @@ const ClassForTesting = require('../../index'); -const { runAndVerifyWithFailures, runAndVerify, generateRandomFilename, defaultExpect } = require('../__mocks__/utils'); +const { + runAndVerifyWithFailures, + runAndVerify, + generateRandomFilename, + defaultExpect +} = require('../__mocks__/utils'); // todo add a test for connection timeout this made me think i had fucked it allll up :D describe('nodeJS run()', () => { @@ -9,7 +14,8 @@ describe('nodeJS run()', () => { ...defaultExpect, packageFilePath: packageJson, }; - const classForTesting = new ClassForTesting(['jest'], ClassForTesting.CONSTANTS.DEPENDENCIES, true, packageJson); + const classForTesting = new ClassForTesting(['jest'], ClassForTesting.CONSTANTS.DEPENDENCIES, true, + packageJson); runAndVerifyWithFailures(done, classForTesting, packageJson, testExpectObject).then(); }); }); diff --git a/tests/__tests__/lib/AddDependencies.js b/tests/__tests__/lib/AddDependencies.js index 5b9b3a2..54e48ad 100644 --- a/tests/__tests__/lib/AddDependencies.js +++ b/tests/__tests__/lib/AddDependencies.js @@ -1,6 +1,9 @@ const argv = require('mock-argv'); const ClassForTesting = require('../../../index'); -const { generateRandomFilename, generateDefaultPackageJson } = require('../../__mocks__/utils'); +const { + generateRandomFilename, + generateDefaultPackageJson +} = require('../../__mocks__/utils'); const Files = require('../../../lib/Files'); describe('test run()', () => { @@ -228,7 +231,8 @@ describe('test runNpmShow()', () => { const depName = 'dffdsfdsdsfzfsfafdsfdsafdsadfsa'; const npmAdd = new ClassForTesting(); npmAdd.runNpmShow('dffdsfdsdsfzfsfafdsfdsafdsadfsa').then(() => { - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', `Could not fetch version info for: ${depName}. Skip.`); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', + `Could not fetch version info for: ${depName}. Skip.`); done(); }); }); @@ -237,7 +241,8 @@ describe('test runNpmShow()', () => { const depName = 'dffdsfdsdsfzfsfafdsfdsafdsadfsa'; const npmAdd = new ClassForTesting(); npmAdd.runNpmShow(`${depName}@1.2.3`).then(() => { - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', `Could not fetch version info for: ${depName}. Skip.`); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', + `Could not fetch version info for: ${depName}. Skip.`); done(); }); }); @@ -338,7 +343,8 @@ describe('test saveToPackage()', () => { const npmAdd = new ClassForTesting(); npmAdd.packageFilePath = 'asdsadasda/package.json'; npmAdd.saveToPackage().then(() => { - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', `Could not read from ${npmAdd.packageFilePath}. Stop.`); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', + `Could not read from ${npmAdd.packageFilePath}. Stop.`); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -350,7 +356,8 @@ describe('test saveToPackage()', () => { const npmAdd = new ClassForTesting(); npmAdd.packageFilePath = fileName; npmAdd.saveToPackage().then(() => { - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', `Could not parse ${npmAdd.packageFilePath}. Stop.`); + expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', + `Could not parse ${npmAdd.packageFilePath}. Stop.`); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -376,7 +383,10 @@ describe('test saveToPackage()', () => { }; npmAdd.saveToPackage().then(() => Files.readFromFile(fileName).then((jsonResult) => { - const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; + const expectedJson = { + ...defaultPackageJson, + ...expectedJsonOverrides + }; expect(JSON.parse(jsonResult)).toEqual(expectedJson); expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); done(); @@ -401,7 +411,10 @@ describe('test saveToPackage()', () => { }; npmAdd.saveToPackage().then(() => Files.readFromFile(fileName).then((jsonResult) => { - const expectedJson = { ...defaultPackageJson, ...expectedJsonOverrides }; + const expectedJson = { + ...defaultPackageJson, + ...expectedJsonOverrides + }; expect(JSON.parse(jsonResult)).toEqual(expectedJson); expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); done(); diff --git a/tests/__tests__/lib/Files.js b/tests/__tests__/lib/Files.js index 69f4964..1aefab5 100644 --- a/tests/__tests__/lib/Files.js +++ b/tests/__tests__/lib/Files.js @@ -1,7 +1,9 @@ const Files = require('../../../lib/Files'); const fs = require('fs'); const path = require('path'); -const { generateRandomFilename } = require('../../__mocks__/utils'); +const { + generateRandomFilename +} = require('../../__mocks__/utils'); describe('readFromFile() Tests', () => { test('file exists', async (done) => { From a986cc76901d321ba051db86afd4eb6b7d7944d7 Mon Sep 17 00:00:00 2001 From: Phyzical Date: Mon, 26 Oct 2020 21:58:29 +0800 Subject: [PATCH 40/49] Trying-To-Support-non-cli: more liniting --- .editorconfig | 1 - lib/AddDependencies.js | 58 +++-- tests/__mocks__/utils.js | 79 ++++--- tests/__tests__/cli-index.js | 18 +- tests/__tests__/index.js | 101 ++++++--- tests/__tests__/lib/AddDependencies.js | 282 +++++++++++++++++-------- tests/__tests__/lib/Files.js | 5 +- tests/config/jest.global.setup.js | 4 +- tests/config/jest.global.teardown.js | 10 +- 9 files changed, 397 insertions(+), 161 deletions(-) diff --git a/.editorconfig b/.editorconfig index 538eb56..7a881e6 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,6 +1,5 @@ [*] indent_size = 2 indent_style = space -max_line_length = 120 tab_width = 2 insert_final_newline = true diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index 231cd39..4bf792f 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -65,11 +65,15 @@ class AddDependencies { runNpmShow(dep) { if (!dep) { - console.error('\x1b[31m%s\x1b[0m', `No Dependency Provided to runNpmShow()`); + console.error( + '\x1b[31m%s\x1b[0m', + `No Dependency Provided to runNpmShow()` + ); return new Promise((resolve) => resolve()); } const depSplit = dep.split('@'); - const [depName, depVersion] = dep.charAt(0) !== '@' ? depSplit : [`@${depSplit[1]}`, depSplit[2]]; + const [depName, depVersion] = + dep.charAt(0) !== '@' ? depSplit : [`@${depSplit[1]}`, depSplit[2]]; if (depVersion) { const depRange = semver.validRange(depVersion) || ''; @@ -88,7 +92,10 @@ class AddDependencies { this.result[depName] = `${depVersion}`; break; } - } else if (operators.length > 1 && specifiedVersions.length > 1) { + } else if ( + operators.length > 1 && + specifiedVersions.length > 1 + ) { if ( semver.cmp(version, operators[0], specifiedVersions[0]) && semver.cmp(version, operators[1], specifiedVersions[1]) @@ -102,13 +109,20 @@ class AddDependencies { } catch (e) {} if (undefined === this.result[depName]) { - console.error('\x1b[31m%s\x1b[0m', - `Could not obtain the specified version for: ${depName}. Skip.`); + console.error( + '\x1b[31m%s\x1b[0m', + `Could not obtain the specified version for: ${depName}. Skip.` + ); } else { - console.log(`Processed: ${depName}, specified version: ${depVersion}`); + console.log( + `Processed: ${depName}, specified version: ${depVersion}` + ); } } else { - console.error('\x1b[31m%s\x1b[0m', `Could not fetch version info for: ${depName}. Skip.`); + console.error( + '\x1b[31m%s\x1b[0m', + `Could not fetch version info for: ${depName}. Skip.` + ); } return resolve(); @@ -122,14 +136,20 @@ class AddDependencies { const parsed = stdout.match(/latest: '(.*?)'/i); if (!parsed || undefined === parsed[1]) { - console.error('\x1b[31m%s\x1b[0m', `Could not obtain the latest version for: ${depName}. Skip.`); + console.error( + '\x1b[31m%s\x1b[0m', + `Could not obtain the latest version for: ${depName}. Skip.` + ); } else { this.result[depName] = `^${parsed[1]}`; console.log(`Processed: ${depName}, latest version: ${parsed[1]}`); } } else { - console.error('\x1b[31m%s\x1b[0m', `Could not fetch version info for: ${depName}. Skip.`); + console.error( + '\x1b[31m%s\x1b[0m', + `Could not fetch version info for: ${depName}. Skip.` + ); } return resolve(); @@ -145,7 +165,10 @@ class AddDependencies { try { json = JSON.parse(data); } catch (e) { - console.error('\x1b[31m%s\x1b[0m', `Could not parse ${this.packageFilePath}. Stop.`); + console.error( + '\x1b[31m%s\x1b[0m', + `Could not parse ${this.packageFilePath}. Stop.` + ); process.exit(1); } @@ -163,17 +186,26 @@ class AddDependencies { json[this.target] = this.result; - return Files.writeToFile(this.packageFilePath, JSON.stringify(json, null, 2)) + return Files.writeToFile( + this.packageFilePath, + JSON.stringify(json, null, 2) + ) .then(() => { console.log('\x1b[32m%s\x1b[0m', 'Done.'); }) .catch(() => { - console.error('\x1b[31m%s\x1b[0m', `Could not write to ${this.packageFilePath}. Stop.`); + console.error( + '\x1b[31m%s\x1b[0m', + `Could not write to ${this.packageFilePath}. Stop.` + ); process.exit(1); }); }) .catch(() => { - console.error('\x1b[31m%s\x1b[0m', `Could not read from ${this.packageFilePath}. Stop.`); + console.error( + '\x1b[31m%s\x1b[0m', + `Could not read from ${this.packageFilePath}. Stop.` + ); process.exit(1); }); } diff --git a/tests/__mocks__/utils.js b/tests/__mocks__/utils.js index 1fff120..ccdc40d 100644 --- a/tests/__mocks__/utils.js +++ b/tests/__mocks__/utils.js @@ -15,33 +15,42 @@ const defaultExpect = { }; const generateDefaultPackageJson = () => { - return Files.readFromFile(path.resolve(__dirname, '../..', 'package.json')).then((defaultPackageJsonString) => { + return Files.readFromFile( + path.resolve(__dirname, '../..', 'package.json') + ).then((defaultPackageJsonString) => { const defaultPackageJson = JSON.parse(defaultPackageJsonString); defaultPackageJson.dependencies = { - jest: '26.0.0' + jest: '26.0.0', }; defaultPackageJson.devDependencies = { - jest: '26.0.0' + jest: '26.0.0', }; defaultPackageJson.optionalDependencies = { - jest: '26.0.0' + jest: '26.0.0', }; defaultPackageJson.peerDependencies = { - jest: '26.0.0' + jest: '26.0.0', }; defaultPackageJson.name = ''; return defaultPackageJson; }); }; -const cliRunAndVerify = async (done, packageJsonFilename, expectedJsonOverrides) => { +const cliRunAndVerify = async ( + done, + packageJsonFilename, + expectedJsonOverrides +) => { generateDefaultPackageJson().then((defaultPackageJson) => { - Files.writeToFile(packageJsonFilename, JSON.stringify(defaultPackageJson)).then(() => { + Files.writeToFile( + packageJsonFilename, + JSON.stringify(defaultPackageJson) + ).then(() => { require('../../cli-index'); Files.readFromFile(packageJsonFilename).then((jsonResult) => { const expectedJson = { ...defaultPackageJson, - ...expectedJsonOverrides + ...expectedJsonOverrides, }; try { expect(JSON.parse(jsonResult)).toEqual(expectedJson); @@ -55,15 +64,24 @@ const cliRunAndVerify = async (done, packageJsonFilename, expectedJsonOverrides) }); }; -const runAndVerify = async (done, classForTesting, packageJsonFilename, testExpectObject, expectedJsonOverrides) => { +const runAndVerify = async ( + done, + classForTesting, + packageJsonFilename, + testExpectObject, + expectedJsonOverrides +) => { expect(classForTesting).toMatchObject(testExpectObject); generateDefaultPackageJson().then((defaultPackageJson) => - Files.writeToFile(packageJsonFilename, JSON.stringify(defaultPackageJson)).then(() => + Files.writeToFile( + packageJsonFilename, + JSON.stringify(defaultPackageJson) + ).then(() => classForTesting.run().then(() => Files.readFromFile(packageJsonFilename).then((jsonResult) => { const expectedJson = { ...defaultPackageJson, - ...expectedJsonOverrides + ...expectedJsonOverrides, }; try { expect(JSON.parse(jsonResult)).toEqual(expectedJson); @@ -82,27 +100,37 @@ const cliRunAndVerifyWithFailures = async (done, inputsString) => { generateRandomFilename().then((packageJson) => { argv([inputsString, packageJson], () => { generateDefaultPackageJson().then((defaultPackageJson) => { - Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => { - require('../../cli-index'); - try { - // add test to test log - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', - 'No dependencies passed. Stop.'); - expect(process.exit).toHaveBeenCalledWith(1); - done(); - } catch (e) { - done(e); + Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then( + () => { + require('../../cli-index'); + try { + // add test to test log + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); + expect(process.exit).toHaveBeenCalledWith(1); + done(); + } catch (e) { + done(e); + } } - }); + ); }); }); }); }; -const runAndVerifyWithFailures = async (done, classForTesting, packageJson, testExpectObject) => { +const runAndVerifyWithFailures = async ( + done, + classForTesting, + packageJson, + testExpectObject +) => { expect(classForTesting).not.toEqual(testExpectObject); generateDefaultPackageJson().then((defaultPackageJson) => - Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then(() => + Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then( + () => classForTesting.run().then(() => Files.readFromFile(packageJson).then((expectedJson) => { expect(JSON.parse(expectedJson)).not.toEqual(defaultPackageJson); @@ -115,7 +143,8 @@ const runAndVerifyWithFailures = async (done, classForTesting, packageJson, test ); }; -const generateRandomFilename = async () => path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); +const generateRandomFilename = async () => + path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); module.exports = { defaultExpect, diff --git a/tests/__tests__/cli-index.js b/tests/__tests__/cli-index.js index 7a15d4c..ea86418 100644 --- a/tests/__tests__/cli-index.js +++ b/tests/__tests__/cli-index.js @@ -13,11 +13,21 @@ describe('cli run()', () => { }); test('test argv mock', (done) => { - argv(['../package.json', addDependenciesNonCli.CONSTANTS.DEPENDENCIES, 'jest@26.0.1'], () => { - expect(process.argv).toContain('../package.json', addDependenciesNonCli.CONSTANTS.DEPENDENCIES, - 'jest@26.0.1'); + argv( + [ + '../package.json', + addDependenciesNonCli.CONSTANTS.DEPENDENCIES, + 'jest@26.0.1', + ], + () => { + expect(process.argv).toContain( + '../package.json', + addDependenciesNonCli.CONSTANTS.DEPENDENCIES, + 'jest@26.0.1' + ); done(); - }); + } + ); }); test('cli fail to make sure tests themselves work', async (done) => { diff --git a/tests/__tests__/index.js b/tests/__tests__/index.js index c125155..d4a519a 100644 --- a/tests/__tests__/index.js +++ b/tests/__tests__/index.js @@ -3,7 +3,7 @@ const { runAndVerifyWithFailures, runAndVerify, generateRandomFilename, - defaultExpect + defaultExpect, } = require('../__mocks__/utils'); // todo add a test for connection timeout this made me think i had fucked it allll up :D @@ -14,9 +14,18 @@ describe('nodeJS run()', () => { ...defaultExpect, packageFilePath: packageJson, }; - const classForTesting = new ClassForTesting(['jest'], ClassForTesting.CONSTANTS.DEPENDENCIES, true, - packageJson); - runAndVerifyWithFailures(done, classForTesting, packageJson, testExpectObject).then(); + const classForTesting = new addDependencies( + ['jest'], + addDependencies.CONSTANTS.DEPENDENCIES, + true, + packageJson + ); + runAndVerifyWithFailures( + done, + classForTesting, + packageJson, + testExpectObject + ).then(); }); }); @@ -26,14 +35,20 @@ describe('nodeJS run()', () => { ...defaultExpect, packageFilePath: packageJson, }; - const classForTesting = new ClassForTesting( + const classForTesting = new addDependencies( ['jest@26.0.0'], - ClassForTesting.CONSTANTS.DEPENDENCIES, + addDependencies.CONSTANTS.DEPENDENCIES, true, packageJson ); const expectedJsonOverrides = {}; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + runAndVerify( + done, + classForTesting, + packageJson, + testExpectObject, + expectedJsonOverrides + ).then(); }); }); @@ -45,9 +60,9 @@ describe('nodeJS run()', () => { packageFilePath: packageJson, dependencies: dependencies, }; - const classForTesting = new ClassForTesting( + const classForTesting = new addDependencies( dependencies, - ClassForTesting.CONSTANTS.DEPENDENCIES, + addDependencies.CONSTANTS.DEPENDENCIES, true, packageJson ); @@ -56,7 +71,13 @@ describe('nodeJS run()', () => { jest: '26.0.1', }, }; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + runAndVerify( + done, + classForTesting, + packageJson, + testExpectObject, + expectedJsonOverrides + ).then(); }); }); @@ -64,9 +85,9 @@ describe('nodeJS run()', () => { generateRandomFilename().then((packageJson) => { const dependencies = ['jest@26.0.1']; - const classForTesting = new ClassForTesting( + const classForTesting = new addDependencies( dependencies, - ClassForTesting.CONSTANTS.DEPENDENCIES, + addDependencies.CONSTANTS.DEPENDENCIES, false, packageJson ); @@ -77,15 +98,21 @@ describe('nodeJS run()', () => { overwrite: false, }; const expectedJsonOverrides = {}; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + runAndVerify( + done, + classForTesting, + packageJson, + testExpectObject, + expectedJsonOverrides + ).then(); }); }); test('with package path', async (done) => { generateRandomFilename().then((packageJson) => { - const classForTesting = new ClassForTesting( + const classForTesting = new addDependencies( ['jest@26.0.0'], - ClassForTesting.CONSTANTS.DEPENDENCIES, + addDependencies.CONSTANTS.DEPENDENCIES, true, packageJson ); @@ -94,16 +121,22 @@ describe('nodeJS run()', () => { packageFilePath: packageJson, }; const expectedJsonOverrides = {}; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + runAndVerify( + done, + classForTesting, + packageJson, + testExpectObject, + expectedJsonOverrides + ).then(); }); }); test('with dev dependencies overwrite with caret', async (done) => { generateRandomFilename().then((packageJson) => { const dependencies = ['jest@^26.0.1']; - const classForTesting = new ClassForTesting( + const classForTesting = new addDependencies( dependencies, - ClassForTesting.CONSTANTS.DEV_DEPENDENCIES, + addDependencies.CONSTANTS.DEV_DEPENDENCIES, true, packageJson ); @@ -119,16 +152,22 @@ describe('nodeJS run()', () => { jest: '^26.0.1', }, }; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + runAndVerify( + done, + classForTesting, + packageJson, + testExpectObject, + expectedJsonOverrides + ).then(); }); }); test('with optional dependencies overwrite lower', async (done) => { generateRandomFilename().then((packageJson) => { const dependencies = ['jest@25.0.0']; - const classForTesting = new ClassForTesting( + const classForTesting = new addDependencies( dependencies, - ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES, + addDependencies.CONSTANTS.OPTIONAL_DEPENDENCIES, true, packageJson ); @@ -143,16 +182,22 @@ describe('nodeJS run()', () => { jest: '25.0.0', }, }; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + runAndVerify( + done, + classForTesting, + packageJson, + testExpectObject, + expectedJsonOverrides + ).then(); }); }); test('with peer dependencies overwrite', async (done) => { generateRandomFilename().then((packageJson) => { const dependencies = ['jest@26.0.1']; - const classForTesting = new ClassForTesting( + const classForTesting = new addDependencies( dependencies, - ClassForTesting.CONSTANTS.PEER_DEPENDENCIES, + addDependencies.CONSTANTS.PEER_DEPENDENCIES, true, packageJson ); @@ -167,7 +212,13 @@ describe('nodeJS run()', () => { jest: '26.0.1', }, }; - runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); + runAndVerify( + done, + classForTesting, + packageJson, + testExpectObject, + expectedJsonOverrides + ).then(); }); }); }); diff --git a/tests/__tests__/lib/AddDependencies.js b/tests/__tests__/lib/AddDependencies.js index 54e48ad..c47736c 100644 --- a/tests/__tests__/lib/AddDependencies.js +++ b/tests/__tests__/lib/AddDependencies.js @@ -2,7 +2,7 @@ const argv = require('mock-argv'); const ClassForTesting = require('../../../index'); const { generateRandomFilename, - generateDefaultPackageJson + generateDefaultPackageJson, } = require('../../__mocks__/utils'); const Files = require('../../../lib/Files'); @@ -14,14 +14,17 @@ describe('test run()', () => { describe('test addDependencies()', () => { test('None', (done) => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { expect(npmAdd.result).toEqual({}); - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEPENDENCIES); + expect(npmAdd.target).toEqual(addDependencies.CONSTANTS.DEPENDENCIES); expect(npmAdd.overwrite).toEqual(true); expect(npmAdd.packageFilePath).toEqual('./package.json'); expect(npmAdd.dependencies).toEqual([]); - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -29,14 +32,19 @@ describe('test addDependencies()', () => { test('-D', (done) => { argv(['-D'], () => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEV_DEPENDENCIES); + expect(npmAdd.target).toEqual( + addDependencies.CONSTANTS.DEV_DEPENDENCIES + ); expect(npmAdd.result).toEqual({}); expect(npmAdd.overwrite).toEqual(true); expect(npmAdd.packageFilePath).toEqual('./package.json'); expect(npmAdd.dependencies).toEqual([]); - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -44,14 +52,19 @@ describe('test addDependencies()', () => { }); test('--save-dev', (done) => { argv(['--save-dev'], () => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEV_DEPENDENCIES); + expect(npmAdd.target).toEqual( + addDependencies.CONSTANTS.DEV_DEPENDENCIES + ); expect(npmAdd.result).toEqual({}); expect(npmAdd.overwrite).toEqual(true); expect(npmAdd.packageFilePath).toEqual('./package.json'); expect(npmAdd.dependencies).toEqual([]); - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -59,14 +72,19 @@ describe('test addDependencies()', () => { }); test('--dev', (done) => { argv(['--dev'], () => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEV_DEPENDENCIES); + expect(npmAdd.target).toEqual( + addDependencies.CONSTANTS.DEV_DEPENDENCIES + ); expect(npmAdd.result).toEqual({}); expect(npmAdd.overwrite).toEqual(true); expect(npmAdd.packageFilePath).toEqual('./package.json'); expect(npmAdd.dependencies).toEqual([]); - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -75,14 +93,19 @@ describe('test addDependencies()', () => { test('-P', (done) => { argv(['-P'], () => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.PEER_DEPENDENCIES); + expect(npmAdd.target).toEqual( + addDependencies.CONSTANTS.PEER_DEPENDENCIES + ); expect(npmAdd.result).toEqual({}); expect(npmAdd.overwrite).toEqual(true); expect(npmAdd.packageFilePath).toEqual('./package.json'); expect(npmAdd.dependencies).toEqual([]); - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -90,14 +113,19 @@ describe('test addDependencies()', () => { }); test('--save-peer', (done) => { argv(['--save-peer'], () => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.PEER_DEPENDENCIES); + expect(npmAdd.target).toEqual( + addDependencies.CONSTANTS.PEER_DEPENDENCIES + ); expect(npmAdd.result).toEqual({}); expect(npmAdd.overwrite).toEqual(true); expect(npmAdd.packageFilePath).toEqual('./package.json'); expect(npmAdd.dependencies).toEqual([]); - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -105,14 +133,19 @@ describe('test addDependencies()', () => { }); test('--peer', (done) => { argv(['--peer'], () => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.PEER_DEPENDENCIES); + expect(npmAdd.target).toEqual( + addDependencies.CONSTANTS.PEER_DEPENDENCIES + ); expect(npmAdd.result).toEqual({}); expect(npmAdd.overwrite).toEqual(true); expect(npmAdd.packageFilePath).toEqual('./package.json'); expect(npmAdd.dependencies).toEqual([]); - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -121,14 +154,19 @@ describe('test addDependencies()', () => { test('-O', (done) => { argv(['-O'], () => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES); + expect(npmAdd.target).toEqual( + addDependencies.CONSTANTS.OPTIONAL_DEPENDENCIES + ); expect(npmAdd.result).toEqual({}); expect(npmAdd.overwrite).toEqual(true); expect(npmAdd.packageFilePath).toEqual('./package.json'); expect(npmAdd.dependencies).toEqual([]); - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -136,14 +174,19 @@ describe('test addDependencies()', () => { }); test('--save-optional', (done) => { argv(['--save-optional'], () => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES); + expect(npmAdd.target).toEqual( + addDependencies.CONSTANTS.OPTIONAL_DEPENDENCIES + ); expect(npmAdd.result).toEqual({}); expect(npmAdd.overwrite).toEqual(true); expect(npmAdd.packageFilePath).toEqual('./package.json'); expect(npmAdd.dependencies).toEqual([]); - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -151,14 +194,19 @@ describe('test addDependencies()', () => { }); test('--optional', (done) => { argv(['--optional'], () => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES); + expect(npmAdd.target).toEqual( + addDependencies.CONSTANTS.OPTIONAL_DEPENDENCIES + ); expect(npmAdd.result).toEqual({}); expect(npmAdd.overwrite).toEqual(true); expect(npmAdd.packageFilePath).toEqual('./package.json'); expect(npmAdd.dependencies).toEqual([]); - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -167,14 +215,17 @@ describe('test addDependencies()', () => { test('--no-overwrite', (done) => { argv(['--no-overwrite'], () => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { expect(npmAdd.overwrite).toEqual(false); - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEPENDENCIES); + expect(npmAdd.target).toEqual(addDependencies.CONSTANTS.DEPENDENCIES); expect(npmAdd.result).toEqual({}); expect(npmAdd.packageFilePath).toEqual('./package.json'); expect(npmAdd.dependencies).toEqual([]); - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -183,14 +234,17 @@ describe('test addDependencies()', () => { test('package.json', (done) => { argv(['../../../package.json'], () => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { expect(npmAdd.packageFilePath).toEqual('../../../package.json'); - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEPENDENCIES); + expect(npmAdd.target).toEqual(addDependencies.CONSTANTS.DEPENDENCIES); expect(npmAdd.result).toEqual({}); expect(npmAdd.overwrite).toEqual(true); expect(npmAdd.dependencies).toEqual([]); - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + 'No dependencies passed. Stop.' + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -200,10 +254,10 @@ describe('test addDependencies()', () => { test('some packages', (done) => { const deps = ['jquery', 'semver@^6.3.0', 'npm-run@~5.0.1']; argv(['jquery', 'semver@^6.3.0', 'npm-run@~5.0.1'], () => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.addDependencies().then(() => { expect(npmAdd.dependencies).toEqual(deps); - expect(npmAdd.target).toEqual(ClassForTesting.CONSTANTS.DEPENDENCIES); + expect(npmAdd.target).toEqual(addDependencies.CONSTANTS.DEPENDENCIES); expect(npmAdd.result).toEqual({ jquery: '^3.5.1', 'npm-run': '~5.0.1', @@ -211,7 +265,9 @@ describe('test addDependencies()', () => { }); expect(npmAdd.overwrite).toEqual(true); expect(npmAdd.packageFilePath).toEqual('./package.json'); - expect(console.log).toBeCalledWith(`Adding packages to '${npmAdd.target}'...`); + expect(console.log).toBeCalledWith( + `Adding packages to '${npmAdd.target}'...` + ); done(); }); }); @@ -220,38 +276,47 @@ describe('test addDependencies()', () => { describe('test runNpmShow()', () => { test('no dep', (done) => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.runNpmShow().then(() => { - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', `No Dependency Provided to runNpmShow()`); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + `No Dependency Provided to runNpmShow()` + ); done(); }); }); test('non existent dep', (done) => { const depName = 'dffdsfdsdsfzfsfafdsfdsafdsadfsa'; - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.runNpmShow('dffdsfdsdsfzfsfafdsfdsafdsadfsa').then(() => { - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', - `Could not fetch version info for: ${depName}. Skip.`); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + `Could not fetch version info for: ${depName}. Skip.` + ); done(); }); }); test('non existent dep with version', (done) => { const depName = 'dffdsfdsdsfzfsfafdsfdsafdsadfsa'; - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.runNpmShow(`${depName}@1.2.3`).then(() => { - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', - `Could not fetch version info for: ${depName}. Skip.`); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + `Could not fetch version info for: ${depName}. Skip.` + ); done(); }); }); test('dep no version', (done) => { const depName = 'jquery'; - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.runNpmShow(depName).then(() => { - expect(console.log).toBeCalledWith(expect.stringContaining(`Processed: ${depName}, latest version:`)); + expect(console.log).toBeCalledWith( + expect.stringContaining(`Processed: ${depName}, latest version:`) + ); done(); }); }); @@ -259,16 +324,18 @@ describe('test runNpmShow()', () => { test('dep with @', (done) => { const depName = 'jquery'; const version = '3.5.1'; - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.runNpmShow(`${depName}@3.5.1`).then(() => { - expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: ${version}`); + expect(console.log).toBeCalledWith( + `Processed: ${depName}, specified version: ${version}` + ); done(); }); }); test('dep with @ invalid version', (done) => { const depName = 'jquery'; - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.runNpmShow(`${depName}@1.2.3`).then(() => { expect(console.error).toBeCalledWith( '\x1b[31m%s\x1b[0m', @@ -280,54 +347,66 @@ describe('test runNpmShow()', () => { test('dep with ^', (done) => { const depName = 'jquery'; - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.runNpmShow(`${depName}@^2.0.0`).then(() => { - expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: ^2.0.0`); + expect(console.log).toBeCalledWith( + `Processed: ${depName}, specified version: ^2.0.0` + ); done(); }); }); test('dep with <', (done) => { const depName = 'jquery'; - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.runNpmShow(`${depName}@<2.2.4`).then(() => { - expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: <2.2.4`); + expect(console.log).toBeCalledWith( + `Processed: ${depName}, specified version: <2.2.4` + ); done(); }); }); test('dep with <=', (done) => { const depName = 'jquery'; - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.runNpmShow(`${depName}@<=2.2.4`).then(() => { - expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: <=2.2.4`); + expect(console.log).toBeCalledWith( + `Processed: ${depName}, specified version: <=2.2.4` + ); done(); }); }); test('dep with >', (done) => { const depName = 'jquery'; - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.runNpmShow(`${depName}@>2.2.3`).then(() => { - expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: >2.2.3`); + expect(console.log).toBeCalledWith( + `Processed: ${depName}, specified version: >2.2.3` + ); done(); }); }); test('dep with >=', (done) => { const depName = 'jquery'; - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.runNpmShow(`${depName}@>=2.2.4`).then(() => { - expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: >=2.2.4`); + expect(console.log).toBeCalledWith( + `Processed: ${depName}, specified version: >=2.2.4` + ); done(); }); }); test('dep with ~', (done) => { const depName = 'jquery'; - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.runNpmShow(`${depName}@~2.2.0`).then(() => { - expect(console.log).toBeCalledWith(`Processed: ${depName}, specified version: ~2.2.0`); + expect(console.log).toBeCalledWith( + `Processed: ${depName}, specified version: ~2.2.0` + ); done(); }); }); @@ -340,11 +419,13 @@ describe('test saveToPackage()', () => { // Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)) // ) // ); - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.packageFilePath = 'asdsadasda/package.json'; npmAdd.saveToPackage().then(() => { - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', - `Could not read from ${npmAdd.packageFilePath}. Stop.`); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + `Could not read from ${npmAdd.packageFilePath}. Stop.` + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -353,11 +434,13 @@ describe('test saveToPackage()', () => { test('not json', (done) => { generateRandomFilename().then((fileName) => Files.writeToFile(fileName, 'i am random text').then(() => { - const npmAdd = new ClassForTesting(); + const npmAdd = new addDependencies(); npmAdd.packageFilePath = fileName; npmAdd.saveToPackage().then(() => { - expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', - `Could not parse ${npmAdd.packageFilePath}. Stop.`); + expect(console.error).toBeCalledWith( + '\x1b[31m%s\x1b[0m', + `Could not parse ${npmAdd.packageFilePath}. Stop.` + ); expect(process.exit).toHaveBeenCalledWith(1); done(); }); @@ -372,8 +455,9 @@ describe('test saveToPackage()', () => { defaultPackageJson.devDependencies = {}; defaultPackageJson.optionalDependencies = {}; defaultPackageJson.peerDependencies = {}; - Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)).then(() => { - const npmAdd = new ClassForTesting(); + Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)).then( + () => { + const npmAdd = new addDependencies(); npmAdd.packageFilePath = fileName; npmAdd.result['jest'] = '26.0.0'; const expectedJsonOverrides = { @@ -385,14 +469,18 @@ describe('test saveToPackage()', () => { Files.readFromFile(fileName).then((jsonResult) => { const expectedJson = { ...defaultPackageJson, - ...expectedJsonOverrides + ...expectedJsonOverrides, }; expect(JSON.parse(jsonResult)).toEqual(expectedJson); - expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); + expect(console.log).toBeCalledWith( + '\x1b[32m%s\x1b[0m', + 'Done.' + ); done(); }) ); - }); + } + ); }) ); }); @@ -400,8 +488,9 @@ describe('test saveToPackage()', () => { test('json with packages and overwrite', (done) => { generateRandomFilename().then((fileName) => generateDefaultPackageJson().then((defaultPackageJson) => { - Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)).then(() => { - const npmAdd = new ClassForTesting(); + Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)).then( + () => { + const npmAdd = new addDependencies(); npmAdd.packageFilePath = fileName; npmAdd.result['jest'] = '26.0.1'; const expectedJsonOverrides = { @@ -413,14 +502,18 @@ describe('test saveToPackage()', () => { Files.readFromFile(fileName).then((jsonResult) => { const expectedJson = { ...defaultPackageJson, - ...expectedJsonOverrides + ...expectedJsonOverrides, }; expect(JSON.parse(jsonResult)).toEqual(expectedJson); - expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); + expect(console.log).toBeCalledWith( + '\x1b[32m%s\x1b[0m', + 'Done.' + ); done(); }) ); - }); + } + ); }) ); }); @@ -428,19 +521,24 @@ describe('test saveToPackage()', () => { test('json with packages no overwrite', (done) => { generateRandomFilename().then((fileName) => generateDefaultPackageJson().then((defaultPackageJson) => { - Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)).then(() => { - const npmAdd = new ClassForTesting(); + Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)).then( + () => { + const npmAdd = new addDependencies(); npmAdd.packageFilePath = fileName; npmAdd.overwrite = false; npmAdd.result['jest'] = '26.0.1'; npmAdd.saveToPackage().then(() => Files.readFromFile(fileName).then((jsonResult) => { expect(JSON.parse(jsonResult)).toEqual(defaultPackageJson); - expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); + expect(console.log).toBeCalledWith( + '\x1b[32m%s\x1b[0m', + 'Done.' + ); done(); }) ); - }); + } + ); }) ); }); @@ -448,18 +546,24 @@ describe('test saveToPackage()', () => { describe('test CONSTANTS()', () => { test('dependencies', () => { - expect(ClassForTesting.CONSTANTS.DEPENDENCIES).toEqual('dependencies'); + expect(addDependencies.CONSTANTS.DEPENDENCIES).toEqual('dependencies'); }); test('devDependencies', () => { - expect(ClassForTesting.CONSTANTS.DEV_DEPENDENCIES).toEqual('devDependencies'); + expect(addDependencies.CONSTANTS.DEV_DEPENDENCIES).toEqual( + 'devDependencies' + ); }); test('peerDependencies', () => { - expect(ClassForTesting.CONSTANTS.PEER_DEPENDENCIES).toEqual('peerDependencies'); + expect(addDependencies.CONSTANTS.PEER_DEPENDENCIES).toEqual( + 'peerDependencies' + ); }); test('optionalDependencies', () => { - expect(ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES).toEqual('optionalDependencies'); + expect(addDependencies.CONSTANTS.OPTIONAL_DEPENDENCIES).toEqual( + 'optionalDependencies' + ); }); }); diff --git a/tests/__tests__/lib/Files.js b/tests/__tests__/lib/Files.js index 1aefab5..22cbaf9 100644 --- a/tests/__tests__/lib/Files.js +++ b/tests/__tests__/lib/Files.js @@ -61,7 +61,10 @@ describe('writeToFile() Tests', () => { }); test('throw when folder doesnt exist', async (done) => { - Files.writeToFile(path.resolve('some', 'random', 'folder.txt'), 'something else') + Files.writeToFile( + path.resolve('some', 'random', 'folder.txt'), + 'something else' + ) .then(() => {}) .catch((e) => { expect(e.code).toEqual('ENOENT'); diff --git a/tests/config/jest.global.setup.js b/tests/config/jest.global.setup.js index bdca9c4..5d3acce 100644 --- a/tests/config/jest.global.setup.js +++ b/tests/config/jest.global.setup.js @@ -1,5 +1,7 @@ const fs = require('fs'); -const { TEST_JSON_DIR } = require('../jest.config'); +const { + TEST_JSON_DIR +} = require('../jest.config'); module.exports = () => { fs.mkdirSync(TEST_JSON_DIR); }; diff --git a/tests/config/jest.global.teardown.js b/tests/config/jest.global.teardown.js index b27463f..3c32d6d 100644 --- a/tests/config/jest.global.teardown.js +++ b/tests/config/jest.global.teardown.js @@ -1,9 +1,15 @@ const fs = require('fs'); const path = require('path'); -const { TEST_JSON_DIR } = require('../jest.config'); +const { + TEST_JSON_DIR +} = require('../jest.config'); module.exports = async () => { fs.readdir(TEST_JSON_DIR, (_, files) => - files.forEach((file) => fs.unlink(path.resolve(TEST_JSON_DIR, file), () => fs.rmdir(TEST_JSON_DIR, () => {}))) + files.forEach((file) => + fs.unlink(path.resolve(TEST_JSON_DIR, file), () => + fs.rmdir(TEST_JSON_DIR, () => {}) + ) + ) ); }; From ac8ea00f80bc017d09804a05bf2e2d649b4ed0ec Mon Sep 17 00:00:00 2001 From: Phyzical Date: Mon, 26 Oct 2020 22:21:49 +0800 Subject: [PATCH 41/49] Trying-To-Support-non-cli: changed to es6 exports, more linting --- babel.config.js | 12 ++++ cli-index.js | 2 +- index.js | 4 +- lib/AddDependencies.js | 11 ++-- package.json | 4 +- tests/__mocks__/utils.js | 21 ++++--- tests/__tests__/cli-index.js | 16 ++--- tests/__tests__/index.js | 2 +- tests/__tests__/lib/AddDependencies.js | 84 +++++++++++++------------- tests/__tests__/lib/Files.js | 2 +- tests/config/jest.global.setup.js | 2 +- tests/config/jest.global.teardown.js | 2 +- 12 files changed, 91 insertions(+), 71 deletions(-) create mode 100644 babel.config.js diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..f037a1a --- /dev/null +++ b/babel.config.js @@ -0,0 +1,12 @@ +module.exports = { + presets: [ + [ + '@babel/preset-env', + { + targets: { + node: 'current', + }, + }, + ], + ], +}; diff --git a/cli-index.js b/cli-index.js index 7dfd00a..0b0ad38 100755 --- a/cli-index.js +++ b/cli-index.js @@ -1,6 +1,6 @@ #!/usr/bin/env node -const AddDependencies = require('./lib/AddDependencies'); +import AddDependencies from './lib/AddDependencies'; console.log( '\x1b[33m%s\x1b[0m', diff --git a/index.js b/index.js index 5a848c4..f155d58 100755 --- a/index.js +++ b/index.js @@ -1,3 +1,5 @@ #!/usr/bin/env node -module.exports = require('./lib/AddDependencies'); +import AddDependencies from './lib/AddDependencies'; + +export default AddDependencies; diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index 4bf792f..9351da8 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -2,8 +2,13 @@ const npmRun = require('npm-run'); const semver = require('semver'); const Files = require('./Files'); -class AddDependencies { - constructor(dependencies = [], target = 'dependencies', overwrite = true, packageFilePath = './package.json') { +export default class AddDependencies { + constructor( + dependencies = [], + target = 'dependencies', + overwrite = true, + packageFilePath = './package.json' + ) { this.result = {}; this.dependencies = dependencies; this.target = target; @@ -219,5 +224,3 @@ class AddDependencies { }; } } - -module.exports = AddDependencies; diff --git a/package.json b/package.json index 95cb63d..563f5ee 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,10 @@ "jest": "^26.0.1", "eslint": "^7.3.0", "babel-eslint": "^10.1.0", + "@babel/core": "^7.12.3", + "@babel/preset-env": "^7.12.1", "eslint-config-prettier": "^3.3.0", "eslint-plugin-prettier": "^3.0.0", "prettier": "^2.0.5" } -} +} \ No newline at end of file diff --git a/tests/__mocks__/utils.js b/tests/__mocks__/utils.js index ccdc40d..7e39b38 100644 --- a/tests/__mocks__/utils.js +++ b/tests/__mocks__/utils.js @@ -2,7 +2,7 @@ const path = require('path'); const Files = require('../../lib/Files'); const argv = require('mock-argv'); const { - TEST_JSON_DIR + TEST_JSON_DIR, // } = require('../jest.config'); const md5 = require('blueimp-md5'); @@ -130,15 +130,16 @@ const runAndVerifyWithFailures = async ( expect(classForTesting).not.toEqual(testExpectObject); generateDefaultPackageJson().then((defaultPackageJson) => Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then( - () => - classForTesting.run().then(() => - Files.readFromFile(packageJson).then((expectedJson) => { - expect(JSON.parse(expectedJson)).not.toEqual(defaultPackageJson); - // expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); - // expect(process.exit).toHaveBeenCalledWith(1); - done(); - }) - ) + () => { + classForTesting.run().then(() => + Files.readFromFile(packageJson).then((expectedJson) => { + expect(JSON.parse(expectedJson)).not.toEqual(defaultPackageJson); + // expect(console.error).toBeCalledWith('\x1b[31m%s\x1b[0m', 'No dependencies passed. Stop.'); + // expect(process.exit).toHaveBeenCalledWith(1); + done(); + }) + ); + } ) ); }; diff --git a/tests/__tests__/cli-index.js b/tests/__tests__/cli-index.js index ea86418..31e69cf 100644 --- a/tests/__tests__/cli-index.js +++ b/tests/__tests__/cli-index.js @@ -1,10 +1,10 @@ const argv = require('mock-argv'); -const addDependenciesNonCli = require('../../index'); +import addDependenciesNonCli from '../../index'; const { cliRunAndVerifyWithFailures, cliRunAndVerify, generateRandomFilename, - defaultExpect, + // defaultExpect, } = require('../__mocks__/utils'); describe('cli run()', () => { @@ -25,7 +25,7 @@ describe('cli run()', () => { addDependenciesNonCli.CONSTANTS.DEPENDENCIES, 'jest@26.0.1' ); - done(); + done(); } ); }); @@ -44,11 +44,11 @@ describe('cli run()', () => { }); test('run() with dependencies with override', async (done) => { - const expectedJsonOverrides = { - dependencies: { - jest: '26.0.1', - }, - }; + // const expectedJsonOverrides = { + // dependencies: { + // jest: '26.0.1', + // }, + // }; generateRandomFilename().then((packageJson) => argv([packageJson, 'jest@26.0.1'], () => { expect(process.argv).toContain(packageJson); diff --git a/tests/__tests__/index.js b/tests/__tests__/index.js index d4a519a..3a4f3ce 100644 --- a/tests/__tests__/index.js +++ b/tests/__tests__/index.js @@ -1,4 +1,4 @@ -const ClassForTesting = require('../../index'); +import addDependencies from '../../index'; const { runAndVerifyWithFailures, runAndVerify, diff --git a/tests/__tests__/lib/AddDependencies.js b/tests/__tests__/lib/AddDependencies.js index c47736c..bd1f875 100644 --- a/tests/__tests__/lib/AddDependencies.js +++ b/tests/__tests__/lib/AddDependencies.js @@ -1,5 +1,5 @@ const argv = require('mock-argv'); -const ClassForTesting = require('../../../index'); +import addDependencies from '../../../index'; const { generateRandomFilename, generateDefaultPackageJson, @@ -458,27 +458,27 @@ describe('test saveToPackage()', () => { Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)).then( () => { const npmAdd = new addDependencies(); - npmAdd.packageFilePath = fileName; - npmAdd.result['jest'] = '26.0.0'; - const expectedJsonOverrides = { - dependencies: { - jest: '26.0.0', - }, - }; - npmAdd.saveToPackage().then(() => - Files.readFromFile(fileName).then((jsonResult) => { - const expectedJson = { - ...defaultPackageJson, + npmAdd.packageFilePath = fileName; + npmAdd.result['jest'] = '26.0.0'; + const expectedJsonOverrides = { + dependencies: { + jest: '26.0.0', + }, + }; + npmAdd.saveToPackage().then(() => + Files.readFromFile(fileName).then((jsonResult) => { + const expectedJson = { + ...defaultPackageJson, ...expectedJsonOverrides, - }; - expect(JSON.parse(jsonResult)).toEqual(expectedJson); + }; + expect(JSON.parse(jsonResult)).toEqual(expectedJson); expect(console.log).toBeCalledWith( '\x1b[32m%s\x1b[0m', 'Done.' ); - done(); - }) - ); + done(); + }) + ); } ); }) @@ -491,27 +491,27 @@ describe('test saveToPackage()', () => { Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)).then( () => { const npmAdd = new addDependencies(); - npmAdd.packageFilePath = fileName; - npmAdd.result['jest'] = '26.0.1'; - const expectedJsonOverrides = { - dependencies: { - jest: '26.0.1', - }, - }; - npmAdd.saveToPackage().then(() => - Files.readFromFile(fileName).then((jsonResult) => { - const expectedJson = { - ...defaultPackageJson, + npmAdd.packageFilePath = fileName; + npmAdd.result['jest'] = '26.0.1'; + const expectedJsonOverrides = { + dependencies: { + jest: '26.0.1', + }, + }; + npmAdd.saveToPackage().then(() => + Files.readFromFile(fileName).then((jsonResult) => { + const expectedJson = { + ...defaultPackageJson, ...expectedJsonOverrides, - }; - expect(JSON.parse(jsonResult)).toEqual(expectedJson); + }; + expect(JSON.parse(jsonResult)).toEqual(expectedJson); expect(console.log).toBeCalledWith( '\x1b[32m%s\x1b[0m', 'Done.' ); - done(); - }) - ); + done(); + }) + ); } ); }) @@ -524,19 +524,19 @@ describe('test saveToPackage()', () => { Files.writeToFile(fileName, JSON.stringify(defaultPackageJson)).then( () => { const npmAdd = new addDependencies(); - npmAdd.packageFilePath = fileName; - npmAdd.overwrite = false; - npmAdd.result['jest'] = '26.0.1'; - npmAdd.saveToPackage().then(() => - Files.readFromFile(fileName).then((jsonResult) => { - expect(JSON.parse(jsonResult)).toEqual(defaultPackageJson); + npmAdd.packageFilePath = fileName; + npmAdd.overwrite = false; + npmAdd.result['jest'] = '26.0.1'; + npmAdd.saveToPackage().then(() => + Files.readFromFile(fileName).then((jsonResult) => { + expect(JSON.parse(jsonResult)).toEqual(defaultPackageJson); expect(console.log).toBeCalledWith( '\x1b[32m%s\x1b[0m', 'Done.' ); - done(); - }) - ); + done(); + }) + ); } ); }) diff --git a/tests/__tests__/lib/Files.js b/tests/__tests__/lib/Files.js index 22cbaf9..3fd6c54 100644 --- a/tests/__tests__/lib/Files.js +++ b/tests/__tests__/lib/Files.js @@ -2,7 +2,7 @@ const Files = require('../../../lib/Files'); const fs = require('fs'); const path = require('path'); const { - generateRandomFilename + generateRandomFilename, // } = require('../../__mocks__/utils'); describe('readFromFile() Tests', () => { diff --git a/tests/config/jest.global.setup.js b/tests/config/jest.global.setup.js index 5d3acce..5ed0214 100644 --- a/tests/config/jest.global.setup.js +++ b/tests/config/jest.global.setup.js @@ -1,6 +1,6 @@ const fs = require('fs'); const { - TEST_JSON_DIR + TEST_JSON_DIR, // } = require('../jest.config'); module.exports = () => { fs.mkdirSync(TEST_JSON_DIR); diff --git a/tests/config/jest.global.teardown.js b/tests/config/jest.global.teardown.js index 3c32d6d..1c1fb10 100644 --- a/tests/config/jest.global.teardown.js +++ b/tests/config/jest.global.teardown.js @@ -1,7 +1,7 @@ const fs = require('fs'); const path = require('path'); const { - TEST_JSON_DIR + TEST_JSON_DIR, // } = require('../jest.config'); module.exports = async () => { From 8093f27c89810a5872976ce5b45f3a0e4e151965 Mon Sep 17 00:00:00 2001 From: Jack Date: Tue, 27 Oct 2020 16:36:08 +0800 Subject: [PATCH 42/49] Update README.md fix to readme for new export --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4831d04..63cdffe 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ $ npx add-dependencies /home/user/project/package.json moment@2.0.0 react@16.8 r or via nodejs ```js -const npmAdd = require('add-dependencies'); +import npmAdd from 'add-dependencies'; const dependencies = [ 'package1', 'package2', @@ -62,4 +62,4 @@ const packageFilePath = 'package.json'; new npmAdd(dependencies, target, overwrite, packageFilePath) .run() .then(() => console.log('completed')); -``` \ No newline at end of file +``` From cdeb6a489c405bbc7cd7740b309a6ca1c705c617 Mon Sep 17 00:00:00 2001 From: Phyzical Date: Tue, 27 Oct 2020 21:07:54 +0800 Subject: [PATCH 43/49] Trying-To-Support-non-cli: rollback the export change --- babel.config.js | 12 ------------ cli-index.js | 2 +- index.js | 4 +--- index.mjs | 5 +++++ lib/AddDependencies.js | 4 ++-- package.json | 2 -- tests/__tests__/cli-index.js | 16 +++++++++------- tests/__tests__/index.js | 2 +- tests/__tests__/lib/AddDependencies.js | 2 +- 9 files changed, 20 insertions(+), 29 deletions(-) delete mode 100644 babel.config.js create mode 100755 index.mjs diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index f037a1a..0000000 --- a/babel.config.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - presets: [ - [ - '@babel/preset-env', - { - targets: { - node: 'current', - }, - }, - ], - ], -}; diff --git a/cli-index.js b/cli-index.js index 0b0ad38..7dfd00a 100755 --- a/cli-index.js +++ b/cli-index.js @@ -1,6 +1,6 @@ #!/usr/bin/env node -import AddDependencies from './lib/AddDependencies'; +const AddDependencies = require('./lib/AddDependencies'); console.log( '\x1b[33m%s\x1b[0m', diff --git a/index.js b/index.js index f155d58..5a848c4 100755 --- a/index.js +++ b/index.js @@ -1,5 +1,3 @@ #!/usr/bin/env node -import AddDependencies from './lib/AddDependencies'; - -export default AddDependencies; +module.exports = require('./lib/AddDependencies'); diff --git a/index.mjs b/index.mjs new file mode 100755 index 0000000..5251d57 --- /dev/null +++ b/index.mjs @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import AddDependencies from './lib/AddDependencies.js'; + +export default AddDependencies; diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index 9351da8..1d2ff57 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -2,7 +2,7 @@ const npmRun = require('npm-run'); const semver = require('semver'); const Files = require('./Files'); -export default class AddDependencies { +module.exports = class AddDependencies { constructor( dependencies = [], target = 'dependencies', @@ -223,4 +223,4 @@ export default class AddDependencies { OPTIONAL_DEPENDENCIES: 'optionalDependencies', }; } -} +}; diff --git a/package.json b/package.json index 563f5ee..229751b 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,6 @@ "jest": "^26.0.1", "eslint": "^7.3.0", "babel-eslint": "^10.1.0", - "@babel/core": "^7.12.3", - "@babel/preset-env": "^7.12.1", "eslint-config-prettier": "^3.3.0", "eslint-plugin-prettier": "^3.0.0", "prettier": "^2.0.5" diff --git a/tests/__tests__/cli-index.js b/tests/__tests__/cli-index.js index 31e69cf..d766e1e 100644 --- a/tests/__tests__/cli-index.js +++ b/tests/__tests__/cli-index.js @@ -1,5 +1,5 @@ const argv = require('mock-argv'); -import addDependenciesNonCli from '../../index'; +const addDependenciesNonCli = require('../../index'); const { cliRunAndVerifyWithFailures, cliRunAndVerify, @@ -44,18 +44,20 @@ describe('cli run()', () => { }); test('run() with dependencies with override', async (done) => { - // const expectedJsonOverrides = { - // dependencies: { - // jest: '26.0.1', - // }, - // }; + const expectedJsonOverrides = { + dependencies: { + jest: '26.0.1', + }, + }; generateRandomFilename().then((packageJson) => argv([packageJson, 'jest@26.0.1'], () => { expect(process.argv).toContain(packageJson); expect(process.argv).toContain('jest@26.0.1'); done(); // todo there is a race condition occurring when we call "require" to when expect fires - // cliRunAndVerify(done, packageJson, expectedJsonOverrides).then(); + // cliRunAndVerify(done, packageJson, expectedJsonOverrides).then(() => { + // done(); + // }); }) ); }); diff --git a/tests/__tests__/index.js b/tests/__tests__/index.js index 3a4f3ce..2b46535 100644 --- a/tests/__tests__/index.js +++ b/tests/__tests__/index.js @@ -1,4 +1,4 @@ -import addDependencies from '../../index'; +const addDependencies = require('../../index'); const { runAndVerifyWithFailures, runAndVerify, diff --git a/tests/__tests__/lib/AddDependencies.js b/tests/__tests__/lib/AddDependencies.js index bd1f875..2563df4 100644 --- a/tests/__tests__/lib/AddDependencies.js +++ b/tests/__tests__/lib/AddDependencies.js @@ -1,5 +1,5 @@ const argv = require('mock-argv'); -import addDependencies from '../../../index'; +const addDependencies = require('../../../index'); const { generateRandomFilename, generateDefaultPackageJson, From 9071cd4a279db32e08fcb11a2ec049ae83d8ecc4 Mon Sep 17 00:00:00 2001 From: Phyzical Date: Tue, 27 Oct 2020 21:25:28 +0800 Subject: [PATCH 44/49] Trying-To-Support-non-cli: add readme fix --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 63cdffe..1891da5 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,11 @@ $ npx add-dependencies /home/user/project/package.json moment@2.0.0 react@16.8 r or via nodejs ```js +const npmAdd = require('add-dependencies'); +//OR +// Note: to use import you must have `"type": "module"` in your projects package.json import npmAdd from 'add-dependencies'; + const dependencies = [ 'package1', 'package2', From 6b456068df2165efd8202c20464bb5b3d827ac9e Mon Sep 17 00:00:00 2001 From: Phyzical Date: Tue, 27 Oct 2020 21:52:35 +0800 Subject: [PATCH 45/49] Trying-To-Support-non-cli: adding inital typescript funtionailty --- PULL_REQUEST_TEMPLATE.md | 5 +++++ package.json | 6 ++++-- tsconfig.json | 19 +++++++++++++++++++ typings/AddDependencies.d.ts | 19 +++++++++++++++++++ typings/Files.d.ts | 5 +++++ 5 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 tsconfig.json create mode 100644 typings/AddDependencies.d.ts create mode 100644 typings/Files.d.ts diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index 4030f6f..cf95a23 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -5,3 +5,8 @@ Fixes # - - - + +## Checklist +make sure you have run the following before requesting a review +* npm run lint +* npm run typescript diff --git a/package.json b/package.json index 229751b..aee17c1 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "homepage": "https://github.com/arfeo/npm-add-dependencies#readme", "scripts": { "test": "jest --config ./tests/jest.config.js", - "lint": "eslint --fix --ext js lib/**.js index.js cli-index.js" + "lint": "eslint --fix --ext js lib/**.js index.js cli-index.js", + "typescript": "tsc" }, "keywords": [ "dependencies", @@ -36,8 +37,9 @@ "jest": "^26.0.1", "eslint": "^7.3.0", "babel-eslint": "^10.1.0", + "typescript": "^4.0.5", "eslint-config-prettier": "^3.3.0", "eslint-plugin-prettier": "^3.0.0", "prettier": "^2.0.5" } -} \ No newline at end of file +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e38e411 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + // Change this to match your project + "include": ["lib/**/*"], + + "compilerOptions": { + // Tells TypeScript to read JS files, as + // normally they are ignored as source files + "allowJs": true, + // Generate d.ts files + "declaration": true, + // This compiler run should + // only output d.ts files + "emitDeclarationOnly": true, + // Types should go into this directory. + // Removing this would place the .d.ts files + // next to the .js files + "outDir": "typings", + }, +} diff --git a/typings/AddDependencies.d.ts b/typings/AddDependencies.d.ts new file mode 100644 index 0000000..d286eda --- /dev/null +++ b/typings/AddDependencies.d.ts @@ -0,0 +1,19 @@ +export = AddDependencies; +declare class AddDependencies { + static get CONSTANTS(): { + DEPENDENCIES: string; + DEV_DEPENDENCIES: string; + PEER_DEPENDENCIES: string; + OPTIONAL_DEPENDENCIES: string; + }; + constructor(dependencies?: any[], target?: string, overwrite?: boolean, packageFilePath?: string); + result: {}; + dependencies: any[]; + target: string; + overwrite: boolean; + packageFilePath: string; + addDependencies(): Promise; + run(): Promise; + runNpmShow(dep: any): Promise; + saveToPackage(): Promise; +} diff --git a/typings/Files.d.ts b/typings/Files.d.ts new file mode 100644 index 0000000..1f48753 --- /dev/null +++ b/typings/Files.d.ts @@ -0,0 +1,5 @@ +export = Files; +declare class Files { + static readFromFile(filePath: any): Promise; + static writeToFile(filePath: any, fileContent: any): Promise; +} From 5964cd9a49ca641c83a19b64232a50a7e32c10d0 Mon Sep 17 00:00:00 2001 From: Phyzical Date: Wed, 28 Oct 2020 21:20:49 +0800 Subject: [PATCH 46/49] Trying-To-Support-non-cli: updated the typescripting to support index --- tsconfig.json | 2 +- typings/index.d.ts | 11 +++++++++++ typings/{ => lib}/AddDependencies.d.ts | 0 typings/{ => lib}/Files.d.ts | 0 4 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 typings/index.d.ts rename typings/{ => lib}/AddDependencies.d.ts (100%) rename typings/{ => lib}/Files.d.ts (100%) diff --git a/tsconfig.json b/tsconfig.json index e38e411..59dddb7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { // Change this to match your project - "include": ["lib/**/*"], + "include": ["lib/**/*", "index.js"], "compilerOptions": { // Tells TypeScript to read JS files, as diff --git a/typings/index.d.ts b/typings/index.d.ts new file mode 100644 index 0000000..502a0a8 --- /dev/null +++ b/typings/index.d.ts @@ -0,0 +1,11 @@ +#!/usr/bin/env node +declare const _exports: { + new (dependencies?: any[], target?: string, overwrite?: boolean, packageFilePath?: string): import("./lib/AddDependencies"); + readonly CONSTANTS: { + DEPENDENCIES: string; + DEV_DEPENDENCIES: string; + PEER_DEPENDENCIES: string; + OPTIONAL_DEPENDENCIES: string; + }; +}; +export = _exports; diff --git a/typings/AddDependencies.d.ts b/typings/lib/AddDependencies.d.ts similarity index 100% rename from typings/AddDependencies.d.ts rename to typings/lib/AddDependencies.d.ts diff --git a/typings/Files.d.ts b/typings/lib/Files.d.ts similarity index 100% rename from typings/Files.d.ts rename to typings/lib/Files.d.ts From 829032c9d8e3397ccb458f20b7350a7e205037d4 Mon Sep 17 00:00:00 2001 From: Phyzical Date: Fri, 30 Oct 2020 15:23:53 +0800 Subject: [PATCH 47/49] Trying-To-Support-non-cli: added logic to mimic a cli usage added logic to fix test package.json file names --- package.json | 6 +++-- tests/__mocks__/cmd.js | 31 +++++++++++++++++++++ tests/__mocks__/utils.js | 58 ++++++++++++---------------------------- 3 files changed, 52 insertions(+), 43 deletions(-) create mode 100644 tests/__mocks__/cmd.js diff --git a/package.json b/package.json index aee17c1..4117d37 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,8 @@ "typescript": "^4.0.5", "eslint-config-prettier": "^3.3.0", "eslint-plugin-prettier": "^3.0.0", - "prettier": "^2.0.5" + "prettier": "^2.0.5", + "concat-stream": "^2.0.0", + "child_process": "^1.0.2" } -} +} \ No newline at end of file diff --git a/tests/__mocks__/cmd.js b/tests/__mocks__/cmd.js new file mode 100644 index 0000000..70ff292 --- /dev/null +++ b/tests/__mocks__/cmd.js @@ -0,0 +1,31 @@ +const concat = require('concat-stream'); +const spawn = require('child_process').spawn; + +function createProcess(processPath, args = []) { + args = [processPath].concat(args); + return spawn('node', args, { + env: Object.assign({ + NODE_ENV: 'test', + }), + }); +} + +function execute(processPath, args = []) { + const childProcess = createProcess(processPath, args); + childProcess.stdin.setEncoding('utf-8'); + const promise = new Promise((resolve, reject) => { + childProcess.stderr.once('data', (err) => { + reject(err.toString()); + }); + childProcess.on('error', reject); + childProcess.stdout.pipe( + concat((result) => { + resolve(result.toString()); + }) + ); + }); + return promise; +} +module.exports = { + execute, // +}; diff --git a/tests/__mocks__/utils.js b/tests/__mocks__/utils.js index 7e39b38..f46442a 100644 --- a/tests/__mocks__/utils.js +++ b/tests/__mocks__/utils.js @@ -1,10 +1,10 @@ const path = require('path'); const Files = require('../../lib/Files'); -const argv = require('mock-argv'); const { TEST_JSON_DIR, // } = require('../jest.config'); const md5 = require('blueimp-md5'); +const cmd = require('./cmd'); // no params const defaultExpect = { @@ -39,6 +39,7 @@ const generateDefaultPackageJson = () => { const cliRunAndVerify = async ( done, packageJsonFilename, + args, expectedJsonOverrides ) => { generateDefaultPackageJson().then((defaultPackageJson) => { @@ -46,19 +47,20 @@ const cliRunAndVerify = async ( packageJsonFilename, JSON.stringify(defaultPackageJson) ).then(() => { - require('../../cli-index'); - Files.readFromFile(packageJsonFilename).then((jsonResult) => { - const expectedJson = { - ...defaultPackageJson, - ...expectedJsonOverrides, - }; - try { - expect(JSON.parse(jsonResult)).toEqual(expectedJson); - expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); - done(); - } catch (e) { - done(e); - } + cmd.execute('cli-index.js', args).then(() => { + Files.readFromFile(packageJsonFilename).then((jsonResult) => { + const expectedJson = { + ...defaultPackageJson, + ...expectedJsonOverrides, + }; + try { + expect(JSON.parse(jsonResult)).toEqual(expectedJson); + // expect(console.log).toBeCalledWith('\x1b[32m%s\x1b[0m', 'Done.'); + done(); + } catch (e) { + done(e); + } + }); }); }); }); @@ -96,31 +98,6 @@ const runAndVerify = async ( ); }; -const cliRunAndVerifyWithFailures = async (done, inputsString) => { - generateRandomFilename().then((packageJson) => { - argv([inputsString, packageJson], () => { - generateDefaultPackageJson().then((defaultPackageJson) => { - Files.writeToFile(packageJson, JSON.stringify(defaultPackageJson)).then( - () => { - require('../../cli-index'); - try { - // add test to test log - expect(console.error).toBeCalledWith( - '\x1b[31m%s\x1b[0m', - 'No dependencies passed. Stop.' - ); - expect(process.exit).toHaveBeenCalledWith(1); - done(); - } catch (e) { - done(e); - } - } - ); - }); - }); - }); -}; - const runAndVerifyWithFailures = async ( done, classForTesting, @@ -145,7 +122,7 @@ const runAndVerifyWithFailures = async ( }; const generateRandomFilename = async () => - path.resolve(TEST_JSON_DIR, md5(Math.random().toString())); + path.resolve(TEST_JSON_DIR, `${md5(Math.random().toString())}package.json`); module.exports = { defaultExpect, @@ -153,6 +130,5 @@ module.exports = { runAndVerifyWithFailures, generateRandomFilename, generateDefaultPackageJson, - cliRunAndVerifyWithFailures, cliRunAndVerify, }; From 064b7a7c4477ff023519d9ab502920ea9641401c Mon Sep 17 00:00:00 2001 From: Phyzical Date: Fri, 30 Oct 2020 15:24:19 +0800 Subject: [PATCH 48/49] Trying-To-Support-non-cli: fixed a bug in the regex tester not working in cli context --- lib/AddDependencies.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/AddDependencies.js b/lib/AddDependencies.js index 1d2ff57..ae4dad1 100644 --- a/lib/AddDependencies.js +++ b/lib/AddDependencies.js @@ -43,7 +43,7 @@ module.exports = class AddDependencies { break; } default: { - if (/package\.json/.test(val)) { + if (val.includes('package.json')) { this.packageFilePath = val; } else if (!/^-/.test(val)) { this.dependencies.push(val); From 379dfd6d3a2b18acd9d06c40f45355af0199618a Mon Sep 17 00:00:00 2001 From: Phyzical Date: Fri, 30 Oct 2020 15:24:35 +0800 Subject: [PATCH 49/49] Trying-To-Support-non-cli: finished cli context tests --- tests/__tests__/cli-index.js | 203 ++++++++--------------------------- 1 file changed, 45 insertions(+), 158 deletions(-) diff --git a/tests/__tests__/cli-index.js b/tests/__tests__/cli-index.js index d766e1e..b9e53b8 100644 --- a/tests/__tests__/cli-index.js +++ b/tests/__tests__/cli-index.js @@ -1,175 +1,62 @@ -const argv = require('mock-argv'); -const addDependenciesNonCli = require('../../index'); const { - cliRunAndVerifyWithFailures, cliRunAndVerify, generateRandomFilename, - // defaultExpect, } = require('../__mocks__/utils'); -describe('cli run()', () => { - test('Hmm its just too hard to test cli context run, lets assume its good with sub tests', () => { - expect(true).toBeTruthy(); +describe('cli tests', () => { + test('with dependencies with override', async (done) => { + const expectedJsonOverrides = { + dependencies: { + jest: '26.0.1', + }, + }; + generateRandomFilename().then((packageJson) => { + const args = [packageJson, 'jest@26.0.1']; + cliRunAndVerify(done, packageJson, args, expectedJsonOverrides); + }); }); - test('test argv mock', (done) => { - argv( - [ - '../package.json', - addDependenciesNonCli.CONSTANTS.DEPENDENCIES, - 'jest@26.0.1', - ], - () => { - expect(process.argv).toContain( - '../package.json', - addDependenciesNonCli.CONSTANTS.DEPENDENCIES, - 'jest@26.0.1' - ); - done(); - } - ); + test('with no overwrite', async (done) => { + generateRandomFilename().then((packageJson) => { + const expectedJsonOverrides = {}; + const args = [packageJson, 'jest@26.0.1', '--no-overwrite']; + cliRunAndVerify(done, packageJson, args, expectedJsonOverrides); + }); }); - test('cli fail to make sure tests themselves work', async (done) => { - cliRunAndVerifyWithFailures(done, 'dependencies').then(); + test('with dev dependencies overwrite with caret', async (done) => { + generateRandomFilename().then((packageJson) => { + const expectedJsonOverrides = { + devDependencies: { + jest: '^26.0.1', + }, + }; + const args = [packageJson, 'jest@^26.0.1', '--dev']; + cliRunAndVerify(done, packageJson, args, expectedJsonOverrides); + }); }); - test('cli with defaults', async (done) => { + test('with optional dependencies overwrite lower', async (done) => { generateRandomFilename().then((packageJson) => { - argv([packageJson], () => { - expect(true).toBeTruthy(); - cliRunAndVerify(done, packageJson).then(); - }); + const expectedJsonOverrides = { + optionalDependencies: { + jest: '25.0.0', + }, + }; + const args = [packageJson, 'jest@25.0.0', '--optional']; + cliRunAndVerify(done, packageJson, args, expectedJsonOverrides); }); }); - test('run() with dependencies with override', async (done) => { - const expectedJsonOverrides = { - dependencies: { - jest: '26.0.1', - }, - }; - generateRandomFilename().then((packageJson) => - argv([packageJson, 'jest@26.0.1'], () => { - expect(process.argv).toContain(packageJson); - expect(process.argv).toContain('jest@26.0.1'); - done(); - // todo there is a race condition occurring when we call "require" to when expect fires - // cliRunAndVerify(done, packageJson, expectedJsonOverrides).then(() => { - // done(); - // }); - }) - ); + test('with peer dependencies overwrite', async (done) => { + generateRandomFilename().then((packageJson) => { + const expectedJsonOverrides = { + peerDependencies: { + jest: '26.0.1', + }, + }; + const args = [packageJson, 'jest@26.0.1', '--peer']; + cliRunAndVerify(done, packageJson, args, expectedJsonOverrides); + }); }); - // - // test('run() with no overwrite', async (done) => { - // generateRandomFilename().then((packageJson) => { - // const dependencies = ['jest@26.0.1']; - // - // const classForTesting = new ClassForTesting( - // dependencies, - // ClassForTesting.CONSTANTS.DEPENDENCIES, - // false, - // packageJson - // ); - // const testExpectObject = { - // ...defaultExpect, - // dependencies: dependencies, - // packageFilePath: packageJson, - // overwrite: false, - // }; - // const expectedJsonOverrides = {}; - // runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); - // }); - // }); - // - // test('run() with package path', async (done) => { - // generateRandomFilename().then((packageJson) => { - // const classForTesting = new ClassForTesting( - // ['jest@26.0.0'], - // ClassForTesting.CONSTANTS.DEPENDENCIES, - // true, - // packageJson - // ); - // const testExpectObject = { - // ...defaultExpect, - // packageFilePath: packageJson, - // }; - // const expectedJsonOverrides = {}; - // runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); - // }); - // }); - // - // test('run() with dev dependencies overwrite with caret', async (done) => { - // generateRandomFilename().then((packageJson) => { - // const dependencies = ['jest@^26.0.1']; - // const classForTesting = new ClassForTesting( - // dependencies, - // ClassForTesting.CONSTANTS.DEV_DEPENDENCIES, - // true, - // packageJson - // ); - // const testExpectObject = { - // ...defaultExpect, - // dependencies: dependencies, - // packageFilePath: packageJson, - // target: 'devDependencies', - // }; - // - // const expectedJsonOverrides = { - // devDependencies: { - // jest: '^26.0.1', - // }, - // }; - // runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); - // }); - // }); - // - // test('run() with optional dependencies overwrite lower', async (done) => { - // generateRandomFilename().then((packageJson) => { - // const dependencies = ['jest@25.0.0']; - // const classForTesting = new ClassForTesting( - // dependencies, - // ClassForTesting.CONSTANTS.OPTIONAL_DEPENDENCIES, - // true, - // packageJson - // ); - // const testExpectObject = { - // ...defaultExpect, - // dependencies: dependencies, - // packageFilePath: packageJson, - // target: 'optionalDependencies', - // }; - // const expectedJsonOverrides = { - // optionalDependencies: { - // jest: '25.0.0', - // }, - // }; - // runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); - // }); - // }); - // - // test('run() with peer dependencies overwrite', async (done) => { - // generateRandomFilename().then((packageJson) => { - // const dependencies = ['jest@26.0.1']; - // const classForTesting = new ClassForTesting( - // dependencies, - // ClassForTesting.CONSTANTS.PEER_DEPENDENCIES, - // true, - // packageJson - // ); - // const testExpectObject = { - // ...defaultExpect, - // dependencies: dependencies, - // packageFilePath: packageJson, - // target: 'peerDependencies', - // }; - // const expectedJsonOverrides = { - // peerDependencies: { - // jest: '26.0.1', - // }, - // }; - // runAndVerify(done, classForTesting, packageJson, testExpectObject, expectedJsonOverrides).then(); - // }); - // }); });