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', CASESENSITIVE => 0 );
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' );
47 'abcd:' x 7 . 'abcd' => 'abcd:' x 7 . 'abcd',
48 '034:' x 7 . '034' => '0034:' x 7 . '0034',
49 'abcd::' => 'abcd:' . '0000:' x 6 . '0000',
50 '::abcd' => '0000:' x 7 . 'abcd',
51 'abcd::034' => 'abcd:' . '0000:' x 6 . '0034',
52 'abcd::192.168.1.1' => 'abcd:' . '0000:' x 5 . 'c0a8:0101',
53 '::192.168.1.1' => '0000:' x 6 . 'c0a8:0101',
54 '::' => '0000:' x 7 . '0000',
57 diag "create a ticket via web and set IP" if $ENV{'TEST_VERBOSE'};
59 for my $ip ( keys %valid ) {
60 ok $agent->goto_create_ticket($q), "go to create ticket";
61 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
63 form_name => 'TicketCreate',
70 $agent->content_contains( $valid{$ip}, "IP on the page" );
71 my ($id) = $agent->content =~ /Ticket (\d+) created/;
72 ok( $id, "created ticket $id" );
74 my $ticket = RT::Ticket->new($RT::SystemUser);
76 ok( $ticket->id, 'loaded ticket' );
77 is( $ticket->FirstCustomFieldValue('IP'), $valid{$ip},
80 my $tickets = RT::Tickets->new($RT::SystemUser);
81 $tickets->FromSQL("id = $id AND CF.{IP} = '$ip'");
82 ok( $tickets->Count, "found tickets" );
86 diag "create a ticket and edit IP field using Edit page"
87 if $ENV{'TEST_VERBOSE'};
92 ok $agent->goto_create_ticket($q), "go to create ticket";
94 form_name => 'TicketCreate',
95 fields => { Subject => 'test ip', }
98 my ($id) = $agent->content =~ /Ticket (\d+) created/;
99 ok( $id, "created ticket $id" );
100 my $cf_field = "Object-RT::Ticket-$id-CustomField-$cf_id-Values";
102 $agent->follow_link_ok( { text => 'Basics', n => "1" },
103 "Followed 'Basics' link" );
104 $agent->form_name('TicketModify');
106 is( $agent->value($cf_field), '', 'IP is empty' );
107 $agent->field( $cf_field => $valid{$ip} );
108 $agent->click('SubmitTicket');
110 $agent->content_contains( $valid{$ip}, "IP on the page" );
112 my $ticket = RT::Ticket->new($RT::SystemUser);
114 ok( $ticket->id, 'loaded ticket' );
115 my $values = $ticket->CustomFieldValues('IP');
116 is( $ticket->FirstCustomFieldValue('IP'), $valid{$ip}, 'correct value' );
118 diag "set IP with spaces around" if $ENV{'TEST_VERBOSE'};
119 my $new_ip = '::3141';
120 my $new_value = '0000:' x 7 . '3141';
122 $agent->follow_link_ok( { text => 'Basics', n => "1" },
123 "Followed 'Basics' link" );
124 $agent->form_name('TicketModify');
125 is( $agent->value($cf_field), $valid{$ip}, 'IP is in input box' );
126 $agent->field( $cf_field => $new_ip );
127 $agent->click('SubmitTicket');
129 $agent->content_contains( $new_value, "IP on the page" );
131 $ticket = RT::Ticket->new($RT::SystemUser);
133 ok( $ticket->id, 'loaded ticket' );
134 is( $ticket->FirstCustomFieldValue('IP'), $new_value, 'correct value' );
137 diag "check that we parse correct IPs only" if $ENV{'TEST_VERBOSE'};
140 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
142 ( 'abcd:', 'efgh', 'abcd:' x 8 . 'abcd', 'abcd::abcd::abcd' );
143 for my $invalid (@invalid) {
144 ok $agent->goto_create_ticket($q), "go to create ticket";
146 form_name => 'TicketCreate',
148 Subject => 'test ip',
149 $cf_field => $invalid,
153 $agent->content_contains( 'is not a valid IP address',
154 'ticket fails to create' );
158 diag "create two tickets with different IPs and check several searches"
159 if $ENV{'TEST_VERBOSE'};
161 ok $agent->goto_create_ticket($q), "go to create ticket";
162 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
164 form_name => 'TicketCreate',
166 Subject => 'test ip',
167 $cf_field => 'abcd::',
171 my ($id1) = $agent->content =~ /Ticket (\d+) created/;
172 ok( $id1, "created first ticket $id1" );
174 ok $agent->goto_create_ticket($q), "go to create ticket";
176 form_name => 'TicketCreate',
178 Subject => 'test ip',
179 $cf_field => 'bbcd::',
183 my ($id2) = $agent->content =~ /Ticket (\d+) created/;
184 ok( $id2, "created second ticket $id2" );
186 my $tickets = RT::Tickets->new($RT::SystemUser);
187 $tickets->FromSQL("id = $id1 OR id = $id2");
188 is( $tickets->Count, 2, "found both tickets by 'id = x OR y'" );
191 $tickets = RT::Tickets->new($RT::SystemUser);
192 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = 'abcd::'");
193 is( $tickets->Count, 1, "found one ticket" );
194 is( $tickets->First->FirstCustomFieldValue('IP'),
195 'abcd' . ':0000' x 7, "correct value" );
196 $tickets = RT::Tickets->new($RT::SystemUser);
197 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = 'bbcd::'");
198 is( $tickets->Count, 1, "found one ticket" );
199 is( $tickets->First->FirstCustomFieldValue('IP'),
200 'bbcd' . ':0000' x 7, "correct value" );
202 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} <= 'abcd::'");
203 is( $tickets->Count, 1, "found one ticket" );
204 is( $tickets->First->FirstCustomFieldValue('IP'),
205 'abcd' . ':0000' x 7, "correct value" );
206 $tickets = RT::Tickets->new($RT::SystemUser);
207 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} >= 'bbcd::'");
208 is( $tickets->Count, 1, "found one ticket" );
209 is( $tickets->First->FirstCustomFieldValue('IP'),
210 'bbcd' . ':0000' x 7, "correct value" );
212 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} > 'bbcd::'");
213 is( $tickets->Count, 0, "no tickets found" );
214 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} < 'abcd::'");
215 is( $tickets->Count, 0, "no tickets found" );
217 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} < 'bbcd::'");
218 is( $tickets->Count, 1, "found one ticket" );
219 is( $tickets->First->FirstCustomFieldValue('IP'),
220 'abcd' . ':0000' x 7, "correct value" );
222 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} > 'abcd::'");
223 is( $tickets->Count, 1, "found one ticket" );
224 is( $tickets->First->FirstCustomFieldValue('IP'),
225 'bbcd' . ':0000' x 7, "correct value" );
228 diag "create a ticket with an IP of abcd:23:: and search for doesn't match 'abcd:23'."
229 if $ENV{'TEST_VERBOSE'};
231 ok $agent->goto_create_ticket($q), "go to create ticket";
232 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
234 form_name => 'TicketCreate',
237 $cf_field => 'abcd:23::',
241 my ($id) = $agent->content =~ /Ticket (\d+) created/;
242 ok( $id, "created first ticket $id" );
244 my $tickets = RT::Tickets->new($RT::SystemUser);
246 $tickets->FromSQL("id=$id AND CF.{IP} NOT LIKE 'abcd:23'");
247 } [qr/not a valid IPAddress/], "caught warning about IPAddress";
250 local $TODO = "partial ip parse can causes ambiguity";
251 is( $tickets->Count, 0, "should not have found the ticket" );