odoo.define_section('class', ['web.Class'], function (test) { test('Basic class creation', function (assert, Class) { var C = Class.extend({ foo: function () { return this.somevar; } }); var i = new C(); i.somevar = 3; assert.ok(i instanceof C); assert.strictEqual(i.foo(), 3); }); test('Class initialization', function (assert, Class) { var C1 = Class.extend({ init: function () { this.foo = 3; } }); var C2 = Class.extend({ init: function (arg) { this.foo = arg; } }); var i1 = new C1(), i2 = new C2(42); assert.strictEqual(i1.foo, 3); assert.strictEqual(i2.foo, 42); }); test('Inheritance', function (assert, Class) { var C0 = Class.extend({ foo: function () { return 1; } }); var C1 = C0.extend({ foo: function () { return 1 + this._super(); } }); var C2 = C1.extend({ foo: function () { return 1 + this._super(); } }); assert.strictEqual(new C0().foo(), 1); assert.strictEqual(new C1().foo(), 2); assert.strictEqual(new C2().foo(), 3); }); test('In-place extension', function (assert, Class) { var C0 = Class.extend({ foo: function () { return 3; }, qux: function () { return 3; }, bar: 3 }); C0.include({ foo: function () { return 5; }, qux: function () { return 2 + this._super(); }, bar: 5, baz: 5 }); assert.strictEqual(new C0().bar, 5); assert.strictEqual(new C0().baz, 5); assert.strictEqual(new C0().foo(), 5); assert.strictEqual(new C0().qux(), 5); }); test('In-place extension and inheritance', function (assert, Class) { var C0 = Class.extend({ foo: function () { return 1; }, bar: function () { return 1; } }); var C1 = C0.extend({ foo: function () { return 1 + this._super(); } }); assert.strictEqual(new C1().foo(), 2); assert.strictEqual(new C1().bar(), 1); C1.include({ foo: function () { return 2 + this._super(); }, bar: function () { return 1 + this._super(); } }); assert.strictEqual(new C1().foo(), 4); assert.strictEqual(new C1().bar(), 2); }); test('In-place extensions alter existing instances', function (assert, Class) { var C0 = Class.extend({ foo: function () { return 1; }, bar: function () { return 1; } }); var i = new C0(); assert.strictEqual(i.foo(), 1); assert.strictEqual(i.bar(), 1); C0.include({ foo: function () { return 2; }, bar: function () { return 2 + this._super(); } }); assert.strictEqual(i.foo(), 2); assert.strictEqual(i.bar(), 3); }); test('In-place extension of subclassed types', function (assert, Class) { var C0 = Class.extend({ foo: function () { return 1; }, bar: function () { return 1; } }); var C1 = C0.extend({ foo: function () { return 1 + this._super(); }, bar: function () { return 1 + this._super(); } }); var i = new C1(); assert.strictEqual(i.foo(), 2); C0.include({ foo: function () { return 2; }, bar: function () { return 2 + this._super(); } }); assert.strictEqual(i.foo(), 3); assert.strictEqual(i.bar(), 4); }); }); odoo.define_section('Widget.proxy', ['web.Widget'], function (test) { test('(String)', function (assert, Widget) { var W = Widget.extend({ exec: function () { this.executed = true; } }); var w = new W(); var fn = w.proxy('exec'); fn(); assert.ok(w.executed, 'should execute the named method in the right context'); }); test('(String)(*args)', function (assert, Widget) { var W = Widget.extend({ exec: function (arg) { this.executed = arg; } }); var w = new W(); var fn = w.proxy('exec'); fn(42); assert.ok(w.executed, "should execute the named method in the right context"); assert.equal(w.executed, 42, "should be passed the proxy's arguments"); }); test('(String), include', function (assert, Widget) { // the proxy function should handle methods being changed on the class // and should always proxy "by name", to the most recent one var W = Widget.extend({ exec: function () { this.executed = 1; } }); var w = new W(); var fn = w.proxy('exec'); W.include({ exec: function () { this.executed = 2; } }); fn(); assert.equal(w.executed, 2, "should be lazily resolved"); }); test('(Function)', function (assert, Widget) { var w = new (Widget.extend({ }))(); var fn = w.proxy(function () { this.executed = true; }); fn(); assert.ok(w.executed, "should set the function's context (like Function#bind)"); }); test('(Function)(*args)', function (assert, Widget) { var w = new (Widget.extend({ }))(); var fn = w.proxy(function (arg) { this.executed = arg; }); fn(42); assert.equal(w.executed, 42, "should be passed the proxy's arguments"); }); }); odoo.define_section('Widget.renderElement', ['web.Widget'], function (test) { test('no template, default', function (assert, Widget) { var widget = new (Widget.extend({ }))(); var $original = widget.$el; assert.ok($original, "should initially have a root element"); widget.renderElement(); assert.ok(widget.$el, "should have generated a root element"); assert.ok($original !== widget.$el, "should have generated a new root element"); assert.strictEqual(widget.$el, widget.$el, "should provide $el alias"); assert.ok(widget.$el.is(widget.el), "should provide raw DOM alias"); assert.equal(widget.el.nodeName, 'DIV', "should have generated the default element"); assert.equal(widget.el.attributes.length, 0, "should not have generated any attribute"); assert.ok(_.isEmpty(widget.$el.html(), "should not have generated any content")); }); test('no template, custom tag', function (assert, Widget) { var widget = new (Widget.extend({ tagName: 'ul' }))(); widget.renderElement(); assert.equal(widget.el.nodeName, 'UL', "should have generated the custom element tag"); }); test('no template, @id', function (assert, Widget) { var widget = new (Widget.extend({ id: 'foo' }))(); widget.renderElement(); assert.equal(widget.el.attributes.length, 1, "should have one attribute"); assert.equal(widget.$el.attr('id'), 'foo', "should have generated the id attribute"); assert.equal(widget.el.id, 'foo', "should also be available via property"); }); test('no template, @className', function (assert, Widget) { var widget = new (Widget.extend({ className: 'oe_some_class' }))(); widget.renderElement(); assert.equal(widget.el.className, 'oe_some_class', "should have the right property"); assert.equal(widget.$el.attr('class'), 'oe_some_class', "should have the right attribute"); }); test('no template, bunch of attributes', function (assert, Widget) { var widget = new (Widget.extend({ attributes: { 'id': 'some_id', 'class': 'some_class', 'data-foo': 'data attribute', 'clark': 'gable', 'spoiler': // don't read the next line if you care about Harry Potter... 'snape kills dumbledore' } }))(); widget.renderElement(); assert.equal(widget.el.attributes.length, 5, "should have all the specified attributes"); assert.equal(widget.el.id, 'some_id'); assert.equal(widget.$el.attr('id'), 'some_id'); assert.equal(widget.el.className, 'some_class'); assert.equal(widget.$el.attr('class'), 'some_class'); assert.equal(widget.$el.attr('data-foo'), 'data attribute'); assert.equal(widget.$el.data('foo'), 'data attribute'); assert.equal(widget.$el.attr('clark'), 'gable'); assert.equal(widget.$el.attr('spoiler'), 'snape kills dumbledore'); }); test('template', ['web.core'], function (assert, Widget, core) { core.qweb.add_template( '' + '' + '
    ' + '
  1. ' + '' + '' + '
  2. ' + '
' + '
' + '
' ); var widget = new (Widget.extend({ template: 'test.widget.template' }))(); widget.renderElement(); assert.equal(widget.el.nodeName, 'OL'); assert.equal(widget.$el.children().length, 5); assert.equal(widget.el.textContent, '01234'); }); test('repeated', ['web.core'], function (assert, Widget, core) { assert.expect(4); var $fix = $( "#qunit-fixture"); core.qweb.add_template( '' + '' + '

' + '
' + '
' ); var widget = new (Widget.extend({ template: 'test.widget.template' }))(); widget.value = 42; return widget.appendTo($fix) .done(function () { assert.equal($fix.find('p').text(), '42', "DOM fixture should contain initial value"); assert.equal(widget.$el.text(), '42', "should set initial value"); widget.value = 36; widget.renderElement(); assert.equal($fix.find('p').text(), '36', "DOM fixture should use new value"); assert.equal(widget.$el.text(), '36', "should set new value"); }); }); }); odoo.define_section('Widget.$', ['web.Widget', 'web.core'], function (test) { test('basic-alias', function (assert, Widget, core) { core.qweb.add_template( '' + '' + '
    ' + '
  1. ' + '' + '' + '
  2. ' + '
' + '
' + '
' ); var widget = new (Widget.extend({ template: 'test.widget.template' }))(); widget.renderElement(); assert.ok(widget.$('li:eq(3)').is(widget.$el.find('li:eq(3)')), "should do the same thing as calling find on the widget root"); }); }); odoo.define_section('Widget.events', ['web.Widget', 'web.core'], function (test) { function setup(qweb) { qweb.add_template( '' + '' + '
    ' + '
  1. ' + '' + '' + '
  2. ' + '
' + '
' + '
' ); } test('delegate', function (assert, Widget, core) { setup(core.qweb); var a = []; var widget = new (Widget.extend({ template: 'test.widget.template', events: { 'click': function () { a[0] = true; assert.strictEqual(this, widget, "should trigger events in widget"); }, 'click li.class-3': 'class3', 'change input': function () { a[2] = true; } }, class3: function () { a[1] = true; } }))(); widget.renderElement(); widget.$el.click(); widget.$('li:eq(3)').click(); widget.$('input:last').val('foo').change(); for(var i=0; i<3; ++i) { assert.ok(a[i], "should pass test " + i); } }); test('undelegate', function (assert, Widget, core) { setup(core.qweb); var clicked = false, newclicked = false; var widget = new (Widget.extend({ template: 'test.widget.template', events: { 'click li': function () { clicked = true; } } }))(); widget.renderElement(); widget.$el.on('click', 'li', function () { newclicked = true; }); widget.$('li').click(); assert.ok(clicked, "should trigger bound events"); assert.ok(newclicked, "should trigger bound events"); clicked = newclicked = false; widget.undelegateEvents(); widget.$('li').click(); assert.ok(!clicked, "undelegate should unbind events delegated"); assert.ok(newclicked, "undelegate should only unbind events it created"); }); }); odoo.define_section('Widget.async', ['web.Widget', 'web.utils'], function (test) { test("alive(alive)", function (assert, Widget, utils) { assert.expect(1); var widget = new (Widget.extend({})); return utils.async_when(widget.start()) .then(function () { return widget.alive(utils.async_when()) }) .then(function () { assert.ok(true); }); }); test("alive(dead)", function (assert, Widget, utils) { assert.expect(1); var widget = new (Widget.extend({})); return $.Deferred(function (d) { utils.async_when(widget.start()) .then(function () { // destroy widget widget.destroy(); var promise = utils.async_when(); // leave time for alive() to do its stuff promise.then(function () { return utils.async_when(); }).then(function () { assert.ok(true); d.resolve(); }); // ensure that widget.alive() refuses to resolve or reject return widget.alive(promise); }).always(function () { d.reject(); assert.ok(false, "alive() should not terminate by default"); }) }); }); test("alive(alive, true)", function (assert, Widget, utils) { assert.expect(1); var widget = new (Widget.extend({})); return utils.async_when(widget.start()) .then(function () { return widget.alive(utils.async_when(), true) }) .then(function () { assert.ok(true); }); }); test("alive(dead, true)", function (assert, Widget, utils) { assert.expect(1); var done = assert.async(); var widget = new (Widget.extend({})); utils.async_when(widget.start()) .then(function () { // destroy widget widget.destroy(); console.log('destroyed'); return widget.alive(utils.async_when().done(function () { console.log('when'); }), true); }).then(function () { console.log('unfailed') assert.ok(false, "alive(p, true) should fail its promise"); done(); }, function () { console.log('failed') assert.ok(true, "alive(p, true) should fail its promise"); done(); }); }); }); odoo.define_section('server-formats', ['web.time'], function (test) { test('Parse server datetime', function (assert, time) { var date = time.str_to_datetime("2009-05-04 12:34:23"); assert.deepEqual( [date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()], [2009, 5 - 1, 4, 12, 34, 23]); assert.deepEqual( [date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()], [2009, 5 - 1, 4, 12 - (date.getTimezoneOffset() / 60), 34, 23]); var date2 = time.str_to_datetime('2011-12-10 00:00:00'); assert.deepEqual( [date2.getUTCFullYear(), date2.getUTCMonth(), date2.getUTCDate(), date2.getUTCHours(), date2.getUTCMinutes(), date2.getUTCSeconds()], [2011, 12 - 1, 10, 0, 0, 0]); var date3 = time.str_to_datetime("2009-05-04 12:34:23.84565"); assert.deepEqual( [date3.getUTCFullYear(), date3.getUTCMonth(), date3.getUTCDate(), date3.getUTCHours(), date3.getUTCMinutes(), date3.getUTCSeconds(), date3.getUTCMilliseconds()], [2009, 5 - 1, 4, 12, 34, 23, 845]); }); test('Parse server datetime on 31', function (assert, time) { var wDate = window.Date; try { window.Date = function (v) { if (_.isUndefined(v)) { v = '2013-10-31 12:34:56'; } return new wDate(v); }; var date = time.str_to_datetime('2013-11-11 02:45:21'); assert.deepEqual( [date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()], [2013, 11 - 1, 11, 2, 45, 21]); } finally { window.Date = wDate; } }); test('Parse server date', function (assert, time) { var date = time.str_to_date("2009-05-04"); assert.deepEqual( [date.getFullYear(), date.getMonth(), date.getDate()], [2009, 5 - 1, 4]); }); test('Parse server date on 31', function (assert, time) { var wDate = window.Date; try { window.Date = function (v) { if (_.isUndefined(v)) { v = '2013-10-31 12:34:56'; } return new wDate(v); }; var date = time.str_to_date('2013-11-21'); assert.deepEqual( [date.getFullYear(), date.getMonth(), date.getDate()], [2013, 11 - 1, 21]); } finally { window.Date = wDate; } }); test('Parse server time', function (assert, time) { var date = time.str_to_time("12:34:23"); assert.deepEqual( [date.getHours(), date.getMinutes(), date.getSeconds()], [12, 34, 23]); date = time.str_to_time("12:34:23.5467"); assert.deepEqual( [date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()], [12, 34, 23, 546]); }); test('Format server datetime', function (assert, time) { var date = new Date(); date.setUTCFullYear(2009); date.setUTCMonth(5 - 1); date.setUTCDate(4); date.setUTCHours(12); date.setUTCMinutes(34); date.setUTCSeconds(23); assert.equal(time.datetime_to_str(date), "2009-05-04 12:34:23"); }); test('Format server date', function (assert, time) { var date = new Date(); date.setUTCFullYear(2009); date.setUTCMonth(5 - 1); date.setUTCDate(4); date.setUTCHours(0); date.setUTCMinutes(0); date.setUTCSeconds(0); assert.equal(time.date_to_str(date), "2009-05-04"); }); test('Format server time', function (assert, time) { var date = new Date(); date.setUTCFullYear(1970); date.setUTCMonth(1 - 1); date.setUTCDate(1); date.setUTCHours(0); date.setUTCMinutes(0); date.setUTCSeconds(0); date.setHours(12); date.setMinutes(34); date.setSeconds(23); assert.equal(time.time_to_str(date), "12:34:23"); }); });