From dfe8446e4477bc47fe49c3b6288eec978cc7ca11 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Fri, 7 Mar 2025 08:36:52 -0800 Subject: [PATCH] test: adding a bunch of test snapshots to replace individual `assert(fs.existsSync(...))...` --- .mocharc.js | 3 +- package.json | 4 +- test/__snapshots__/api-spec.js.snap | 402 ++++++++++++++ test/__snapshots__/cli-spec.js.snap | 771 ++++++++++++++++++++++++++ test/api-spec.js | 9 +- test/cli-spec.js | 32 +- mocha.setup.js => test/mocha.setup.js | 0 test/util/compareDirectories.js | 3 +- 8 files changed, 1192 insertions(+), 32 deletions(-) create mode 100644 test/__snapshots__/api-spec.js.snap rename mocha.setup.js => test/mocha.setup.js (100%) diff --git a/.mocharc.js b/.mocharc.js index 9a9cc704..a3e22799 100644 --- a/.mocharc.js +++ b/.mocharc.js @@ -1,6 +1,7 @@ module.exports = { 'watch-files': ['test/**/*.js', 'lib/**/*.js'], recursive: true, - file: './mocha.setup.js', // setup file before everything else loads + file: './test/mocha.setup.js', // setup file before everything else loads 'forbid-only': process.env.CI ?? false, // make sure no `test.only` is merged into `main` + reporter: 'spec', }; diff --git a/package.json b/package.json index 8cceed31..712e39ae 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,8 @@ }, "scripts": { "build": "tsc", - "mocha": "xvfb-maybe electron-mocha --reporter spec && mocha --reporter spec", - "mocha:update": "UPDATE_SNAPSHOT=true yarn mocha", + "mocha": "xvfb-maybe electron-mocha && mocha", + "mocha:update": "mocha --update", "mocha:watch": "mocha --watch", "test": "yarn lint && yarn mocha", "lint": "yarn prettier:check", diff --git a/test/__snapshots__/api-spec.js.snap b/test/__snapshots__/api-spec.js.snap new file mode 100644 index 00000000..b0ba7f6e --- /dev/null +++ b/test/__snapshots__/api-spec.js.snap @@ -0,0 +1,402 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`api should create archive from directory (with nothing packed) 1`] = ` +Object { + "files": Object { + ".hiddenfile.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "d400d9a74f67e724a4793173d73e1403bd6b734930632f4eee50a3a5a1e5a478", + ], + "hash": "d400d9a74f67e724a4793173d73e1403bd6b734930632f4eee50a3a5a1e5a478", + }, + "size": 19, + "unpacked": true, + }, + "dir1": Object { + "files": Object { + "file1.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + ], + "hash": "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + }, + "size": 9, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "dir2": Object { + "files": Object { + "file2.png": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + ], + "hash": "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + }, + "size": 182, + "unpacked": true, + }, + "file3.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + ], + "hash": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + }, + "size": 3, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "emptyfile.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ], + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }, + "size": 0, + "unpacked": true, + }, + "file0.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + ], + "hash": "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + }, + "size": 13, + "unpacked": true, + }, + }, +} +`; + +exports[`api should create archive from directory (with nothing packed) 2`] = ` +Array [ + Object { + "content": "file one.", + "name": "dir1/file1.txt", + }, + "dir2/file2.png", + Object { + "content": "123", + "name": "dir2/file3.txt", + }, + "dir1", + "dir2", + Object { + "content": "This file is hidden", + "name": ".hiddenfile.txt", + }, + Object { + "content": "", + "name": "emptyfile.txt", + }, + Object { + "content": "file0 content", + "name": "file0.txt", + }, +] +`; + +exports[`api should create archive from directory (with transformed files) 1`] = ` +Object { + "files": Object { + ".hiddenfile.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "d400d9a74f67e724a4793173d73e1403bd6b734930632f4eee50a3a5a1e5a478", + ], + "hash": "d400d9a74f67e724a4793173d73e1403bd6b734930632f4eee50a3a5a1e5a478", + }, + "offset": "0", + "size": 19, + }, + "dir1": Object { + "files": Object { + "file1.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + ], + "hash": "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + }, + "offset": "19", + "size": 9, + }, + }, + }, + "dir2": Object { + "files": Object { + "file2.png": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + ], + "hash": "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + }, + "offset": "28", + "size": 182, + }, + "file3.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + ], + "hash": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + }, + "offset": "210", + "size": 3, + }, + }, + }, + "emptyfile.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ], + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }, + "offset": "213", + "size": 0, + }, + "file0.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + ], + "hash": "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + }, + "offset": "213", + "size": 13, + }, + }, +} +`; + +exports[`api should create archive from directory (without hidden files) 1`] = ` +Object { + "files": Object { + "dir1": Object { + "files": Object { + "file1.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + ], + "hash": "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + }, + "offset": "0", + "size": 9, + }, + }, + }, + "dir2": Object { + "files": Object { + "file2.png": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + ], + "hash": "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + }, + "offset": "9", + "size": 182, + }, + "file3.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + ], + "hash": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + }, + "offset": "191", + "size": 3, + }, + }, + }, + "emptyfile.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ], + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }, + "offset": "194", + "size": 0, + }, + "file0.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + ], + "hash": "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + }, + "offset": "194", + "size": 13, + }, + }, +} +`; + +exports[`api should create archive from directory 1`] = ` +Object { + "files": Object { + ".hiddenfile.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "d400d9a74f67e724a4793173d73e1403bd6b734930632f4eee50a3a5a1e5a478", + ], + "hash": "d400d9a74f67e724a4793173d73e1403bd6b734930632f4eee50a3a5a1e5a478", + }, + "offset": "0", + "size": 19, + }, + "dir1": Object { + "files": Object { + "file1.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + ], + "hash": "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + }, + "offset": "19", + "size": 9, + }, + }, + }, + "dir2": Object { + "files": Object { + "file2.png": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + ], + "hash": "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + }, + "offset": "28", + "size": 182, + }, + "file3.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + ], + "hash": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + }, + "offset": "210", + "size": 3, + }, + }, + }, + "emptyfile.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ], + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }, + "offset": "213", + "size": 0, + }, + "file0.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + ], + "hash": "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + }, + "offset": "213", + "size": 13, + }, + }, +} +`; + +exports[`api should handle multibyte characters in paths 1`] = ` +Object { + "files": Object { + "dir1": Object { + "files": Object { + "file1.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ], + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }, + "offset": "0", + "size": 0, + }, + "女の子.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ], + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }, + "offset": "0", + "size": 0, + }, + }, + }, + }, +} +`; diff --git a/test/__snapshots__/cli-spec.js.snap b/test/__snapshots__/cli-spec.js.snap index afd13fc2..49e6ffa3 100644 --- a/test/__snapshots__/cli-spec.js.snap +++ b/test/__snapshots__/cli-spec.js.snap @@ -1,5 +1,776 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`command line interface should create archive from directory with unpacked dirs 1`] = ` +Object { + "files": Object { + "dir1": Object { + "files": Object { + "file1.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + ], + "hash": "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + }, + "offset": "0", + "size": 9, + }, + }, + }, + "dir2": Object { + "files": Object { + "file2.png": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + ], + "hash": "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + }, + "size": 182, + "unpacked": true, + }, + "file3.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + ], + "hash": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + }, + "size": 3, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "emptyfile.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ], + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }, + "offset": "9", + "size": 0, + }, + "file0.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + ], + "hash": "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + }, + "offset": "9", + "size": 13, + }, + }, +} +`; + +exports[`command line interface should create archive from directory with unpacked dirs 2`] = ` +Array [ + "dir2/file2.png", + Object { + "content": "123", + "name": "dir2/file3.txt", + }, + "dir2", +] +`; + +exports[`command line interface should create archive from directory with unpacked dirs and files 1`] = ` +Object { + "files": Object { + "dir1": Object { + "files": Object { + "file1.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + ], + "hash": "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + }, + "offset": "0", + "size": 9, + }, + }, + }, + "dir2": Object { + "files": Object { + "file2.png": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + ], + "hash": "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + }, + "size": 182, + "unpacked": true, + }, + "file3.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + ], + "hash": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + }, + "size": 3, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "emptyfile.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ], + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }, + "offset": "9", + "size": 0, + }, + "file0.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + ], + "hash": "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + }, + "offset": "9", + "size": 13, + }, + }, +} +`; + +exports[`command line interface should create archive from directory with unpacked dirs and files 2`] = ` +Array [ + "dir2/file2.png", + Object { + "content": "123", + "name": "dir2/file3.txt", + }, + "dir2", +] +`; + +exports[`command line interface should create archive from directory with unpacked dirs specified by foo/{bar,baz} style pattern 1`] = ` +Object { + "files": Object { + "x1": Object { + "files": Object { + "file1.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "be4f0d7f4574cda8a2c7b45495a252df4ed0ceaf8eedb692fb00e3409444b591", + ], + "hash": "be4f0d7f4574cda8a2c7b45495a252df4ed0ceaf8eedb692fb00e3409444b591", + }, + "size": 8, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "x2": Object { + "files": Object { + "file2.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "586ea213ecd662832d578a6d53b84f34a44df8a5d23555215ec11dbd708dfdb6", + ], + "hash": "586ea213ecd662832d578a6d53b84f34a44df8a5d23555215ec11dbd708dfdb6", + }, + "size": 8, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "y3": Object { + "files": Object { + "file3.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "33e658c933a8d7ac2706b5ea44d0887c9a6617d33c89cfd7aa8a8a5043c5577e", + ], + "hash": "33e658c933a8d7ac2706b5ea44d0887c9a6617d33c89cfd7aa8a8a5043c5577e", + }, + "offset": "0", + "size": 10, + }, + "x1": Object { + "files": Object { + "file4.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "dbeebbfbd66e243dd5c2e2fd96d83318269c89d99ebb0aa1a5a1f027092db5e1", + ], + "hash": "dbeebbfbd66e243dd5c2e2fd96d83318269c89d99ebb0aa1a5a1f027092db5e1", + }, + "size": 9, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "z1": Object { + "files": Object { + "x2": Object { + "files": Object { + "file5.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "74abc479d95c489f300f18086bcab63f188b89f6d309725ea613cf6a8d487a88", + ], + "hash": "74abc479d95c489f300f18086bcab63f188b89f6d309725ea613cf6a8d487a88", + }, + "size": 9, + "unpacked": true, + }, + }, + "unpacked": true, + }, + }, + }, + }, + }, + "z4": Object { + "files": Object { + "w1": Object { + "files": Object { + "file6.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "10ad5315269b2145a0990eeb305f792c522f5d8efda2c58e180fbfed5be231cd", + ], + "hash": "10ad5315269b2145a0990eeb305f792c522f5d8efda2c58e180fbfed5be231cd", + }, + "offset": "10", + "size": 8, + }, + }, + }, + }, + }, + }, +} +`; + +exports[`command line interface should create archive from directory with unpacked dirs specified by foo/{bar,baz} style pattern 2`] = ` +Array [ + Object { + "content": "filefour +", + "name": "y3/x1/file4.txt", + }, + Object { + "content": "filefive +", + "name": "y3/z1/x2/file5.txt", + }, + "y3/z1/x2", + "y3/x1", + "y3/z1", + "y3", +] +`; + +exports[`command line interface should create archive from directory with unpacked dirs specified by glob pattern 1`] = ` +Object { + "files": Object { + "x1": Object { + "files": Object { + "file1.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "be4f0d7f4574cda8a2c7b45495a252df4ed0ceaf8eedb692fb00e3409444b591", + ], + "hash": "be4f0d7f4574cda8a2c7b45495a252df4ed0ceaf8eedb692fb00e3409444b591", + }, + "size": 8, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "x2": Object { + "files": Object { + "file2.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "586ea213ecd662832d578a6d53b84f34a44df8a5d23555215ec11dbd708dfdb6", + ], + "hash": "586ea213ecd662832d578a6d53b84f34a44df8a5d23555215ec11dbd708dfdb6", + }, + "size": 8, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "y3": Object { + "files": Object { + "file3.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "33e658c933a8d7ac2706b5ea44d0887c9a6617d33c89cfd7aa8a8a5043c5577e", + ], + "hash": "33e658c933a8d7ac2706b5ea44d0887c9a6617d33c89cfd7aa8a8a5043c5577e", + }, + "offset": "0", + "size": 10, + }, + "x1": Object { + "files": Object { + "file4.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "dbeebbfbd66e243dd5c2e2fd96d83318269c89d99ebb0aa1a5a1f027092db5e1", + ], + "hash": "dbeebbfbd66e243dd5c2e2fd96d83318269c89d99ebb0aa1a5a1f027092db5e1", + }, + "offset": "10", + "size": 9, + }, + }, + }, + "z1": Object { + "files": Object { + "x2": Object { + "files": Object { + "file5.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "74abc479d95c489f300f18086bcab63f188b89f6d309725ea613cf6a8d487a88", + ], + "hash": "74abc479d95c489f300f18086bcab63f188b89f6d309725ea613cf6a8d487a88", + }, + "offset": "19", + "size": 9, + }, + }, + }, + }, + }, + }, + }, + "z4": Object { + "files": Object { + "w1": Object { + "files": Object { + "file6.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "10ad5315269b2145a0990eeb305f792c522f5d8efda2c58e180fbfed5be231cd", + ], + "hash": "10ad5315269b2145a0990eeb305f792c522f5d8efda2c58e180fbfed5be231cd", + }, + "offset": "28", + "size": 8, + }, + }, + }, + }, + }, + }, +} +`; + +exports[`command line interface should create archive from directory with unpacked dirs specified by glob pattern 2`] = ` +Array [ + Object { + "content": "fileone +", + "name": "x1/file1.txt", + }, + Object { + "content": "filetwo +", + "name": "x2/file2.txt", + }, + "x1", + "x2", +] +`; + +exports[`command line interface should create archive from directory with unpacked dirs specified by globstar pattern 1`] = ` +Object { + "files": Object { + "x1": Object { + "files": Object { + "file1.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "be4f0d7f4574cda8a2c7b45495a252df4ed0ceaf8eedb692fb00e3409444b591", + ], + "hash": "be4f0d7f4574cda8a2c7b45495a252df4ed0ceaf8eedb692fb00e3409444b591", + }, + "size": 8, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "x2": Object { + "files": Object { + "file2.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "586ea213ecd662832d578a6d53b84f34a44df8a5d23555215ec11dbd708dfdb6", + ], + "hash": "586ea213ecd662832d578a6d53b84f34a44df8a5d23555215ec11dbd708dfdb6", + }, + "size": 8, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "y3": Object { + "files": Object { + "file3.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "33e658c933a8d7ac2706b5ea44d0887c9a6617d33c89cfd7aa8a8a5043c5577e", + ], + "hash": "33e658c933a8d7ac2706b5ea44d0887c9a6617d33c89cfd7aa8a8a5043c5577e", + }, + "offset": "0", + "size": 10, + }, + "x1": Object { + "files": Object { + "file4.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "dbeebbfbd66e243dd5c2e2fd96d83318269c89d99ebb0aa1a5a1f027092db5e1", + ], + "hash": "dbeebbfbd66e243dd5c2e2fd96d83318269c89d99ebb0aa1a5a1f027092db5e1", + }, + "size": 9, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "z1": Object { + "files": Object { + "x2": Object { + "files": Object { + "file5.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "74abc479d95c489f300f18086bcab63f188b89f6d309725ea613cf6a8d487a88", + ], + "hash": "74abc479d95c489f300f18086bcab63f188b89f6d309725ea613cf6a8d487a88", + }, + "size": 9, + "unpacked": true, + }, + }, + "unpacked": true, + }, + }, + }, + }, + }, + "z4": Object { + "files": Object { + "w1": Object { + "files": Object { + "file6.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "10ad5315269b2145a0990eeb305f792c522f5d8efda2c58e180fbfed5be231cd", + ], + "hash": "10ad5315269b2145a0990eeb305f792c522f5d8efda2c58e180fbfed5be231cd", + }, + "offset": "10", + "size": 8, + }, + }, + }, + }, + }, + }, +} +`; + +exports[`command line interface should create archive from directory with unpacked dirs specified by globstar pattern 2`] = ` +Array [ + Object { + "content": "fileone +", + "name": "x1/file1.txt", + }, + Object { + "content": "filetwo +", + "name": "x2/file2.txt", + }, + Object { + "content": "filefour +", + "name": "y3/x1/file4.txt", + }, + Object { + "content": "filefive +", + "name": "y3/z1/x2/file5.txt", + }, + "y3/z1/x2", + "y3/x1", + "y3/z1", + "x1", + "x2", + "y3", +] +`; + +exports[`command line interface should create archive from directory with unpacked files 1`] = ` +Object { + "files": Object { + "dir1": Object { + "files": Object { + "file1.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + ], + "hash": "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + }, + "offset": "0", + "size": 9, + }, + }, + }, + "dir2": Object { + "files": Object { + "file2.png": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + ], + "hash": "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + }, + "size": 182, + "unpacked": true, + }, + "file3.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + ], + "hash": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + }, + "offset": "9", + "size": 3, + }, + }, + }, + "emptyfile.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ], + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }, + "offset": "12", + "size": 0, + }, + "file0.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + ], + "hash": "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + }, + "offset": "12", + "size": 13, + }, + }, +} +`; + +exports[`command line interface should create archive from directory with unpacked files 2`] = ` +Array [ + "dir2/file2.png", + "dir2", +] +`; + +exports[`command line interface should create archive from directory with unpacked subdirs and files using minimatch 1`] = ` +Object { + "files": Object { + "dir1": Object { + "files": Object { + "file1.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + ], + "hash": "420149d3f852894ba7f32e9d3ec7d8919ee2451724bf2580b0186cd373bd6d82", + }, + "size": 9, + "unpacked": true, + }, + }, + }, + "dir2": Object { + "files": Object { + "subdir": Object { + "files": Object { + "file2.png": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + ], + "hash": "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + }, + "size": 182, + "unpacked": true, + }, + "file3.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + ], + "hash": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", + }, + "size": 3, + "unpacked": true, + }, + }, + "unpacked": true, + }, + "subdir-do-not-unpack": Object { + "files": Object { + "file2.png": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + ], + "hash": "cc402b796dc92b2b1f3a6d09515003d8400e63d8acaffc967e49c0cf015fcffe", + }, + "offset": "0", + "size": 182, + }, + }, + }, + }, + }, + "file0.txt": Object { + "integrity": Object { + "algorithm": "SHA256", + "blockSize": 4194304, + "blocks": Array [ + "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + ], + "hash": "41a978be88ff87a57308bf234106a57ebf9aa0971e2101e75113547a815be72b", + }, + "size": 13, + "unpacked": true, + }, + }, +} +`; + +exports[`command line interface should create archive from directory with unpacked subdirs and files using minimatch 2`] = ` +Array [ + Object { + "content": "file one.", + "name": "dir1/file1.txt", + }, + "dir2/subdir/file2.png", + Object { + "content": "123", + "name": "dir2/subdir/file3.txt", + }, + "dir2/subdir", + "dir1", + "dir2", + Object { + "content": "file0 content", + "name": "file0.txt", + }, +] +`; + exports[`command line interface should respect ordering file (format: "\${filepath}") 1`] = ` Object { "files": Object { diff --git a/test/api-spec.js b/test/api-spec.js index 4500aaa6..466b0141 100644 --- a/test/api-spec.js +++ b/test/api-spec.js @@ -2,9 +2,8 @@ const assert = require('assert'); const fs = require('../lib/wrapped-fs').default; -const os = require('os'); -const path = require('path'); const rimraf = require('rimraf'); +const os = require('os'); const asar = require('..'); const compDirs = require('./util/compareDirectories'); @@ -12,6 +11,7 @@ const compFileLists = require('./util/compareFileLists'); const { compFiles, isSymbolicLinkSync } = require('./util/compareFiles'); const transform = require('./util/transformStream'); const { TEST_APPS_DIR } = require('./util/constants'); +const { verifySmartUnpack } = require('./util/verifySmartUnpack'); async function assertPackageListEquals(actualList, expectedFilename) { const expected = await fs.readFile(expectedFilename, 'utf8'); @@ -25,6 +25,7 @@ describe('api', function () { it('should create archive from directory', async () => { await asar.createPackage('test/input/packthis/', 'tmp/packthis-api.asar'); + await verifySmartUnpack('tmp/packthis-api.asar'); return compFiles('tmp/packthis-api.asar', 'test/expected/packthis.asar'); }); if (os.platform() === 'win32') { @@ -39,6 +40,7 @@ describe('api', function () { 'tmp/packthis-without-hidden-api.asar', { dot: false }, ); + await verifySmartUnpack('tmp/packthis-without-hidden-api.asar'); return compFiles( 'tmp/packthis-without-hidden-api.asar', 'test/expected/packthis-without-hidden.asar', @@ -50,6 +52,7 @@ describe('api', function () { 'tmp/packthis-api-transformed.asar', { transform }, ); + await verifySmartUnpack('tmp/packthis-api-transformed.asar'); return compFiles( 'tmp/packthis-api-transformed.asar', 'test/expected/packthis-transformed.asar', @@ -59,6 +62,7 @@ describe('api', function () { await asar.createPackageWithOptions('test/input/packthis/', 'tmp/packthis-api-unpacked.asar', { unpackDir: '**', }); + await verifySmartUnpack('tmp/packthis-api-unpacked.asar'); await compFiles('tmp/packthis-api-unpacked.asar', 'test/expected/packthis-all-unpacked.asar'); return compDirs('tmp/packthis-api-unpacked.asar.unpacked', 'test/expected/extractthis'); }); @@ -159,6 +163,7 @@ describe('api', function () { }, }, ); + await verifySmartUnpack('tmp/packthis-unicode-path.asar'); return compFiles('tmp/packthis-unicode-path.asar', 'test/expected/packthis-unicode-path.asar'); }); it('should extract a text file from archive with multibyte characters in path', async () => { diff --git a/test/cli-spec.js b/test/cli-spec.js index deac4b65..1c0f20fd 100644 --- a/test/cli-spec.js +++ b/test/cli-spec.js @@ -55,7 +55,7 @@ describe('command line interface', function () { await execAsar( 'p test/input/packthis/ tmp/packthis-unpack-cli.asar --unpack *.png --exclude-hidden', ); - assert.ok(fs.existsSync('tmp/packthis-unpack-cli.asar.unpacked/dir2/file2.png')); + await verifySmartUnpack('tmp/packthis-unpack-cli.asar'); await compFiles('tmp/packthis-unpack-cli.asar', 'test/expected/packthis-unpack.asar'); }); it('should list files/dirs in archive', async () => { @@ -115,40 +115,31 @@ describe('command line interface', function () { await execAsar( 'p test/input/packthis/ tmp/packthis-unpack-dir-cli.asar --unpack-dir dir2 --exclude-hidden', ); - assert.ok(fs.existsSync('tmp/packthis-unpack-dir-cli.asar.unpacked/dir2/file2.png')); - assert.ok(fs.existsSync('tmp/packthis-unpack-dir-cli.asar.unpacked/dir2/file3.txt')); + await verifySmartUnpack('tmp/packthis-unpack-dir-cli.asar'); return compFiles('tmp/packthis-unpack-dir-cli.asar', 'test/expected/packthis-unpack-dir.asar'); }); it('should create archive from directory with unpacked dirs specified by glob pattern', async () => { const tmpFile = 'tmp/packthis-unpack-dir-glob-cli.asar'; - const tmpUnpacked = 'tmp/packthis-unpack-dir-glob-cli.asar.unpacked'; await execAsar( `p test/input/packthis-glob/ ${tmpFile} --unpack-dir "{x1,x2}" --exclude-hidden`, ); - assert.ok(fs.existsSync(tmpUnpacked + '/x1/file1.txt')); - assert.ok(fs.existsSync(tmpUnpacked + '/x2/file2.txt')); + await verifySmartUnpack(tmpFile); return compFiles(tmpFile, 'test/expected/packthis-unpack-dir-glob.asar'); }); it('should create archive from directory with unpacked dirs specified by globstar pattern', async () => { const tmpFile = 'tmp/packthis-unpack-dir-globstar-cli.asar'; - const tmpUnpacked = 'tmp/packthis-unpack-dir-globstar-cli.asar.unpacked'; await execAsar( `p test/input/packthis-glob/ ${tmpFile} --unpack-dir "**/{x1,x2}" --exclude-hidden`, ); - assert.ok(fs.existsSync(tmpUnpacked + '/x1/file1.txt')); - assert.ok(fs.existsSync(tmpUnpacked + '/x2/file2.txt')); - assert.ok(fs.existsSync(tmpUnpacked + '/y3/x1/file4.txt')); - assert.ok(fs.existsSync(tmpUnpacked + '/y3/z1/x2/file5.txt')); + await verifySmartUnpack(tmpFile); return compFiles(tmpFile, 'test/expected/packthis-unpack-dir-globstar.asar'); }); it('should create archive from directory with unpacked dirs specified by foo/{bar,baz} style pattern', async () => { const tmpFile = 'tmp/packthis-unpack-dir-globstar-cli.asar'; - const tmpUnpacked = 'tmp/packthis-unpack-dir-globstar-cli.asar.unpacked'; await execAsar( `p test/input/packthis-glob/ ${tmpFile} --unpack-dir "y3/{x1,z1}" --exclude-hidden`, ); - assert.ok(fs.existsSync(path.join(tmpUnpacked, 'y3/x1/file4.txt'))); - assert.ok(fs.existsSync(path.join(tmpUnpacked, 'y3/z1/x2/file5.txt'))); + await verifySmartUnpack(tmpFile); }); it('should list files/dirs in archive with unpacked dirs', async () => { return assertAsarOutputMatches( @@ -170,8 +161,7 @@ describe('command line interface', function () { await execAsar( 'p test/input/packthis/ tmp/packthis-unpack-dir-file-cli.asar --unpack *.png --unpack-dir dir2 --exclude-hidden', ); - assert.ok(fs.existsSync('tmp/packthis-unpack-dir-file-cli.asar.unpacked/dir2/file2.png')); - assert.ok(fs.existsSync('tmp/packthis-unpack-dir-file-cli.asar.unpacked/dir2/file3.txt')); + await verifySmartUnpack('tmp/packthis-unpack-dir-file-cli.asar'); return compFiles( 'tmp/packthis-unpack-dir-file-cli.asar', 'test/expected/packthis-unpack-dir.asar', @@ -181,15 +171,7 @@ describe('command line interface', function () { await execAsar( 'p test/input/packthis-subdir/ tmp/packthis-unpack-subdir-cli.asar --unpack *.txt --unpack-dir "{dir2/subdir,dir2/subdir}" --exclude-hidden', ); - assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/file0.txt')); - assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/dir1/file1.txt')); - assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/dir2/subdir/file2.png')); - assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/dir2/subdir/file3.txt')); - assert.ok( - fs.existsSync( - 'tmp/packthis-unpack-subdir-cli.asar.unpacked/dir2/subdir-do-not-unpack/file2.png', - ) === false, - ); + await verifySmartUnpack('tmp/packthis-unpack-subdir-cli.asar'); }); it('should unpack static framework with all underlying symlinks unpacked', async () => { const { testPath } = await createSymlinkApp('app'); diff --git a/mocha.setup.js b/test/mocha.setup.js similarity index 100% rename from mocha.setup.js rename to test/mocha.setup.js diff --git a/test/util/compareDirectories.js b/test/util/compareDirectories.js index 43025505..7da761a0 100644 --- a/test/util/compareDirectories.js +++ b/test/util/compareDirectories.js @@ -29,8 +29,7 @@ module.exports = async function (dirA, dirB) { differentFiles.push(filename); continue; } - // TODO: FIXME - This promise needs an `await`, but the fixtures are flaky across OS's and it should be investigated separately - const [fileContentA, fileContentB] = Promise.all( + const [fileContentA, fileContentB] = await Promise.all( [dirA, dirB].map((dir) => fs.readFile(path.join(dir, filename), 'utf8')), ); if (fileContentA !== fileContentB) {