1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\CalDAV\Schedule; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehleruse Sabre\HTTP\Request; 6*a1a3b679SAndreas Boehler 7*a1a3b679SAndreas Boehlerclass ScheduleDeliverTest extends \Sabre\DAVServerTest { 8*a1a3b679SAndreas Boehler 9*a1a3b679SAndreas Boehler public $setupCalDAV = true; 10*a1a3b679SAndreas Boehler public $setupCalDAVScheduling = true; 11*a1a3b679SAndreas Boehler public $setupACL = true; 12*a1a3b679SAndreas Boehler public $autoLogin = 'user1'; 13*a1a3b679SAndreas Boehler 14*a1a3b679SAndreas Boehler public $caldavCalendars = [ 15*a1a3b679SAndreas Boehler [ 16*a1a3b679SAndreas Boehler 'principaluri' => 'principals/user1', 17*a1a3b679SAndreas Boehler 'uri' => 'cal', 18*a1a3b679SAndreas Boehler ], 19*a1a3b679SAndreas Boehler [ 20*a1a3b679SAndreas Boehler 'principaluri' => 'principals/user2', 21*a1a3b679SAndreas Boehler 'uri' => 'cal', 22*a1a3b679SAndreas Boehler ], 23*a1a3b679SAndreas Boehler ]; 24*a1a3b679SAndreas Boehler 25*a1a3b679SAndreas Boehler function setUp() { 26*a1a3b679SAndreas Boehler 27*a1a3b679SAndreas Boehler $this->calendarObjectUri = '/calendars/user1/cal/object.ics'; 28*a1a3b679SAndreas Boehler 29*a1a3b679SAndreas Boehler parent::setUp(); 30*a1a3b679SAndreas Boehler 31*a1a3b679SAndreas Boehler } 32*a1a3b679SAndreas Boehler 33*a1a3b679SAndreas Boehler function testNewInvite() { 34*a1a3b679SAndreas Boehler 35*a1a3b679SAndreas Boehler $newObject = <<<ICS 36*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 37*a1a3b679SAndreas BoehlerBEGIN:VEVENT 38*a1a3b679SAndreas BoehlerUID:foo 39*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 40*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 41*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 42*a1a3b679SAndreas BoehlerEND:VEVENT 43*a1a3b679SAndreas BoehlerEND:VCALENDAR 44*a1a3b679SAndreas BoehlerICS; 45*a1a3b679SAndreas Boehler 46*a1a3b679SAndreas Boehler $this->deliver(null, $newObject); 47*a1a3b679SAndreas Boehler $this->assertItemsInInbox('user2', 1); 48*a1a3b679SAndreas Boehler 49*a1a3b679SAndreas Boehler $expected = <<<ICS 50*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 51*a1a3b679SAndreas BoehlerBEGIN:VEVENT 52*a1a3b679SAndreas BoehlerUID:foo 53*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 54*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 55*a1a3b679SAndreas BoehlerATTENDEE;SCHEDULE-STATUS=1.2:mailto:user2.sabredav@sabredav.org 56*a1a3b679SAndreas BoehlerEND:VEVENT 57*a1a3b679SAndreas BoehlerEND:VCALENDAR 58*a1a3b679SAndreas BoehlerICS; 59*a1a3b679SAndreas Boehler 60*a1a3b679SAndreas Boehler $this->assertVObjEquals( 61*a1a3b679SAndreas Boehler $expected, 62*a1a3b679SAndreas Boehler $newObject 63*a1a3b679SAndreas Boehler ); 64*a1a3b679SAndreas Boehler 65*a1a3b679SAndreas Boehler } 66*a1a3b679SAndreas Boehler 67*a1a3b679SAndreas Boehler function testNewOnWrongCollection() { 68*a1a3b679SAndreas Boehler 69*a1a3b679SAndreas Boehler $newObject = <<<ICS 70*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 71*a1a3b679SAndreas BoehlerBEGIN:VEVENT 72*a1a3b679SAndreas BoehlerUID:foo 73*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 74*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 75*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 76*a1a3b679SAndreas BoehlerEND:VEVENT 77*a1a3b679SAndreas BoehlerEND:VCALENDAR 78*a1a3b679SAndreas BoehlerICS; 79*a1a3b679SAndreas Boehler 80*a1a3b679SAndreas Boehler $this->calendarObjectUri = '/calendars/user1/object.ics'; 81*a1a3b679SAndreas Boehler $this->deliver(null, $newObject); 82*a1a3b679SAndreas Boehler $this->assertItemsInInbox('user2', 0); 83*a1a3b679SAndreas Boehler 84*a1a3b679SAndreas Boehler 85*a1a3b679SAndreas Boehler } 86*a1a3b679SAndreas Boehler function testNewInviteSchedulingDisabled() { 87*a1a3b679SAndreas Boehler 88*a1a3b679SAndreas Boehler $newObject = <<<ICS 89*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 90*a1a3b679SAndreas BoehlerBEGIN:VEVENT 91*a1a3b679SAndreas BoehlerUID:foo 92*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 93*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 94*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 95*a1a3b679SAndreas BoehlerEND:VEVENT 96*a1a3b679SAndreas BoehlerEND:VCALENDAR 97*a1a3b679SAndreas BoehlerICS; 98*a1a3b679SAndreas Boehler 99*a1a3b679SAndreas Boehler $this->deliver(null, $newObject, true); 100*a1a3b679SAndreas Boehler $this->assertItemsInInbox('user2', 0); 101*a1a3b679SAndreas Boehler 102*a1a3b679SAndreas Boehler } 103*a1a3b679SAndreas Boehler function testUpdatedInvite() { 104*a1a3b679SAndreas Boehler 105*a1a3b679SAndreas Boehler $newObject = <<<ICS 106*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 107*a1a3b679SAndreas BoehlerBEGIN:VEVENT 108*a1a3b679SAndreas BoehlerUID:foo 109*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 110*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 111*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 112*a1a3b679SAndreas BoehlerEND:VEVENT 113*a1a3b679SAndreas BoehlerEND:VCALENDAR 114*a1a3b679SAndreas BoehlerICS; 115*a1a3b679SAndreas Boehler $oldObject = <<<ICS 116*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 117*a1a3b679SAndreas BoehlerBEGIN:VEVENT 118*a1a3b679SAndreas BoehlerUID:foo 119*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 120*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 121*a1a3b679SAndreas BoehlerEND:VEVENT 122*a1a3b679SAndreas BoehlerEND:VCALENDAR 123*a1a3b679SAndreas BoehlerICS; 124*a1a3b679SAndreas Boehler 125*a1a3b679SAndreas Boehler $this->deliver($oldObject, $newObject); 126*a1a3b679SAndreas Boehler $this->assertItemsInInbox('user2', 1); 127*a1a3b679SAndreas Boehler 128*a1a3b679SAndreas Boehler $expected = <<<ICS 129*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 130*a1a3b679SAndreas BoehlerBEGIN:VEVENT 131*a1a3b679SAndreas BoehlerUID:foo 132*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 133*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 134*a1a3b679SAndreas BoehlerATTENDEE;SCHEDULE-STATUS=1.2:mailto:user2.sabredav@sabredav.org 135*a1a3b679SAndreas BoehlerEND:VEVENT 136*a1a3b679SAndreas BoehlerEND:VCALENDAR 137*a1a3b679SAndreas BoehlerICS; 138*a1a3b679SAndreas Boehler 139*a1a3b679SAndreas Boehler $this->assertVObjEquals( 140*a1a3b679SAndreas Boehler $expected, 141*a1a3b679SAndreas Boehler $newObject 142*a1a3b679SAndreas Boehler ); 143*a1a3b679SAndreas Boehler 144*a1a3b679SAndreas Boehler 145*a1a3b679SAndreas Boehler } 146*a1a3b679SAndreas Boehler function testUpdatedInviteSchedulingDisabled() { 147*a1a3b679SAndreas Boehler 148*a1a3b679SAndreas Boehler $newObject = <<<ICS 149*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 150*a1a3b679SAndreas BoehlerBEGIN:VEVENT 151*a1a3b679SAndreas BoehlerUID:foo 152*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 153*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 154*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 155*a1a3b679SAndreas BoehlerEND:VEVENT 156*a1a3b679SAndreas BoehlerEND:VCALENDAR 157*a1a3b679SAndreas BoehlerICS; 158*a1a3b679SAndreas Boehler $oldObject = <<<ICS 159*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 160*a1a3b679SAndreas BoehlerBEGIN:VEVENT 161*a1a3b679SAndreas BoehlerUID:foo 162*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 163*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 164*a1a3b679SAndreas BoehlerEND:VEVENT 165*a1a3b679SAndreas BoehlerEND:VCALENDAR 166*a1a3b679SAndreas BoehlerICS; 167*a1a3b679SAndreas Boehler 168*a1a3b679SAndreas Boehler $this->deliver($oldObject, $newObject, true); 169*a1a3b679SAndreas Boehler $this->assertItemsInInbox('user2', 0); 170*a1a3b679SAndreas Boehler 171*a1a3b679SAndreas Boehler } 172*a1a3b679SAndreas Boehler 173*a1a3b679SAndreas Boehler function testUpdatedInviteWrongPath() { 174*a1a3b679SAndreas Boehler 175*a1a3b679SAndreas Boehler $newObject = <<<ICS 176*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 177*a1a3b679SAndreas BoehlerBEGIN:VEVENT 178*a1a3b679SAndreas BoehlerUID:foo 179*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 180*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 181*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 182*a1a3b679SAndreas BoehlerEND:VEVENT 183*a1a3b679SAndreas BoehlerEND:VCALENDAR 184*a1a3b679SAndreas BoehlerICS; 185*a1a3b679SAndreas Boehler $oldObject = <<<ICS 186*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 187*a1a3b679SAndreas BoehlerBEGIN:VEVENT 188*a1a3b679SAndreas BoehlerUID:foo 189*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 190*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 191*a1a3b679SAndreas BoehlerEND:VEVENT 192*a1a3b679SAndreas BoehlerEND:VCALENDAR 193*a1a3b679SAndreas BoehlerICS; 194*a1a3b679SAndreas Boehler 195*a1a3b679SAndreas Boehler $this->calendarObjectUri = '/calendars/user1/inbox/foo.ics'; 196*a1a3b679SAndreas Boehler $this->deliver($oldObject, $newObject); 197*a1a3b679SAndreas Boehler $this->assertItemsInInbox('user2', 0); 198*a1a3b679SAndreas Boehler 199*a1a3b679SAndreas Boehler } 200*a1a3b679SAndreas Boehler 201*a1a3b679SAndreas Boehler function testDeletedInvite() { 202*a1a3b679SAndreas Boehler 203*a1a3b679SAndreas Boehler $newObject = null; 204*a1a3b679SAndreas Boehler 205*a1a3b679SAndreas Boehler $oldObject = <<<ICS 206*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 207*a1a3b679SAndreas BoehlerBEGIN:VEVENT 208*a1a3b679SAndreas BoehlerUID:foo 209*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 210*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 211*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 212*a1a3b679SAndreas BoehlerEND:VEVENT 213*a1a3b679SAndreas BoehlerEND:VCALENDAR 214*a1a3b679SAndreas BoehlerICS; 215*a1a3b679SAndreas Boehler 216*a1a3b679SAndreas Boehler $this->deliver($oldObject, $newObject); 217*a1a3b679SAndreas Boehler $this->assertItemsInInbox('user2', 1); 218*a1a3b679SAndreas Boehler 219*a1a3b679SAndreas Boehler } 220*a1a3b679SAndreas Boehler 221*a1a3b679SAndreas Boehler function testDeletedInviteSchedulingDisabled() { 222*a1a3b679SAndreas Boehler 223*a1a3b679SAndreas Boehler $newObject = null; 224*a1a3b679SAndreas Boehler 225*a1a3b679SAndreas Boehler $oldObject = <<<ICS 226*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 227*a1a3b679SAndreas BoehlerBEGIN:VEVENT 228*a1a3b679SAndreas BoehlerUID:foo 229*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 230*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 231*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 232*a1a3b679SAndreas BoehlerEND:VEVENT 233*a1a3b679SAndreas BoehlerEND:VCALENDAR 234*a1a3b679SAndreas BoehlerICS; 235*a1a3b679SAndreas Boehler 236*a1a3b679SAndreas Boehler $this->deliver($oldObject, $newObject, true); 237*a1a3b679SAndreas Boehler $this->assertItemsInInbox('user2', 0); 238*a1a3b679SAndreas Boehler 239*a1a3b679SAndreas Boehler } 240*a1a3b679SAndreas Boehler 241*a1a3b679SAndreas Boehler /** 242*a1a3b679SAndreas Boehler * A MOVE request will trigger an unbind on a scheduling resource. 243*a1a3b679SAndreas Boehler * 244*a1a3b679SAndreas Boehler * However, we must not treat it as a cancellation, it just got moved to a 245*a1a3b679SAndreas Boehler * different calendar. 246*a1a3b679SAndreas Boehler */ 247*a1a3b679SAndreas Boehler function testUnbindIgnoredOnMove() { 248*a1a3b679SAndreas Boehler 249*a1a3b679SAndreas Boehler $newObject = null; 250*a1a3b679SAndreas Boehler 251*a1a3b679SAndreas Boehler $oldObject = <<<ICS 252*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 253*a1a3b679SAndreas BoehlerBEGIN:VEVENT 254*a1a3b679SAndreas BoehlerUID:foo 255*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 256*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 257*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 258*a1a3b679SAndreas BoehlerEND:VEVENT 259*a1a3b679SAndreas BoehlerEND:VCALENDAR 260*a1a3b679SAndreas BoehlerICS; 261*a1a3b679SAndreas Boehler 262*a1a3b679SAndreas Boehler 263*a1a3b679SAndreas Boehler $this->server->httpRequest->setMethod('MOVE'); 264*a1a3b679SAndreas Boehler $this->deliver($oldObject, $newObject); 265*a1a3b679SAndreas Boehler $this->assertItemsInInbox('user2', 0); 266*a1a3b679SAndreas Boehler 267*a1a3b679SAndreas Boehler } 268*a1a3b679SAndreas Boehler 269*a1a3b679SAndreas Boehler function testDeletedInviteWrongUrl() { 270*a1a3b679SAndreas Boehler 271*a1a3b679SAndreas Boehler $newObject = null; 272*a1a3b679SAndreas Boehler 273*a1a3b679SAndreas Boehler $oldObject = <<<ICS 274*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 275*a1a3b679SAndreas BoehlerBEGIN:VEVENT 276*a1a3b679SAndreas BoehlerUID:foo 277*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 278*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 279*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 280*a1a3b679SAndreas BoehlerEND:VEVENT 281*a1a3b679SAndreas BoehlerEND:VCALENDAR 282*a1a3b679SAndreas BoehlerICS; 283*a1a3b679SAndreas Boehler 284*a1a3b679SAndreas Boehler $this->calendarObjectUri = '/calendars/user1/inbox/foo.ics'; 285*a1a3b679SAndreas Boehler $this->deliver($oldObject, $newObject); 286*a1a3b679SAndreas Boehler $this->assertItemsInInbox('user2', 0); 287*a1a3b679SAndreas Boehler 288*a1a3b679SAndreas Boehler } 289*a1a3b679SAndreas Boehler 290*a1a3b679SAndreas Boehler function testReply() { 291*a1a3b679SAndreas Boehler 292*a1a3b679SAndreas Boehler $oldObject = <<<ICS 293*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 294*a1a3b679SAndreas BoehlerBEGIN:VEVENT 295*a1a3b679SAndreas BoehlerUID:foo 296*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 297*a1a3b679SAndreas BoehlerORGANIZER:mailto:user2.sabredav@sabredav.org 298*a1a3b679SAndreas BoehlerATTENDEE;PARTSTAT=ACCEPTED:mailto:user2.sabredav@sabredav.org 299*a1a3b679SAndreas BoehlerATTENDEE:mailto:user1.sabredav@sabredav.org 300*a1a3b679SAndreas BoehlerATTENDEE:mailto:user3.sabredav@sabredav.org 301*a1a3b679SAndreas BoehlerEND:VEVENT 302*a1a3b679SAndreas BoehlerEND:VCALENDAR 303*a1a3b679SAndreas BoehlerICS; 304*a1a3b679SAndreas Boehler 305*a1a3b679SAndreas Boehler $newObject = <<<ICS 306*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 307*a1a3b679SAndreas BoehlerBEGIN:VEVENT 308*a1a3b679SAndreas BoehlerUID:foo 309*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 310*a1a3b679SAndreas BoehlerORGANIZER:mailto:user2.sabredav@sabredav.org 311*a1a3b679SAndreas BoehlerATTENDEE;PARTSTAT=ACCEPTED:mailto:user2.sabredav@sabredav.org 312*a1a3b679SAndreas BoehlerATTENDEE;PARTSTAT=ACCEPTED:mailto:user1.sabredav@sabredav.org 313*a1a3b679SAndreas BoehlerATTENDEE:mailto:user3.sabredav@sabredav.org 314*a1a3b679SAndreas BoehlerEND:VEVENT 315*a1a3b679SAndreas BoehlerEND:VCALENDAR 316*a1a3b679SAndreas BoehlerICS; 317*a1a3b679SAndreas Boehler 318*a1a3b679SAndreas Boehler $this->putPath('calendars/user2/cal/foo.ics', $oldObject); 319*a1a3b679SAndreas Boehler 320*a1a3b679SAndreas Boehler $this->deliver($oldObject, $newObject); 321*a1a3b679SAndreas Boehler $this->assertItemsInInbox('user2', 1); 322*a1a3b679SAndreas Boehler $this->assertItemsInInbox('user1', 0); 323*a1a3b679SAndreas Boehler 324*a1a3b679SAndreas Boehler $expected = <<<ICS 325*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 326*a1a3b679SAndreas BoehlerBEGIN:VEVENT 327*a1a3b679SAndreas BoehlerUID:foo 328*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 329*a1a3b679SAndreas BoehlerORGANIZER;SCHEDULE-STATUS=1.2:mailto:user2.sabredav@sabredav.org 330*a1a3b679SAndreas BoehlerATTENDEE;PARTSTAT=ACCEPTED:mailto:user2.sabredav@sabredav.org 331*a1a3b679SAndreas BoehlerATTENDEE;PARTSTAT=ACCEPTED:mailto:user1.sabredav@sabredav.org 332*a1a3b679SAndreas BoehlerATTENDEE:mailto:user3.sabredav@sabredav.org 333*a1a3b679SAndreas BoehlerEND:VEVENT 334*a1a3b679SAndreas BoehlerEND:VCALENDAR 335*a1a3b679SAndreas BoehlerICS; 336*a1a3b679SAndreas Boehler 337*a1a3b679SAndreas Boehler $this->assertVObjEquals( 338*a1a3b679SAndreas Boehler $expected, 339*a1a3b679SAndreas Boehler $newObject 340*a1a3b679SAndreas Boehler ); 341*a1a3b679SAndreas Boehler 342*a1a3b679SAndreas Boehler } 343*a1a3b679SAndreas Boehler 344*a1a3b679SAndreas Boehler 345*a1a3b679SAndreas Boehler 346*a1a3b679SAndreas Boehler function testInviteUnknownUser() { 347*a1a3b679SAndreas Boehler 348*a1a3b679SAndreas Boehler $newObject = <<<ICS 349*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 350*a1a3b679SAndreas BoehlerBEGIN:VEVENT 351*a1a3b679SAndreas BoehlerUID:foo 352*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 353*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 354*a1a3b679SAndreas BoehlerATTENDEE:mailto:user3.sabredav@sabredav.org 355*a1a3b679SAndreas BoehlerEND:VEVENT 356*a1a3b679SAndreas BoehlerEND:VCALENDAR 357*a1a3b679SAndreas BoehlerICS; 358*a1a3b679SAndreas Boehler 359*a1a3b679SAndreas Boehler $this->deliver(null, $newObject); 360*a1a3b679SAndreas Boehler 361*a1a3b679SAndreas Boehler $expected = <<<ICS 362*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 363*a1a3b679SAndreas BoehlerBEGIN:VEVENT 364*a1a3b679SAndreas BoehlerUID:foo 365*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 366*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 367*a1a3b679SAndreas BoehlerATTENDEE;SCHEDULE-STATUS=3.7:mailto:user3.sabredav@sabredav.org 368*a1a3b679SAndreas BoehlerEND:VEVENT 369*a1a3b679SAndreas BoehlerEND:VCALENDAR 370*a1a3b679SAndreas BoehlerICS; 371*a1a3b679SAndreas Boehler 372*a1a3b679SAndreas Boehler $this->assertVObjEquals( 373*a1a3b679SAndreas Boehler $expected, 374*a1a3b679SAndreas Boehler $newObject 375*a1a3b679SAndreas Boehler ); 376*a1a3b679SAndreas Boehler 377*a1a3b679SAndreas Boehler } 378*a1a3b679SAndreas Boehler 379*a1a3b679SAndreas Boehler function testInviteNoInboxUrl() { 380*a1a3b679SAndreas Boehler 381*a1a3b679SAndreas Boehler $newObject = <<<ICS 382*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 383*a1a3b679SAndreas BoehlerBEGIN:VEVENT 384*a1a3b679SAndreas BoehlerUID:foo 385*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 386*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 387*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 388*a1a3b679SAndreas BoehlerEND:VEVENT 389*a1a3b679SAndreas BoehlerEND:VCALENDAR 390*a1a3b679SAndreas BoehlerICS; 391*a1a3b679SAndreas Boehler 392*a1a3b679SAndreas Boehler $this->server->on('propFind', function($propFind) { 393*a1a3b679SAndreas Boehler $propFind->set('{' . Plugin::NS_CALDAV . '}schedule-inbox-URL', null, 403); 394*a1a3b679SAndreas Boehler }); 395*a1a3b679SAndreas Boehler $this->deliver(null, $newObject); 396*a1a3b679SAndreas Boehler 397*a1a3b679SAndreas Boehler $expected = <<<ICS 398*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 399*a1a3b679SAndreas BoehlerBEGIN:VEVENT 400*a1a3b679SAndreas BoehlerUID:foo 401*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 402*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 403*a1a3b679SAndreas BoehlerATTENDEE;SCHEDULE-STATUS=5.2:mailto:user2.sabredav@sabredav.org 404*a1a3b679SAndreas BoehlerEND:VEVENT 405*a1a3b679SAndreas BoehlerEND:VCALENDAR 406*a1a3b679SAndreas BoehlerICS; 407*a1a3b679SAndreas Boehler 408*a1a3b679SAndreas Boehler $this->assertVObjEquals( 409*a1a3b679SAndreas Boehler $expected, 410*a1a3b679SAndreas Boehler $newObject 411*a1a3b679SAndreas Boehler ); 412*a1a3b679SAndreas Boehler 413*a1a3b679SAndreas Boehler } 414*a1a3b679SAndreas Boehler 415*a1a3b679SAndreas Boehler function testInviteNoCalendarHomeSet() { 416*a1a3b679SAndreas Boehler 417*a1a3b679SAndreas Boehler $newObject = <<<ICS 418*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 419*a1a3b679SAndreas BoehlerBEGIN:VEVENT 420*a1a3b679SAndreas BoehlerUID:foo 421*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 422*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 423*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 424*a1a3b679SAndreas BoehlerEND:VEVENT 425*a1a3b679SAndreas BoehlerEND:VCALENDAR 426*a1a3b679SAndreas BoehlerICS; 427*a1a3b679SAndreas Boehler 428*a1a3b679SAndreas Boehler $this->server->on('propFind', function($propFind) { 429*a1a3b679SAndreas Boehler $propFind->set('{' . Plugin::NS_CALDAV . '}calendar-home-set', null, 403); 430*a1a3b679SAndreas Boehler }); 431*a1a3b679SAndreas Boehler $this->deliver(null, $newObject); 432*a1a3b679SAndreas Boehler 433*a1a3b679SAndreas Boehler $expected = <<<ICS 434*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 435*a1a3b679SAndreas BoehlerBEGIN:VEVENT 436*a1a3b679SAndreas BoehlerUID:foo 437*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 438*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 439*a1a3b679SAndreas BoehlerATTENDEE;SCHEDULE-STATUS=5.2:mailto:user2.sabredav@sabredav.org 440*a1a3b679SAndreas BoehlerEND:VEVENT 441*a1a3b679SAndreas BoehlerEND:VCALENDAR 442*a1a3b679SAndreas BoehlerICS; 443*a1a3b679SAndreas Boehler 444*a1a3b679SAndreas Boehler $this->assertVObjEquals( 445*a1a3b679SAndreas Boehler $expected, 446*a1a3b679SAndreas Boehler $newObject 447*a1a3b679SAndreas Boehler ); 448*a1a3b679SAndreas Boehler 449*a1a3b679SAndreas Boehler } 450*a1a3b679SAndreas Boehler function testInviteNoDefaultCalendar() { 451*a1a3b679SAndreas Boehler 452*a1a3b679SAndreas Boehler $newObject = <<<ICS 453*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 454*a1a3b679SAndreas BoehlerBEGIN:VEVENT 455*a1a3b679SAndreas BoehlerUID:foo 456*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 457*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 458*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 459*a1a3b679SAndreas BoehlerEND:VEVENT 460*a1a3b679SAndreas BoehlerEND:VCALENDAR 461*a1a3b679SAndreas BoehlerICS; 462*a1a3b679SAndreas Boehler 463*a1a3b679SAndreas Boehler $this->server->on('propFind', function($propFind) { 464*a1a3b679SAndreas Boehler $propFind->set('{' . Plugin::NS_CALDAV . '}schedule-default-calendar-URL', null, 403); 465*a1a3b679SAndreas Boehler }); 466*a1a3b679SAndreas Boehler $this->deliver(null, $newObject); 467*a1a3b679SAndreas Boehler 468*a1a3b679SAndreas Boehler $expected = <<<ICS 469*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 470*a1a3b679SAndreas BoehlerBEGIN:VEVENT 471*a1a3b679SAndreas BoehlerUID:foo 472*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 473*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 474*a1a3b679SAndreas BoehlerATTENDEE;SCHEDULE-STATUS=5.2:mailto:user2.sabredav@sabredav.org 475*a1a3b679SAndreas BoehlerEND:VEVENT 476*a1a3b679SAndreas BoehlerEND:VCALENDAR 477*a1a3b679SAndreas BoehlerICS; 478*a1a3b679SAndreas Boehler 479*a1a3b679SAndreas Boehler $this->assertVObjEquals( 480*a1a3b679SAndreas Boehler $expected, 481*a1a3b679SAndreas Boehler $newObject 482*a1a3b679SAndreas Boehler ); 483*a1a3b679SAndreas Boehler 484*a1a3b679SAndreas Boehler } 485*a1a3b679SAndreas Boehler function testInviteNoScheduler() { 486*a1a3b679SAndreas Boehler 487*a1a3b679SAndreas Boehler $newObject = <<<ICS 488*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 489*a1a3b679SAndreas BoehlerBEGIN:VEVENT 490*a1a3b679SAndreas BoehlerUID:foo 491*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 492*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 493*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 494*a1a3b679SAndreas BoehlerEND:VEVENT 495*a1a3b679SAndreas BoehlerEND:VCALENDAR 496*a1a3b679SAndreas BoehlerICS; 497*a1a3b679SAndreas Boehler 498*a1a3b679SAndreas Boehler $this->server->removeAllListeners('schedule'); 499*a1a3b679SAndreas Boehler $this->deliver(null, $newObject); 500*a1a3b679SAndreas Boehler 501*a1a3b679SAndreas Boehler $expected = <<<ICS 502*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 503*a1a3b679SAndreas BoehlerBEGIN:VEVENT 504*a1a3b679SAndreas BoehlerUID:foo 505*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 506*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 507*a1a3b679SAndreas BoehlerATTENDEE;SCHEDULE-STATUS=5.2:mailto:user2.sabredav@sabredav.org 508*a1a3b679SAndreas BoehlerEND:VEVENT 509*a1a3b679SAndreas BoehlerEND:VCALENDAR 510*a1a3b679SAndreas BoehlerICS; 511*a1a3b679SAndreas Boehler 512*a1a3b679SAndreas Boehler $this->assertVObjEquals( 513*a1a3b679SAndreas Boehler $expected, 514*a1a3b679SAndreas Boehler $newObject 515*a1a3b679SAndreas Boehler ); 516*a1a3b679SAndreas Boehler 517*a1a3b679SAndreas Boehler } 518*a1a3b679SAndreas Boehler function testInviteNoACLPlugin() { 519*a1a3b679SAndreas Boehler 520*a1a3b679SAndreas Boehler $this->setupACL = false; 521*a1a3b679SAndreas Boehler parent::setUp(); 522*a1a3b679SAndreas Boehler 523*a1a3b679SAndreas Boehler $newObject = <<<ICS 524*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 525*a1a3b679SAndreas BoehlerBEGIN:VEVENT 526*a1a3b679SAndreas BoehlerUID:foo 527*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 528*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 529*a1a3b679SAndreas BoehlerATTENDEE:mailto:user2.sabredav@sabredav.org 530*a1a3b679SAndreas BoehlerEND:VEVENT 531*a1a3b679SAndreas BoehlerEND:VCALENDAR 532*a1a3b679SAndreas BoehlerICS; 533*a1a3b679SAndreas Boehler 534*a1a3b679SAndreas Boehler $this->deliver(null, $newObject); 535*a1a3b679SAndreas Boehler 536*a1a3b679SAndreas Boehler $expected = <<<ICS 537*a1a3b679SAndreas BoehlerBEGIN:VCALENDAR 538*a1a3b679SAndreas BoehlerBEGIN:VEVENT 539*a1a3b679SAndreas BoehlerUID:foo 540*a1a3b679SAndreas BoehlerDTSTART:20140811T230000Z 541*a1a3b679SAndreas BoehlerORGANIZER:mailto:user1.sabredav@sabredav.org 542*a1a3b679SAndreas BoehlerATTENDEE;SCHEDULE-STATUS=5.2:mailto:user2.sabredav@sabredav.org 543*a1a3b679SAndreas BoehlerEND:VEVENT 544*a1a3b679SAndreas BoehlerEND:VCALENDAR 545*a1a3b679SAndreas BoehlerICS; 546*a1a3b679SAndreas Boehler 547*a1a3b679SAndreas Boehler $this->assertVObjEquals( 548*a1a3b679SAndreas Boehler $expected, 549*a1a3b679SAndreas Boehler $newObject 550*a1a3b679SAndreas Boehler ); 551*a1a3b679SAndreas Boehler 552*a1a3b679SAndreas Boehler } 553*a1a3b679SAndreas Boehler 554*a1a3b679SAndreas Boehler protected $calendarObjectUri; 555*a1a3b679SAndreas Boehler 556*a1a3b679SAndreas Boehler function deliver($oldObject, &$newObject, $disableScheduling = false) { 557*a1a3b679SAndreas Boehler 558*a1a3b679SAndreas Boehler $this->server->httpRequest->setUrl($this->calendarObjectUri); 559*a1a3b679SAndreas Boehler if ($disableScheduling) { 560*a1a3b679SAndreas Boehler $this->server->httpRequest->setHeader('Schedule-Reply','F'); 561*a1a3b679SAndreas Boehler } 562*a1a3b679SAndreas Boehler 563*a1a3b679SAndreas Boehler if ($oldObject && $newObject) { 564*a1a3b679SAndreas Boehler // update 565*a1a3b679SAndreas Boehler $this->putPath($this->calendarObjectUri, $oldObject); 566*a1a3b679SAndreas Boehler 567*a1a3b679SAndreas Boehler $stream = fopen('php://memory','r+'); 568*a1a3b679SAndreas Boehler fwrite($stream, $newObject); 569*a1a3b679SAndreas Boehler rewind($stream); 570*a1a3b679SAndreas Boehler $modified = false; 571*a1a3b679SAndreas Boehler 572*a1a3b679SAndreas Boehler $this->server->emit('beforeWriteContent', [ 573*a1a3b679SAndreas Boehler $this->calendarObjectUri, 574*a1a3b679SAndreas Boehler $this->server->tree->getNodeForPath($this->calendarObjectUri), 575*a1a3b679SAndreas Boehler &$stream, 576*a1a3b679SAndreas Boehler &$modified 577*a1a3b679SAndreas Boehler ]); 578*a1a3b679SAndreas Boehler if ($modified) { 579*a1a3b679SAndreas Boehler $newObject = $stream; 580*a1a3b679SAndreas Boehler } 581*a1a3b679SAndreas Boehler 582*a1a3b679SAndreas Boehler } elseif ($oldObject && !$newObject) { 583*a1a3b679SAndreas Boehler // delete 584*a1a3b679SAndreas Boehler $this->putPath($this->calendarObjectUri, $oldObject); 585*a1a3b679SAndreas Boehler 586*a1a3b679SAndreas Boehler $this->caldavSchedulePlugin->beforeUnbind( 587*a1a3b679SAndreas Boehler $this->calendarObjectUri 588*a1a3b679SAndreas Boehler ); 589*a1a3b679SAndreas Boehler } else { 590*a1a3b679SAndreas Boehler 591*a1a3b679SAndreas Boehler // create 592*a1a3b679SAndreas Boehler $stream = fopen('php://memory','r+'); 593*a1a3b679SAndreas Boehler fwrite($stream, $newObject); 594*a1a3b679SAndreas Boehler rewind($stream); 595*a1a3b679SAndreas Boehler $modified = false; 596*a1a3b679SAndreas Boehler $this->server->emit('beforeCreateFile', [ 597*a1a3b679SAndreas Boehler $this->calendarObjectUri, 598*a1a3b679SAndreas Boehler &$stream, 599*a1a3b679SAndreas Boehler $this->server->tree->getNodeForPath(dirname($this->calendarObjectUri)), 600*a1a3b679SAndreas Boehler &$modified 601*a1a3b679SAndreas Boehler ]); 602*a1a3b679SAndreas Boehler 603*a1a3b679SAndreas Boehler if ($modified) { 604*a1a3b679SAndreas Boehler $newObject = $stream; 605*a1a3b679SAndreas Boehler } 606*a1a3b679SAndreas Boehler } 607*a1a3b679SAndreas Boehler 608*a1a3b679SAndreas Boehler } 609*a1a3b679SAndreas Boehler 610*a1a3b679SAndreas Boehler 611*a1a3b679SAndreas Boehler /** 612*a1a3b679SAndreas Boehler * Creates or updates a node at the specified path. 613*a1a3b679SAndreas Boehler * 614*a1a3b679SAndreas Boehler * This circumvents sabredav's internal server apis, so all events and 615*a1a3b679SAndreas Boehler * access control is skipped. 616*a1a3b679SAndreas Boehler * 617*a1a3b679SAndreas Boehler * @param string $path 618*a1a3b679SAndreas Boehler * @param string $data 619*a1a3b679SAndreas Boehler * @return void 620*a1a3b679SAndreas Boehler */ 621*a1a3b679SAndreas Boehler function putPath($path, $data) { 622*a1a3b679SAndreas Boehler 623*a1a3b679SAndreas Boehler list($parent, $base) = \Sabre\HTTP\UrlUtil::splitPath($path); 624*a1a3b679SAndreas Boehler $parentNode = $this->server->tree->getNodeForPath($parent); 625*a1a3b679SAndreas Boehler 626*a1a3b679SAndreas Boehler /* 627*a1a3b679SAndreas Boehler if ($parentNode->childExists($base)) { 628*a1a3b679SAndreas Boehler $childNode = $parentNode->getChild($base); 629*a1a3b679SAndreas Boehler $childNode->put($data); 630*a1a3b679SAndreas Boehler } else {*/ 631*a1a3b679SAndreas Boehler $parentNode->createFile($base, $data); 632*a1a3b679SAndreas Boehler //} 633*a1a3b679SAndreas Boehler 634*a1a3b679SAndreas Boehler } 635*a1a3b679SAndreas Boehler 636*a1a3b679SAndreas Boehler function assertItemsInInbox($user, $count) { 637*a1a3b679SAndreas Boehler 638*a1a3b679SAndreas Boehler $inboxNode = $this->server->tree->getNodeForPath('calendars/'.$user.'/inbox'); 639*a1a3b679SAndreas Boehler $this->assertEquals($count, count($inboxNode->getChildren())); 640*a1a3b679SAndreas Boehler 641*a1a3b679SAndreas Boehler } 642*a1a3b679SAndreas Boehler 643*a1a3b679SAndreas Boehler function assertVObjEquals($expected, $actual) { 644*a1a3b679SAndreas Boehler 645*a1a3b679SAndreas Boehler $format = function($data) { 646*a1a3b679SAndreas Boehler 647*a1a3b679SAndreas Boehler $data = trim($data, "\r\n"); 648*a1a3b679SAndreas Boehler $data = str_replace("\r","", $data); 649*a1a3b679SAndreas Boehler // Unfolding lines. 650*a1a3b679SAndreas Boehler $data = str_replace("\n ", "", $data); 651*a1a3b679SAndreas Boehler 652*a1a3b679SAndreas Boehler return $data; 653*a1a3b679SAndreas Boehler 654*a1a3b679SAndreas Boehler }; 655*a1a3b679SAndreas Boehler 656*a1a3b679SAndreas Boehler $this->assertEquals( 657*a1a3b679SAndreas Boehler $format($expected), 658*a1a3b679SAndreas Boehler $format($actual) 659*a1a3b679SAndreas Boehler ); 660*a1a3b679SAndreas Boehler 661*a1a3b679SAndreas Boehler } 662*a1a3b679SAndreas Boehler 663*a1a3b679SAndreas Boehler} 664*a1a3b679SAndreas Boehler 665