Files
nvatom/spec/note-watcher-spec.coffee
2016-07-03 10:44:32 -07:00

143 lines
4.6 KiB
CoffeeScript

fs = require 'fs'
path = require 'path'
temp = require 'temp'
NoteWatcher = require '../lib/note-watcher'
temp.track()
describe 'note-watcher', ->
watcher = null
directoryPath = null
beforeEach ->
directoryPath = temp.mkdirSync()
fs.writeFileSync(
path.join(directoryPath, 'foo.md'),
'The use of foo in a programming context is generally credited to the Tech Model Railroad Club (TMRC) of MIT.')
fs.writeFileSync(
path.join(directoryPath, 'bar.md'),
'When used in connection with bar it is generally traced to the World War II military slang FUBAR.')
spy = jasmine.createSpy()
watcher = new NoteWatcher(directoryPath)
watcher.on 'ready', spy
waitsFor -> spy.wasCalled
afterEach ->
watcher.close()
it 'handles a symbolic link note properly', ->
spy = jasmine.createSpy()
watcher.on 'update', spy
anotherDirectoryPath = temp.mkdirSync()
fs.writeFileSync(path.join(anotherDirectoryPath, 'baz.md'), 'A common name for the foobar, also foobaz.')
fs.symlinkSync(path.join(anotherDirectoryPath, 'baz.md'), path.join(directoryPath, 'baz.md'))
waitsFor -> spy.wasCalled
runs ->
result = watcher.search('baz')
expect(result.length).toBe(1)
it 'handles a symbolic link directory properly', ->
spy = jasmine.createSpy()
watcher.on 'update', spy
anotherDirectoryPath = temp.mkdirSync()
fs.writeFileSync(path.join(anotherDirectoryPath, 'baz.md'), 'A common name for the foobar, also foobaz.')
fs.symlinkSync(anotherDirectoryPath, path.join(directoryPath, 'baz'))
waitsFor -> spy.wasCalled
runs ->
result = watcher.search('baz')
expect(result.length).toBe(1)
expect(result[0].filePath).toBe(path.join(directoryPath, 'baz', 'baz.md'))
it 'handles paired symbolic links properly without falling into an infinite loop', ->
spy = jasmine.createSpy()
watcher.on 'update', spy
anotherDirectoryPath = temp.mkdirSync()
fs.writeFileSync(path.join(anotherDirectoryPath, 'baz.md'), 'A common name for the foobar, also foobaz.')
fs.symlinkSync(anotherDirectoryPath, path.join(directoryPath, 'bazDir'))
fs.symlinkSync(directoryPath, path.join(anotherDirectoryPath, 'fooDir'))
waitsFor -> spy.wasCalled
runs ->
result = watcher.search('baz')
expect(result.length).toBe(1)
expect(result[0].filePath).toBe(path.join(directoryPath, 'bazDir', 'baz.md'))
it 'watches adding a file', ->
spy = jasmine.createSpy()
watcher.on 'update', spy
fs.writeFileSync(path.join(directoryPath, 'note.md'), 'hello world')
waitsFor -> spy.wasCalled
it 'watches changing a file', ->
spy = jasmine.createSpy()
watcher.on 'update', spy
filePath = path.join(directoryPath, 'note.md')
fs.writeFileSync(filePath, 'hello world')
waitsFor -> spy.callCount == 1
runs -> fs.writeFileSync(filePath, 'hello world 2')
waitsFor -> spy.callCount == 2
it 'watches removing a file', ->
spy = jasmine.createSpy()
watcher.on('update', spy)
filePath = path.join(directoryPath, 'note.md')
fs.writeFileSync(filePath, 'hello world')
waitsFor -> spy.callCount == 1
runs -> fs.unlinkSync(filePath)
waitsFor -> spy.callCount == 2
it 'searches', ->
result = watcher.search('programming')
expect(result.length).toBe(1)
expect(result[0].title).toBe('foo')
it 'saves and loads', ->
watcher.save()
watcher.close()
watcher = new NoteWatcher(directoryPath)
spy = jasmine.createSpy()
watcher.on 'ready', spy
waitsFor -> spy.wasCalled
runs ->
result = watcher.search('programming')
expect(result.length).toBe(1)
expect(result[0].title).toBe('foo')
it 'loads the modified contents correctly', ->
watcher.save()
watcher.close()
# create, change, and delete
fs.writeFileSync(path.join(directoryPath, 'baz.md'), 'A common name for the foobar, also foobaz.')
fs.writeFileSync(path.join(directoryPath, 'foo.md'), 'The etymology of foo is obscure.')
fs.unlinkSync(path.join(directoryPath, 'bar.md'))
watcher = new NoteWatcher(directoryPath)
spy = jasmine.createSpy()
watcher.on('ready', spy)
waitsFor -> spy.wasCalled
runs ->
# in deleted foo.md
expect(watcher.search('programming').length).toBe(0)
# in replaced foo.md
expect(watcher.search('obscure').length).toBe(1)
# in bar.md
expect(watcher.search('connection').length).toBe(0)
# in baz.md
expect(watcher.search('baz').length).toBe(1)