blob: 13b971973321d2cf3d5d5178b829db9544fc9e62 [file] [log] [blame]
'use strict'
var test = require('tap').test
var requireInject = require('require-inject')
var writeFileAtomic = requireInject('../index', {
'graceful-fs': {
writeFile: function (tmpfile, data, options, cb) {
if (/nowrite/.test(tmpfile)) return cb(new Error('ENOWRITE'))
cb()
},
chown: function (tmpfile, uid, gid, cb) {
if (/nochown/.test(tmpfile)) return cb(new Error('ENOCHOWN'))
cb()
},
rename: function (tmpfile, filename, cb) {
if (/norename/.test(tmpfile)) return cb(new Error('ENORENAME'))
cb()
},
unlink: function (tmpfile, cb) {
if (/nounlink/.test(tmpfile)) return cb(new Error('ENOUNLINK'))
cb()
},
writeFileSync: function (tmpfile, data, options) {
if (/nowrite/.test(tmpfile)) throw new Error('ENOWRITE')
},
chownSync: function (tmpfile, uid, gid) {
if (/nochown/.test(tmpfile)) throw new Error('ENOCHOWN')
},
renameSync: function (tmpfile, filename) {
if (/norename/.test(tmpfile)) throw new Error('ENORENAME')
},
unlinkSync: function (tmpfile) {
if (/nounlink/.test(tmpfile)) throw new Error('ENOUNLINK')
}
}
})
var writeFileAtomicSync = writeFileAtomic.sync
test('async tests', function (t) {
t.plan(7)
writeFileAtomic('good', 'test', {mode: '0777'}, function (err) {
t.notOk(err, 'No errors occur when passing in options')
})
writeFileAtomic('good', 'test', function (err) {
t.notOk(err, 'No errors occur when NOT passing in options')
})
writeFileAtomic('nowrite', 'test', function (err) {
t.is(err.message, 'ENOWRITE', 'writeFile failures propagate')
})
writeFileAtomic('nochown', 'test', {chown: {uid: 100, gid: 100}}, function (err) {
t.is(err.message, 'ENOCHOWN', 'Chown failures propagate')
})
writeFileAtomic('nochown', 'test', function (err) {
t.notOk(err, 'No attempt to chown when no uid/gid passed in')
})
writeFileAtomic('norename', 'test', function (err) {
t.is(err.message, 'ENORENAME', 'Rename errors propagate')
})
writeFileAtomic('norename nounlink', 'test', function (err) {
t.is(err.message, 'ENORENAME', 'Failure to unlink the temp file does not clobber the original error')
})
})
test('sync tests', function (t) {
t.plan(7)
var throws = function (shouldthrow, msg, todo) {
var err
try { todo() } catch (e) { err = e }
t.is(shouldthrow, err.message, msg)
}
var noexception = function (msg, todo) {
var err
try { todo() } catch (e) { err = e }
t.notOk(err, msg)
}
noexception('No errors occur when passing in options', function () {
writeFileAtomicSync('good', 'test', {mode: '0777'})
})
noexception('No errors occur when NOT passing in options', function () {
writeFileAtomicSync('good', 'test')
})
throws('ENOWRITE', 'writeFile failures propagate', function () {
writeFileAtomicSync('nowrite', 'test')
})
throws('ENOCHOWN', 'Chown failures propagate', function () {
writeFileAtomicSync('nochown', 'test', {chown: {uid: 100, gid: 100}})
})
noexception('No attempt to chown when no uid/gid passed in', function () {
writeFileAtomicSync('nochown', 'test')
})
throws('ENORENAME', 'Rename errors propagate', function () {
writeFileAtomicSync('norename', 'test')
})
throws('ENORENAME', 'Failure to unlink the temp file does not clobber the original error', function () {
writeFileAtomicSync('norename nounlink', 'test')
})
})