mirror of
https://github.com/Llewellynvdm/nativefier.git
synced 2024-12-23 10:38:55 +00:00
a360f6c2ee
This implements the following cases: * Basic runs for a specific version/platform/arch with default options (testing for existence of expected output files/folders) * Runs for each target platform with `out` set * Runs for each target platform with `asar` set * Runs for each target platform with `prune` set * Runs for each target platform with `ignore` set * This includes testing `ignore` including a path separator * This also includes testing that `ignore` entries are applied with the app folder trimmed * Runs for each target platform with `overwrite` set / not set * Runs with `all` set, with `arch` or `platform` each set to `all`, and with `platform` set to multiple platforms (comma-delimited or array) * Tests specifically for the darwin target platform, to test `icon` and `sign` The test logic is organized such that the version of Electron being tested can be configured once centrally (in config.json), and the tests will not run until after downloading any necessary electron versions (to avoid timing out due to long downloads). Resolves #77.
274 lines
9.6 KiB
JavaScript
274 lines
9.6 KiB
JavaScript
var fs = require('fs')
|
|
var path = require('path')
|
|
|
|
var packager = require('..')
|
|
var waterfall = require('run-waterfall')
|
|
|
|
var config = require('./config.json')
|
|
var util = require('./util')
|
|
|
|
function generateBasename (opts) {
|
|
return opts.name + '-' + opts.platform + '-' + opts.arch
|
|
}
|
|
|
|
function generateNamePath (opts) {
|
|
// Generates path to verify reflects the name given in the options.
|
|
// Returns the Helper.app location on darwin since the top-level .app is already tested for the resources path;
|
|
// returns the executable for other OSes
|
|
if (opts.platform === 'darwin') {
|
|
return path.join(opts.name + '.app', 'Contents', 'Frameworks', opts.name + ' Helper.app')
|
|
}
|
|
|
|
return opts.name + (opts.platform === 'win32' ? '.exe' : '')
|
|
}
|
|
|
|
function createDefaultsTest (combination) {
|
|
return function (t) {
|
|
t.timeoutAfter(config.timeout)
|
|
|
|
var opts = Object.create(combination)
|
|
opts.name = 'basicTest'
|
|
opts.dir = path.join(__dirname, 'fixtures', 'basic')
|
|
|
|
var finalPath
|
|
var resourcesPath
|
|
|
|
waterfall([
|
|
function (cb) {
|
|
packager(opts, cb)
|
|
}, function (paths, cb) {
|
|
t.true(Array.isArray(paths), 'packager call should resolve to an array')
|
|
t.equal(paths.length, 1, 'Single-target run should resolve to a 1-item array')
|
|
|
|
finalPath = paths[0]
|
|
t.equal(finalPath, path.join(util.getWorkCwd(), generateBasename(opts)),
|
|
'Path should follow the expected format and be in the cwd')
|
|
fs.stat(finalPath, cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isDirectory(), 'The expected output directory should exist')
|
|
resourcesPath = path.join(finalPath, util.generateResourcesPath(opts))
|
|
fs.stat(path.join(finalPath, generateNamePath(opts)), cb)
|
|
}, function (stats, cb) {
|
|
if (opts.platform === 'darwin') {
|
|
t.true(stats.isDirectory(), 'The Helper.app should reflect opts.name')
|
|
} else {
|
|
t.true(stats.isFile(), 'The executable should reflect opts.name')
|
|
}
|
|
fs.stat(resourcesPath, cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isDirectory(), 'The output directory should contain the expected resources subdirectory')
|
|
fs.stat(path.join(resourcesPath, 'app', 'node_modules', 'run-waterfall'), cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isDirectory(), 'The output directory should contain devDependencies by default (no prune)')
|
|
util.areFilesEqual(path.join(opts.dir, 'main.js'), path.join(resourcesPath, 'app', 'main.js'), cb)
|
|
}, function (equal, cb) {
|
|
t.true(equal, 'File under packaged app directory should match source file')
|
|
util.areFilesEqual(path.join(opts.dir, 'ignore', 'this.txt'),
|
|
path.join(resourcesPath, 'app', 'ignore', 'this.txt'),
|
|
cb)
|
|
}, function (equal, cb) {
|
|
t.true(equal,
|
|
'File under subdirectory of packaged app directory should match source file and not be ignored by default')
|
|
cb()
|
|
}
|
|
], function (err) {
|
|
t.end(err)
|
|
})
|
|
}
|
|
}
|
|
|
|
function createOutTest (combination) {
|
|
return function (t) {
|
|
t.timeoutAfter(config.timeout)
|
|
|
|
var opts = Object.create(combination)
|
|
opts.name = 'basicTest'
|
|
opts.dir = path.join(__dirname, 'fixtures', 'basic')
|
|
opts.out = 'dist'
|
|
|
|
var finalPath
|
|
|
|
waterfall([
|
|
function (cb) {
|
|
packager(opts, cb)
|
|
}, function (paths, cb) {
|
|
finalPath = paths[0]
|
|
t.equal(finalPath, path.join('dist', generateBasename(opts)),
|
|
'Path should follow the expected format and be under the folder specifed in `out`')
|
|
fs.stat(finalPath, cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isDirectory(), 'The expected output directory should exist')
|
|
fs.stat(path.join(finalPath, util.generateResourcesPath(opts)), cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isDirectory(), 'The output directory should contain the expected resources subdirectory')
|
|
cb()
|
|
}
|
|
], function (err) {
|
|
t.end(err)
|
|
})
|
|
}
|
|
}
|
|
|
|
function createAsarTest (combination) {
|
|
return function (t) {
|
|
t.timeoutAfter(config.timeout)
|
|
|
|
var opts = Object.create(combination)
|
|
opts.name = 'basicTest'
|
|
opts.dir = path.join(__dirname, 'fixtures', 'basic')
|
|
opts.asar = true
|
|
|
|
var finalPath
|
|
var resourcesPath
|
|
|
|
waterfall([
|
|
function (cb) {
|
|
packager(opts, cb)
|
|
}, function (paths, cb) {
|
|
finalPath = paths[0]
|
|
fs.stat(finalPath, cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isDirectory(), 'The expected output directory should exist')
|
|
resourcesPath = path.join(finalPath, util.generateResourcesPath(opts))
|
|
fs.stat(resourcesPath, cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isDirectory(), 'The output directory should contain the expected resources subdirectory')
|
|
fs.stat(path.join(resourcesPath, 'app.asar'), cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isFile(), 'app.asar should exist under the resources subdirectory when opts.asar is true')
|
|
fs.exists(path.join(resourcesPath, 'app'), function (exists) {
|
|
t.false(exists, 'app subdirectory should NOT exist when app.asar is built')
|
|
cb()
|
|
})
|
|
}
|
|
], function (err) {
|
|
t.end(err)
|
|
})
|
|
}
|
|
}
|
|
|
|
function createPruneTest (combination) {
|
|
return function (t) {
|
|
t.timeoutAfter(config.timeout)
|
|
|
|
var opts = Object.create(combination)
|
|
opts.name = 'basicTest'
|
|
opts.dir = path.join(__dirname, 'fixtures', 'basic')
|
|
opts.prune = true
|
|
|
|
var finalPath
|
|
var resourcesPath
|
|
|
|
waterfall([
|
|
function (cb) {
|
|
packager(opts, cb)
|
|
}, function (paths, cb) {
|
|
finalPath = paths[0]
|
|
fs.stat(finalPath, cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isDirectory(), 'The expected output directory should exist')
|
|
resourcesPath = path.join(finalPath, util.generateResourcesPath(opts))
|
|
fs.stat(resourcesPath, cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isDirectory(), 'The output directory should contain the expected resources subdirectory')
|
|
fs.stat(path.join(resourcesPath, 'app', 'node_modules', 'run-series'), cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isDirectory(), 'npm dependency should exist under app/node_modules')
|
|
fs.exists(path.join(resourcesPath, 'app', 'node_modules', 'run-waterfall'), function (exists) {
|
|
t.false(exists, 'npm devDependency should NOT exist under app/node_modules')
|
|
cb()
|
|
})
|
|
}
|
|
], function (err) {
|
|
t.end(err)
|
|
})
|
|
}
|
|
}
|
|
|
|
function createIgnoreTest (combination, ignorePattern, ignoredFile) {
|
|
return function (t) {
|
|
t.timeoutAfter(config.timeout)
|
|
|
|
var opts = Object.create(combination)
|
|
opts.name = 'basicTest'
|
|
opts.dir = path.join(__dirname, 'fixtures', 'basic')
|
|
opts.ignore = ignorePattern
|
|
|
|
var appPath
|
|
|
|
waterfall([
|
|
function (cb) {
|
|
packager(opts, cb)
|
|
}, function (paths, cb) {
|
|
appPath = path.join(paths[0], util.generateResourcesPath(opts), 'app')
|
|
fs.stat(path.join(appPath, 'package.json'), cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isFile(), 'The expected output directory should exist and contain files')
|
|
fs.exists(path.join(appPath, ignoredFile), function (exists) {
|
|
t.false(exists, 'Ignored file should not exist in output app directory')
|
|
cb()
|
|
})
|
|
}
|
|
], function (err) {
|
|
t.end(err)
|
|
})
|
|
}
|
|
}
|
|
|
|
function createOverwriteTest (combination) {
|
|
return function (t) {
|
|
t.timeoutAfter(config.timeout * 2) // Multiplied since this test packages the application twice
|
|
|
|
var opts = Object.create(combination)
|
|
opts.name = 'basicTest'
|
|
opts.dir = path.join(__dirname, 'fixtures', 'basic')
|
|
|
|
var finalPath
|
|
var testPath
|
|
|
|
waterfall([
|
|
function (cb) {
|
|
packager(opts, cb)
|
|
}, function (paths, cb) {
|
|
finalPath = paths[0]
|
|
fs.stat(finalPath, cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isDirectory(), 'The expected output directory should exist')
|
|
// Create a dummy file to detect whether the output directory is replaced in subsequent runs
|
|
testPath = path.join(finalPath, 'test.txt')
|
|
fs.writeFile(testPath, 'test', cb)
|
|
}, function (cb) {
|
|
// Run again, defaulting to overwrite false
|
|
packager(opts, cb)
|
|
}, function (paths, cb) {
|
|
fs.stat(testPath, cb)
|
|
}, function (stats, cb) {
|
|
t.true(stats.isFile(), 'The existing output directory should exist as before (skipped by default)')
|
|
// Run a third time, explicitly setting overwrite to true
|
|
opts.overwrite = true
|
|
packager(opts, cb)
|
|
}, function (paths, cb) {
|
|
fs.exists(testPath, function (exists) {
|
|
t.false(exists, 'The output directory should be regenerated when overwrite is true')
|
|
cb()
|
|
})
|
|
}
|
|
], function (err) {
|
|
t.end(err)
|
|
})
|
|
}
|
|
}
|
|
|
|
util.testAllPlatforms('defaults test', createDefaultsTest)
|
|
util.testAllPlatforms('out test', createOutTest)
|
|
util.testAllPlatforms('asar test', createAsarTest)
|
|
util.testAllPlatforms('prune test', createPruneTest)
|
|
util.testAllPlatforms('ignore test: string in array', createIgnoreTest, ['ignorethis'], 'ignorethis.txt')
|
|
util.testAllPlatforms('ignore test: string', createIgnoreTest, 'ignorethis', 'ignorethis.txt')
|
|
util.testAllPlatforms('ignore test: RegExp', createIgnoreTest, /ignorethis/, 'ignorethis.txt')
|
|
util.testAllPlatforms('ignore test: string with slash', createIgnoreTest, 'ignore/this',
|
|
path.join('ignore', 'this.txt'))
|
|
util.testAllPlatforms('ignore test: only match subfolder of app', createIgnoreTest, 'electron-packager',
|
|
path.join('electron-packager', 'readme.txt'))
|
|
util.testAllPlatforms('overwrite test', createOverwriteTest)
|