diff options
Diffstat (limited to 'rt/t/web/search_ical.t')
-rw-r--r-- | rt/t/web/search_ical.t | 196 |
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'); +} |