diff --git a/lib/Application/Schedule/CalendarSubscriptionUrl.php b/lib/Application/Schedule/CalendarSubscriptionUrl.php index a415ff15f..480ad5c23 100644 --- a/lib/Application/Schedule/CalendarSubscriptionUrl.php +++ b/lib/Application/Schedule/CalendarSubscriptionUrl.php @@ -23,9 +23,15 @@ public function __construct($userPublicId, $schedulePublicId, $resourcePublicId) $scriptUrl .= '/export/' . self::PAGE_TOKEN; $url = new Url($scriptUrl); - $url->AddQueryString(QueryStringKeys::USER_ID, $userPublicId); - $url->AddQueryString(QueryStringKeys::SCHEDULE_ID, $schedulePublicId); - $url->AddQueryString(QueryStringKeys::RESOURCE_ID, $resourcePublicId); + if (!empty($userPublicId)) { + $url->AddQueryString(QueryStringKeys::USER_ID, $userPublicId); + } + if (!empty($schedulePublicId)) { + $url->AddQueryString(QueryStringKeys::SCHEDULE_ID, $schedulePublicId); + } + if (!empty($resourcePublicId)) { + $url->AddQueryString(QueryStringKeys::RESOURCE_ID, $resourcePublicId); + } $url->AddQueryString(QueryStringKeys::SUBSCRIPTION_KEY, $subscriptionKey); $this->url = $url; } diff --git a/tests/Application/Schedule/CalendarSubscriptionUrlTest.php b/tests/Application/Schedule/CalendarSubscriptionUrlTest.php new file mode 100644 index 000000000..a219e9f53 --- /dev/null +++ b/tests/Application/Schedule/CalendarSubscriptionUrlTest.php @@ -0,0 +1,70 @@ +fakeConfig->SetKey(ConfigKeys::ICS_SUBSCRIPTION_KEY, 'thekey'); + } + + public function testOnlyIncludesQueryStringForIdsThatWereProvided() + { + $url = new CalendarSubscriptionUrl(null, 'scheduleId', null); + + $webcalUrl = $url->GetWebcalUrl(); + + $this->assertStringContainsString('sid=scheduleId', $webcalUrl); + $this->assertStringNotContainsString('uid=', $webcalUrl); + $this->assertStringNotContainsString('rid=', $webcalUrl); + } + + public function testIncludesAllProvidedIds() + { + $url = new CalendarSubscriptionUrl('userId', 'scheduleId', 'resourceId'); + + $webcalUrl = $url->GetWebcalUrl(); + + $this->assertStringContainsString('uid=userId', $webcalUrl); + $this->assertStringContainsString('sid=scheduleId', $webcalUrl); + $this->assertStringContainsString('rid=resourceId', $webcalUrl); + } + + public function testOnlyIncludesResourceIdWhenScheduleAndUserAreOmitted() + { + $url = new CalendarSubscriptionUrl(null, null, 'resourceId'); + + $webcalUrl = $url->GetWebcalUrl(); + + $this->assertStringContainsString('rid=resourceId', $webcalUrl); + $this->assertStringNotContainsString('uid=', $webcalUrl); + $this->assertStringNotContainsString('sid=', $webcalUrl); + } + + public function testOnlyIncludesUserIdWhenScheduleAndResourceAreOmitted() + { + $url = new CalendarSubscriptionUrl('userId', null, null); + + $webcalUrl = $url->GetWebcalUrl(); + + $this->assertStringContainsString('uid=userId', $webcalUrl); + $this->assertStringNotContainsString('sid=', $webcalUrl); + $this->assertStringNotContainsString('rid=', $webcalUrl); + } + + public function testTreatsEmptyStringIdsTheSameAsNull() + { + $url = new CalendarSubscriptionUrl('', '', ''); + + $webcalUrl = $url->GetWebcalUrl(); + + $this->assertStringNotContainsString('uid=', $webcalUrl); + $this->assertStringNotContainsString('sid=', $webcalUrl); + $this->assertStringNotContainsString('rid=', $webcalUrl); + } +}