diff --git a/browser/main/lib/dataApi/createSnippet.js b/browser/main/lib/dataApi/createSnippet.js index 0c6cd648..5d189217 100644 --- a/browser/main/lib/dataApi/createSnippet.js +++ b/browser/main/lib/dataApi/createSnippet.js @@ -3,20 +3,22 @@ import crypto from 'crypto' import consts from 'browser/lib/consts' import fetchSnippet from 'browser/main/lib/dataApi/fetchSnippet' -function createSnippet () { +function createSnippet (snippetFile) { return new Promise((resolve, reject) => { - fetchSnippet().then((snippets) => { - const newSnippet = { - id: crypto.randomBytes(16).toString('hex'), - name: 'Unnamed snippet', - prefix: [], - content: '' - } + const newSnippet = { + id: crypto.randomBytes(16).toString('hex'), + name: 'Unnamed snippet', + prefix: [], + content: '' + } + fetchSnippet(null, snippetFile).then((snippets) => { snippets.push(newSnippet) - fs.writeFile(consts.SNIPPET_FILE, JSON.stringify(snippets, null, 4), (err) => { + fs.writeFile(snippetFile || consts.SNIPPET_FILE, JSON.stringify(snippets, null, 4), (err) => { if (err) reject(err) resolve(newSnippet) }) + }).catch((err) => { + reject(err) }) }) } diff --git a/browser/main/lib/dataApi/deleteSnippet.js b/browser/main/lib/dataApi/deleteSnippet.js index d8d9c68a..0e446886 100644 --- a/browser/main/lib/dataApi/deleteSnippet.js +++ b/browser/main/lib/dataApi/deleteSnippet.js @@ -2,11 +2,11 @@ import fs from 'fs' import consts from 'browser/lib/consts' import fetchSnippet from 'browser/main/lib/dataApi/fetchSnippet' -function deleteSnippet (snippet) { +function deleteSnippet (snippet, snippetFile) { return new Promise((resolve, reject) => { - fetchSnippet().then((snippets) => { + fetchSnippet(null, snippetFile).then((snippets) => { snippets = snippets.filter(currentSnippet => currentSnippet.id !== snippet.id) - fs.writeFile(consts.SNIPPET_FILE, JSON.stringify(snippets, null, 4), (err) => { + fs.writeFile(snippetFile || consts.SNIPPET_FILE, JSON.stringify(snippets, null, 4), (err) => { if (err) reject(err) resolve(snippet) }) diff --git a/browser/main/lib/dataApi/fetchSnippet.js b/browser/main/lib/dataApi/fetchSnippet.js index 94a7e687..8d5a6efe 100644 --- a/browser/main/lib/dataApi/fetchSnippet.js +++ b/browser/main/lib/dataApi/fetchSnippet.js @@ -2,9 +2,9 @@ import fs from 'fs' import crypto from 'crypto' import consts from 'browser/lib/consts' -function fetchSnippet (id) { +function fetchSnippet (id, snippetFile) { return new Promise((resolve, reject) => { - fs.readFile(consts.SNIPPET_FILE, 'utf8', (err, data) => { + fs.readFile(snippetFile || consts.SNIPPET_FILE, 'utf8', (err, data) => { if (err) { reject(err) } diff --git a/browser/main/lib/dataApi/updateSnippet.js b/browser/main/lib/dataApi/updateSnippet.js index 60677bb8..f2310b8e 100644 --- a/browser/main/lib/dataApi/updateSnippet.js +++ b/browser/main/lib/dataApi/updateSnippet.js @@ -1,9 +1,9 @@ import fs from 'fs' import consts from 'browser/lib/consts' -function updateSnippet (snippet) { +function updateSnippet (snippet, snippetFile) { return new Promise((resolve, reject) => { - const snippets = JSON.parse(fs.readFileSync(consts.SNIPPET_FILE, 'utf-8')) + const snippets = JSON.parse(fs.readFileSync(snippetFile || consts.SNIPPET_FILE, 'utf-8')) for (let i = 0; i < snippets.length; i++) { const currentSnippet = snippets[i] @@ -20,7 +20,7 @@ function updateSnippet (snippet) { currentSnippet.name = snippet.name currentSnippet.prefix = snippet.prefix currentSnippet.content = snippet.content - fs.writeFile(consts.SNIPPET_FILE, JSON.stringify(snippets, null, 4), (err) => { + fs.writeFile(snippetFile || consts.SNIPPET_FILE, JSON.stringify(snippets, null, 4), (err) => { if (err) reject(err) resolve(snippets) }) diff --git a/browser/main/modals/PreferencesModal/SnippetTab.js b/browser/main/modals/PreferencesModal/SnippetTab.js index 2f22895a..ddbfc1b0 100644 --- a/browser/main/modals/PreferencesModal/SnippetTab.js +++ b/browser/main/modals/PreferencesModal/SnippetTab.js @@ -63,6 +63,10 @@ class SnippetTab extends React.Component { deleteSnippet (snippet) { dataApi.deleteSnippet(snippet).then(() => { this.reloadSnippetList() + // prevent old snippet still display when deleted + if (snippet.id === this.state.currentSnippet.id) { + this.setState({currentSnippet: null}) + } }).catch(err => { throw err }) } diff --git a/tests/dataApi/createSnippet-test.js b/tests/dataApi/createSnippet-test.js new file mode 100644 index 00000000..97e64cbb --- /dev/null +++ b/tests/dataApi/createSnippet-test.js @@ -0,0 +1,34 @@ +const test = require('ava') +const createSnippet = require('browser/main/lib/dataApi/createSnippet') +const sander = require('sander') +const os = require('os') +const path = require('path') + +const snippetFilePath = path.join(os.tmpdir(), `test${path.sep}create-snippet`) +const snippetFile = path.join(snippetFilePath, 'snippets.json') + +test.beforeEach((t) => { + sander.writeFileSync(snippetFile, '[]') +}) + +test.serial('Create a snippet', (t) => { + return Promise.resolve() + .then(function doTest () { + return Promise.all([ + createSnippet(snippetFile) + ]) + }) + .then(function assert (data) { + data = data[0] + const snippets = JSON.parse(sander.readFileSync(snippetFile)) + const snippet = snippets.find(currentSnippet => currentSnippet.id === data.id) + t.not(snippet, undefined) + t.is(snippet.name, data.name) + t.deepEqual(snippet.prefix, data.prefix) + t.is(snippet.content, data.content) + }) +}) + +test.after.always(() => { + sander.rimrafSync(snippetFilePath) +}) diff --git a/tests/dataApi/deleteSnippet-test.js b/tests/dataApi/deleteSnippet-test.js new file mode 100644 index 00000000..3b2f0e91 --- /dev/null +++ b/tests/dataApi/deleteSnippet-test.js @@ -0,0 +1,38 @@ +const test = require('ava') +const deleteSnippet = require('browser/main/lib/dataApi/deleteSnippet') +const sander = require('sander') +const os = require('os') +const path = require('path') +const crypto = require('crypto') + +const snippetFilePath = path.join(os.tmpdir(), `test${path.sep}delete-snippet`) +const snippetFile = path.join(snippetFilePath, 'snippets.json') +const newSnippet = { + id: crypto.randomBytes(16).toString('hex'), + name: 'Unnamed snippet', + prefix: [], + content: '' +} + +test.beforeEach((t) => { + sander.writeFileSync(snippetFile, JSON.stringify([newSnippet])) +}) + +test.serial('Delete a snippet', (t) => { + return Promise.resolve() + .then(function doTest () { + return Promise.all([ + deleteSnippet(newSnippet, snippetFile) + ]) + }) + .then(function assert (data) { + data = data[0] + const snippets = JSON.parse(sander.readFileSync(snippetFile)) + const snippet = snippets.find(currentSnippet => currentSnippet.id === data.id) + t.is(snippets.length, 0) + }) +}) + +test.after.always(() => { + sander.rimrafSync(snippetFilePath) +}) diff --git a/tests/dataApi/updateSnippet-test.js b/tests/dataApi/updateSnippet-test.js new file mode 100644 index 00000000..5bd252a0 --- /dev/null +++ b/tests/dataApi/updateSnippet-test.js @@ -0,0 +1,48 @@ +const test = require('ava') +const updateSnippet = require('browser/main/lib/dataApi/updateSnippet') +const sander = require('sander') +const os = require('os') +const path = require('path') +const crypto = require('crypto') + +const snippetFilePath = path.join(os.tmpdir(), `test${path.sep}update-snippet`) +const snippetFile = path.join(snippetFilePath, 'snippets.json') +const oldSnippet = { + id: crypto.randomBytes(16).toString('hex'), + name: 'Initial snippet', + prefix: [], + content: '' +} + +const newSnippet = { + id: oldSnippet.id, + name: 'new name', + prefix: ['prefix'], + content: 'new content' +} + + +test.beforeEach((t) => { + sander.writeFileSync(snippetFile, JSON.stringify([oldSnippet])) +}) + +test.serial('Update a snippet', (t) => { + return Promise.resolve() + .then(function doTest () { + return Promise.all([ + updateSnippet(newSnippet, snippetFile) + ]) + }) + .then(function assert () { + const snippets = JSON.parse(sander.readFileSync(snippetFile)) + const snippet = snippets.find(currentSnippet => currentSnippet.id === newSnippet.id) + t.not(snippet, undefined) + t.is(snippet.name, newSnippet.name) + t.deepEqual(snippet.prefix, newSnippet.prefix) + t.is(snippet.content, newSnippet.content) + }) +}) + +test.after.always(() => { + sander.rimrafSync(snippetFilePath) +})