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