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