|
32 | 32 |
|
33 | 33 | namespace OCA\DAV\Tests\unit\CalDAV; |
34 | 34 |
|
| 35 | +use DateInterval; |
35 | 36 | use DateTime; |
| 37 | +use DateTimeImmutable; |
36 | 38 | use DateTimeZone; |
37 | 39 | use OCA\DAV\CalDAV\CalDavBackend; |
38 | 40 | use OCA\DAV\CalDAV\Calendar; |
@@ -1283,4 +1285,71 @@ public function testSearchPrincipal(): void { |
1283 | 1285 | $this->assertEquals($sharerPrivate, $sharerSearchResults[1]['calendardata']); |
1284 | 1286 | $this->assertEquals($sharerConfidential, $sharerSearchResults[2]['calendardata']); |
1285 | 1287 | } |
| 1288 | + |
| 1289 | + public function testSearchAndExpandRecurrences() { |
| 1290 | + $calendarId = $this->createTestCalendar(); |
| 1291 | + $calendarInfo = [ |
| 1292 | + 'id' => $calendarId, |
| 1293 | + 'principaluri' => 'user1', |
| 1294 | + '{http://owncloud.org/ns}owner-principal' => 'user1', |
| 1295 | + ]; |
| 1296 | + |
| 1297 | + $calData = <<<'EOD' |
| 1298 | +BEGIN:VCALENDAR |
| 1299 | +PRODID:-//IDN nextcloud.com//Calendar app 4.5.0-alpha.2//EN |
| 1300 | +CALSCALE:GREGORIAN |
| 1301 | +VERSION:2.0 |
| 1302 | +BEGIN:VEVENT |
| 1303 | +CREATED:20230921T133401Z |
| 1304 | +DTSTAMP:20230921T133448Z |
| 1305 | +LAST-MODIFIED:20230921T133448Z |
| 1306 | +SEQUENCE:2 |
| 1307 | +UID:7b7d5d12-683c-48ce-973a-b3e1cb0bae2a |
| 1308 | +DTSTART;VALUE=DATE:20230912 |
| 1309 | +DTEND;VALUE=DATE:20230913 |
| 1310 | +STATUS:CONFIRMED |
| 1311 | +SUMMARY:Daily Event |
| 1312 | +RRULE:FREQ=DAILY |
| 1313 | +END:VEVENT |
| 1314 | +END:VCALENDAR |
| 1315 | +EOD; |
| 1316 | + $uri = static::getUniqueID('calobj'); |
| 1317 | + $this->backend->createCalendarObject($calendarId, $uri, $calData); |
| 1318 | + |
| 1319 | + $start = new DateTimeImmutable('2023-09-20T00:00:00Z'); |
| 1320 | + $end = $start->add(new DateInterval('P14D')); |
| 1321 | + |
| 1322 | + $results = $this->backend->search( |
| 1323 | + $calendarInfo, |
| 1324 | + '', |
| 1325 | + [], |
| 1326 | + [ |
| 1327 | + 'timerange' => [ |
| 1328 | + 'start' => $start, |
| 1329 | + 'end' => $end, |
| 1330 | + ] |
| 1331 | + ], |
| 1332 | + null, |
| 1333 | + null, |
| 1334 | + ); |
| 1335 | + |
| 1336 | + $this->assertCount(1, $results); |
| 1337 | + $this->assertCount(14, $results[0]['objects']); |
| 1338 | + foreach ($results as $result) { |
| 1339 | + foreach ($result['objects'] as $object) { |
| 1340 | + $this->assertEquals($object['UID'][0], '7b7d5d12-683c-48ce-973a-b3e1cb0bae2a'); |
| 1341 | + $this->assertEquals($object['SUMMARY'][0], 'Daily Event'); |
| 1342 | + $this->assertGreaterThanOrEqual( |
| 1343 | + $start->getTimestamp(), |
| 1344 | + $object['DTSTART'][0]->getTimestamp(), |
| 1345 | + 'Recurrence starting before requested start', |
| 1346 | + ); |
| 1347 | + $this->assertLessThanOrEqual( |
| 1348 | + $end->getTimestamp(), |
| 1349 | + $object['DTSTART'][0]->getTimestamp(), |
| 1350 | + 'Recurrence starting after requested end', |
| 1351 | + ); |
| 1352 | + } |
| 1353 | + } |
| 1354 | + } |
1286 | 1355 | } |
0 commit comments