summaryrefslogtreecommitdiff
path: root/rt/t/web/search_ical.t
diff options
context:
space:
mode:
Diffstat (limited to 'rt/t/web/search_ical.t')
-rw-r--r--rt/t/web/search_ical.t196
1 files changed, 196 insertions, 0 deletions
diff --git a/rt/t/web/search_ical.t b/rt/t/web/search_ical.t
new file mode 100644
index 000000000..094d8a2de
--- /dev/null
+++ b/rt/t/web/search_ical.t
@@ -0,0 +1,196 @@
+use strict;
+use warnings;
+
+use Data::ICal;
+use RT::Test tests => 77;
+
+my $start_obj = RT::Date->new( RT->SystemUser );
+$start_obj->SetToNow;
+my $start = $start_obj->iCal( Time => 1);
+
+my $due_obj = RT::Date->new( RT->SystemUser );
+$due_obj->SetToNow;
+$due_obj->AddDays(2);
+my $due = $due_obj->iCal( Time => 1);
+
+diag 'Test iCal with date only';
+{
+ my ($baseurl, $agent) = RT::Test->started_ok;
+
+ my $ticket = RT::Ticket->new(RT->SystemUser);
+
+ for ( 1 .. 5 ) {
+ $ticket->Create(
+ Subject => 'Ticket ' . $_,
+ Queue => 'General',
+ Owner => 'root',
+ Requestor => 'ical@localhost',
+ Starts => $start_obj->ISO,
+ Due => $due_obj->ISO,
+ );
+ }
+
+ ok $agent->login('root', 'password'), 'logged in as root';
+
+ $agent->get_ok('/Search/Build.html');
+ $agent->form_name('BuildQuery');
+ $agent->field('idOp', '>');
+ $agent->field('ValueOfid', '0');
+ $agent->submit('DoSearch');
+ $agent->follow_link_ok({id => 'page-results'});
+
+ for ( 1 .. 5 ) {
+ $agent->content_contains('Ticket ' . $_);
+ }
+
+ $agent->follow_link_ok( { text => 'iCal' } );
+
+ is( $agent->content_type, 'text/calendar', 'content type is text/calendar' );
+
+ for ( 1 .. 5 ) {
+ $agent->content_like(qr/URL\:$baseurl\/Ticket\/Display\.html\?id=$_/);
+ }
+
+ my $ical = Data::ICal->new(data => $agent->content);
+
+ my @entries = $ical->entries;
+ my $ical_count = @{$entries[0]};
+ is( $ical_count, 10, "Got $ical_count ical entries");
+
+ my $prop_ref = $entries[0]->[0]->properties;
+ my $start_as_root = RT::Date->new( RT::CurrentUser->new( 'root' ) );
+ $start_as_root->Unix( $start_obj->Unix );
+ my $start = $start_as_root->ISO( Time => 0, Timezone => 'user' );
+ $start =~ s/-//g;
+ is($prop_ref->{'dtstart'}->[0]->value, $start, "Got start date: $start");
+ like( $prop_ref->{'dtstart'}->[0]->as_string, qr/VALUE=DATE\:/, 'Got DATE value');
+
+ $prop_ref = $entries[0]->[1]->properties;
+ my $due_as_root = RT::Date->new( RT::CurrentUser->new( 'root' ) );
+ $due_as_root->Unix( $due_obj->Unix );
+ my $due = $due_as_root->ISO( Time => 0, Timezone => 'user' );
+ $due =~ s/-//g;
+ is($prop_ref->{'dtend'}->[0]->value, $due, "Got due date: $due");
+ like( $prop_ref->{'dtend'}->[0]->as_string, qr/VALUE=DATE\:/, 'Got DATE value');
+}
+
+RT::Test->stop_server;
+
+diag 'Test iCal with date and time with config option';
+{
+ RT->Config->Set(TimeInICal =>1);
+ my ($baseurl, $agent) = RT::Test->started_ok;
+
+ ok $agent->login('root', 'password'), 'logged in as root';
+
+ $agent->get_ok('/Search/Build.html');
+ $agent->form_name('BuildQuery');
+ $agent->field('idOp', '>');
+ $agent->field('ValueOfid', '0');
+ $agent->submit('DoSearch');
+ $agent->follow_link_ok({id => 'page-results'});
+
+ for ( 1 .. 5 ) {
+ $agent->content_contains('Ticket ' . $_);
+ }
+
+ my $link = $agent->find_link( text => 'iCal' ); # use $link later
+ $agent->get_ok($link->url);
+
+ is( $agent->content_type, 'text/calendar', 'content type is text/calendar' );
+
+ for ( 1 .. 5 ) {
+ $agent->content_like(qr/URL\:$baseurl\/Ticket\/Display\.html\?id=$_/);
+ }
+
+ my $ical = Data::ICal->new(data => $agent->content);
+
+ my @entries = $ical->entries;
+ my $ical_count = @{$entries[0]};
+ is( $ical_count, 10, "Got $ical_count ical entries");
+
+ my $prop_ref = $entries[0]->[0]->properties;
+ $start =~ s/-//g;
+ is($prop_ref->{'dtstart'}->[0]->value, $start, "Got start date with time: $start");
+ like( $prop_ref->{'dtstart'}->[0]->as_string, qr/VALUE=DATE-TIME\:/, 'Got DATE-TIME value');
+
+ $prop_ref = $entries[0]->[1]->properties;
+ $due =~ s/-//g;
+ is($prop_ref->{'dtend'}->[0]->value, $due, "Got due date with time: $due");
+ like( $prop_ref->{'dtend'}->[0]->as_string, qr/VALUE=DATE-TIME\:/, 'Got DATE-TIME value');
+}
+
+RT::Test->stop_server;
+
+diag 'Test iCal with date and time using query param';
+{
+ RT->Config->Set(TimeInICal =>0);
+ my ($baseurl, $agent) = RT::Test->started_ok;
+
+ ok $agent->login('root', 'password'), 'logged in as root';
+
+ $agent->get_ok('/Search/Build.html');
+ $agent->form_name('BuildQuery');
+ $agent->field('idOp', '>');
+ $agent->field('ValueOfid', '0');
+ $agent->submit('DoSearch');
+ $agent->follow_link_ok({id => 'page-results'});
+
+ for ( 1 .. 5 ) {
+ $agent->content_contains('Ticket ' . $_);
+ }
+
+ my $link = $agent->find_link( text => 'iCal' );
+ $agent->get_ok($link->url . '?Time=1');
+
+ is( $agent->content_type, 'text/calendar', 'content type is text/calendar' );
+
+ for ( 1 .. 5 ) {
+ $agent->content_like(qr/URL\:$baseurl\/Ticket\/Display\.html\?id=$_/);
+ }
+
+ my $ical = Data::ICal->new(data => $agent->content);
+
+ my @entries = $ical->entries;
+ my $ical_count = @{$entries[0]};
+ is( $ical_count, 10, "Got $ical_count ical entries");
+
+ my $prop_ref = $entries[0]->[0]->properties;
+ $start =~ s/-//g;
+ is($prop_ref->{'dtstart'}->[0]->value, $start, "Got start date with time: $start");
+ like( $prop_ref->{'dtstart'}->[0]->as_string, qr/VALUE=DATE-TIME\:/, 'Got DATE-TIME value');
+
+ $prop_ref = $entries[0]->[1]->properties;
+ $due =~ s/-//g;
+ is($prop_ref->{'dtend'}->[0]->value, $due, "Got due date with time: $due");
+ like( $prop_ref->{'dtend'}->[0]->as_string, qr/VALUE=DATE-TIME\:/, 'Got DATE-TIME value');
+
+ diag 'Test iCal with date and time in single events';
+
+ my $url = $link->url . '?SingleEvent=1&Time=1';
+ $agent->get_ok($url);
+
+ is( $agent->content_type, 'text/calendar', 'content type is text/calendar' );
+
+ for ( 1 .. 5 ) {
+ $agent->content_like(qr/URL\:$baseurl\/Ticket\/Display\.html\?id=$_/);
+ }
+
+ $ical = Data::ICal->new(data => $agent->content);
+
+ @entries = $ical->entries;
+ $ical_count = @{$entries[0]};
+
+ # Only 5 entries in single event mode
+ is( $ical_count, 5, "Got $ical_count ical entries");
+
+ $prop_ref = $entries[0]->[0]->properties;
+ $start =~ s/-//g;
+ is($prop_ref->{'dtstart'}->[0]->value, $start, "Got start date with time: $start");
+ like( $prop_ref->{'dtstart'}->[0]->as_string, qr/VALUE=DATE-TIME\:/, 'Got DATE-TIME value');
+
+ $prop_ref = $entries[0]->[1]->properties;
+ $due =~ s/-//g;
+ is($prop_ref->{'dtend'}->[0]->value, $due, "Got due date with time: $due");
+ like( $prop_ref->{'dtend'}->[0]->as_string, qr/VALUE=DATE-TIME\:/, 'Got DATE-TIME value');
+}