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= |