Skip to content

Commit

Permalink
test: add --ordering unit tests with chai (#357)
Browse files Browse the repository at this point in the history
* adding chai+snapshot functionality. adding snapshot tests to verify app with new `ordering` file unit tests

* undo `await Promise.all` to return to `main` logic. Added comment saying it needs to be fixed but currently the fixture is flaky and warrants a separate investigation  ¯\_(ツ)_/¯

* PR feedback. add `ordering` jsdoc and update unit tests to supply additional files to verify that "ordering" is successfully applied
  • Loading branch information
mmaietta authored Mar 6, 2025
1 parent 9b7ccfe commit dfd30c5
Show file tree
Hide file tree
Showing 15 changed files with 1,466 additions and 36 deletions.
1 change: 1 addition & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ jobs:
test:
name: Test
strategy:
fail-fast: false
matrix:
node-version:
- '20.10'
Expand Down
6 changes: 6 additions & 0 deletions .mocharc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = {
'watch-files': ['test/**/*.js', 'lib/**/*.js'],
recursive: true,
file: './mocha.setup.js', // setup file before everything else loads
'forbid-only': process.env.CI ?? false, // make sure no `test.only` is merged into `main`
};
4 changes: 4 additions & 0 deletions mocha.setup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
const chai = require('chai');
const { jestSnapshotPlugin } = require('mocha-chai-jest-snapshot');

chai.use(jestSnapshotPlugin());
6 changes: 5 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,11 @@
"scripts": {
"build": "tsc",
"mocha": "xvfb-maybe electron-mocha --reporter spec && mocha --reporter spec",
"mocha:update": "UPDATE_SNAPSHOT=true yarn mocha",
"mocha:watch": "mocha --watch",
"test": "yarn lint && yarn mocha",
"lint": "yarn prettier:check",
"prettier": "prettier \"src/**/*.ts\" \"test/**/*.js\"",
"prettier": "prettier \"src/**/*.ts\" \"test/**/*.js\" \"*.js\"",
"prettier:check": "yarn prettier --check",
"prettier:write": "yarn prettier --write",
"prepare": "tsc"
Expand All @@ -44,10 +46,12 @@
"devDependencies": {
"@types/minimatch": "^3.0.5",
"@types/node": "^12.0.0",
"chai": "^4.5.0",
"electron": "^22.0.0",
"electron-mocha": "^13.0.1",
"lodash": "^4.17.15",
"mocha": "^10.1.0",
"mocha-chai-jest-snapshot": "^1.1.6",
"prettier": "^3.3.3",
"rimraf": "^3.0.2",
"typescript": "^5.5.4",
Expand Down
7 changes: 7 additions & 0 deletions src/asar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ export async function createPackage(src: string, dest: string) {
export type CreateOptions = {
dot?: boolean;
globOptions?: IOptions;
/**
* Path to a file containing the list of relative filepaths relative to `src` and the specific order they should be inserted into the asar.
* Formats allowed below:
* filepath
* : filepath
* <anything>:filepath
*/
ordering?: string;
pattern?: string;
transform?: (filePath: string) => NodeJS.ReadWriteStream | void;
Expand Down
276 changes: 276 additions & 0 deletions test/__snapshots__/cli-spec.js.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,276 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`command line interface should respect ordering file (format: "\${filepath}") 1`] = `
Object {
"files": Object {
"private": Object {
"files": Object {
"var": Object {
"files": Object {
"app": Object {
"files": Object {
"file.txt": Object {
"link": "private/var/file.txt",
},
},
},
"file.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
],
"hash": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
},
"offset": "15",
"size": 11,
},
"file1.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"5b41362bc82b7f3d56edc5a306db22105707d01ff4819e26faef9724a2d406c9",
],
"hash": "5b41362bc82b7f3d56edc5a306db22105707d01ff4819e26faef9724a2d406c9",
},
"offset": "10",
"size": 5,
},
"file2.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"d98cf53e0c8b77c14a96358d5b69584225b4bb9026423cbc2f7b0161894c402c",
],
"hash": "d98cf53e0c8b77c14a96358d5b69584225b4bb9026423cbc2f7b0161894c402c",
},
"offset": "5",
"size": 5,
},
"file3.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"f60f2d65da046fcaaf8a10bd96b5630104b629e111aff46ce89792e1caa11b18",
],
"hash": "f60f2d65da046fcaaf8a10bd96b5630104b629e111aff46ce89792e1caa11b18",
},
"offset": "0",
"size": 5,
},
},
},
},
},
"var": Object {
"link": "private/var",
},
},
}
`;

exports[`command line interface should respect ordering file (format: "\${random number} : \${filepath}") 1`] = `
Object {
"files": Object {
"private": Object {
"files": Object {
"var": Object {
"files": Object {
"app": Object {
"files": Object {
"file.txt": Object {
"link": "private/var/file.txt",
},
},
},
"file.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
],
"hash": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
},
"offset": "15",
"size": 11,
},
"file1.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"5b41362bc82b7f3d56edc5a306db22105707d01ff4819e26faef9724a2d406c9",
],
"hash": "5b41362bc82b7f3d56edc5a306db22105707d01ff4819e26faef9724a2d406c9",
},
"offset": "10",
"size": 5,
},
"file2.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"d98cf53e0c8b77c14a96358d5b69584225b4bb9026423cbc2f7b0161894c402c",
],
"hash": "d98cf53e0c8b77c14a96358d5b69584225b4bb9026423cbc2f7b0161894c402c",
},
"offset": "5",
"size": 5,
},
"file3.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"f60f2d65da046fcaaf8a10bd96b5630104b629e111aff46ce89792e1caa11b18",
],
"hash": "f60f2d65da046fcaaf8a10bd96b5630104b629e111aff46ce89792e1caa11b18",
},
"offset": "0",
"size": 5,
},
},
},
},
},
"var": Object {
"link": "private/var",
},
},
}
`;

exports[`command line interface should respect ordering file (format: ": \${filepath}") 1`] = `
Object {
"files": Object {
"private": Object {
"files": Object {
"var": Object {
"files": Object {
"app": Object {
"files": Object {
"file.txt": Object {
"link": "private/var/file.txt",
},
},
},
"file.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
],
"hash": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
},
"offset": "15",
"size": 11,
},
"file1.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"5b41362bc82b7f3d56edc5a306db22105707d01ff4819e26faef9724a2d406c9",
],
"hash": "5b41362bc82b7f3d56edc5a306db22105707d01ff4819e26faef9724a2d406c9",
},
"offset": "10",
"size": 5,
},
"file2.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"d98cf53e0c8b77c14a96358d5b69584225b4bb9026423cbc2f7b0161894c402c",
],
"hash": "d98cf53e0c8b77c14a96358d5b69584225b4bb9026423cbc2f7b0161894c402c",
},
"offset": "5",
"size": 5,
},
"file3.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"f60f2d65da046fcaaf8a10bd96b5630104b629e111aff46ce89792e1caa11b18",
],
"hash": "f60f2d65da046fcaaf8a10bd96b5630104b629e111aff46ce89792e1caa11b18",
},
"offset": "0",
"size": 5,
},
},
},
},
},
"var": Object {
"link": "private/var",
},
},
}
`;

exports[`command line interface should unpack static framework with all underlying symlinks unpacked 1`] = `
Object {
"files": Object {
"private": Object {
"files": Object {
"var": Object {
"files": Object {
"app": Object {
"files": Object {
"file.txt": Object {
"link": "private/var/file.txt",
"unpacked": true,
},
},
},
"file.txt": Object {
"integrity": Object {
"algorithm": "SHA256",
"blockSize": 4194304,
"blocks": Array [
"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
],
"hash": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
},
"size": 11,
"unpacked": true,
},
},
},
},
},
"var": Object {
"link": "private/var",
"unpacked": true,
},
},
}
`;

exports[`command line interface should unpack static framework with all underlying symlinks unpacked 2`] = `
Array [
Object {
"content": "hello world",
"name": "private/var/app/file.txt",
},
"private/var/app",
Object {
"content": "hello world",
"name": "private/var/file.txt",
},
"private/var",
"private",
"var",
]
`;
3 changes: 2 additions & 1 deletion test/api-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const compDirs = require('./util/compareDirectories');
const compFileLists = require('./util/compareFileLists');
const { compFiles, isSymbolicLinkSync } = require('./util/compareFiles');
const transform = require('./util/transformStream');
const { TEST_APPS_DIR } = require('./util/constants');

async function assertPackageListEquals(actualList, expectedFilename) {
const expected = await fs.readFile(expectedFilename, 'utf8');
Expand All @@ -19,7 +20,7 @@ async function assertPackageListEquals(actualList, expectedFilename) {

describe('api', function () {
beforeEach(() => {
rimraf.sync(path.join(__dirname, '..', 'tmp'), fs);
rimraf.sync(TEST_APPS_DIR, fs);
});

it('should create archive from directory', async () => {
Expand Down
Loading

0 comments on commit dfd30c5

Please sign in to comment.