diff --git a/app/attachments.js b/app/attachments.js index 99a67fda9..c70f6a305 100644 --- a/app/attachments.js +++ b/app/attachments.js @@ -67,6 +67,22 @@ exports.writeData = (root) => { }; }; +// deleteData :: AttachmentsPath -> IO Unit +exports.deleteData = (root) => { + if (!isString(root)) { + throw new TypeError('`root` must be a path'); + } + + return async (relativePath) => { + if (!isString(relativePath)) { + throw new TypeError('`relativePath` must be a string'); + } + + const absolutePath = path.join(root, relativePath); + await fse.remove(absolutePath); + }; +}; + // createName :: Unit -> IO String exports.createName = () => { const buffer = crypto.randomBytes(32); diff --git a/test/app/attachments_test.js b/test/app/attachments_test.js index b0bf8d73b..23a60456e 100644 --- a/test/app/attachments_test.js +++ b/test/app/attachments_test.js @@ -63,6 +63,33 @@ describe('Attachments', () => { }); }); + describe('deleteData', () => { + let tempRootDirectory = null; + before(() => { + tempRootDirectory = tmp.dirSync().name; + }); + + after(async () => { + await fse.remove(tempRootDirectory); + }); + + it('should delete file from disk', async () => { + const tempDirectory = path.join(tempRootDirectory, 'Attachments_deleteData'); + + const relativePath = Attachments.getRelativePath(Attachments.createName()); + const fullPath = path.join(tempDirectory, relativePath); + const input = stringToArrayBuffer('test string'); + + const inputBuffer = Buffer.from(input); + await fse.ensureFile(fullPath); + await fse.writeFile(fullPath, inputBuffer); + await Attachments.deleteData(tempDirectory)(relativePath); + + const existsFile = await fse.exists(fullPath); + assert.isFalse(existsFile); + }); + }); + describe('createName', () => { it('should return random file name with correct length', () => { assert.lengthOf(Attachments.createName(), NAME_LENGTH);