| 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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 |
1
1
1
8
1
1
1
1
1
1
1
8
8
8
1
1
4
1
4
8
4
4
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
1
1
1
1
1
1
| "use strict";
var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; };
var _prototypeProperties = function (child, staticProps, instanceProps) { Iif (staticProps) Object.defineProperties(child, staticProps); Eif (instanceProps) Object.defineProperties(child.prototype, instanceProps); };
var _inherits = function (subClass, superClass) { Iif (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) subClass.__proto__ = superClass; };
var _classCallCheck = function (instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
var _Flux = require("../Flux");
var Flux = _Flux.Flux;
var Actions = _Flux.Actions;
var sinon = _interopRequire(require("sinon"));
describe("Actions", function () {
var TestActions = (function (Actions) {
function TestActions() {
_classCallCheck(this, TestActions);
Eif (Actions != null) {
Actions.apply(this, arguments);
}
}
_inherits(TestActions, Actions);
_prototypeProperties(TestActions, null, {
getFoo: {
value: function getFoo() {
return { foo: "bar" };
},
writable: true,
configurable: true
},
getBar: {
value: function getBar() {
return { bar: "baz" };
},
writable: true,
configurable: true
},
getBaz: {
value: function getBaz() {
return;
},
writable: true,
configurable: true
},
asyncAction: {
value: function asyncAction(returnValue) {
return regeneratorRuntime.async(function asyncAction$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
return context$3$0.abrupt("return", returnValue);
case 1:
case "end":
return context$3$0.stop();
}
}, null, this);
},
writable: true,
configurable: true
},
badAsyncAction: {
value: function badAsyncAction() {
return Promise.reject(new Error("some error"));
},
writable: true,
configurable: true
}
});
return TestActions;
})(Actions);
describe("#getActionIds / #getConstants", function () {
it("returns strings corresponding to action method names", function () {
var actions = new TestActions();
var actionIds = actions.getActionIds();
expect(actionIds.getFoo).to.be.a("string");
expect(actionIds.getBar).to.be.a("string");
expect(actionIds.getFoo).to.be.a("string");
expect(actionIds.getBar).to.be.a("string");
});
});
describe("#[methodName]", function () {
it("calls Flux dispatcher", function () {
var actions = new TestActions();
// Attach mock flux instance
var dispatch = sinon.spy();
actions.dispatch = dispatch;
actions.getFoo();
expect(dispatch.firstCall.args[1]).to.deep.equal({ foo: "bar" });
});
it("warns if actions have not been added to a Flux instance", function () {
var actions = new TestActions();
var warn = sinon.spy(console, "warn");
actions.getFoo();
expect(warn.firstCall.args[0]).to.equal("You've attempted to perform the action TestActions#getFoo, but it " + "hasn't been added to a Flux instance.");
actions.asyncAction();
expect(warn.secondCall.args[0]).to.equal("You've attempted to perform the asynchronous action " + "TestActions#asyncAction, but it hasn't been added " + "to a Flux instance.");
console.warn.restore();
});
it("sends return value to Flux dispatch", function () {
var actions = new TestActions();
var actionId = actions.getActionIds().getFoo;
var dispatch = sinon.spy();
actions.dispatch = dispatch;
actions.getFoo();
expect(dispatch.firstCall.args[0]).to.equal(actionId);
expect(dispatch.firstCall.args[1]).to.deep.equal({ foo: "bar" });
});
it("send async return value to Flux#dispatchAsync", function callee$2$0() {
var actions, actionId, dispatch, response;
return regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
actions = new TestActions();
actionId = actions.getActionIds().asyncAction;
dispatch = sinon.stub().returns(Promise.resolve());
actions.dispatchAsync = dispatch;
response = actions.asyncAction("foobar");
expect(response.then).to.be.a("function");
context$3$0.next = 8;
return response;
case 8:
expect(dispatch.firstCall.args[0]).to.equal(actionId);
expect(dispatch.firstCall.args[1]).to.be.an.instanceOf(Promise);
case 10:
case "end":
return context$3$0.stop();
}
}, null, this);
});
it("skips disptach if return value is undefined", function () {
var actions = new TestActions();
var dispatch = sinon.spy();
actions.dispatch = dispatch;
actions.getBaz();
expect(dispatch.called).to.be["false"];
});
it("does not skip async dispatch, even if resolved value is undefined", function () {
var actions = new TestActions();
var dispatch = sinon.spy();
actions.dispatchAsync = dispatch;
actions.asyncAction(undefined);
expect(dispatch.called).to.be["true"];
});
it("returns value from wrapped action", function callee$2$1() {
var flux, actions;
return regeneratorRuntime.async(function callee$2$1$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
flux = new Flux();
actions = flux.createActions("test", TestActions);
expect(actions.getFoo()).to.deep.equal({ foo: "bar" });
context$3$0.next = 5;
return expect(actions.asyncAction("async result")).to.eventually.equal("async result");
case 5:
case "end":
return context$3$0.stop();
}
}, null, this);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vQWN0aW9ucy10ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7b0JBQThCLFNBQVM7O0lBQTlCLElBQUksU0FBSixJQUFJO0lBQUUsT0FBTyxTQUFQLE9BQU87SUFDZixLQUFLLDJCQUFNLE9BQU87O0FBRXpCLFFBQVEsQ0FBQyxTQUFTLEVBQUUsWUFBTTtNQUVsQixXQUFXLGNBQVMsT0FBTzthQUEzQixXQUFXOzRCQUFYLFdBQVc7O1VBQVMsT0FBTztBQUFQLGVBQU87Ozs7Y0FBM0IsV0FBVyxFQUFTLE9BQU87O3lCQUEzQixXQUFXO0FBQ2YsWUFBTTtlQUFBLGtCQUFHO0FBQ1AsaUJBQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDdkI7Ozs7QUFFRCxZQUFNO2VBQUEsa0JBQUc7QUFDUCxpQkFBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUN2Qjs7OztBQUVELFlBQU07ZUFBQSxrQkFBRztBQUNQLGlCQUFPO1NBQ1I7Ozs7QUFFSyxpQkFBVztlQUFBLHFCQUFDLFdBQVc7Ozs7b0RBQ3BCLFdBQVc7Ozs7OztTQUNuQjs7OztBQUVELG9CQUFjO2VBQUEsMEJBQUc7QUFDZixpQkFBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7U0FDaEQ7Ozs7OztXQW5CRyxXQUFXO0tBQVMsT0FBTzs7QUFzQmpDLFVBQVEsQ0FBQywrQkFBK0IsRUFBRSxZQUFNO0FBQzlDLE1BQUUsQ0FBQyxzREFBc0QsRUFBRSxZQUFNO0FBQy9ELFVBQUksT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7O0FBRWhDLFVBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7QUFFdkMsWUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMs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O0FBQzNCLGFBQU8sQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDOztBQUVqQyxhQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDOztBQUUvQixZQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQUssQ0FBQztLQUNwQyxDQUFDLENBQUM7O0FBRUgsTUFBRSxDQUFDLG1DQUFtQyxFQUFFO1VBQ2xDLElBQUksRUFDSixPQUFPOzs7O0FBRFAsZ0JBQUksR0FBRyxJQUFJLElBQUksRUFBRTtBQUNqQixtQkFBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQzs7O0FBRXJELGtCQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzs7bUJBQ2pELE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQzlDLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQzs7Ozs7O0tBQ3ZDLENBQUMsQ0FBQztHQUVKLENBQUMsQ0FBQztDQUVKLENBQUMsQ0FBQyIsImZpbGUiOiJzcmMvX190ZXN0c19fL0FjdGlvbnMtdGVzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsdXgsIEFjdGlvbnMgfSBmcm9tICcuLi9GbHV4JztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cbmRlc2NyaWJlKCdBY3Rpb25zJywgKCkgPT4ge1xuXG4gIGNsYXNzIFRlc3RBY3Rpb25zIGV4dGVuZHMgQWN0aW9ucyB7XG4gICAgZ2V0Rm9vKCkge1xuICAgICAgcmV0dXJuIHsgZm9vOiAnYmFyJyB9O1xuICAgIH1cblxuICAgIGdldEJhcigpIHtcbiAgICAgIHJldHVybiB7IGJhcjogJ2JheicgfTtcbiAgICB9XG5cbiAgICBnZXRCYXooKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXN5bmMgYXN5bmNBY3Rpb24ocmV0dXJuVmFsdWUpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG5cbiAgICBiYWRBc3luY0FjdGlvbigpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ3NvbWUgZXJyb3InKSk7XG4gICAgfVxuICB9XG5cbiAgZGVzY3JpYmUoJyNnZXRBY3Rpb25JZHMgLyAjZ2V0Q29uc3RhbnRzJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHN0cmluZ3MgY29ycmVzcG9uZGluZyB0byBhY3Rpb24gbWV0aG9kIG5hbWVzJywgKCkgPT4ge1xuICAgICAgbGV0IGFjdGlvbnMgPSBuZXcgVGVzdEFjdGlvbnMoKTtcblxuICAgICAgbGV0IGFjdGlvbklkcyA9IGFjdGlvbnMuZ2V0QWN0aW9uSWRzKCk7XG5cbiAgICAgIGV4cGVjdChhY3Rpb25JZHMuZ2V0Rm9vKS50by5iZS5hKCdzdHJpbmcnKTtcbiAgICAgIGV4cGVjdChhY3Rpb25JZHMuZ2V0QmFyKS50by5iZS5hKCdzdHJpbmcnKTtcblxuICAgICAgZXhwZWN0KGFjdGlvbklkcy5nZXRGb28pLnRvLmJlLmEoJ3N0cmluZycpO1xuICAgICAgZXhwZWN0KGFjdGlvbklkcy5nZXRCYXIpLnRvLmJlLmEoJ3N0cmluZycpO1xuICAgIH0pO1xuXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjW21ldGhvZE5hbWVdJywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyBGbHV4IGRpc3BhdGNoZXInLCAoKSA9PiB7XG4gICAgICBsZXQgYWN0aW9ucyA9IG5ldyBUZXN0QWN0aW9ucygpO1xuXG4gICAgICAvLyBBdHRhY2ggbW9jayBmbHV4IGluc3RhbmNlXG4gICAgICBsZXQgZGlzcGF0Y2ggPSBzaW5vbi5zcHkoKTtcbiAgICAgIGFjdGlvbnMuZGlzcGF0Y2ggPSBkaXNwYXRjaDtcblxuICAgICAgYWN0aW9ucy5nZXRGb28oKTtcbiAgICAgIGV4cGVjdChkaXNwYXRjaC5maXJzdENhbGwuYXJnc1sxXSkudG8uZGVlcC5lcXVhbCh7IGZvbzogJ2JhcicgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2FybnMgaWYgYWN0aW9ucyBoYXZlIG5vdCBiZWVuIGFkZGVkIHRvIGEgRmx1eCBpbnN0YW5jZScsICgpID0+IHtcbiAgICAgIGxldCBhY3Rpb25zID0gbmV3IFRlc3RBY3Rpb25zKCk7XG4gICAgICBsZXQgd2FybiA9IHNpbm9uLnNweShjb25zb2xlLCAnd2FybicpO1xuXG4gICAgICBhY3Rpb25zLmdldEZvbygpO1xuXG4gICAgICBleHBlY3Qod2Fybi5maXJzdENhbGwuYXJnc1swXSkudG8uZXF1YWwoXG4gICAgICAgICdZb3VcXCd2ZSBhdHRlbXB0ZWQgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIFRlc3RBY3Rpb25zI2dldEZvbywgYnV0IGl0ICdcbiAgICAgICsgJ2hhc25cXCd0IGJlZW4gYWRkZWQgdG8gYSBGbHV4IGluc3RhbmNlLidcbiAgICAgICk7XG5cbiAgICAgIGFjdGlvbnMuYXN5bmNBY3Rpb24oKTtcblxuICAgICAgZXhwZWN0KHdhcm4uc2Vjb25kQ2FsbC5hcmdzWzBdKS50by5lcXVhbChcbiAgICAgICAgYFlvdSd2ZSBhdHRlbXB0ZWQgdG8gcGVyZm9ybSB0aGUgYXN5bmNocm9ub3VzIGFjdGlvbiBgXG4gICAgICArIGBUZXN0QWN0aW9ucyNhc3luY0FjdGlvbiwgYnV0IGl0IGhhc24ndCBiZWVuIGFkZGVkIGBcbiAgICAgICsgYHRvIGEgRmx1eCBpbnN0YW5jZS5gXG4gICAgICApO1xuXG4gICAgICBjb25zb2xlLndhcm4ucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NlbmRzIHJldHVybiB2YWx1ZSB0byBGbHV4IGRpc3BhdGNoJywgKCkgPT4ge1xuICAgICAgbGV0IGFjdGlvbnMgPSBuZXcgVGVzdEFjdGlvbnMoKTtcbiAgICAgIGxldCBhY3Rpb25JZCA9IGFjdGlvbnMuZ2V0QWN0aW9uSWRzKCkuZ2V0Rm9vO1xuICAgICAgbGV0IGRpc3BhdGNoID0gc2lub24uc3B5KCk7XG4gICAgICBhY3Rpb25zLmRpc3BhdGNoID0gZGlzcGF0Y2g7XG5cbiAgICAgIGFjdGlvbnMuZ2V0Rm9vKCk7XG5cbiAgICAgIGV4cGVjdChkaXNwYXRjaC5maXJzdENhbGwuYXJnc1swXSkudG8uZXF1YWwoYWN0aW9uSWQpO1xuICAgICAgZXhwZWN0KGRpc3BhdGNoLmZpcnN0Q2FsbC5hcmdzWzFdKS50by5kZWVwLmVxdWFsKHsgZm9vOiAnYmFyJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzZW5kIGFzeW5jIHJldHVybiB2YWx1ZSB0byBGbHV4I2Rpc3BhdGNoQXN5bmMnLCBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAgIGxldCBhY3Rpb25zID0gbmV3IFRlc3RBY3Rpb25zKCk7XG4gICAgICBsZXQgYWN0aW9uSWQgPSBhY3Rpb25zLmdldEFjdGlvbklkcygpLmFzeW5jQWN0aW9uO1xuICAgICAgbGV0IGRpc3BhdGNoID0gc2lub24uc3R1YigpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCkpO1xuICAgICAgYWN0aW9ucy5kaXNwYXRjaEFzeW5jID0gZGlzcGF0Y2g7XG5cbiAgICAgIGxldCByZXNwb25zZSA9IGFjdGlvbnMuYXN5bmNBY3Rpb24oJ2Zvb2JhcicpO1xuXG4gICAgICBleHBlY3QocmVzcG9uc2UudGhlbikudG8uYmUuYSgnZnVuY3Rpb24nKTtcblxuICAgICAgYXdhaXQgcmVzcG9uc2U7XG5cbiAgICAgIGV4cGVjdChkaXNwYXRjaC5maXJzdENhbGwuYXJnc1swXSkudG8uZXF1YWwoYWN0aW9uSWQpO1xuICAgICAgZXhwZWN0KGRpc3BhdGNoLmZpcnN0Q2FsbC5hcmdzWzFdKS50by5iZS5hbi5pbnN0YW5jZU9mKFByb21pc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NraXBzIGRpc3B0YWNoIGlmIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBsZXQgYWN0aW9ucyA9IG5ldyBUZXN0QWN0aW9ucygpO1xuICAgICAgbGV0IGRpc3BhdGNoID0gc2lub24uc3B5KCk7XG4gICAgICBhY3Rpb25zLmRpc3BhdGNoID0gZGlzcGF0Y2g7XG5cbiAgICAgIGFjdGlvbnMuZ2V0QmF6KCk7XG5cbiAgICAgIGV4cGVjdChkaXNwYXRjaC5jYWxsZWQpLnRvLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHNraXAgYXN5bmMgZGlzcGF0Y2gsIGV2ZW4gaWYgcmVzb2x2ZWQgdmFsdWUgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgbGV0IGFjdGlvbnMgPSBuZXcgVGVzdEFjdGlvbnMoKTtcbiAgICAgIGxldCBkaXNwYXRjaCA9IHNpbm9uLnNweSgpO1xuICAgICAgYWN0aW9ucy5kaXNwYXRjaEFzeW5jID0gZGlzcGF0Y2g7XG5cbiAgICAgIGFjdGlvbnMuYXN5bmNBY3Rpb24odW5kZWZpbmVkKTtcblxuICAgICAgZXhwZWN0KGRpc3BhdGNoLmNhbGxlZCkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIHZhbHVlIGZyb20gd3JhcHBlZCBhY3Rpb24nLCBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAgIGxldCBmbHV4ID0gbmV3IEZsdXgoKTtcbiAgICAgIGxldCBhY3Rpb25zID0gZmx1eC5jcmVhdGVBY3Rpb25zKCd0ZXN0JywgVGVzdEFjdGlvbnMpO1xuXG4gICAgICBleHBlY3QoYWN0aW9ucy5nZXRGb28oKSkudG8uZGVlcC5lcXVhbCh7IGZvbzogJ2JhcicgfSk7XG4gICAgICBhd2FpdCBleHBlY3QoYWN0aW9ucy5hc3luY0FjdGlvbignYXN5bmMgcmVzdWx0JykpXG4gICAgICAgIC50by5ldmVudHVhbGx5LmVxdWFsKCdhc3luYyByZXN1bHQnKTtcbiAgICB9KTtcblxuICB9KTtcblxufSk7XG4iXX0= |