diff options
| author | Christophe Matthieu <chm@odoo.com> | 2018-09-10 10:26:45 +0200 |
|---|---|---|
| committer | Christophe Matthieu <chm@odoo.com> | 2018-09-10 16:36:43 +0200 |
| commit | dabe5bfbae10de983bd1cbdba38949f17a62562e (patch) | |
| tree | 94731f1082ec869af188a805007bf9409274a4b4 /addons/web/static/tests/core/widget_tests.js | |
| parent | 1199451606cab7342e34fc9c41a2085b8beb1243 (diff) | |
[FIX] web: ajax must return a promise with abort method
Remove part in service_mixins who hide this error. Queries must be able
to be canceled for better performance. Also in the case of longpolling,
if the request is not canceled, wait for a server message or the maximum
time (30 sec) to add or delete channels.
Diffstat (limited to 'addons/web/static/tests/core/widget_tests.js')
| -rw-r--r-- | addons/web/static/tests/core/widget_tests.js | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/addons/web/static/tests/core/widget_tests.js b/addons/web/static/tests/core/widget_tests.js index 19e72cb97b6..9510079e380 100644 --- a/addons/web/static/tests/core/widget_tests.js +++ b/addons/web/static/tests/core/widget_tests.js @@ -1,10 +1,12 @@ odoo.define('web.widget_tests', function (require) { "use strict"; +var AjaxService = require('web.AjaxService'); var concurrency = require('web.concurrency'); var core = require('web.core'); var QWeb = require('web.QWeb'); var Widget = require('web.Widget'); +var testUtils = require('web.test_utils'); QUnit.module('core', {}, function () { @@ -377,16 +379,47 @@ QUnit.module('core', {}, function () { }); QUnit.test("calling _rpc on destroyed widgets", function (assert) { - assert.expect(1); + assert.expect(3); + + var def; + var parent = new Widget(); + testUtils.addMockEnvironment(parent, { + session: { + rpc: function () { + def = $.Deferred(); + def.abort = def.reject; + return def; + }, + }, + services: [AjaxService], + }); + var widget = new Widget(parent); + + widget._rpc({route: '/a/route'}).then(function () { + assert.ok(true, "The ajax call should be resolve"); + }); + def.resolve(); + def = null; - var widget = new Widget(); + widget._rpc({route: '/a/route'}).always(function () { + throw Error("Calling _rpc on a destroyed widget should return a " + + "deferred that is never resolved nor rejected"); + }); widget.destroy(); + def.resolve(); + def = null; + widget._rpc({route: '/a/route'}).always(function () { throw Error("Calling _rpc on a destroyed widget should return a " + "deferred that is never resolved nor rejected"); }); + assert.ok(!def, + "The trigger_up is not performed and the call returns a deferred "+ + "never resolved nor rejected"); + assert.ok(true, "there should be no crash when calling _rpc on a destroyed widget"); + parent.destroy(); }); QUnit.test('start is not called when widget is destroyed', function (assert) { |
