cqr-env
Version:
Have multiple env files that can be encrypted and included in version control
123 lines (101 loc) • 5.64 kB
JavaScript
const test = require('ava')
const fs = require('fs')
const { spawnSync } = require('child_process')
const pkg = require('../index')
test.before(function (t) {
// set key in environment variable
process.env.cqr_key = '1234'
})
test.serial('encrypt new sensible env file', function (t) {
const file = 'tests/C/password.env.js'
// create new file
fs.writeFileSync(file + '.exposed', 'module.exports = "secret password!"')
// encrypt file via CLI
const s = spawn('node', ['./cli.js', '-e', 'tests/C/password.env.js.exposed', '-v', 'cqr_key'])
t.false(fs.existsSync(file + '.exposed'))
t.true(fs.existsSync(file + '.encrypted'))
// t.is(Buffer.from(fs.readFileSync(file + '.encrypted')).toString(), '3d831f9789c7741974f54cc4e73cea2aaa7ab7cd98ce8f708d3f6dbaca4d9358d025be6542f0602c771b59e9e41685d9MrK9z4b9MxZ1ubgtJRLN5JJzQowl5rvYKoeOTtG3UowcR2jjAHxFG4hzbWXBdrOKf2Mn9CemZ4KxU6QPwzDIYBRXtkKT7+b2stPDnh0daDHXVB93AR4BPxIfdELODrCPeau6/CT74GpvyWmJjjZlN2HHoLYg8y6o9A2UkgVc984sJ8zCTouSOLakpGzGuol97Nhq3BIXc6tJazOZFgarpw==')
})
test.serial('decrypt env file', function (t) {
const file = 'tests/C/password.env.js'
// decrypt file via CLI
const s = spawn('node', ['./cli.js', '-d', 'tests/C/password.env.js.encrypted', '-v', 'cqr_key'])
t.false(fs.existsSync(file + '.encrypted'))
t.true(fs.existsSync(file + '.exposed'))
t.is(Buffer.from(fs.readFileSync(file + '.exposed')).toString(), 'module.exports = "secret password!"')
fs.unlinkSync(file + '.exposed')
})
test.serial.skip('encrypt multiple new sensible env file', function (t) {
const file = 'tests/C/password.env.js'
// create new file
fs.writeFileSync(file + '.exposed', 'module.exports = "secret password!"')
// encrypt file via CLI
spawnSync('node', ['./cli.js', '-e', file + '.exposed', 'cqr_key'])
t.false(fs.existsSync(file + '.exposed'))
t.true(fs.existsSync(file + '.encrypted'))
// t.is(Buffer.from(fs.readFileSync(file + '.encrypted')).toString(), '3d831f9789c7741974f54cc4e73cea2aaa7ab7cd98ce8f708d3f6dbaca4d9358d025be6542f0602c771b59e9e41685d9MrK9z4b9MxZ1ubgtJRLN5JJzQowl5rvYKoeOTtG3UowcR2jjAHxFG4hzbWXBdrOKf2Mn9CemZ4KxU6QPwzDIYBRXtkKT7+b2stPDnh0daDHXVB93AR4BPxIfdELODrCPeau6/CT74GpvyWmJjjZlN2HHoLYg8y6o9A2UkgVc984sJ8zCTouSOLakpGzGuol97Nhq3BIXc6tJazOZFgarpw==')
})
test.serial.skip('decrypt multiple env file', function (t) {
const file = 'tests/C/password.env.js'
// decrypt file via CLI
spawnSync('node', ['./cli.js', '-d', file + '.encrypted', 'cqr_key'])
t.false(fs.existsSync(file + '.encrypted'))
t.true(fs.existsSync(file + '.exposed'))
t.is(Buffer.from(fs.readFileSync(file + '.exposed')).toString(), 'module.exports = "secret password!"')
fs.unlinkSync(file + '.exposed')
})
test('use secret env file', function (t) {
const env = pkg('tests/D/production.env.js.encrypted', { envvar: 'cqr_key' })
t.deepEqual(env, { production: { host: 'example.com', pw: 'abcde' }})
})
test('use secret env file, options as string', function (t) {
const env = pkg('tests/D/production.env.js.encrypted', 'cqr_key')
t.deepEqual(env, { production: { host: 'example.com', pw: 'abcde' }})
})
test.serial.cb('encrypt new sensible env file with pwfile', function (t) {
// create new file
fs.writeFileSync('tests/C/password.env.js.exposed', 'module.exports = "secret password!"')
// encrypt file via CLI
const s = spawn('node', ['./cli.js', '-e', 'tests/C/password.env.js.exposed', '-f', 'tests/F/pw'])
s.on('close', function (code) {
t.false(fs.existsSync('tests/C/password.env.js.exposed'))
t.true(fs.existsSync('tests/C/password.env.js.encrypted'))
// t.is(Buffer.from(fs.readFileSync('tests/C/password.env.js.encrypted')).toString(), '3d831f9789c7741974f54cc4e73cea2aaa7ab7cd98ce8f708d3f6dbaca4d9358d025be6542f0602c771b59e9e41685d9MrK9z4b9MxZ1ubgtJRLN5JJzQowl5rvYKoeOTtG3UowcR2jjAHxFG4hzbWXBdrOKf2Mn9CemZ4KxU6QPwzDIYBRXtkKT7+b2stPDnh0daDHXVB93AR4BPxIfdELODrCPeau6/CT74GpvyWmJjjZlN2HHoLYg8y6o9A2UkgVc984sJ8zCTouSOLakpGzGuol97Nhq3BIXc6tJazOZFgarpw==')
t.end()
})
})
test.serial.cb('decrypt env file with pwfile', function (t) {
// decrypt file via CLI
const s = spawn('node', ['./cli.js', '-d', 'tests/C/password.env.js.encrypted', '-f', 'tests/F/pw'])
s.on('close', function (code) {
t.false(fs.existsSync('tests/C/password.env.js.encrypted'))
t.true(fs.existsSync('tests/C/password.env.js.exposed'))
t.is(Buffer.from(fs.readFileSync('tests/C/password.env.js.exposed')).toString(), 'module.exports = "secret password!"')
fs.unlinkSync('tests/C/password.env.js.exposed')
t.end()
})
})
test('use secret env file with pwfile', function (t) {
const pkg = require('../index')
const env = pkg('tests/D/development.env.js.encrypted', { pwfile: 'tests/F/pw' })
t.deepEqual(env, { development: { host: 'localhost' }})
})
test.serial('encrypt inside env file', function (t) {
const file = 'tests/G/production.env.json'
try { fs.unlinkSync(file) } catch (e) {}
try { fs.unlinkSync(file + '.exposed') } catch (e) {}
// create new file
fs.writeFileSync(file + '.exposed', '{\n "host": "example.com",\n "pw": "abcde"\n}')
// encrypt file via CLI
spawnSync('node', ['./cli.js', '-e', file + '.exposed', 'pw', 'cqr_key'])
t.false(fs.existsSync(file + '.exposed'))
t.true(fs.existsSync(file))
t.not(JSON.parse(Buffer.from(fs.readFileSync(file)).toString()).pw, 'abcde')
})
test.serial('decrypt inside env file', function (t) {
// decrypt file via API
const file = 'tests/G/production.env.json'
const env = pkg(file, false)
t.deepEqual(env, module.exports = { host: 'example.com', pw: 'abcde' })
fs.unlinkSync(file + '.exposed')
})