Merge branch 'master' of git.freeside.biz:/home/git/freeside
[freeside.git] / rt / t / lifecycles / dates.t
1
2 use strict;
3 use warnings;
4 use Data::Dumper;
5
6 BEGIN {require 't/lifecycles/utils.pl'};
7
8 my $general = RT::Test->load_or_create_queue(
9     Name => 'General',
10 );
11 ok $general && $general->id, 'loaded or created a queue';
12
13 my $delivery = RT::Test->load_or_create_queue(
14     Name => 'delivery',
15     Lifecycle => 'delivery',
16 );
17 ok $delivery && $delivery->id, 'loaded or created a queue';
18
19 my $tstatus = sub {
20     DBIx::SearchBuilder::Record::Cachable->FlushCache;
21     my $ticket = RT::Ticket->new( RT->SystemUser );
22     $ticket->Load( $_[0] );
23     return $ticket->Status;
24 };
25
26 my ($baseurl, $m) = RT::Test->started_ok;
27 ok $m->login, 'logged in';
28
29 diag "check basic API";
30 {
31     my $schema = $general->Lifecycle;
32     isa_ok($schema, 'RT::Lifecycle');
33     is $schema->Name, 'default', "it's a default schema";
34
35     $schema = $delivery->Lifecycle;
36     isa_ok($schema, 'RT::Lifecycle');
37     is $schema->Name, 'delivery', "it's a delivery schema";
38 }
39
40 diag "dates on create for default schema";
41 {
42     {
43         my $ticket = RT::Ticket->new( RT->SystemUser );
44         my ($id, $msg) = $ticket->Create(
45             Queue => $general->id,
46             Subject => 'test',
47             Status => 'new',
48         );
49         ok $id, 'created a ticket';
50         ok $ticket->StartedObj->Unix <= 0, 'started is not set';
51         ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
52     }
53     {
54         my $ticket = RT::Ticket->new( RT->SystemUser );
55         my ($id, $msg) = $ticket->Create(
56             Queue => $general->id,
57             Subject => 'test',
58             Status => 'open',
59         );
60         ok $id, 'created a ticket';
61         ok $ticket->StartedObj->Unix > 0, 'started is set';
62         ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
63     }
64     {
65         my $ticket = RT::Ticket->new( RT->SystemUser );
66         my ($id, $msg) = $ticket->Create(
67             Queue => $general->id,
68             Subject => 'test',
69             Status => 'resolved',
70         );
71         ok $id, 'created a ticket';
72         ok $ticket->StartedObj->Unix > 0, 'started is set';
73         ok $ticket->ResolvedObj->Unix > 0, 'resolved is set';
74     }
75
76     my $test_date = '2008-11-28 12:00:00';
77     {
78         my $ticket = RT::Ticket->new( RT->SystemUser );
79         my ($id, $msg) = $ticket->Create(
80             Queue => $general->id,
81             Subject => 'test',
82             Status => 'new',
83             Started => $test_date,
84             Resolved => $test_date,
85         );
86         ok $id, 'created a ticket';
87         is $ticket->StartedObj->ISO, $test_date, 'started is set';
88         is $ticket->ResolvedObj->ISO, $test_date, 'resolved is set';
89     }
90     {
91         my $ticket = RT::Ticket->new( RT->SystemUser );
92         my ($id, $msg) = $ticket->Create(
93             Queue => $general->id,
94             Subject => 'test',
95             Status => 'open',
96             Started => $test_date,
97             Resolved => $test_date,
98         );
99         ok $id, 'created a ticket';
100         is $ticket->StartedObj->ISO, $test_date, 'started is set';
101         is $ticket->ResolvedObj->ISO, $test_date, 'resolved is set';
102     }
103     {
104         my $ticket = RT::Ticket->new( RT->SystemUser );
105         my ($id, $msg) = $ticket->Create(
106             Queue => $general->id,
107             Subject => 'test',
108             Status => 'resolved',
109             Started => $test_date,
110             Resolved => $test_date,
111         );
112         ok $id, 'created a ticket';
113         is $ticket->StartedObj->ISO, $test_date, 'started is set';
114         is $ticket->ResolvedObj->ISO, $test_date, 'resolved is set';
115     }
116 }
117
118 diag "dates on create for delivery schema";
119 {
120     {
121         my $ticket = RT::Ticket->new( RT->SystemUser );
122         my ($id, $msg) = $ticket->Create(
123             Queue => $delivery->id,
124             Subject => 'test',
125             Status => 'ordered',
126         );
127         ok $id, 'created a ticket';
128         is $ticket->StartedObj->Unix , 0, 'started is not set';
129         is $ticket->ResolvedObj->Unix, 0, 'resolved is not set';
130
131     }
132     {
133         my $ticket = RT::Ticket->new( RT->SystemUser );
134         my ($id, $txn, $msg) = $ticket->Create(
135             Queue => $delivery->id,
136             Subject => 'test',
137         );
138         ok $id, 'created a ticket';
139         diag($msg);
140         is $ticket->Status, 'ordered', "Status is ordered";
141         my ($statusval,$statusmsg) = $ticket->SetStatus('on way');
142         ok($statusval,$statusmsg);
143         ok $ticket->StartedObj->Unix > 0, 'started is set to ' .$ticket->StartedObj->AsString ;
144         is $ticket->ResolvedObj->Unix, 0, 'resolved is not set';
145     }
146     {
147         my $ticket = RT::Ticket->new( RT->SystemUser );
148         my ($id, $msg) = $ticket->Create(
149             Queue => $delivery->id,
150             Subject => 'test',
151         );
152         ok $id, 'created a ticket';
153
154         my ($statusval,$statusmsg) = $ticket->SetStatus('on way');
155         ok($statusval,$statusmsg);
156
157         ($statusval,$statusmsg) = $ticket->SetStatus('delivered');
158         ok($statusval,$statusmsg);
159
160         ok $ticket->StartedObj->Unix > 0, 'started is set';
161         ok $ticket->ResolvedObj->Unix > 0, 'resolved is set';
162     }
163
164     my $test_date = '2008-11-28 12:00:00';
165     {
166         my $ticket = RT::Ticket->new( RT->SystemUser );
167         my ($id, $statusmsg) = $ticket->Create(
168             Queue => $delivery->id,
169             Subject => 'test',
170             Status => 'ordered',
171             Started => $test_date,
172             Resolved => $test_date,
173         );
174         ok $id, 'created a ticket';
175         is $ticket->StartedObj->ISO, $test_date, 'started is set';
176         is $ticket->ResolvedObj->ISO, $test_date, 'resolved is set';
177     }
178     {
179         my $ticket = RT::Ticket->new( RT->SystemUser );
180         my ($id, $msg) = $ticket->Create(
181             Queue => $delivery->id,
182             Subject => 'test',
183             Status => 'ordered',
184             Started => $test_date,
185             Resolved => $test_date,
186         );
187         ok $id, 'created a ticket';
188         my ($statusval,$statusmsg) = $ticket->SetStatus('on way');
189         ok($statusval,$statusmsg);
190         is $ticket->StartedObj->ISO, $test_date, 'started is set';
191         is $ticket->ResolvedObj->ISO, $test_date, 'resolved is set';
192     }
193     {
194         my $ticket = RT::Ticket->new( RT->SystemUser );
195         my ($id, $msg) = $ticket->Create(
196             Queue => $delivery->id,
197             Subject => 'test',
198             Started => $test_date,
199             Resolved => $test_date,
200         );
201         ok $id, 'created a ticket';
202         my ($statusval,$statusmsg) = $ticket->SetStatus('on way');
203         ok($statusval,$statusmsg);
204         ($statusval,$statusmsg) = $ticket->SetStatus('delivered');
205         ok($statusval,$statusmsg);
206         is $ticket->StartedObj->ISO, $test_date, 'started is set';
207         TODO: {
208             local $TODO = "we should decide if we set resolved repeatedly";
209             is $ticket->ResolvedObj->ISO, $test_date, 'resolved is set';
210         };
211     }
212 }
213
214 diag "dates on status change for default schema";
215 {
216     my $ticket = RT::Ticket->new( RT->SystemUser );
217     my ($id, $msg) = $ticket->Create(
218         Queue => $general->id,
219         Subject => 'test',
220         Status => 'new',
221     );
222     ok $id, 'created a ticket';
223     ok $ticket->StartedObj->Unix <= 0, 'started is not set';
224     ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
225
226     (my $status, $msg) = $ticket->SetStatus('open');
227     ok $status, 'changed status' or diag "error: $msg";
228     ok $ticket->StartedObj->Unix > 0, 'started is set';
229     ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
230
231     my $started = $ticket->StartedObj->Unix;
232
233     ($status, $msg) = $ticket->SetStatus('stalled');
234     ok $status, 'changed status' or diag "error: $msg";
235     is $ticket->StartedObj->Unix, $started, 'started is set and the same';
236     ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
237
238     ($status, $msg) = $ticket->SetStatus('open');
239     ok $status, 'changed status' or diag "error: $msg";
240     is $ticket->StartedObj->Unix, $started, 'started is set and the same';
241     ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
242
243     ($status, $msg) = $ticket->SetStatus('resolved');
244     ok $status, 'changed status' or diag "error: $msg";
245     is $ticket->StartedObj->Unix, $started, 'started is set and the same';
246     ok $ticket->ResolvedObj->Unix > 0, 'resolved is set';
247 }
248
249 diag "dates on status change for delivery schema";
250 {
251     my $ticket = RT::Ticket->new( RT->SystemUser );
252     my ($id, $msg) = $ticket->Create(
253         Queue => $delivery->id,
254         Subject => 'test',
255         Status => 'ordered',
256     );
257     ok $id, 'created a ticket';
258     ok $ticket->StartedObj->Unix <= 0, 'started is not set';
259     ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
260
261     (my $status, $msg) = $ticket->SetStatus('delayed');
262     ok $status, 'changed status' or diag "error: $msg";
263     ok $ticket->StartedObj->Unix > 0, 'started is set';
264     ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
265
266     my $started = $ticket->StartedObj->Unix;
267
268     ($status, $msg) = $ticket->SetStatus('on way');
269     ok $status, 'changed status' or diag "error: $msg";
270     is $ticket->StartedObj->Unix, $started, 'started is set and the same';
271     ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
272
273     ($status, $msg) = $ticket->SetStatus('delivered');
274     ok $status, 'changed status' or diag "error: $msg";
275     is $ticket->StartedObj->Unix, $started, 'started is set and the same';
276     ok $ticket->ResolvedObj->Unix > 0, 'resolved is set';
277 }
278
279 diag "add partial map between general->delivery";
280 {
281     my $schemas = RT->Config->Get('Lifecycles');
282     $schemas->{'__maps__'} = {
283         'default -> delivery' => {
284             new => 'on way',
285         },
286         'delivery -> default' => {
287             'on way' => 'resolved',
288         },
289     };
290     RT::Lifecycle->FillCache;
291 }
292
293 diag "check date changes on moving a ticket";
294 {
295     my $ticket = RT::Ticket->new( RT->SystemUser );
296     my ($id, $msg) = $ticket->Create(
297         Queue => $general->id,
298         Subject => 'test',
299         Status => 'new',
300     );
301     ok $id, 'created a ticket';
302     ok $ticket->StartedObj->Unix <= 0, 'started is not set';
303     ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
304
305     (my $status, $msg) = $ticket->SetQueue( $delivery->id );
306     ok $status, "moved ticket between queues with different schemas";
307     is $ticket->Status, 'on way', 'status has been changed';
308     ok $ticket->StartedObj->Unix > 0, 'started is set';
309     ok $ticket->ResolvedObj->Unix <= 0, 'resolved is not set';
310
311     ($status, $msg) = $ticket->SetQueue( $general->id );
312     ok $status, "moved ticket between queues with different schemas";
313     is $ticket->Status, 'resolved', 'status has been changed';
314     ok $ticket->StartedObj->Unix > 0, 'started is set';
315     ok $ticket->ResolvedObj->Unix > 0, 'resolved is set';
316 }