diff options
Diffstat (limited to 'comm/calendar/test/browser/eventDialog/browser_eventDialogEditButton.js')
-rw-r--r-- | comm/calendar/test/browser/eventDialog/browser_eventDialogEditButton.js | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/comm/calendar/test/browser/eventDialog/browser_eventDialogEditButton.js b/comm/calendar/test/browser/eventDialog/browser_eventDialogEditButton.js new file mode 100644 index 0000000000..b7730444b2 --- /dev/null +++ b/comm/calendar/test/browser/eventDialog/browser_eventDialogEditButton.js @@ -0,0 +1,223 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Tests for the edit button displayed in the calendar summary dialog. + */ + +const { cal } = ChromeUtils.import("resource:///modules/calendar/calUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetters(this, { + CalEvent: "resource:///modules/CalEvent.jsm", + CalRecurrenceInfo: "resource:///modules/CalRecurrenceInfo.jsm", +}); + +const calendar = CalendarTestUtils.createCalendar("Edit Button Test", "storage"); + +registerCleanupFunction(() => { + CalendarTestUtils.removeCalendar(calendar); +}); + +function createNonRecurringEvent() { + let event = new CalEvent(); + event.title = "Non-Recurring Event"; + event.startDate = cal.createDateTime("20191201T000001Z"); + return event; +} + +function createRecurringEvent() { + let event = new CalEvent(); + event.title = "Recurring Event"; + event.startDate = cal.createDateTime("20200101T000001Z"); + event.recurrenceInfo = new CalRecurrenceInfo(event); + event.recurrenceInfo.appendRecurrenceItem(cal.createRecurrenceRule("RRULE:FREQ=DAILY;COUNT=30")); + return event; +} + +/** + * Test the correct edit button is shown for a non-recurring event. + */ +add_task(async function testNonRecurringEvent() { + let event = await calendar.addItem(createNonRecurringEvent()); + await CalendarTestUtils.setCalendarView(window, "month"); + window.goToDate(event.startDate); + + let eventWindow = await CalendarTestUtils.monthView.viewItemAt(window, 1, 1, 1); + let editMenuButton = eventWindow.document.querySelector( + "#calendar-summary-dialog-edit-menu-button" + ); + + Assert.ok( + !BrowserTestUtils.is_visible(editMenuButton), + "edit dropdown is not visible for non-recurring event" + ); + + let editButton = eventWindow.document.querySelector("#calendar-summary-dialog-edit-button"); + + Assert.ok( + BrowserTestUtils.is_visible(editButton), + "edit button is visible for non-recurring event" + ); + await CalendarTestUtils.items.cancelItemDialog(eventWindow); + await calendar.deleteItem(event); +}); + +/** + * Test the edit button for a non-recurring event actual edits the event. + */ +add_task(async function testEditNonRecurringEvent() { + let event = await calendar.addItem(createNonRecurringEvent()); + await CalendarTestUtils.setCalendarView(window, "month"); + window.goToDate(event.startDate); + + let modificationPromise = new Promise(resolve => { + calendar.wrappedJSObject.addObserver({ + QueryInterface: ChromeUtils.generateQI(["calIObserver"]), + onModifyItem(aNewItem, aOldItem) { + calendar.wrappedJSObject.removeObserver(this); + resolve(); + }, + }); + }); + + let { dialogWindow, iframeDocument } = await CalendarTestUtils.monthView.editItemAt( + window, + 1, + 1, + 1 + ); + + let newTitle = "Edited Non-Recurring Event"; + iframeDocument.querySelector("#item-title").value = newTitle; + + await CalendarTestUtils.items.saveAndCloseItemDialog(dialogWindow); + await modificationPromise; + + let viewWindow = await CalendarTestUtils.monthView.viewItemAt(window, 1, 1, 1); + let actualTitle = viewWindow.document.querySelector( + "#calendar-item-summary .item-title" + ).textContent; + + Assert.equal(actualTitle, newTitle, "edit non-recurring event successful"); + await CalendarTestUtils.items.cancelItemDialog(viewWindow); + await calendar.deleteItem(event); +}); + +/** + * Tests the dropdown menu is displayed for a recurring event. + */ +add_task(async function testRecurringEvent() { + let event = await calendar.addItem(createRecurringEvent()); + await CalendarTestUtils.setCalendarView(window, "month"); + window.goToDate(event.startDate); + + let viewWindow = await CalendarTestUtils.monthView.viewItemAt(window, 1, 6, 1); + + Assert.ok( + !BrowserTestUtils.is_visible( + viewWindow.document.querySelector("#calendar-summary-dialog-edit-button") + ), + "non-recurring edit button is not visible for recurring event" + ); + Assert.ok( + BrowserTestUtils.is_visible( + viewWindow.document.querySelector("#calendar-summary-dialog-edit-menu-button") + ), + "edit dropdown is visible for recurring event" + ); + + await CalendarTestUtils.items.cancelItemDialog(viewWindow); + await calendar.deleteItem(event); +}); + +/** + * Tests the dropdown menu allows a single occurrence of a repeating event + * to be edited. + */ +add_task(async function testEditThisOccurrence() { + let event = createRecurringEvent(); + event = await calendar.addItem(event); + + await CalendarTestUtils.setCalendarView(window, "month"); + window.goToDate(event.startDate); + + let modificationPromise = new Promise(resolve => { + calendar.wrappedJSObject.addObserver({ + QueryInterface: ChromeUtils.generateQI(["calIObserver"]), + onModifyItem(aNewItem, aOldItem) { + calendar.wrappedJSObject.removeObserver(this); + resolve(); + }, + }); + }); + + let { dialogWindow, iframeDocument } = await CalendarTestUtils.monthView.editItemOccurrenceAt( + window, + 1, + 6, + 1 + ); + + let originalTitle = event.title; + let newTitle = "Edited This Occurrence"; + + iframeDocument.querySelector("#item-title").value = newTitle; + await CalendarTestUtils.items.saveAndCloseItemDialog(dialogWindow); + + await modificationPromise; + + let changedBox = await CalendarTestUtils.monthView.waitForItemAt(window, 1, 6, 1); + let eventBoxes = document.querySelectorAll("calendar-month-day-box-item"); + + for (let box of eventBoxes) { + if (box !== changedBox) { + Assert.equal( + box.item.title, + originalTitle, + '"Edit this occurrence" did not edit other occurrences' + ); + } else { + Assert.equal(box.item.title, newTitle, '"Edit this occurrence only" edited this occurrence.'); + } + } + await calendar.deleteItem(event); +}); + +/** + * Tests the dropdown menu allows all occurrences of a recurring event to be + * edited. + */ +add_task(async function testEditAllOccurrences() { + let event = await calendar.addItem(createRecurringEvent()); + + await CalendarTestUtils.setCalendarView(window, "month"); + window.goToDate(event.startDate); + + // Setup an observer so we can wait for the event boxes to be updated. + let boxesRefreshed = false; + let observer = new MutationObserver(() => (boxesRefreshed = true)); + observer.observe(document.querySelector("#month-view"), { + childList: true, + subtree: true, + }); + + let { dialogWindow, iframeDocument } = await CalendarTestUtils.monthView.editItemOccurrencesAt( + window, + 1, + 6, + 1 + ); + + let newTitle = "Edited All Occurrences"; + + iframeDocument.querySelector("#item-title").value = newTitle; + await CalendarTestUtils.items.saveAndCloseItemDialog(dialogWindow); + await TestUtils.waitForCondition(() => boxesRefreshed, "event boxes did not refresh in time"); + + let eventBoxes = document.querySelectorAll("calendar-month-day-box-item"); + for (let box of eventBoxes) { + Assert.equal(box.item.title, newTitle, '"Edit all occurrences" edited each occurrence'); + } + await calendar.deleteItem(event); +}); |