RT 4.0.13
[freeside.git] / rt / t / lifecycles / basics.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 $tstatus = sub {
14     DBIx::SearchBuilder::Record::Cachable->FlushCache;
15     my $ticket = RT::Ticket->new( RT->SystemUser );
16     $ticket->Load( $_[0] );
17     return $ticket->Status;
18 };
19
20 diag "check basic API";
21 {
22     my $schema = $general->Lifecycle;
23     isa_ok($schema, 'RT::Lifecycle');
24     is $schema->Name, 'default', "it's a default schema";
25     is_deeply [$schema->Valid],
26         [qw(new open stalled resolved rejected deleted)],
27         'this is the default set from our config file';
28
29     foreach my $s ( qw(new open stalled resolved rejected deleted) ) {
30         ok $schema->IsValid($s), "valid";
31     }
32     ok !$schema->IsValid(), 'invalid';
33     ok !$schema->IsValid(''), 'invalid';
34     ok !$schema->IsValid(undef), 'invalid';
35     ok !$schema->IsValid('foo'), 'invalid';
36
37     is_deeply [$schema->Initial], ['new'], 'initial set';
38     ok $schema->IsInitial('new'), "initial";
39     ok !$schema->IsInitial('open'), "not initial";
40     ok !$schema->IsInitial, "not initial";
41     ok !$schema->IsInitial(''), "not initial";
42     ok !$schema->IsInitial(undef), "not initial";
43     ok !$schema->IsInitial('foo'), "not initial";
44
45     is_deeply [$schema->Active], [qw(open stalled)], 'active set';
46     ok( $schema->IsActive($_), "active" )
47         foreach qw(open stalled);
48     ok !$schema->IsActive('new'), "not active";
49     ok !$schema->IsActive, "not active";
50     ok !$schema->IsActive(''), "not active";
51     ok !$schema->IsActive(undef), "not active";
52     ok !$schema->IsActive('foo'), "not active";
53
54     is_deeply [$schema->Inactive], [qw(resolved rejected deleted)], 'inactive set';
55     ok( $schema->IsInactive($_), "inactive" )
56         foreach qw(resolved rejected deleted);
57     ok !$schema->IsInactive('new'), "not inactive";
58     ok !$schema->IsInactive, "not inactive";
59     ok !$schema->IsInactive(''), "not inactive";
60     ok !$schema->IsInactive(undef), "not inactive";
61     ok !$schema->IsInactive('foo'), "not inactive";
62
63     is_deeply [$schema->Transitions('')], [qw(new open resolved)], 'on create transitions';
64     ok $schema->IsTransition('' => $_), 'good transition'
65         foreach qw(new open resolved);
66 }
67
68 my ($baseurl, $m) = RT::Test->started_ok;
69 ok $m->login, 'logged in';
70
71 diag "check status input on create";
72 {
73     $m->goto_create_ticket( $general );
74
75     my $form = $m->form_name('TicketCreate');
76     ok my $input = $form->find_input('Status'), 'found status selector';
77
78     my @form_values = $input->possible_values;
79     ok scalar @form_values, 'some options in the UI';
80
81     my $valid = 1;
82     foreach ( @form_values ) {
83         next if $general->Lifecycle->IsValid($_);
84         $valid = 0;
85         diag("$_ doesn't appear to be a valid status, but it was in the form");
86     }
87
88
89     ok $valid, 'all statuses in the form are valid';
90 }
91
92 diag "create a ticket";
93 my $tid;
94 {
95     my $ticket = RT::Ticket->new( RT->SystemUser );
96     ($tid) = $ticket->Create( Queue => $general->id, Subject => 'test' );
97     ok $tid, "created a ticket #$tid";
98     is $ticket->Status, 'new', 'correct status';
99 }
100
101 diag "new ->(open it)-> open";
102 {
103     ok $m->goto_ticket( $tid ), 'opened a ticket';
104     $m->check_links(
105         has => ['Open It', 'Resolve', 'Reject', 'Delete'],
106         has_no => ['Stall', 'Re-open', 'Undelete'],
107     );
108
109     $m->follow_link_ok({text => 'Open It'});
110     $m->form_name('TicketUpdate');
111     $m->click('SubmitTicket');
112
113     is $tstatus->($tid), 'open', 'changed status';
114 }
115
116 diag "open ->(stall)-> stalled";
117 {
118     is $tstatus->($tid), 'open', 'ticket is open';
119
120     ok $m->goto_ticket( $tid ), 'opened a ticket';
121
122     $m->check_links(
123         has => ['Stall', 'Resolve', 'Reject'],
124         has_no => ['Open It', 'Delete', 'Re-open', 'Undelete'],
125     );
126
127     $m->follow_link_ok({text => 'Stall'});
128     $m->form_name('TicketUpdate');
129     $m->click('SubmitTicket');
130
131     is $tstatus->($tid), 'stalled', 'changed status';
132 }
133
134 diag "stall ->(open it)-> open";
135 {
136     is $tstatus->($tid), 'stalled', 'ticket is stalled';
137
138     ok $m->goto_ticket( $tid ), 'opened a ticket';
139     $m->check_links(
140         has => ['Open It'],
141         has_no => ['Delete', 'Re-open', 'Undelete', 'Stall', 'Resolve', 'Reject'],
142     );
143
144     $m->follow_link_ok({text => 'Open It'});
145
146     is $tstatus->($tid), 'open', 'changed status';
147 }
148
149 diag "open -> deleted, only via modify";
150 {
151     is $tstatus->($tid), 'open', 'ticket is open';
152
153     $m->get_ok( '/Ticket/Modify.html?id='. $tid );
154     my $form = $m->form_name('TicketModify');
155     ok my $input = $form->find_input('Status'), 'found status selector';
156
157     my @form_values = $input->possible_values;
158     ok scalar @form_values, 'some options in the UI';
159
160     ok grep($_ eq 'deleted', @form_values), "has deleted";
161
162     $m->select( Status => 'deleted' );
163     $m->submit;
164
165     is $tstatus->($tid), 'deleted', 'deleted ticket';
166 }
167
168 diag "deleted -> X via modify, only open is available";
169 {
170     is $tstatus->($tid), 'deleted', 'ticket is deleted';
171
172     $m->get_ok( '/Ticket/Modify.html?id='. $tid );
173     my $form = $m->form_name('TicketModify');
174     ok my $input = $form->find_input('Status'), 'found status selector';
175
176     my @form_values = $input->possible_values;
177     ok scalar @form_values, 'some options in the UI';
178
179     is join('-', @form_values), '-deleted-open', 'only default, current and open available';
180 }
181
182 diag "check illegal values and transitions";
183 {
184     {
185         my $ticket = RT::Ticket->new( RT->SystemUser );
186         my ($id, $msg) = $ticket->Create(
187             Queue => $general->id,
188             Subject => 'test',
189             Status => 'illegal',
190         );
191         ok !$id, 'have not created a ticket';
192     }
193     {
194         my $ticket = RT::Ticket->new( RT->SystemUser );
195         my ($id, $msg) = $ticket->Create(
196             Queue => $general->id,
197             Subject => 'test',
198             Status => 'new',
199         );
200         ok $id, 'created a ticket';
201     }
202     {
203         my $ticket = RT::Ticket->new( RT->SystemUser );
204         my ($id, $msg) = $ticket->Create(
205             Queue => $general->id,
206             Subject => 'test',
207             Status => 'new',
208         );
209         ok $id, 'created a ticket';
210
211         (my $status, $msg) = $ticket->SetStatus( 'illeagal' );
212         ok !$status, "couldn't set illeagal status";
213         is $ticket->Status, 'new', 'status is steal the same';
214
215         ($status, $msg) = $ticket->SetStatus( 'stalled' );
216         ok !$status, "couldn't set status, transition is illeagal";
217         is $ticket->Status, 'new', 'status is steal the same';
218     }
219 }
220
221 diag "'!inactive -> inactive' actions are shown even if ticket has unresolved dependencies";
222 {
223     my $child_ticket = RT::Test->create_ticket(
224         Queue => $general->id,
225         Subject => 'child',
226     );
227     my $cid = $child_ticket->id;
228     my $parent_ticket = RT::Test->create_ticket(
229         Queue => $general->id,
230         Subject => 'parent',
231         DependsOn => $child_ticket->id,
232     );
233     my $pid = $parent_ticket->id;
234
235     ok $m->goto_ticket( $pid ), 'opened a ticket';
236     $m->check_links(
237         has => ['Open It', 'Resolve', 'Reject', 'Delete' ],
238         has_no => ['Stall', 'Re-open', 'Undelete', ],
239     );
240     ok $m->goto_ticket( $cid ), 'opened a ticket';
241     $m->check_links(
242         has => ['Open It', 'Resolve', 'Reject', 'Delete'],
243         has_no => ['Stall', 'Re-open', 'Undelete'],
244     );
245 }
246