Skip to content

Commit 84948c5

Browse files
committed
first test
1 parent 34e2ae4 commit 84948c5

File tree

2 files changed

+29
-137
lines changed

2 files changed

+29
-137
lines changed

src/retrier.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,11 @@ const createRetrierFn = function (fn, curve) {
4949

5050
const recurse = function (resolve, reject) {
5151
return fn(...args).then(resolve).catch(function (err) {
52-
let timeout = curve(err, ++attempt)
53-
if (timeout < 0) return reject(err)
52+
let timeout
53+
5454
try {
55-
if (err <= 0) return recurse(resolve, reject)
55+
timeout = curve(err, ++attempt)
56+
if (timeout <= 0) return recurse(resolve, reject)
5657
return setTimeout(recurse, timeout, resolve, reject)
5758
} catch (_err) {
5859
return reject(_err)
@@ -65,3 +66,4 @@ const createRetrierFn = function (fn, curve) {
6566
}
6667

6768
module.exports.createRetrierFn = createRetrierFn
69+
module.exports.retry = createRetrierFn

test/retrier.js

Lines changed: 24 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
const test = require('ava')
2-
const {
3-
createLinear,
4-
createExponential,
5-
createRetrierFn,
6-
} = require('../src/retrier')
2+
const { createRetrierFn } = require('../src/retrier')
73

84
test('createRetrierFn - retries async errors with delay', async function (t) {
9-
const sleep = x => new Promise(r => setTimeout(r, x))
5+
const sleep = ms => new Promise(r => setTimeout(r, ms))
106

117
/**
128
* Given 'i', create function that will return a promise
@@ -22,146 +18,40 @@ test('createRetrierFn - retries async errors with delay', async function (t) {
2218
i--
2319
throw new Error(i)
2420
}
25-
return true
26-
}
27-
}
28-
29-
// Will retry three times.
30-
const succeeder = createRetrierFn(createFailer(2), () => 15, 3)
31-
t.true(typeof succeeder === 'function')
32-
33-
const start = new Date().getTime()
34-
const success = await succeeder()
35-
t.true(success)
36-
t.true(new Date().getTime() - start >= 30)
3721

38-
const failer = createRetrierFn(createFailer(4), 2)
39-
t.true(typeof succeeder === 'function')
40-
41-
let failure
42-
try {
43-
failure = await failer()
44-
} catch ({ message }) {
45-
failure = +message // Coerce.
22+
return i
23+
}
4624
}
4725

48-
t.true(failure === 2)
49-
})
50-
51-
test('createRetrierFn - retries sync errors', async function (t) {
52-
const responses = [
53-
new Error('fail'),
54-
true,
55-
]
26+
// NOTE: This serves as an example of a curve function.
27+
const createCurve = function (limit, ms) {
28+
const curve = function (err, count) {
29+
if (count > limit) throw err
30+
return ms
31+
}
5632

57-
function failOnce() {
58-
const response = responses.shift()
59-
if (response instanceof Error) throw response
60-
return response
33+
return curve
6134
}
6235

63-
const fn = createRetrierFn(failOnce, 2)
64-
t.true(await fn())
65-
})
66-
67-
test('createRetrierFn - allows opt out of retries', async function (t) {
68-
const shouldRetry = () => false
69-
const responses = [
70-
new Error('fail'),
71-
true,
72-
]
36+
const succeeder = createRetrierFn(createFailer(2), createCurve(3, 200))
37+
t.true(typeof succeeder === 'function')
7338

74-
function failOnce() {
75-
const response = responses.shift()
76-
if (response instanceof Error) throw response
77-
return response
78-
}
39+
const ts = new Date().getTime()
7940

80-
const fn = createRetrierFn(failOnce, 2, undefined, shouldRetry)
81-
try {
82-
await fn()
83-
t.fail()
84-
} catch (error) {
85-
t.pass()
86-
}
87-
})
41+
const success = await succeeder()
42+
t.true(success === 0)
43+
t.true((new Date().getTime() - ts) >= 400)
8844

89-
test('createRetrierFn - allows indefinite retries', async function (t) {
90-
const responses = [
91-
new Error('fail'),
92-
new Error('fail'),
93-
new Error('fail'),
94-
new Error('fail'),
95-
true,
96-
]
45+
const failer = createRetrierFn(createFailer(5), createCurve(2, 200))
46+
t.true(typeof failer === 'function')
9747

98-
function failMany() {
99-
const response = responses.shift()
100-
if (response instanceof Error) throw response
101-
return response
102-
}
48+
let value
10349

104-
const fn = createRetrierFn(failMany, 0, 0)
10550
try {
106-
await fn()
107-
t.pass()
108-
} catch (error) {
109-
t.fail()
110-
}
111-
})
112-
113-
test('createRetrierFn - supports curves', async function (t) {
114-
const sleep = x => new Promise(r => setTimeout(r, x))
115-
116-
const cache = []
117-
const createFn = function () {
118-
let failed = false
119-
120-
const fn = async function (value) {
121-
await sleep(100)
122-
cache.push(value)
123-
124-
if (!failed) {
125-
failed = true
126-
throw new Error('')
127-
}
128-
129-
return value
130-
}
131-
132-
return fn
133-
}
134-
135-
let f = createFn()
136-
let fn = createRetrierFn(f, 2)
137-
138-
t.true(await fn('x') === 'x')
139-
t.true(cache.length === 2)
140-
141-
cache.length = 0
142-
f = createFn()
143-
fn = createRetrierFn(f, x => x, 2)
144-
145-
t.true(await fn('x') === 'x')
146-
t.true(cache.length === 2)
147-
})
148-
149-
test('createRetrierFn - and inbuilt curves', async function (t) {
150-
const range = function* (len) {
151-
let count = 0
152-
while (count < len) {
153-
yield count
154-
count++
155-
}
51+
await failer()
52+
} catch ({ message }) {
53+
value = +message // Coerce.
15654
}
15755

158-
let fx = createLinear({ m: 2, b: 0 })
159-
t.deepEqual([...range(4)].map(fx), [0, 2, 4, 6])
160-
161-
fx = createExponential({ a: 2, b: 1 }, 1)
162-
t.deepEqual([...range(6)].map(fx), [1, 2, 4, 8, 16, 32])
163-
164-
fx = createExponential({ a: 2, b: 1 }, 1000)
165-
t.deepEqual([...range(6)].map(fx), [1000, 2000, 4000, 8000, 16000, 32000])
56+
t.true(value === 2)
16657
})
167-

0 commit comments

Comments
 (0)