first pass RT4 merge, RT#13852
[freeside.git] / rt / t / web / cf_datetime.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use RT::Test tests => 51;
7
8 RT->Config->Set( 'Timezone' => 'EST5EDT' ); # -04:00
9 my ($baseurl, $m) = RT::Test->started_ok;
10 ok $m->login, 'logged in as root';
11 my $root = RT::User->new( RT->SystemUser );
12 ok( $root->Load('root'), 'load root user' );
13
14 my $cf_name = 'test cf datetime';
15
16 my $why;
17
18 if ( ( $ENV{RT_TEST_WEB_HANDLER} || '' ) =~ /^apache(\+mod_perl)?$/
19     && RT::Test::Apache->apache_mpm_type =~ /^(?:worker|event)$/ )
20 {
21     $why =
22 'localizing $ENV{TZ} does *not* work with mod_perl+mpm_event or mod_perl+mpm_worker';
23 }
24
25 my $cfid;
26 diag "Create a CF";
27 {
28     $m->follow_link( id => 'tools-config-custom-fields-create');
29     $m->submit_form(
30         form_name => "ModifyCustomField",
31         fields => {
32             Name          => $cf_name,
33             TypeComposite => 'DateTime-1',
34             LookupType    => 'RT::Queue-RT::Ticket',
35         },
36     );
37     $m->content_contains('Object created', 'created CF sucessfully' );
38     $cfid = $m->form_name('ModifyCustomField')->value('id');
39     ok $cfid, "found id of the CF in the form, it's #$cfid";
40 }
41
42 diag "apply the CF to General queue";
43 my $queue = RT::Test->load_or_create_queue( Name => 'General' );
44 ok $queue && $queue->id, 'loaded or created queue';
45
46 {
47     $m->follow_link( text => 'Queues' );
48     $m->title_is(q/Admin queues/, 'admin-queues screen');
49     $m->follow_link( text => 'General' );
50     $m->title_is(q/Configuration for queue General/, 'admin-queue: general');
51     $m->follow_link( text => 'Ticket Custom Fields' );
52     $m->title_is(q/Custom Fields for queue General/, 'admin-queue: general cfid');
53
54     $m->form_name('EditCustomFields');
55     $m->tick( "AddCustomField" => $cfid );
56     $m->click('UpdateCFs');
57
58     $m->content_contains('Object created', 'TCF added to the queue' );
59 }
60
61 diag 'check valid inputs with various timezones in ticket create page';
62 {
63     my ( $ticket, $id );
64
65     $m->submit_form(
66         form_name => "CreateTicketInQueue",
67         fields => { Queue => 'General' },
68     );
69     $m->content_contains('Select datetime', 'has cf field');
70
71     $m->submit_form(
72         form_name => "TicketCreate",
73         fields    => {
74             Subject                                       => 'test 2010-05-04 13:00:01',
75             Content                                       => 'test',
76             "Object-RT::Ticket--CustomField-$cfid-Values" => '2010-05-04 13:00:01',
77         },
78     );
79     ok( ($id) = $m->content =~ /Ticket (\d+) created/,
80         "created ticket $id" );
81
82     $ticket = RT::Ticket->new( RT->SystemUser );
83     $ticket->Load($id);
84     TODO: {
85         local $TODO = $why;
86         is(
87             $ticket->CustomFieldValues($cfid)->First->Content,
88             '2010-05-04 17:00:01',
89             'date in db is in UTC'
90         );
91     }
92
93     $m->content_contains('test cf datetime:', 'has cf datetime field on the page');
94     $m->content_contains('Tue May 04 13:00:01 2010', 'has cf datetime value on the page');
95
96     $root->SetTimezone( 'Asia/Shanghai' );
97     # interesting that $m->reload doesn't work
98     $m->get_ok( $m->uri );
99
100     TODO: {
101         local $TODO = $why;
102         $m->content_contains( 'Wed May 05 01:00:01 2010',
103             'cf datetime value respects user timezone' );
104     }
105
106     $m->submit_form(
107         form_name => "CreateTicketInQueue",
108         fields => { Queue => 'General' },
109     );
110     $m->submit_form(
111         form_name => "TicketCreate",
112         fields    => {
113             Subject                                       => 'test 2010-05-06 07:00:01',
114             Content                                       => 'test',
115             "Object-RT::Ticket--CustomField-$cfid-Values" => '2010-05-06 07:00:01',
116         },
117     );
118     ok( ($id) = $m->content =~ /Ticket (\d+) created/,
119         "created ticket $id" );
120     $ticket = RT::Ticket->new( RT->SystemUser );
121     $ticket->Load($id);
122     TODO: {
123         local $TODO = $why;
124         is(
125             $ticket->CustomFieldValues($cfid)->First->Content,
126             '2010-05-05 23:00:01',
127             'date in db is in UTC'
128         );
129     }
130
131     $m->content_contains('test cf datetime:', 'has cf datetime field on the page');
132     $m->content_contains( 'Thu May 06 07:00:01 2010',
133         'cf datetime input respects user timezone' );
134     $root->SetTimezone( 'EST5EDT' ); # back to -04:00
135     $m->get_ok( $m->uri );
136
137     TODO: {
138         local $TODO = $why;
139         $m->content_contains( 'Wed May 05 19:00:01 2010',
140             'cf datetime value respects user timezone' );
141     }
142 }
143
144
145 diag 'check search build page';
146 {
147     $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
148
149     $m->form_name('BuildQuery');
150     my ($cf_op) =
151       $m->find_all_inputs( type => 'option', name_regex => qr/test cf datetime/ );
152     is_deeply(
153         [ $cf_op->possible_values ],
154         [ '<', '=', '>' ],
155         'right oprators'
156     );
157
158     my ($cf_field) =
159       $m->find_all_inputs( type => 'text', name_regex => qr/test cf datetime/ );
160
161     is_results_number( { $cf_op->name => '=', $cf_field->name => '2010-05-04', }, 1 );
162     $m->content_contains( '2010-05-04',     'got the right ticket' );
163     $m->content_lacks( '2010-05-06', 'did not get the wrong ticket' );
164
165     my $shanghai = RT::Test->load_or_create_user(
166         Name     => 'shanghai',
167         Password => 'password',
168         Timezone => 'Asia/Shanghai',
169     );
170     ok( $shanghai->PrincipalObj->GrantRight(
171         Right  => 'SuperUser',
172         Object => $RT::System,
173     ));
174     $m->login( 'shanghai', 'password', logout => 1 );
175
176     is_results_number( { $cf_op->name => '<', $cf_field->name => '2010-05-07', }, 2 );
177     is_results_number( { $cf_op->name => '>', $cf_field->name => '2010-05-04', }, 2 );
178
179     TODO: {
180         local $TODO = $why;
181         is_results_number( { $cf_op->name => '=', $cf_field->name => '2010-05-05', }, 1 );
182         is_results_number( { $cf_op->name => '=', $cf_field->name => '2010-05-05 01:00:01', }, 1 );
183     }
184
185     is_results_number(
186         { $cf_op->name => '=', $cf_field->name => '2010-05-05 02:00:01', }, 0 );
187
188     is_results_number( { $cf_op->name => '=', $cf_field->name => '2010-05-06', }, 1 );
189     is_results_number( { $cf_op->name => '=', $cf_field->name => '2010-05-06 07:00:01', }, 1 );
190     is_results_number( { $cf_op->name => '=', $cf_field->name => '2010-05-06 08:00:01', }, 0 );
191 }
192
193 diag 'check invalid inputs';
194 {
195     $m->submit_form(
196         form_name => "CreateTicketInQueue",
197         fields => { Queue => 'General' },
198     );
199     my $form = $m->form_name("TicketCreate");
200
201     $m->submit_form(
202         form_name => "TicketCreate",
203         fields    => {
204             Subject                                       => 'test',
205             Content                                       => 'test',
206             "Object-RT::Ticket--CustomField-$cfid-Values" => 'foodate',
207         },
208     );
209     $m->content_like(qr/Ticket \d+ created/, "a ticket is created succesfully");
210
211     $m->content_contains('test cf datetime:', 'has cf datetime field on the page');
212     $m->content_lacks('foodate', 'invalid dates not set');
213 }
214
215 sub is_results_number {
216     local $Test::Builder::Level = $Test::Builder::Level + 1;
217     my $fields = shift;
218     my $number = shift;
219     my $operator = shift;
220     my $value = shift;
221     {
222         local $TODO;
223         $m->get_ok( $baseurl . '/Search/Build.html?Query=Queue=1' );
224     }
225     $m->form_name('BuildQuery');
226     $m->submit_form(
227         fields => $fields,
228         button => 'DoSearch',
229     );
230     $m->content_contains( "Found $number ticket", "Found $number ticket" );
231 }
232
233 # to make $m->DESTROY happy
234 undef $m;
235