5 use RT::Test tests => undef;
8 my ( $baseurl, $agent ) = RT::Test->started_ok;
9 ok( $agent->login, 'log in' );
11 my $q = RT::Queue->new($RT::SystemUser);
13 my $ip_cf = RT::CustomField->new($RT::SystemUser);
15 my ( $val, $msg ) = $ip_cf->Create(
18 LookupType => 'RT::Queue-RT::Ticket'
22 $ip_cf->AddToObject($q);
26 diag "load and check basic properties of the IP CF" if $ENV{'TEST_VERBOSE'};
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'" );
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" );
39 diag "check that CF applies to queue General" if $ENV{'TEST_VERBOSE'};
41 my $cfs = $q->TicketCustomFields;
42 $cfs->Limit( FIELD => 'id', VALUE => $cf->id, ENTRYAGGREGATOR => 'AND' );
43 is( $cfs->Count, 1, 'field applies to queue' );
46 diag "create a ticket via web and set IP" if $ENV{'TEST_VERBOSE'};
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";
52 form_name => 'TicketCreate',
59 $agent->content_contains( $val, "IP on the page" );
60 my ($id) = $agent->content =~ /Ticket (\d+) created/;
61 ok( $id, "created ticket $id" );
63 my $ticket = RT::Ticket->new($RT::SystemUser);
65 ok( $ticket->id, 'loaded ticket' );
66 is( $ticket->FirstCustomFieldValue('IP'), $val, 'correct value' );
69 diag "create a ticket and edit IP field using Edit page"
70 if $ENV{'TEST_VERBOSE'};
72 my $val = '172.16.0.1';
73 ok $agent->goto_create_ticket($q), "go to create ticket";
75 form_name => 'TicketCreate',
76 fields => { Subject => 'test ip', }
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";
83 $agent->follow_link_ok( { text => 'Basics', n => "1" },
84 "Followed 'Basics' link" );
85 $agent->form_name('TicketModify');
87 is( $agent->value($cf_field), '', 'IP is empty' );
88 $agent->field( $cf_field => $val );
89 $agent->click('SubmitTicket');
91 $agent->content_contains( $val, "IP on the page" );
93 my $ticket = RT::Ticket->new($RT::SystemUser);
95 ok( $ticket->id, 'loaded ticket' );
96 is( $ticket->FirstCustomFieldValue('IP'), '172.16.0.1' );
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');
107 $agent->content_contains( '172.16.0.2', "IP on the page" );
109 $ticket = RT::Ticket->new($RT::SystemUser);
111 ok( $ticket->id, 'loaded ticket' );
112 is( $ticket->FirstCustomFieldValue('IP'),
113 '172.16.0.2', 'correct value' );
116 diag "check that we parse correct IPs only" if $ENV{'TEST_VERBOSE'};
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";
123 form_name => 'TicketCreate',
125 Subject => 'test ip',
130 my ($id) = $agent->content =~ /Ticket (\d+) created/;
131 ok( $id, "created ticket $id" );
132 my $ticket = RT::Ticket->new($RT::SystemUser);
134 is( $ticket->id, $id, 'loaded ticket' );
136 is( $ticket->FirstCustomFieldValue('IP'),
137 $valid, 'correct value' );
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";
143 form_name => 'TicketCreate',
145 Subject => 'test ip',
146 $cf_field => $invalid,
150 $agent->content_contains( 'can not be parsed as an IP address',
151 'ticket fails to create' );
156 diag "search tickets by IP" if $ENV{'TEST_VERBOSE'};
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";
162 form_name => 'TicketCreate',
164 Subject => 'test ip',
169 my ($id) = $agent->content =~ /Ticket (\d+) created/;
170 ok( $id, "created ticket $id" );
172 my $ticket = RT::Ticket->new($RT::SystemUser);
174 ok( $ticket->id, 'loaded ticket' );
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" );
181 diag "create two tickets with different IPs and check several searches"
182 if $ENV{'TEST_VERBOSE'};
184 ok $agent->goto_create_ticket($q), "go to create ticket";
185 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
187 form_name => 'TicketCreate',
189 Subject => 'test ip',
190 $cf_field => '192.168.21.10',
194 my ($id1) = $agent->content =~ /Ticket (\d+) created/;
195 ok( $id1, "created first ticket $id1" );
197 ok $agent->goto_create_ticket($q), "go to create ticket";
199 form_name => 'TicketCreate',
201 Subject => 'test ip',
202 $cf_field => '192.168.22.10',
206 my ($id2) = $agent->content =~ /Ticket (\d+) created/;
207 ok( $id2, "created second ticket $id2" );
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'" );
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" );
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" );
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" );
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" );
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" );
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'};
254 ok $agent->goto_create_ticket($q), "go to create ticket";
255 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
257 form_name => 'TicketCreate',
260 $cf_field => '10.0.0.1',
264 my ($id) = $agent->content =~ /Ticket (\d+) created/;
265 ok( $id, "created first ticket $id" );
267 my $tickets = RT::Tickets->new($RT::SystemUser);
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";
273 skip "partical ip parse causes ambiguity", 1;
274 is( $tickets->Count, 0, "should not have found the ticket" );
279 diag "test the operators in search page" if $ENV{'TEST_VERBOSE'};
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' );