flectra.define('web.calendar_tests', function (require) { "use strict"; var CalendarView = require('web.CalendarView'); var CalendarRenderer = require('web.CalendarRenderer'); var fieldUtils = require('web.field_utils'); var mixins = require('web.mixins'); var testUtils = require('web.test_utils'); var session = require('web.session'); CalendarRenderer.include({ getAvatars: function () { var res = this._super.apply(this, arguments); for (var k in res) { res[k] = res[k].replace(/src="([^"]+)"/, 'src="#test:\$1"'); } return res; } }); var createView = testUtils.createView; var initialDate = new Date(2016, 11, 12, 8, 0, 0); initialDate = new Date(initialDate.getTime() - initialDate.getTimezoneOffset()*60*1000); QUnit.module('Views', { beforeEach: function () { session.uid = -1; // TO CHECK this.data = { event: { fields: { id: {string: "ID", type: "integer"}, user_id: {string: "user", type: "many2one", relation: 'user', default: session.uid}, partner_id: {string: "user", type: "many2one", relation: 'partner', related: 'user_id.partner_id', default: 1}, name: {string: "name", type: "char"}, start_date: {string: "start date", type: "date"}, stop_date: {string: "stop date", type: "date"}, start: {string: "start datetime", type: "datetime"}, stop: {string: "stop datetime", type: "datetime"}, allday: {string: "allday", type: "boolean"}, partner_ids: {string: "attendees", type: "one2many", relation: 'partner', default: [[6, 0, [1]]]}, type: {string: "type", type: "integer"}, }, records: [ {id: 1, user_id: session.uid, partner_id: 1, name: "event 1", start: "2016-12-11 00:00:00", stop: "2016-12-11 00:00:00", allday: false, partner_ids: [1,2,3], type: 1}, {id: 2, user_id: session.uid, partner_id: 1, name: "event 2", start: "2016-12-12 10:55:05", stop: "2016-12-12 14:55:05", allday: false, partner_ids: [1,2], type: 3}, {id: 3, user_id: 4, partner_id: 4, name: "event 3", start: "2016-12-12 15:55:05", stop: "2016-12-12 16:55:05", allday: false, partner_ids: [1], type: 2}, {id: 4, user_id: session.uid, partner_id: 1, name: "event 4", start: "2016-12-14 15:55:05", stop: "2016-12-14 18:55:05", allday: true, partner_ids: [1], type: 2}, {id: 5, user_id: 4, partner_id: 4, name: "event 5", start: "2016-12-13 15:55:05", stop: "2016-12-20 18:55:05", allday: false, partner_ids: [2,3], type: 2}, {id: 6, user_id: session.uid, partner_id: 1, name: "event 6", start: "2016-12-18 08:00:00", stop: "2016-12-18 09:00:00", allday: false, partner_ids: [3], type: 3} ], check_access_rights: function () { return $.when(true); } }, user: { fields: { id: {string: "ID", type: "integer"}, display_name: {string: "Displayed name", type: "char"}, partner_id: {string: "partner", type: "many2one", relation: 'partner'}, image: {string: "image", type: "integer"}, }, records: [ {id: session.uid, display_name: "user 1", partner_id: 1}, {id: 4, display_name: "user 4", partner_id: 4}, ] }, partner: { fields: { id: {string: "ID", type: "integer"}, display_name: {string: "Displayed name", type: "char"}, image: {string: "image", type: "integer"}, }, records: [ {id: 1, display_name: "partner 1", image: 'AAA'}, {id: 2, display_name: "partner 2", image: 'BBB'}, {id: 3, display_name: "partner 3", image: 'CCC'}, {id: 4, display_name: "partner 4", image: 'DDD'} ] }, filter_partner: { fields: { id: {string: "ID", type: "integer"}, user_id: {string: "user", type: "many2one", relation: 'user'}, partner_id: {string: "partner", type: "many2one", relation: 'partner'}, }, records: [ {id: 1, user_id: session.uid, partner_id: 1}, {id: 2, user_id: session.uid, partner_id: 2}, {id: 3, user_id: 4, partner_id: 3} ] }, }; } }, function () { QUnit.module('CalendarView'); var archs = { "event,false,form": '
'+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ '', "event,1,form": { attrs: {}, children: [ { attrs: { modifiers: '{"invisible": true}', name: "allday" }, children: [], tag: 'field' }, { attrs: { modifiers: '{"invisible": [["allday","=",false]]}', name: "start" }, children: [], tag: 'field' }, { attrs: { modifiers: '{"invisible": [["allday","=",true]]}', name: "stop" }, children: [], tag: 'field' } ], tag: "form" } }; QUnit.test('simple calendar rendering', function (assert) { assert.expect(24); this.data.event.records.push({ id: 7, user_id: session.uid, partner_id: false, name: "event 7", start: "2016-12-18 09:00:00", stop: "2016-12-18 10:00:00", allday: false, partner_ids: [2], type: 1 }); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, }); assert.ok(calendar.$('.o_calendar_view').find('.fc-view-container').length, "should instance of fullcalendar"); var $sidebar = calendar.$('.o_calendar_sidebar'); assert.strictEqual($sidebar.find('.ui-state-active').text(), "12", "should highlight the target day"); // test view scales assert.strictEqual(calendar.$('.fc-event').length, 9, "should display 9 events on the week (4 event + 5 days event)"); assert.strictEqual($sidebar.find('.o_selected_range').length, 7, "week scale should highlight 7 days in mini calendar"); calendar.$buttons.find('.o_calendar_button_day').trigger('click'); // display only one day assert.strictEqual(calendar.$('.fc-event').length, 2, "should display 2 events on the day"); assert.strictEqual($sidebar.find('.o_selected_range').length, 1, "should highlight the target day in mini calendar"); calendar.$buttons.find('.o_calendar_button_month').trigger('click'); // display all the month assert.strictEqual(calendar.$('.fc-event').length, 7, "should display 7 events on the month (5 events + 2 week event - 1 'event 6' is filtered + 1 'Undefined event')"); assert.strictEqual($sidebar.find('.o_selected_range').length, 31, "month scale should highlight all days in mini calendar"); // test filters assert.strictEqual($sidebar.find('.o_calendar_filter').length, 2, "should display 3 filters"); var $typeFilter = $sidebar.find('.o_calendar_filter:has(h3:contains(user))'); assert.ok($typeFilter.length, "should display 'user' filter"); assert.strictEqual($typeFilter.find('.o_calendar_filter_item').length, 3, "should display 3 filter items for 'user'"); // filters which has no value should show with string "Undefined" and should show at the last assert.strictEqual($typeFilter.find('.o_calendar_filter_item:last').data('value'), false, "filters having false value should be displayed at last in filter items"); assert.strictEqual($typeFilter.find('.o_calendar_filter_item:last > span').text(), "Undefined", "filters having false value should display 'Undefined' string"); var $attendeesFilter = $sidebar.find('.o_calendar_filter:has(h3:contains(attendees))'); assert.ok($attendeesFilter.length, "should display 'attendees' filter"); assert.strictEqual($attendeesFilter.find('.o_calendar_filter_item').length, 3, "should display 3 filter items for 'attendees' who use write_model (2 saved + Everything)"); assert.ok($attendeesFilter.find('.o_field_many2one').length, "should display one2many search bar for 'attendees' filter"); assert.strictEqual(calendar.$('.fc-event').length, 7, "should display 7 events ('event 5' counts for 2 because it spans two weeks and thus generate two fc-event elements)"); calendar.$('.o_calendar_filter .o_checkbox input').first().click(); // Disable first filter assert.strictEqual(calendar.$('.fc-event').length, 4, "should now only display 4 event"); calendar.$('.o_calendar_filter .o_checkbox input').eq(1).click(); // Disable second filter assert.strictEqual(calendar.$('.fc-event').length, 0, "should not display any event anymore"); // test search bar in filter $sidebar.find('input[type="text"]').trigger('click'); assert.strictEqual($('ul.ui-autocomplete li:not(.o_m2o_dropdown_option)').length, 2, "should display 2 choices in one2many autocomplete"); // TODO: remove :not(.o_m2o_dropdown_option) because can't have "create & edit" choice $('ul.ui-autocomplete li:first').trigger('click'); assert.strictEqual($sidebar.find('.o_calendar_filter:has(h3:contains(attendees)) .o_calendar_filter_item').length, 4, "should display 4 filter items for 'attendees'"); $sidebar.find('input[type="text"]').trigger('click'); assert.strictEqual($('ul.ui-autocomplete li:not(.o_m2o_dropdown_option)').text(), "partner 4", "should display the last choice in one2many autocomplete"); // TODO: remove :not(.o_m2o_dropdown_option) because can't have "create & edit" choice $sidebar.find('.o_calendar_filter_item .o_remove').first().trigger('click'); assert.ok($('.modal button.btn:contains(Ok)').length, "should display the confirm message"); $('.modal button.btn:contains(Ok)').trigger('click'); assert.strictEqual($sidebar.find('.o_calendar_filter:has(h3:contains(attendees)) .o_calendar_filter_item').length, 3, "click on remove then should display 3 filter items for 'attendees'"); calendar.destroy(); }); QUnit.test('create and change events', function (assert) { assert.expect(26); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, }); assert.ok(calendar.$('.fc-month-view').length, "should display in month mode"); // click on an existing event to open the formViewDialog calendar.$('.fc-event:contains(event 4) .fc-content').trigger('click'); assert.ok($('.modal-body').length, "should open the form view in dialog when click on event"); assert.ok($('.modal button.btn:contains(Edit)').length, "formViewDialog should be in readonly mode"); assert.ok($('.modal button.btn:contains(Delete)').length, "formViewDialog should have a delete button"); $('.modal button.btn:contains(Edit)').trigger('click'); assert.ok($('.modal-body').length, "should switch the modal in edit mode"); assert.notOk($('.modal button.btn:contains(Delete)').length, "formViewDialog should not have a delete button in edit mode"); $('.modal-body input:first').val('event 4 modified').trigger('input'); $('.modal button.btn:contains(Save)').trigger('click'); assert.notOk($('.modal-body').length, "save button should close the modal"); assert.ok(calendar.$('.fc-event:contains(event 4 modified)').length, "should display the updated records"); // create a new event, quick create only var $cell = calendar.$('.fc-day-grid .fc-row:eq(2) .fc-day:eq(2)'); testUtils.triggerMouseEvent($cell, "mousedown"); testUtils.triggerMouseEvent($cell, "mouseup"); assert.ok($('.modal-dialog.modal-sm').length, "should open the quick create dialog"); $('.modal-body input:first').val('new event in quick create').trigger('input'); $('.modal button.btn:contains(Create)').trigger('click').trigger('click'); assert.strictEqual(calendar.$('.fc-event:contains(new event in quick create)').length, 1, "should display the new record"); assert.strictEqual(calendar.$('td.fc-event-container[colspan]').length, 2, "should the new record have only one day"); // create a new event, quick create only (validated by pressing enter key) testUtils.triggerMouseEvent($cell, "mousedown"); testUtils.triggerMouseEvent($cell, "mouseup"); assert.ok($('.modal-dialog.modal-sm').length, "should open the quick create dialog"); $('.modal-body input:first') .val('new event in quick create validated by pressing enter key.') .trigger($.Event('keyup', {keyCode: $.ui.keyCode.ENTER})) .trigger($.Event('keyup', {keyCode: $.ui.keyCode.ENTER})); assert.strictEqual(calendar.$('.fc-event:contains(new event in quick create validated by pressing enter key.)').length, 1, "should display the new record by pressing enter key"); // create a new event and edit it $cell = calendar.$('.fc-day-grid .fc-row:eq(4) .fc-day:eq(2)'); testUtils.triggerMouseEvent($cell, "mousedown"); testUtils.triggerMouseEvent($cell, "mouseup"); assert.strictEqual($('.modal-dialog.modal-sm').length, 1, "should open the quick create dialog"); $('.modal-body input:first').val('coucou').trigger('input'); $('.modal button.btn:contains(Edit)').trigger('click'); assert.strictEqual($('.modal-dialog.modal-lg .o_form_view').length, 1, "should open the slow create dialog"); assert.strictEqual($('.modal-dialog.modal-lg .modal-title').text(), "Create: Events", "should use the string attribute as modal title"); assert.strictEqual($('.modal-dialog.modal-lg .o_form_view input[name="name"]').val(), "coucou", "should have set the name from the quick create dialog"); $('.modal-lg button.btn:contains(Save)').trigger('click'); assert.strictEqual(calendar.$('.fc-event:contains(coucou)').length, 1, "should display the new record"); // create a new event with 2 days $cell = calendar.$('.fc-day-grid .fc-row:eq(3) .fc-day:eq(2)'); testUtils.triggerMouseEvent($cell, "mousedown"); testUtils.triggerMouseEvent($cell.next(), "mousemove"); testUtils.triggerMouseEvent($cell.next(), "mouseup"); $('.modal input:first').val('new event in quick create 2').trigger('input'); $('.modal button.btn:contains(Edit)').trigger('click'); assert.strictEqual($('.modal-lg input:first').val(), 'new event in quick create 2', "should open the formViewDialog with default values"); $('.modal-lg button.btn:contains(Save)').trigger('click'); assert.notOk($('.modal').length, "should close dialogs"); var $newevent2 = calendar.$('.fc-event:contains(new event in quick create 2)'); assert.ok($newevent2.length, "should display the 2 days new record"); assert.strictEqual($newevent2.closest('.fc-event-container').attr('colspan'), "2", "the new record should have 2 days"); // delete the a record calendar.$('.fc-event:contains(event 4) .fc-content').trigger('click'); $('.modal button.btn:contains(Delete)').trigger('click'); assert.ok($('.modal button.btn:contains(Ok)').length, "should display the confirm message"); $('.modal button.btn:contains(Ok)').trigger('click'); assert.notOk(calendar.$('.fc-event:contains(event 4) .fc-content').length, "the record should be deleted"); assert.strictEqual(calendar.$('.fc-event-container .fc-event').length, 10, "should display 10 events"); // move to next month calendar.$buttons.find('.o_calendar_button_next').click(); assert.strictEqual(calendar.$('.fc-event-container .fc-event').length, 0, "should display 0 events"); calendar.destroy(); }); QUnit.test('quickcreate switching to actual create for required fields', function (assert) { assert.expect(4); var event = $.Event(); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, mockRPC: function (route, args) { if (args.method === "create") { return $.Deferred().reject({ code: 200, data: {}, message: "Flectra server error", }, event); } return this._super(route, args); }, }); // create a new event var $cell = calendar.$('.fc-day-grid .fc-row:eq(2) .fc-day:eq(2)'); testUtils.triggerMouseEvent($cell, "mousedown"); testUtils.triggerMouseEvent($cell, "mouseup"); assert.strictEqual($('.modal-dialog.modal-sm .modal-title').text(), 'Create', "should open the quick create dialog"); $('.modal-body input:first').val('new event in quick create').trigger('input'); $('.modal button.btn:contains(Create)').trigger('click').trigger('click'); // If the event is not default-prevented, a traceback will be raised, which we do not want assert.ok(event.isDefaultPrevented(), "fail deferred event should have been default-prevented"); assert.strictEqual($('.modal-dialog.modal-lg .modal-title').text(), 'Create: Events', "should have switched to a bigger modal for an actual create rather than quickcreate"); assert.strictEqual($('.modal-dialog.modal-lg .modal-body .o_form_view.o_form_editable').length, 1, "should open the full event form view in a dialog"); calendar.destroy(); }); QUnit.test('create event with timezone in week mode', function (assert) { assert.expect(5); this.data.event.records = []; var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, session: { getTZOffset: function () { return 120; }, }, mockRPC: function (route, args) { if (args.method === "create") { assert.deepEqual(args.kwargs.context, { "default_name": null, "default_start": "2016-12-13 06:00:00", "default_stop": "2016-12-13 08:00:00", "default_allday": null }, "should send the context to create events"); } return this._super(route, args); }, }); var $view = $('#qunit-fixture').contents(); $view.prependTo('body'); // => select with click position var top = calendar.$('.fc-axis:contains(8am)').offset().top + 5; var left = calendar.$('.fc-day:eq(2)').offset().left + 5; try { testUtils.triggerPositionalMouseEvent(left, top, "mousedown"); } catch (e) { calendar.destroy(); $view.remove(); throw new Error('The test fails to simulate a click in the screen. Your screen is probably too small or your dev tools is open.'); } testUtils.triggerPositionalMouseEvent(left, top + 60, "mousemove"); assert.strictEqual(calendar.$('.fc-content .fc-time').text(), "08:00 - 10:00", "should display the time in the calendar sticker"); testUtils.triggerPositionalMouseEvent(left, top + 60, "mouseup"); $('.modal input:first').val('new event').trigger('input'); $('.modal button.btn:contains(Create)').trigger('click'); var $newevent = calendar.$('.fc-event:contains(new event)'); assert.strictEqual($newevent.text().replace(/[\s\n\r]+/g, ''), "08:00-10:00newevent12/13/201608:00:00False", "should display the new event with time, title and additional fields"); assert.deepEqual($newevent.data('fcSeg').event.record, { display_name: "new event", start: fieldUtils.parse.datetime("2016-12-13 06:00:00", this.data.event.fields.start, {isUTC: true}), stop: fieldUtils.parse.datetime("2016-12-13 08:00:00", this.data.event.fields.stop, {isUTC: true}), allday: false, name: "new event", id: 1 }, "the new record should have the utc datetime (quickCreate)"); // delete record $newevent.trigger('click'); $('.modal button.btn-default:contains(Delete)').trigger('click'); $('.modal button.btn-primary:contains(Ok)').trigger('click'); assert.strictEqual(calendar.$('.fc-content').length, 0, "should delete the record"); calendar.destroy(); $view.remove(); }); QUnit.test('create event with timezone in week mode with formViewDialog', function (assert) { assert.expect(8); this.data.event.records = []; this.data.event.onchanges = { allday: function (obj) { if (obj.allday) { obj.start_date = obj.start && obj.start.split(' ')[0] || obj.start_date; obj.stop_date = obj.stop && obj.stop.split(' ')[0] || obj.stop_date || obj.start_date; } else { obj.start = obj.start_date && (obj.start_date + ' 00:00:00') || obj.start; obj.stop = obj.stop_date && (obj.stop_date + ' 00:00:00') || obj.stop || obj.start; } } }; var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, session: { getTZOffset: function () { return 120; }, }, mockRPC: function (route, args) { if (args.method === "create") { assert.deepEqual(args.kwargs.context, { "default_name": "new event", "default_start": "2016-12-13 06:00:00", "default_stop": "2016-12-13 08:00:00", "default_allday": null }, "should send the context to create events"); } if (args.method === "write") { assert.deepEqual(args.args[1], expectedEvent, "should move the event"); } return this._super(route, args); }, }); var $view = $('#qunit-fixture').contents(); $view.prependTo('body'); // => select with click position var top = calendar.$('.fc-axis:contains(8am)').offset().top + 5; var left = calendar.$('.fc-day:eq(2)').offset().left + 5; try { testUtils.triggerPositionalMouseEvent(left, top, "mousedown"); } catch (e) { calendar.destroy(); $view.remove(); throw new Error('The test fails to simulate a click in the screen. Your screen is probably too small or your dev tools is open.'); } testUtils.triggerPositionalMouseEvent(left, top + 60, "mousemove"); testUtils.triggerPositionalMouseEvent(left, top + 60, "mouseup"); $('.modal input:first').val('new event').trigger('input'); $('.modal button.btn:contains(Edit)').trigger('click'); assert.strictEqual($('.o_field_widget[name="start"] input').val(), "12/13/2016 08:00:00", "should display the datetime"); $('.modal-lg .o_field_boolean[name="allday"] input').trigger('click'); assert.strictEqual($('.o_field_widget[name="start_date"] input').val(), "12/13/2016", "should display the date"); $('.modal-lg .o_field_boolean[name="allday"] input').trigger('click'); assert.strictEqual($('.o_field_widget[name="start"] input').val(), "12/13/2016 02:00:00", "should display the datetime from the date with the timezone"); // use datepicker to enter a date: 12/13/2016 08:00:00 $('.o_field_widget[name="start"] input').trigger('click'); $('.bootstrap-datetimepicker-widget .picker-switch a[data-action="togglePicker"]').trigger('click'); $('.bootstrap-datetimepicker-widget .timepicker .timepicker-hour').trigger('click'); $('.bootstrap-datetimepicker-widget .timepicker-hours td.hour:contains(08)').trigger('click'); $('.bootstrap-datetimepicker-widget .picker-switch a[data-action="close"]').trigger('click'); // use datepicker to enter a date: 12/13/2016 10:00:00 $('.o_field_widget[name="stop"] input').trigger('click'); $('.bootstrap-datetimepicker-widget .picker-switch a[data-action="togglePicker"]').trigger('click'); $('.bootstrap-datetimepicker-widget .timepicker .timepicker-hour').trigger('click'); $('.bootstrap-datetimepicker-widget .timepicker-hours td.hour:contains(10)').trigger('click'); $('.bootstrap-datetimepicker-widget .picker-switch a[data-action="close"]').trigger('click'); $('.modal-lg button.btn:contains(Save)').trigger('click'); var $newevent = calendar.$('.fc-event:contains(new event)'); assert.strictEqual($newevent.text().replace(/[\s\n\r]+/g, ''), "08:00-10:00newevent", "should display the new event with time and title"); assert.deepEqual($newevent.data('fcSeg').event.record, { display_name: "new event", start: fieldUtils.parse.datetime("2016-12-13 06:00:00", this.data.event.fields.start, {isUTC: true}), stop: fieldUtils.parse.datetime("2016-12-13 08:00:00", this.data.event.fields.stop, {isUTC: true}), allday: false, name: "new event", id: 1 }, "the new record should have the utc datetime (formViewDialog)"); var pos = calendar.$('.fc-content').offset(); left = pos.left + 5; top = pos.top + 5; // Mode this event to another day var expectedEvent = { "allday": false, "start": "2016-12-12 06:00:00", "stop": "2016-12-12 08:00:00" }; testUtils.triggerPositionalMouseEvent(left, top, "mousedown"); left = calendar.$('.fc-day:eq(1)').offset().left + 5; testUtils.triggerPositionalMouseEvent(left, top, "mousemove"); testUtils.triggerPositionalMouseEvent(left, top, "mouseup"); // Move to "All day" expectedEvent = { "allday": true, "start": "2016-12-12 00:00:00", "stop": "2016-12-12 00:00:00" }; testUtils.triggerPositionalMouseEvent(left, top, "mousedown"); top = calendar.$('.fc-day:eq(1)').offset().top + 5; testUtils.triggerPositionalMouseEvent(left, top, "mousemove"); testUtils.triggerPositionalMouseEvent(left, top, "mouseup"); calendar.destroy(); $view.remove(); }); QUnit.test('create all day event in week mode', function (assert) { assert.expect(3); this.data.event.records = []; var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, session: { getTZOffset: function () { return 120; }, }, }); var $view = $('#qunit-fixture').contents(); $view.prependTo('body'); // => select with click position var pos = calendar.$('.fc-bg td:eq(4)').offset(); try { testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mousedown"); } catch (e) { calendar.destroy(); $view.remove(); throw new Error('The test fails to simulate a click in the screen. Your screen is probably too small or your dev tools is open.'); } pos = calendar.$('.fc-bg td:eq(5)').offset(); testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mousemove"); testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mouseup"); $('.modal input:first').val('new event').trigger('input'); $('.modal button.btn:contains(Create)').trigger('click'); var $newevent = calendar.$('.fc-event:contains(new event)'); assert.strictEqual($newevent.text().replace(/[\s\n\r]+/g, ''), "newevent", "should display the new event with time and title"); assert.strictEqual($newevent.parent().attr('colspan'), "2", "should appear over two days."); assert.deepEqual($newevent.data('fcSeg').event.record, { display_name: "new event", start: fieldUtils.parse.datetime("2016-12-14 00:00:00", this.data.event.fields.start, {isUTC: true}), stop: fieldUtils.parse.datetime("2016-12-15 00:00:00", this.data.event.fields.stop, {isUTC: true}), allday: true, name: "new event", id: 1 }, "the new record should have the utc datetime (quickCreate)"); calendar.destroy(); $view.remove(); }); QUnit.test('create all day event in week mode (no quickCreate)', function (assert) { assert.expect(1); this.data.event.records = []; var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, session: { getTZOffset: function () { return 120; }, }, intercepts: { do_action: function (event) { assert.deepEqual(event.data.action.context, { "default_name": null, "default_start": "2016-12-14 05:00:00", "default_stop": "2016-12-15 17:00:00", }, "should send the correct data to create events"); }, }, }); var $view = $('#qunit-fixture').contents(); $view.prependTo('body'); // => select with click position var pos = calendar.$('.fc-bg td:eq(4)').offset(); try { testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mousedown"); } catch (e) { calendar.destroy(); $view.remove(); throw new Error('The test fails to simulate a click in the screen. Your screen is probably too small or your dev tools is open.'); } pos = calendar.$('.fc-bg td:eq(5)').offset(); testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mousemove"); testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mouseup"); calendar.destroy(); $view.remove(); }); QUnit.test('create event in month mode', function (assert) { assert.expect(4); this.data.event.records = []; var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, session: { getTZOffset: function () { return 120; }, }, mockRPC: function (route, args) { if (args.method === "create") { assert.deepEqual(args.args[0], { "name": "new event", "start": "2016-12-14 05:00:00", "stop": "2016-12-15 17:00:00", }, "should send the correct data to create events"); } return this._super(route, args); }, }); var $view = $('#qunit-fixture').contents(); $view.prependTo('body'); // => select with click position var pos = calendar.$('.fc-bg td:eq(20)').offset(); try { testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mousedown"); } catch (e) { calendar.destroy(); $view.remove(); throw new Error('The test fails to simulate a click in the screen. Your screen is probably too small or your dev tools is open.'); } pos = calendar.$('.fc-bg td:eq(21)').offset(); testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mousemove"); testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mouseup"); $('.modal input:first').val('new event').trigger('input'); $('.modal button.btn:contains(Create)').trigger('click'); var $newevent = calendar.$('.fc-event:contains(new event)'); assert.strictEqual($newevent.text().replace(/[\s\n\r]+/g, ''), "newevent", "should display the new event with time and title"); assert.strictEqual($newevent.parent().attr('colspan'), "2", "should appear over two days."); assert.deepEqual($newevent.data('fcSeg').event.record, { display_name: "new event", start: fieldUtils.parse.datetime("2016-12-14 05:00:00", this.data.event.fields.start, {isUTC: true}), stop: fieldUtils.parse.datetime("2016-12-15 17:00:00", this.data.event.fields.stop, {isUTC: true}), name: "new event", id: 1 }, "the new record should have the utc datetime (quickCreate)"); calendar.destroy(); $view.remove(); }); QUnit.test('use mini calendar', function (assert) { assert.expect(12); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, session: { getTZOffset: function () { return 120; }, }, }); assert.strictEqual(calendar.$('.fc-agendaWeek-view').length, 1, "should be in week mode"); assert.strictEqual(calendar.$('.fc-event').length, 9, "should display 9 events on the week (4 event + 5 days event)"); calendar.$('.o_calendar_mini a:contains(19)').click(); // Clicking on a day in another week should switch to the other week view assert.strictEqual(calendar.$('.fc-agendaWeek-view').length, 1, "should be in week mode"); assert.strictEqual(calendar.$('.fc-event').length, 4, "should display 4 events on the week (1 event + 3 days event)"); // Clicking on a day in the same week should switch to that particular day view calendar.$('.o_calendar_mini a:contains(18)').click(); assert.strictEqual(calendar.$('.fc-agendaDay-view').length, 1, "should be in day mode"); assert.strictEqual(calendar.$('.fc-event').length, 2, "should display 2 events on the day"); // Clicking on the same day should toggle between day, month and week views calendar.$('.o_calendar_mini a:contains(18)').click(); assert.strictEqual(calendar.$('.fc-month-view').length, 1, "should be in month mode"); assert.strictEqual(calendar.$('.fc-event').length, 7, "should display 7 events on the month (event 5 is on multiple weeks and generates to .fc-event)"); calendar.$('.o_calendar_mini a:contains(18)').click(); assert.strictEqual(calendar.$('.fc-agendaWeek-view').length, 1, "should be in week mode"); assert.strictEqual(calendar.$('.fc-event').length, 4, "should display 4 events on the week (1 event + 3 days event)"); calendar.$('.o_calendar_mini a:contains(18)').click(); assert.strictEqual(calendar.$('.fc-agendaDay-view').length, 1, "should be in day mode"); assert.strictEqual(calendar.$('.fc-event').length, 2, "should display 2 events on the day"); calendar.destroy(); }); QUnit.test('rendering, with many2many', function (assert) { assert.expect(5); this.data.event.fields.partner_ids.type = 'many2many'; this.data.event.records[0].partner_ids = [1,2,3,4,5]; this.data.partner.records.push({id: 5, display_name: "partner 5", image: 'EEE'}); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ' '+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, }); assert.strictEqual(calendar.$('.o_calendar_filter_items .o_cal_avatar').length, 3, "should have 3 avatars in the side bar"); var $event1Avatars = calendar.$('.fc-event .o_calendar_avatars').first(); assert.strictEqual($event1Avatars.find('img').length, 1, "should have 1 avatar"); assert.strictEqual($event1Avatars.find('span').length, 0, "should not have a span for more attendees since there is only one"); var $event2Avatars = calendar.$('.fc-event:contains(All day) .o_calendar_avatars'); assert.strictEqual($event2Avatars.find('img').length, 3, "should have 3 avatars"); assert.strictEqual($event2Avatars.find('span').text(), '+2', "should indicate there are 2 more attendees that we don't show"); calendar.destroy(); }); QUnit.test('open form view', function (assert) { assert.expect(3); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, mockRPC: function (route, args) { if (args.method === "get_formview_id") { return $.Deferred().resolve('A view'); } return this._super(route, args); }, }); // click on an existing event to open the form view testUtils.intercept(calendar, 'do_action', function (event) { assert.deepEqual(event.data.action, { type: "ir.actions.act_window", res_id: 4, res_model: "event", views: [['A view', "form"]], target: "current", context: {} }, "should open the form view"); }); calendar.$('.fc-event:contains(event 4) .fc-content').trigger('click'); // create a new event and edit it var $cell = calendar.$('.fc-day-grid .fc-row:eq(4) .fc-day:eq(2)'); testUtils.triggerMouseEvent($cell, "mousedown"); testUtils.triggerMouseEvent($cell, "mouseup"); $('.modal-body input:first').val('coucou').trigger('input'); testUtils.intercept(calendar, 'do_action', function (event) { assert.deepEqual(event.data.action, { type: "ir.actions.act_window", res_model: "event", views: [[false, "form"]], target: "current", context: { "default_name": "coucou", "default_start": "2016-12-27 00:00:00", "default_stop": "2016-12-27 00:00:00", "default_allday": true } }, "should open the form view with the context default values"); }); $('.modal button.btn:contains(Edit)').trigger('click'); calendar.destroy(); assert.strictEqual($('#ui-datepicker-div:empty').length, 0, "should have a clean body"); }); QUnit.test('create and edit event in month mode (all_day: false)', function (assert) { assert.expect(2); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, session: { getTZOffset: function () { return -240; }, }, }); // create a new event and edit it var $cell = calendar.$('.fc-day-grid .fc-row:eq(4) .fc-day:eq(2)'); testUtils.triggerMouseEvent($cell, "mousedown"); testUtils.triggerMouseEvent($cell, "mouseup"); $('.modal-body input:first').val('coucou').trigger('input'); testUtils.intercept(calendar, 'do_action', function (event) { assert.deepEqual(event.data.action, { type: "ir.actions.act_window", res_model: "event", views: [[false, "form"]], target: "current", context: { "default_name": "coucou", "default_start": "2016-12-27 11:00:00", // 7:00 + 4h "default_stop": "2016-12-27 23:00:00", // 19:00 + 4h } }, "should open the form view with the context default values"); }); $('.modal button.btn:contains(Edit)').trigger('click'); calendar.destroy(); assert.strictEqual($('#ui-datepicker-div:empty').length, 0, "should have a clean body"); }); QUnit.test('readonly date_start field', function (assert) { assert.expect(4); this.data.event.fields.start.readonly = true; var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, mockRPC: function (route, args) { if (args.method === "get_formview_id") { return $.when(false); } return this._super(route, args); }, }); assert.strictEqual(calendar.$('.fc-resizer').length, 0, "should not have resize button"); // click on an existing event to open the form view testUtils.intercept(calendar, 'do_action', function (event) { assert.deepEqual(event.data.action, { type: "ir.actions.act_window", res_id: 4, res_model: "event", views: [[false, "form"]], target: "current", context: {} }, "should open the form view"); }); calendar.$('.fc-event:contains(event 4) .fc-content').trigger('click'); // create a new event and edit it var $cell = calendar.$('.fc-day-grid .fc-row:eq(4) .fc-day:eq(2)'); testUtils.triggerMouseEvent($cell, "mousedown"); testUtils.triggerMouseEvent($cell, "mouseup"); $('.modal-body input:first').val('coucou').trigger('input'); testUtils.intercept(calendar, 'do_action', function (event) { assert.deepEqual(event.data.action, { type: "ir.actions.act_window", res_model: "event", views: [[false, "form"]], target: "current", context: { "default_name": "coucou", "default_start": "2016-12-27 00:00:00", "default_stop": "2016-12-27 00:00:00", "default_allday": true } }, "should open the form view with the context default values"); }); $('.modal button.btn:contains(Edit)').trigger('click'); calendar.destroy(); assert.strictEqual($('#ui-datepicker-div:empty').length, 0, "should have a clean body"); }); QUnit.test('"all" filter', function (assert) { assert.expect(3); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ ''+ ''+ '', viewOptions: { initialDate: initialDate, }, }); assert.strictEqual(calendar.$('.fc-event').length, 9, "should display 9 events on the week"); // Select the events only associated with partner 2 calendar.$('.o_calendar_filter_item[data-id=2] input').click(); assert.strictEqual(calendar.$('.fc-event').length, 4, "should display 4 events on the week"); // Click on the 'all' filter to reload all events calendar.$('.o_calendar_filter_item[data-value=all] input').click(); assert.strictEqual(calendar.$('.fc-event').length, 9, "should display 9 events on the week"); calendar.destroy(); }); QUnit.test('create event with filters', function (assert) { assert.expect(7); this.data.event.fields.user_id.default = 5; this.data.event.fields.partner_id.default = 3; this.data.user.records.push({id: 5, display_name: "user 5", partner_id: 3}); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ ''+ ''+ '', viewOptions: { initialDate: initialDate, }, }); var $view = $('#qunit-fixture').contents(); $view.prependTo('body'); // => select with click position calendar.$('.o_calendar_filter_item[data-value=4] input').click(); assert.strictEqual(calendar.$('.o_calendar_filter_item').length, 5, "should display 5 filter items"); assert.strictEqual(calendar.$('.fc-event').length, 3, "should display 3 events"); // quick create a record var left = calendar.$('.fc-bg td:eq(4)').offset().left+15; var top = calendar.$('.fc-slats tr:eq(4) td:first').offset().top+15; try { testUtils.triggerPositionalMouseEvent(left, top, "mousedown"); } catch (e) { calendar.destroy(); $view.remove(); throw new Error('The test fails to simulate a click in the screen. Your screen is probably too small or your dev tools is open.'); } testUtils.triggerPositionalMouseEvent(left, top + 200, "mousemove"); testUtils.triggerPositionalMouseEvent(left, top + 200, "mouseup"); $('.modal-body input:first').val('coucou').trigger('input'); $('.modal button.btn:contains(Create)').trigger('click'); assert.strictEqual(calendar.$('.o_calendar_filter_item').length, 6, "should add the missing filter (active)"); assert.strictEqual(calendar.$('.fc-event').length, 4, "should display the created item"); // change default value for quick create an hide record this.data.event.fields.user_id.default = 4; this.data.event.fields.partner_id.default = 4; // quick create and other record left = calendar.$('.fc-bg td:eq(3)').offset().left+15; top = calendar.$('.fc-slats tr:eq(4) td:first').offset().top+15; testUtils.triggerPositionalMouseEvent(left, top, "mousedown"); testUtils.triggerPositionalMouseEvent(left, top + 200, "mousemove"); testUtils.triggerPositionalMouseEvent(left, top + 200, "mouseup"); $('.modal-body input:first').val('coucou 2').trigger('input'); $('.modal button.btn:contains(Create)').trigger('click'); assert.strictEqual(calendar.$('.o_calendar_filter_item').length, 6, "should have the same filters"); assert.strictEqual(calendar.$('.fc-event').length, 4, "should not display the created item"); calendar.$('.o_calendar_filter_item[data-value=4] input').click(); assert.strictEqual(calendar.$('.fc-event').length, 11, "should display all records"); calendar.destroy(); $view.remove(); }); QUnit.test('create event with filters (no quickCreate)', function (assert) { assert.expect(4); this.data.event.fields.user_id.default = 5; this.data.event.fields.partner_id.default = 3; this.data.user.records.push({ id: 5, display_name: "user 5", partner_id: 3 }); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ ''+ ''+ '', archs: { "event,false,form": '
'+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ '
', }, viewOptions: { initialDate: initialDate, }, }); var $view = $('#qunit-fixture').contents(); $view.prependTo('body'); // => select with click position calendar.$('.o_calendar_filter_item[data-value=4] input').click(); assert.strictEqual(calendar.$('.o_calendar_filter_item').length, 5, "should display 5 filter items"); assert.strictEqual(calendar.$('.fc-event').length, 3, "should display 3 events"); // quick create a record var left = calendar.$('.fc-bg td:eq(4)').offset().left+15; var top = calendar.$('.fc-slats tr:eq(4) td:first').offset().top+15; try { testUtils.triggerPositionalMouseEvent(left, top, "mousedown"); } catch (e) { calendar.destroy(); $view.remove(); throw new Error('The test fails to simulate a click in the screen. Your screen is probably too small or your dev tools is open.'); } testUtils.triggerPositionalMouseEvent(left, top + 200, "mousemove"); testUtils.triggerPositionalMouseEvent(left, top + 200, "mouseup"); $('.modal-body input:first').val('coucou').trigger('input'); $('.modal button.btn:contains(Edit)').trigger('click'); $('.modal button.btn:contains(Save)').trigger('click'); assert.strictEqual(calendar.$('.o_calendar_filter_item').length, 6, "should add the missing filter (active)"); assert.strictEqual(calendar.$('.fc-event').length, 4, "should display the created item"); calendar.destroy(); $view.remove(); }); QUnit.test('Update event with filters', function (assert) { assert.expect(4); var records = this.data.user.records; records.push({ id: 5, display_name: "user 5", partner_id: 3 }); this.data.event.onchanges = { user_id: function (obj) { obj.partner_id = _.findWhere(records, {id:obj.user_id}).partner_id; } }; var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ ''+ ''+ '', archs: { "event,false,form": '
'+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ '
', }, viewOptions: { initialDate: initialDate, }, }); calendar.$('.o_calendar_filter_item[data-value=4] input').click(); assert.strictEqual(calendar.$('.o_calendar_filter_item').length, 5, "should display 5 filter items"); assert.strictEqual(calendar.$('.fc-event').length, 3, "should display 3 events"); calendar.$('.fc-event:contains(event 2) .fc-content').trigger('click'); $('.modal button.btn:contains(Edit)').trigger('click'); $('.modal .o_field_widget[name="user_id"] input').trigger('click'); $('.ui-menu-item a:contains(user 5)').trigger('mouseenter').trigger('click'); $('.modal button.btn:contains(Save)').trigger('click'); assert.strictEqual(calendar.$('.o_calendar_filter_item').length, 6, "should add the missing filter (active)"); assert.strictEqual(calendar.$('.fc-event').length, 3, "should display the updated item"); calendar.destroy(); }); QUnit.test('change pager with filters', function (assert) { assert.expect(3); this.data.user.records.push({ id: 5, display_name: "user 5", partner_id: 3 }); this.data.event.records.push({ id: 7, user_id: 5, partner_id: 3, name: "event 7", start: "2016-12-06 04:00:00", stop: "2016-12-06 08:00:00", allday: false, partner_ids: [1,2,3], type: 1 }, { id: 8, user_id: session.uid, partner_id: 1, name: "event 8", start: "2016-12-07 04:00:00", stop: "2016-12-07 08:00:00", allday: false, partner_ids: [1,2,3], type: 1 },{ id: 9, user_id: 4, partner_id: 4, name: "event 9", start: "2016-12-08 04:00:00", stop: "2016-12-08 08:00:00", allday: false, partner_ids: [1,2,3], type: 1 }); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ ''+ ''+ '', viewOptions: { initialDate: initialDate, }, }); calendar.$('.o_calendar_filter_item[data-value=4] input').click(); $('.o_calendar_button_prev').click(); assert.strictEqual(calendar.$('.o_calendar_filter_item').length, 6, "should display 6 filter items"); assert.strictEqual(calendar.$('.fc-event').length, 2, "should display 2 events"); assert.strictEqual(calendar.$('.fc-event .o_field_name').text().replace(/\s/g, ''), "event7event8", "should display 2 events"); calendar.destroy(); }); QUnit.test('ensure events are still shown if filters give an empty domain', function (assert) { assert.expect(2); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: '' + '' + '', viewOptions: { initialDate: initialDate, }, }); assert.strictEqual(calendar.$('.fc-event').length, 5, "should display 5 events"); calendar.$('.o_calendar_filter_item[data-value=all] input[type=checkbox]').click(); assert.strictEqual(calendar.$('.fc-event').length, 5, "should display 5 events"); calendar.destroy(); }); QUnit.test('events starting at midnight', function (assert) { assert.expect(2); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: '', viewOptions: { initialDate: initialDate, }, }); // Click on Tuesday 12am var $view = $('#qunit-fixture').contents(); $view.prependTo('body'); var top = calendar.$('.fc-axis:contains(12am)').offset().top + 5; var left = calendar.$('.fc-day:eq(2)').offset().left + 5; try { testUtils.triggerPositionalMouseEvent(left, top, "mousedown"); testUtils.triggerPositionalMouseEvent(left, top, "mouseup"); } catch (e) { calendar.destroy(); $view.remove(); throw new Error('The test failed to simulate a click on the screen.' + 'Your screen is probably too small or your dev tools are open.'); } assert.ok($('.modal-dialog.modal-sm').length, "should open the quick create dialog"); // Creating the event $('.modal-body input:first').val('new event in quick create').trigger('input'); $('.modal button.btn:contains(Create)').trigger('click').trigger('click'); assert.strictEqual(calendar.$('.fc-event:contains(new event in quick create)').length, 1, "should display the new record"); calendar.destroy(); $view.remove(); }); QUnit.test('set event as all day when field is date', function (assert) { assert.expect(2); this.data.event.records[0].start_date = "2016-12-14"; var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, session: { getTZOffset: function () { return -480; } }, }); assert.strictEqual(calendar.$('.fc-day-grid .fc-event-container').length, 1, "should be one event in the all day row"); assert.strictEqual(calendar.model.data.data[0].r_start.date(), 14, "the date should be 14"); calendar.destroy(); }); QUnit.test('quickcreate avoid double event creation', function (assert) { assert.expect(1); var createCount = 0; var def = $.Deferred(); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, mockRPC: function (route, args) { var result = this._super(route, args); if (args.method === "create") { createCount++; return def.then(_.constant(result)); } return result; }, }); // create a new event var $cell = calendar.$('.fc-day-grid .fc-row:eq(2) .fc-day:eq(2)'); testUtils.triggerMouseEvent($cell, "mousedown"); testUtils.triggerMouseEvent($cell, "mouseup"); var $input = $('.modal-body input:first'); $input.val('new event in quick create').trigger('input'); // Simulate ENTER pressed on Create button (after a TAB) $input.trigger($.Event('keyup', { which: $.ui.keyCode.ENTER, keyCode: $.ui.keyCode.ENTER, })); $('.modal-footer button:first').click(); def.resolve(); assert.strictEqual(createCount, 1, "should create only one event"); calendar.destroy(); }); QUnit.test('check if the view destroys all widgets and instances', function (assert) { assert.expect(1); var instanceNumber = 0; testUtils.patch(mixins.ParentedMixin, { init: function () { instanceNumber++; return this._super.apply(this, arguments); }, destroy: function () { if (!this.isDestroyed()) { instanceNumber--; } return this._super.apply(this, arguments); } }); var params = { View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, }; var calendar = createView(params); calendar.destroy(); var initialInstanceNumber = instanceNumber; instanceNumber = 0; calendar = createView(params); // call destroy function of controller to ensure that it correctly destroys everything calendar.__destroy(); assert.strictEqual(instanceNumber, initialInstanceNumber+1, "every widget must be destroyed exept the parent"); calendar.destroy(); testUtils.unpatch(mixins.ParentedMixin); }); QUnit.test('timezone does not affect current day', function (assert) { assert.expect(2); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, session: { getTZOffset: function () { return -2400; // 40 hours timezone }, }, }); var $sidebar = calendar.$('.o_calendar_sidebar'); assert.strictEqual($sidebar.find('.ui-datepicker-current-day').text(), "12", "should highlight the target day"); // go to previous day $sidebar.find('.ui-datepicker-current-day').prev().click(); assert.strictEqual($sidebar.find('.ui-datepicker-current-day').text(), "11", "should highlight the selected day"); calendar.destroy(); }); QUnit.test('form_view_id attribute works (for creating events)', function (assert) { assert.expect(1); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ''+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, }, mockRPC: function (route, args) { if (args.method === "create") { // we simulate here the case where a create call with just // the field name fails. This is a normal flow, the server // reject the create rpc (quick create), then the web client // fall back to a form view. This happens typically when a // model has required fields return $.Deferred().reject('None shall pass!'); } return this._super(route, args); }, intercepts: { do_action: function (event) { assert.strictEqual(event.data.action.views[0][0], 42, "should do a do_action with view id 42"); }, }, }); var $cell = calendar.$('.fc-day-grid .fc-row:eq(2) .fc-day:eq(2)'); testUtils.triggerMouseEvent($cell, "mousedown"); testUtils.triggerMouseEvent($cell, "mouseup"); var $input = $('.modal-body input:first'); $input.val("It's just a fleshwound").trigger('input'); $('.modal button.btn:contains(Create)').trigger('click'); calendar.destroy(); }); QUnit.test('calendar fallback to form view id in action if necessary', function (assert) { assert.expect(1); var calendar = createView({ View: CalendarView, model: 'event', data: this.data, arch: ' '+ ''+ '', archs: archs, viewOptions: { initialDate: initialDate, action: {views: [[1, 'kanban'], [43, 'form']]} }, mockRPC: function (route, args) { if (args.method === "create") { // we simulate here the case where a create call with just // the field name fails. This is a normal flow, the server // reject the create rpc (quick create), then the web client // fall back to a form view. This happens typically when a // model has required fields return $.Deferred().reject('None shall pass!'); } return this._super(route, args); }, intercepts: { do_action: function (event) { assert.strictEqual(event.data.action.views[0][0], 43, "should do a do_action with view id 43"); }, }, }); var $cell = calendar.$('.fc-day-grid .fc-row:eq(2) .fc-day:eq(2)'); testUtils.triggerMouseEvent($cell, "mousedown"); testUtils.triggerMouseEvent($cell, "mouseup"); var $input = $('.modal-body input:first'); $input.val("It's just a fleshwound").trigger('input'); $('.modal button.btn:contains(Create)').trigger('click'); calendar.destroy(); }); }); });