Skip to content
This repository was archived by the owner on Jul 8, 2023. It is now read-only.

Commit 1d4116b

Browse files
committed
Improved tests.
1 parent b0721b8 commit 1d4116b

File tree

3 files changed

+119
-70
lines changed

3 files changed

+119
-70
lines changed

lib/CouchBuilder.js

Lines changed: 17 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/CouchBuilder.coffee

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,36 @@
11
path = require 'path'
22
Promise = require 'bluebird'
3-
readdirp = require 'readdirp'
43

54
module.exports = class CouchBuilder
65

7-
constructor: (@handlers = []) ->
6+
constructor: (@handlers = [], @_readdirp = require 'readdirp') ->
87

98
build: (root) -> new Promise (resolve, reject) =>
109
closeError = null
1110
entries = []
1211

13-
stream = readdirp root: root, entryType: 'files'
12+
stream = @_readdirp root: root, entryType: 'files'
1413

1514
stream.on 'data', (entry) ->
1615
entries.push entry
1716

1817
return
1918

20-
stream.on 'warn', (error) ->
21-
closeError = error
22-
stream.destroy()
19+
stream.on 'end', =>
20+
@_processEntries entries
21+
.then (result) -> return resolve result
22+
.catch (error) -> return reject error
2323

2424
return
2525

26-
stream.on 'error', (error) ->
27-
return reject error
28-
29-
stream.on 'end', =>
30-
@_processEntries entries
31-
.then (result) ->
32-
return resolve result
26+
stream.on 'warn', (error) ->
27+
closeError = error
28+
stream.destroy()
3329

3430
return
3531

36-
stream.on 'close', ->
37-
return reject closeError
32+
stream.on 'close', -> return reject closeError
33+
stream.on 'error', (error) -> return reject error
3834

3935
return
4036

@@ -58,6 +54,7 @@ module.exports = class CouchBuilder
5854
@_set result, atoms, results[i][1].toString()
5955

6056
return resolve result
57+
.catch (error) -> return reject error
6158

6259
return
6360

@@ -66,10 +63,9 @@ module.exports = class CouchBuilder
6663

6764
Promise.all(handler filePath for handler in @handlers)
6865
.then (results) ->
69-
for result in results when result?
70-
return resolve result
71-
66+
return resolve result for result in results when result?
7267
return resolve null
68+
.catch (error) -> return reject error
7369

7470
return
7571

test/suite/CouchBuilder.spec.coffee

Lines changed: 88 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -7,43 +7,91 @@ CouchBuilder = require '../../src/CouchBuilder'
77
describe 'CouchBuilder', ->
88

99
beforeEach ->
10-
@handlers = [
11-
(filePath) -> new Promise (resolve, reject) ->
12-
return resolve null unless path.basename(filePath).match /^file-a/
13-
14-
fs.readFile filePath, (error, data) ->
15-
return reject error if error
16-
17-
resolve [path.basename(filePath), "(handler a) #{data.toString()}"]
18-
19-
(filePath) -> new Promise (resolve, reject) ->
20-
return resolve null unless path.basename(filePath).match /^file-b/
21-
22-
fs.readFile filePath, (error, data) ->
23-
return reject error if error
24-
25-
resolve [path.basename(filePath), "(handler b) #{data.toString()}"]
26-
]
27-
@subject = new CouchBuilder @handlers
28-
29-
it 'builds a result using the correct handlers', ->
30-
filePath = "#{__dirname}/../fixture/tree"
31-
expected =
32-
'directory-a':
33-
'directory-a-a':
34-
'file-a-a-a': '(handler a) a-a-a\n'
35-
'file-a-a-b': '(handler a) a-a-b\n'
36-
'directory-a-b':
37-
'file-a-b-a': '(handler a) a-b-a\n'
38-
'file-a-b-b': '(handler a) a-b-b\n'
39-
'file-a-a': '(handler a) a-a\n'
40-
'file-a-b': '(handler a) a-b\n'
41-
'directory-b':
42-
'file-b-a': '(handler b) b-a\n'
43-
'file-b-b': '(handler b) b-b\n'
44-
'file-a': '(handler a) a\n'
45-
'file-b': '(handler b) b\n'
46-
47-
return @subject.build filePath
48-
.then (actual) ->
49-
assert.deepEqual actual, expected
10+
@handlerA = (filePath) -> new Promise (resolve, reject) ->
11+
return resolve null unless path.basename(filePath).match /^file-a/
12+
13+
fs.readFile filePath, (error, data) ->
14+
return reject error if error
15+
16+
resolve [path.basename(filePath), "(handler a) #{data.toString()}"]
17+
18+
@handlerB = (filePath) -> new Promise (resolve, reject) ->
19+
return resolve null unless path.basename(filePath).match /^file-b/
20+
21+
fs.readFile filePath, (error, data) ->
22+
return reject error if error
23+
24+
resolve [path.basename(filePath), "(handler b) #{data.toString()}"]
25+
26+
@filePath = "#{__dirname}/../fixture/tree"
27+
28+
describe 'under normal conditions', ->
29+
30+
beforeEach ->
31+
@subject = new CouchBuilder [@handlerA, @handlerB]
32+
33+
it 'builds a result using the correct handlers', ->
34+
expected =
35+
'directory-a':
36+
'directory-a-a':
37+
'file-a-a-a': '(handler a) a-a-a\n'
38+
'file-a-a-b': '(handler a) a-a-b\n'
39+
'directory-a-b':
40+
'file-a-b-a': '(handler a) a-b-a\n'
41+
'file-a-b-b': '(handler a) a-b-b\n'
42+
'file-a-a': '(handler a) a-a\n'
43+
'file-a-b': '(handler a) a-b\n'
44+
'directory-b':
45+
'file-b-a': '(handler b) b-a\n'
46+
'file-b-b': '(handler b) b-b\n'
47+
'file-a': '(handler a) a\n'
48+
'file-b': '(handler b) b\n'
49+
50+
return @subject.build @filePath
51+
.then (actual) ->
52+
assert.deepEqual actual, expected
53+
54+
describe 'under handler error conditions', ->
55+
56+
beforeEach ->
57+
@error = 'error'
58+
@handlerX = (filePath) => new Promise (resolve, reject) =>
59+
return reject @error
60+
@subject = new CouchBuilder [@handlerA, @handlerX]
61+
62+
it 'handles the handler error', ->
63+
return @subject.build @filePath
64+
.catch (actual) =>
65+
assert.deepEqual actual, @error
66+
67+
describe 'under file tree traversal error conditions', ->
68+
69+
beforeEach ->
70+
@streamHandlers = {}
71+
@stream =
72+
on: (event, handler) => @streamHandlers[event] = handler
73+
destroy: => @streamHandlers.close()
74+
@readdirp = sinon.stub()
75+
@readdirp.returns @stream
76+
77+
@subject = new CouchBuilder [], @readdirp
78+
79+
it 'handles warnings', ->
80+
expected = 'warning'
81+
promise = @subject.build 'filePath'
82+
.catch (actual) ->
83+
assert.strictEqual actual, expected
84+
85+
@streamHandlers.warn expected
86+
87+
return promise
88+
89+
it 'handles errors', ->
90+
expected = 'error'
91+
promise = @subject.build 'filePath'
92+
.catch (actual) ->
93+
assert.strictEqual actual, expected
94+
95+
@streamHandlers.error expected
96+
97+
return promise

0 commit comments

Comments
 (0)