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