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
|
/* 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/. */
/* globals openAttendeesWindow, closeAttendeesWindow, findAndEditMatchingRow */
const { CalEvent } = ChromeUtils.import("resource:///modules/CalEvent.jsm");
add_setup(async function () {
await CalendarTestUtils.setCalendarView(window, "day");
CalendarTestUtils.goToDate(window, 2023, 2, 18);
});
add_task(async function testUpdateAttendee() {
const calendar = CalendarTestUtils.createCalendar();
calendar.setProperty("organizerId", "mailto:foo@example.com");
// Create an event with several attendees, all of which should have some
// non-default properties which aren't covered in the attendees dialog to
// ensure that we aren't throwing properties away when we close the dialog.
const event = await calendar.addItem(
new CalEvent(CalendarTestUtils.dedent`
BEGIN:VEVENT
SUMMARY:An event
DTSTART:20230218T100000Z
DTEND:20230218T110000Z
ORGANIZER;CN="Foo Fooson":mailto:foo@example.com
ATTENDEE;CN="Foo Fooson";PARTSTAT=TENTATIVE;ROLE=REQ-PARTICIPANT:mailto:f
oo@example.com
ATTENDEE;CN="Bar Barington";PARTSTAT=DECLINED;ROLE=CHAIR:mailto:bar@examp
le.com
ATTENDEE;CN="Baz Luhrmann";PARTSTAT=NEEDS-ACTION;ROLE=OPT-PARTICIPANT;RSV
P=TRUE:mailto:baz@example.com
END:VEVENT
`)
);
// Remember event details so we can refetch it after editing.
const eventId = event.id;
const eventModified = event.lastModifiedTime;
// Sanity check. Note that order of attendees is not significant and thus not
// guaranteed.
const attendees = event.getAttendees();
Assert.equal(attendees.length, 3, "there should be three attendees of the event");
const fooFooson = attendees.find(attendee => attendee.id == "mailto:foo@example.com");
Assert.ok(fooFooson, "an attendee should have the address foo@example.com");
Assert.equal(fooFooson.commonName, "Foo Fooson", "attendee name should match");
Assert.equal(fooFooson.participationStatus, "TENTATIVE", "attendee should be marked tentative");
Assert.equal(fooFooson.role, "REQ-PARTICIPANT", "attendee should be required");
const barBarrington = attendees.find(attendee => attendee.id == "mailto:bar@example.com");
Assert.ok(barBarrington, "an attendee should have the address bar@example.com");
Assert.equal(barBarrington.commonName, "Bar Barington", "attendee name should match");
Assert.equal(barBarrington.participationStatus, "DECLINED", "attendee should have declined");
Assert.equal(barBarrington.role, "CHAIR", "attendee should be the meeting chair");
const bazLuhrmann = attendees.find(attendee => attendee.id == "mailto:baz@example.com");
Assert.ok(bazLuhrmann, "an attendee should have the address baz@example.com");
Assert.equal(bazLuhrmann.commonName, "Baz Luhrmann", "attendee name should match");
Assert.equal(
bazLuhrmann.participationStatus,
"NEEDS-ACTION",
"attendee should not have responded yet"
);
Assert.equal(bazLuhrmann.role, "OPT-PARTICIPANT", "attendee should be optional");
Assert.equal(bazLuhrmann.rsvp, "TRUE", "attendee should be expected to RSVP");
// Open our event for editing.
const { dialogWindow: eventWindow } = await CalendarTestUtils.dayView.editEventAt(window, 1);
const attendeesWindow = await openAttendeesWindow(eventWindow);
// Edit the second attendee to correct their name.
findAndEditMatchingRow(
attendeesWindow,
"Bar Barrington <bar@example.com>",
"there should an input containing the provided email",
value => value.includes("bar@example.com")
);
// Save and close the event.
await closeAttendeesWindow(attendeesWindow);
await CalendarTestUtils.items.saveAndCloseItemDialog(eventWindow);
await TestUtils.waitForCondition(async () => {
const item = await calendar.getItem(eventId);
return item.lastModifiedTime != eventModified;
});
const editedEvent = await calendar.getItem(eventId);
const editedAttendees = editedEvent.getAttendees();
Assert.equal(
editedAttendees.length,
3,
"there should be three attendees of the event after editing"
);
// Verify that the first attendee's properties have not been overwritten or
// lost.
const editedFooFooson = editedAttendees.find(attendee => attendee.id == "mailto:foo@example.com");
Assert.ok(editedFooFooson, "an attendee should have the address foo@example.com");
Assert.equal(editedFooFooson.commonName, "Foo Fooson", "attendee name should match");
Assert.equal(
editedFooFooson.participationStatus,
"TENTATIVE",
"attendee should be marked tentative"
);
Assert.equal(editedFooFooson.role, "REQ-PARTICIPANT", "attendee should be required");
// Verify that the second attendee's name has been changed and all other
// fields remain untouched.
const editedBarBarrington = editedAttendees.find(
attendee => attendee.id == "mailto:bar@example.com"
);
Assert.ok(editedBarBarrington, "an attendee should have the address bar@example.com");
Assert.equal(editedBarBarrington.commonName, "Bar Barrington", "attendee name should match");
Assert.equal(
editedBarBarrington.participationStatus,
"DECLINED",
"attendee should have declined"
);
Assert.equal(editedBarBarrington.role, "CHAIR", "attendee should be the meeting chair");
// Verify that the final attendee's properties remain untouched.
const editedBazLuhrmann = editedAttendees.find(
attendee => attendee.id == "mailto:baz@example.com"
);
Assert.ok(editedBazLuhrmann, "an attendee should have the address baz@example.com");
Assert.equal(editedBazLuhrmann.commonName, "Baz Luhrmann", "attendee name should match");
Assert.equal(
editedBazLuhrmann.participationStatus,
"NEEDS-ACTION",
"attendee should not have responded yet"
);
Assert.equal(editedBazLuhrmann.role, "OPT-PARTICIPANT", "attendee should be optional");
Assert.equal(editedBazLuhrmann.rsvp, "TRUE", "attendee should be expected to RSVP");
CalendarTestUtils.removeCalendar(calendar);
});
|