1 |
|
2 | import assert from 'assert'
|
3 | import sinon from 'sinon'
|
4 |
|
5 | import buffers from '../lib/buffers'
|
6 |
|
7 | var actionStub = () => {
|
8 | return { payload: 1, resolve() { } }
|
9 | }
|
10 |
|
11 | describe('buffers', () => {
|
12 |
|
13 | describe('base (unbuffered) buffer', () => {
|
14 |
|
15 | it ('should always pass puts into unreleased array', () => {
|
16 | var buffer = buffers.base()
|
17 | assert(buffer.unreleased.length === 0)
|
18 | buffer.push({})
|
19 | assert(buffer.unreleased.length === 1)
|
20 | })
|
21 |
|
22 | it ('should always shift off unreleased', () => {
|
23 | var buffer = buffers.base()
|
24 | var obj = obj
|
25 | buffer.push(obj)
|
26 | assert(buffer.unreleased.length === 1)
|
27 | assert(buffer.shift() === obj)
|
28 | assert(buffer.unreleased.length === 0)
|
29 | })
|
30 | })
|
31 |
|
32 | describe('fixed', () => {
|
33 |
|
34 | describe('when there is room', () => {
|
35 |
|
36 | it ('should immediately release', () => {
|
37 | var buffer = buffers.fixed(2)
|
38 | var action = actionStub()
|
39 | var spy = sinon.spy(action, 'resolve')
|
40 | buffer.push(action)
|
41 | assert(spy.calledWith(true))
|
42 | })
|
43 | })
|
44 |
|
45 | describe('when there is not room', () => {
|
46 |
|
47 | it ('should queue up', () => {
|
48 |
|
49 | var buffer = buffers.fixed(2)
|
50 |
|
51 |
|
52 | buffer.push(actionStub())
|
53 | buffer.push(actionStub())
|
54 |
|
55 | buffer.push(actionStub())
|
56 |
|
57 | assert(buffer.released.length === 2)
|
58 | assert(buffer.unreleased.length === 1)
|
59 |
|
60 | })
|
61 |
|
62 | it ('should release next action when buffer full and has > 1 waiting', () => {
|
63 |
|
64 | var buffer = buffers.fixed(1)
|
65 |
|
66 | buffer.push(actionStub())
|
67 | buffer.push(actionStub())
|
68 |
|
69 | assert(buffer.released.length === 1)
|
70 | assert(buffer.unreleased.length === 1)
|
71 |
|
72 | var spy = sinon.spy(buffer.unreleased[0], 'resolve')
|
73 | buffer.shift()
|
74 |
|
75 | assert(spy.called)
|
76 |
|
77 | assert(buffer.released.length === 1)
|
78 | assert(buffer.unreleased.length === 0)
|
79 | })
|
80 | })
|
81 | })
|
82 |
|
83 | describe('dropping', () => {
|
84 |
|
85 | describe('when there is room', () => {
|
86 |
|
87 | it ('should immediately release', () => {
|
88 | var buffer = buffers.dropping(2)
|
89 | var action = actionStub()
|
90 | var spy = sinon.spy(action, 'resolve')
|
91 | buffer.push(action)
|
92 | assert(spy.calledWith(true))
|
93 | })
|
94 | })
|
95 |
|
96 | describe('when there is not room', () => {
|
97 |
|
98 | it ('should resolve, drop the put and ignore it', () => {
|
99 | var buffer = buffers.dropping(2)
|
100 | buffer.push(actionStub())
|
101 | buffer.push(actionStub())
|
102 | var extra = actionStub()
|
103 | var spy = sinon.spy(extra, 'resolve')
|
104 | buffer.push(extra)
|
105 | assert(spy.called)
|
106 | assert(buffer.released.length === 2)
|
107 | })
|
108 | })
|
109 | })
|
110 |
|
111 | describe('sliding', () => {
|
112 |
|
113 | describe('when there is room', () => {
|
114 |
|
115 | it ('should immediately release', () => {
|
116 | var buffer = buffers.sliding(2)
|
117 | var action = actionStub()
|
118 | var spy = sinon.spy(action, 'resolve')
|
119 | buffer.push(action)
|
120 | assert(spy.calledWith(true))
|
121 | })
|
122 | })
|
123 |
|
124 | describe('when there is not room', () => {
|
125 |
|
126 | it ('should drop the oldest and accept the new one', () => {
|
127 | var buffer = buffers.sliding(2)
|
128 | var first = actionStub()
|
129 | buffer.push(first)
|
130 | var second = actionStub()
|
131 | buffer.push(second)
|
132 |
|
133 | assert(buffer.released[0] === first)
|
134 | assert(buffer.released[1] === second)
|
135 |
|
136 | var third = actionStub()
|
137 | var spy = sinon.spy(third, 'resolve')
|
138 | buffer.push(third)
|
139 | assert(spy.called)
|
140 |
|
141 | assert(buffer.released[0] === second)
|
142 | assert(buffer.released[1] === third)
|
143 | })
|
144 | })
|
145 | })
|
146 | })
|