rt 4.0.21 (RT#13852)
[freeside.git] / rt / t / customfields / ip.t
1
2 use strict;
3 use warnings;
4
5 use RT::Test tests => undef;
6 use Test::Warn;
7
8 my ( $baseurl, $agent ) = RT::Test->started_ok;
9 ok( $agent->login, 'log in' );
10
11 my $q = RT::Queue->new($RT::SystemUser);
12 $q->Load('General');
13 my $ip_cf = RT::CustomField->new($RT::SystemUser);
14
15 my ( $val, $msg ) = $ip_cf->Create(
16     Name       => 'IP',
17     Type       => 'IPAddress',
18     LookupType => 'RT::Queue-RT::Ticket'
19 );
20 ok( $val, $msg );
21 my $cf_id = $val;
22 $ip_cf->AddToObject($q);
23 use_ok('RT');
24
25 my $cf;
26 diag "load and check basic properties of the IP CF" if $ENV{'TEST_VERBOSE'};
27 {
28     my $cfs = RT::CustomFields->new($RT::SystemUser);
29     $cfs->Limit( FIELD => 'Name', VALUE => 'IP' );
30     is( $cfs->Count, 1, "found one CF with name 'IP'" );
31
32     $cf = $cfs->First;
33     is( $cf->Type,       'IPAddress',            'type check' );
34     is( $cf->LookupType, 'RT::Queue-RT::Ticket', 'lookup type check' );
35     ok( !$cf->MaxValues, "unlimited number of values" );
36     ok( !$cf->Disabled,  "not disabled" );
37 }
38
39 diag "check that CF applies to queue General" if $ENV{'TEST_VERBOSE'};
40 {
41     my $cfs = $q->TicketCustomFields;
42     $cfs->Limit( FIELD => 'id', VALUE => $cf->id, ENTRYAGGREGATOR => 'AND' );
43     is( $cfs->Count, 1, 'field applies to queue' );
44 }
45
46 diag "create a ticket via web and set IP" if $ENV{'TEST_VERBOSE'};
47 {
48     my $val = '192.168.20.1';
49     ok $agent->goto_create_ticket($q), "go to create ticket";
50     my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
51     $agent->submit_form(
52         form_name => 'TicketCreate',
53         fields    => {
54             Subject   => 'test ip',
55             $cf_field => $val,
56         }
57     );
58
59     $agent->content_contains( $val, "IP on the page" );
60     my ($id) = $agent->content =~ /Ticket (\d+) created/;
61     ok( $id, "created ticket $id" );
62
63     my $ticket = RT::Ticket->new($RT::SystemUser);
64     $ticket->Load($id);
65     ok( $ticket->id, 'loaded ticket' );
66     is( $ticket->FirstCustomFieldValue('IP'), $val, 'correct value' );
67 }
68
69 diag "create a ticket and edit IP field using Edit page"
70   if $ENV{'TEST_VERBOSE'};
71 {
72     my $val = '172.16.0.1';
73     ok $agent->goto_create_ticket($q), "go to create ticket";
74     $agent->submit_form(
75         form_name => 'TicketCreate',
76         fields    => { Subject => 'test ip', }
77     );
78
79     my ($id) = $agent->content =~ /Ticket (\d+) created/;
80     ok( $id, "created ticket $id" );
81     my $cf_field = "Object-RT::Ticket-$id-CustomField-$cf_id-Values";
82
83     $agent->follow_link_ok( { text => 'Basics', n => "1" },
84         "Followed 'Basics' link" );
85     $agent->form_name('TicketModify');
86
87     is( $agent->value($cf_field), '', 'IP is empty' );
88     $agent->field( $cf_field => $val );
89     $agent->click('SubmitTicket');
90
91     $agent->content_contains( $val, "IP on the page" );
92
93     my $ticket = RT::Ticket->new($RT::SystemUser);
94     $ticket->Load($id);
95     ok( $ticket->id, 'loaded ticket' );
96     is( $ticket->FirstCustomFieldValue('IP'), '172.16.0.1' );
97
98     diag "set IP with spaces around" if $ENV{'TEST_VERBOSE'};
99     $val = "  172.16.0.2  \n  ";
100     $agent->follow_link_ok( { text => 'Basics', n => "1" },
101         "Followed 'Basics' link" );
102     $agent->form_name('TicketModify');
103     is( $agent->value($cf_field), '172.16.0.1', 'IP is in input box' );
104     $agent->field( $cf_field => $val );
105     $agent->click('SubmitTicket');
106
107     $agent->content_contains( '172.16.0.2', "IP on the page" );
108
109     $ticket = RT::Ticket->new($RT::SystemUser);
110     $ticket->Load($id);
111     ok( $ticket->id, 'loaded ticket' );
112     is( $ticket->FirstCustomFieldValue('IP'),
113         '172.16.0.2', 'correct value' );
114 }
115
116 diag "check that we parse correct IPs only" if $ENV{'TEST_VERBOSE'};
117 {
118
119     my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
120     for my $valid (qw/1.0.0.0 255.255.255.255/) {
121         ok $agent->goto_create_ticket($q), "go to create ticket";
122         $agent->submit_form(
123             form_name => 'TicketCreate',
124             fields    => {
125                 Subject   => 'test ip',
126                 $cf_field => $valid,
127             }
128         );
129
130         my ($id) = $agent->content =~ /Ticket (\d+) created/;
131         ok( $id, "created ticket $id" );
132         my $ticket = RT::Ticket->new($RT::SystemUser);
133         $ticket->Load($id);
134         is( $ticket->id, $id, 'loaded ticket' );
135
136         is( $ticket->FirstCustomFieldValue('IP'),
137             $valid, 'correct value' );
138     }
139
140     for my $invalid (qw{255.255.255.256 355.255.255.255 8.13.8/8.13.0/1.0}) {
141         ok $agent->goto_create_ticket($q), "go to create ticket";
142         $agent->submit_form(
143             form_name => 'TicketCreate',
144             fields    => {
145                 Subject   => 'test ip',
146                 $cf_field => $invalid,
147             }
148         );
149
150         $agent->content_contains( 'is not a valid IP address',
151             'ticket fails to create' );
152     }
153
154 }
155
156 diag "search tickets by IP" if $ENV{'TEST_VERBOSE'};
157 {
158     my $val = '172.16.1.1';
159     ok $agent->goto_create_ticket($q), "go to create ticket";
160     my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
161     $agent->submit_form(
162         form_name => 'TicketCreate',
163         fields    => {
164             Subject   => 'test ip',
165             $cf_field => $val,
166         }
167     );
168
169     my ($id) = $agent->content =~ /Ticket (\d+) created/;
170     ok( $id, "created ticket $id" );
171
172     my $ticket = RT::Ticket->new($RT::SystemUser);
173     $ticket->Load($id);
174     ok( $ticket->id, 'loaded ticket' );
175
176     my $tickets = RT::Tickets->new($RT::SystemUser);
177     $tickets->FromSQL("id = $id AND CF.{IP} = '172.16.1.1'");
178     ok( $tickets->Count, "found tickets" );
179 }
180
181 diag "create two tickets with different IPs and check several searches"
182   if $ENV{'TEST_VERBOSE'};
183 {
184     ok $agent->goto_create_ticket($q), "go to create ticket";
185     my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
186     $agent->submit_form(
187         form_name => 'TicketCreate',
188         fields    => {
189             Subject   => 'test ip',
190             $cf_field => '192.168.21.10',
191         }
192     );
193
194     my ($id1) = $agent->content =~ /Ticket (\d+) created/;
195     ok( $id1, "created first ticket $id1" );
196
197     ok $agent->goto_create_ticket($q), "go to create ticket";
198     $agent->submit_form(
199         form_name => 'TicketCreate',
200         fields    => {
201             Subject   => 'test ip',
202             $cf_field => '192.168.22.10',
203         }
204     );
205
206     my ($id2) = $agent->content =~ /Ticket (\d+) created/;
207     ok( $id2, "created second ticket $id2" );
208
209     my $tickets = RT::Tickets->new($RT::SystemUser);
210     $tickets->FromSQL("id = $id1 OR id = $id2");
211     is( $tickets->Count, 2, "found both tickets by 'id = x OR y'" );
212
213     # IP
214     $tickets = RT::Tickets->new($RT::SystemUser);
215     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.10'");
216     is( $tickets->Count, 1, "found one ticket" );
217     is( $tickets->First->FirstCustomFieldValue('IP'),
218         '192.168.21.10', "correct value" );
219     $tickets = RT::Tickets->new($RT::SystemUser);
220     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22.10'");
221     is( $tickets->Count, 1, "found one ticket" );
222     is( $tickets->First->FirstCustomFieldValue('IP'),
223         '192.168.22.10', "correct value" );
224
225     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} <= '192.168.21.10'");
226     is( $tickets->Count, 1, "found one ticket" );
227     is( $tickets->First->FirstCustomFieldValue('IP'),
228         '192.168.21.10', "correct value" );
229     $tickets = RT::Tickets->new($RT::SystemUser);
230     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} >= '192.168.22.10'");
231     is( $tickets->Count, 1, "found one ticket" );
232     is( $tickets->First->FirstCustomFieldValue('IP'),
233         '192.168.22.10', "correct value" );
234
235     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} > '192.168.22.10'");
236     is( $tickets->Count, 0, "no tickets found" );
237     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} < '192.168.21.10'");
238     is( $tickets->Count, 0, "no tickets found" );
239
240     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} < '192.168.22.10'");
241     is( $tickets->Count, 1, "found one ticket" );
242     is( $tickets->First->FirstCustomFieldValue('IP'),
243         '192.168.21.10', "correct value" );
244
245     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} > '192.168.21.10'");
246     is( $tickets->Count, 1, "found one ticket" );
247     is( $tickets->First->FirstCustomFieldValue('IP'),
248         '192.168.22.10', "correct value" );
249 }
250
251 diag "create a ticket with an IP of 10.0.0.1 and search for doesn't match '10.0.0.'."
252   if $ENV{'TEST_VERBOSE'};
253 {
254     ok $agent->goto_create_ticket($q), "go to create ticket";
255     my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
256     $agent->submit_form(
257         form_name => 'TicketCreate',
258         fields    => {
259             Subject   => 'local',
260             $cf_field => '10.0.0.1',
261         }
262     );
263
264     my ($id) = $agent->content =~ /Ticket (\d+) created/;
265     ok( $id, "created first ticket $id" );
266
267     my $tickets = RT::Tickets->new($RT::SystemUser);
268     warning_like {
269         $tickets->FromSQL("id=$id AND CF.{IP} NOT LIKE '10.0.0.'");
270     } [qr/not a valid IPAddress/], "caught warning about valid IP address";
271
272     SKIP: {
273         skip "partical ip parse causes ambiguity", 1;
274         is( $tickets->Count, 0, "should not have found the ticket" );
275     }
276 }
277
278
279 diag "test the operators in search page" if $ENV{'TEST_VERBOSE'};
280 {
281     $agent->get_ok( $baseurl . "/Search/Build.html?Query=Queue='General'" );
282     $agent->content_contains('CF.{IP}', 'got CF.{IP}');
283     my $form = $agent->form_name('BuildQuery');
284     my $op = $form->find_input("'CF.{IP}'Op");
285     ok( $op, "found 'CF.{IP}'Op" );
286     is_deeply( [ $op->possible_values ], [ '=', '!=', '<', '>' ], 'op values' );
287 }
288
289 undef $agent;
290 done_testing;