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