Skip to content

Commit ed0184d

Browse files
committed
Adding tests for and / or
1 parent 734be4c commit ed0184d

File tree

2 files changed

+125
-2
lines changed

2 files changed

+125
-2
lines changed

src/helper.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const or = (...conditions) => resolver => (...query) => {
1414
return new Promise((resolve, reject) => {
1515
let limit = conditions.length - 1;
1616
const attempt = (i) =>
17-
conditions[limit - i].createResolver(resolver)(...query)
17+
conditions[i].createResolver(resolver)(...query)
1818
.then(res => resolve(res))
1919
.catch(err => {
2020
if(i === limit) reject(err);

test/unit/helper_spec.js

Lines changed: 124 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { expect } from 'chai';
2+
import { stub } from 'sinon';
23

34
import {
4-
combineResolvers
5+
combineResolvers, and, or,
56
} from '../../dist/helper';
7+
import { createResolver } from '../../dist/resolver';
68

79
describe('(unit) src/helper.js', () => {
810
describe('combineResolvers', () => {
@@ -51,4 +53,125 @@ describe('(unit) src/helper.js', () => {
5153
});
5254
})
5355
});
56+
57+
describe('Conditional resolvers', () => {
58+
const conditionalErr = new Error('conditional error');
59+
const successResolver = createResolver(() => null, () => null);
60+
const failureResolver = createResolver(() => { throw conditionalErr; }, () => null);
61+
62+
describe('and', () => {
63+
it('(true, true) succeeds', () => {
64+
const resolver = and(successResolver, successResolver)(() => true);
65+
return resolver().then(res => expect(res).to.be.true);
66+
});
67+
68+
it('(false, true) throws', () => {
69+
const resolver = and(failureResolver, successResolver)(() => true);
70+
return resolver().catch(err => expect(err).to.equal(conditionalErr));
71+
});
72+
73+
it('(false, false) throws', () => {
74+
const resolver = and(failureResolver, failureResolver)(() => true);
75+
return resolver().catch(err => expect(err).to.equal(conditionalErr));
76+
});
77+
78+
it('stops evaluating resolvers after first failure', () => {
79+
const r1 = {
80+
handle: () => { throw conditionalErr },
81+
error: () => null,
82+
};
83+
84+
const r2 = {
85+
handle: () => null,
86+
error: () => null,
87+
};
88+
89+
stub(r1, 'handle', r1.handle);
90+
stub(r2, 'handle', r2.handle);
91+
92+
const resolver = or(
93+
createResolver(r1.handle, r1.error),
94+
createResolver(r2.handle, r2.error)
95+
)(() => true);
96+
return resolver().catch(err => {
97+
expect(err).to.equal(conditionalErr)
98+
expect(r1.handle.calledOnce).to.be.true;
99+
expect(r2.handle.notCalled).to.be.true;
100+
});
101+
});
102+
103+
it('only calls the result resolver once', () => {
104+
const r1 = {
105+
handle: () => true,
106+
error: () => null,
107+
};
108+
109+
stub(r1, 'handle', r1.handle);
110+
111+
const resolver = and(successResolver, successResolver)(createResolver(r1.handle, r1.error));
112+
return resolver().then(res => {
113+
expect(res).to.be.true;
114+
expect(r1.handle.calledOnce).to.be.true;
115+
});
116+
});
117+
});
118+
119+
describe('or', () => {
120+
it('(true, true) succeeds', () => {
121+
const resolver = or(successResolver, successResolver)(() => true);
122+
return resolver().then(res => expect(res).to.be.true);
123+
});
124+
125+
it('(false, true) succeeds', () => {
126+
const resolver = or(failureResolver, successResolver)(() => true);
127+
return resolver().then(res => expect(res).to.be.true);
128+
});
129+
130+
it('(false, false) throws', () => {
131+
const resolver = or(failureResolver, failureResolver)(() => true);
132+
return resolver().catch(err => expect(err).to.equal(conditionalErr));
133+
});
134+
135+
it('stops evaluating resolvers after first success', () => {
136+
const r1 = {
137+
handle: () => null,
138+
error: () => null,
139+
};
140+
141+
const r2 = {
142+
handle: () => null,
143+
error: () => null,
144+
};
145+
146+
stub(r1, 'handle', r1.handle);
147+
stub(r2, 'handle', r2.handle);
148+
149+
const resolver = or(
150+
createResolver(r1.handle, r1.error),
151+
createResolver(r2.handle, r2.error)
152+
)(() => true);
153+
return resolver().then(res => {
154+
expect(res).to.be.true;
155+
expect(r1.handle.calledOnce).to.be.true;
156+
expect(r2.handle.notCalled).to.be.true;
157+
});
158+
});
159+
160+
it('only calls the result resolver once', () => {
161+
const r1 = {
162+
handle: () => true,
163+
error: () => null,
164+
};
165+
166+
stub(r1, 'handle', r1.handle);
167+
168+
const resolver = or(failureResolver, successResolver)(createResolver(r1.handle, r1.error));
169+
return resolver().then(res => {
170+
expect(res).to.be.true;
171+
expect(r1.handle.calledOnce).to.be.true;
172+
});
173+
});
174+
});
175+
176+
});
54177
});

0 commit comments

Comments
 (0)