-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfruit-picker.spec.js
More file actions
122 lines (104 loc) · 2.8 KB
/
Copy pathfruit-picker.spec.js
File metadata and controls
122 lines (104 loc) · 2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// @ts-check
import {
purchaseInventoryIfAvailable,
isServiceOnline,
pickAndPurchaseFruit,
pickFruit,
} from './fruit-picker';
import {
setStatus,
resetStatus,
setResponse,
getLastQuery,
resetQuery,
} from './grocer';
describe('service status', () => {
beforeEach(() => {
resetStatus();
});
test('returns the initial status of the service', () => {
expect(isServiceOnline()).toBe(false);
});
test('returns the status when service is online', () => {
setStatus('ONLINE');
expect(isServiceOnline()).toBe(true);
});
});
describe('inventory service', () => {
beforeEach(() => {
resetQuery();
});
test('uses the query format', () => {
pickFruit('strawberry', 5, () => {});
expect(getLastQuery()).toEqual({
variety: 'strawberry',
quantity: 5,
});
});
test('takes parameters for the query', () => {
pickFruit('blueberry', 20, () => {});
expect(getLastQuery()).toEqual({
variety: 'blueberry',
quantity: 20,
});
});
test('returns synchronously', () => {
setResponse(true);
expect(pickFruit('melon', 1, (res) => res)).toBe(true);
});
test('returns the inventory status', () => {
setResponse(null, false);
expect(pickFruit('melon', 1, (err, isAvailable) => isAvailable)).toBe(
false
);
});
});
describe('inventory result callback', () => {
test('throws error if receives inventory error', () => {
expect(() => {
purchaseInventoryIfAvailable('inventory error');
}).toThrow();
});
test('returns "PURCHASE" when inventory is available', () => {
expect(purchaseInventoryIfAvailable(null, { quantityAvailable: 4 })).toBe(
'PURCHASE'
);
});
test('returns "NOOP" when inventory is unavailable', () => {
expect(purchaseInventoryIfAvailable(null, false)).toBe('NOOP');
});
});
describe('putting it together', () => {
beforeEach(() => {
resetQuery();
});
test('uses the query format', () => {
setResponse(null, true);
pickAndPurchaseFruit('jackfruit', 15);
expect(getLastQuery()).toEqual({
variety: 'jackfruit',
quantity: 15,
});
});
test('takes parameters for the query', () => {
setResponse(null, true);
pickAndPurchaseFruit('raspberry', 30);
expect(getLastQuery()).toEqual({
variety: 'raspberry',
quantity: 30,
});
});
test('throws error if receives inventory error', () => {
expect(() => {
pickAndPurchaseFruit('honeydew', 3);
}).toThrow();
});
test('returns "NOOP" if quantity not available', () => {
setResponse(null, false);
expect(pickAndPurchaseFruit('apples', 12)).toBe('NOOP');
});
test('returns "PURCHASE" if quantity available', () => {
setResponse(null, { quantityAvailable: 23 });
expect(pickAndPurchaseFruit('oranges', 22)).toBe('PURCHASE');
});
});