rt 4.0.21 (RT#13852)
[freeside.git] / rt / t / customfields / ipv6.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 my %valid = (
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',
55 );
56
57 diag "create a ticket via web and set IP" if $ENV{'TEST_VERBOSE'};
58 {
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";
62         $agent->submit_form(
63             form_name => 'TicketCreate',
64             fields    => {
65                 Subject   => 'test ip',
66                 $cf_field => $ip,
67             }
68         );
69
70         $agent->content_contains( $valid{$ip}, "IP on the page" );
71         my ($id) = $agent->content =~ /Ticket (\d+) created/;
72         ok( $id, "created ticket $id" );
73
74         my $ticket = RT::Ticket->new($RT::SystemUser);
75         $ticket->Load($id);
76         ok( $ticket->id, 'loaded ticket' );
77         is( $ticket->FirstCustomFieldValue('IP'), $valid{$ip},
78             'correct value' );
79
80         my $tickets = RT::Tickets->new($RT::SystemUser);
81         $tickets->FromSQL("id = $id AND CF.{IP} = '$ip'");
82         ok( $tickets->Count, "found tickets" );
83     }
84 }
85
86 diag "create a ticket and edit IP field using Edit page"
87   if $ENV{'TEST_VERBOSE'};
88
89 {
90     my $ip = 'abcd::034';
91
92     ok $agent->goto_create_ticket($q), "go to create ticket";
93     $agent->submit_form(
94         form_name => 'TicketCreate',
95         fields    => { Subject => 'test ip', }
96     );
97
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";
101
102     $agent->follow_link_ok( { text => 'Basics', n => "1" },
103         "Followed 'Basics' link" );
104     $agent->form_name('TicketModify');
105
106     is( $agent->value($cf_field), '', 'IP is empty' );
107     $agent->field( $cf_field => $valid{$ip} );
108     $agent->click('SubmitTicket');
109
110     $agent->content_contains( $valid{$ip}, "IP on the page" );
111
112     my $ticket = RT::Ticket->new($RT::SystemUser);
113     $ticket->Load($id);
114     ok( $ticket->id, 'loaded ticket' );
115     my $values = $ticket->CustomFieldValues('IP');
116     is( $ticket->FirstCustomFieldValue('IP'), $valid{$ip}, 'correct value' );
117
118     diag "set IP with spaces around" if $ENV{'TEST_VERBOSE'};
119     my $new_ip    = '::3141';
120     my $new_value = '0000:' x 7 . '3141';
121
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');
128
129     $agent->content_contains( $new_value, "IP on the page" );
130
131     $ticket = RT::Ticket->new($RT::SystemUser);
132     $ticket->Load($id);
133     ok( $ticket->id, 'loaded ticket' );
134     is( $ticket->FirstCustomFieldValue('IP'), $new_value, 'correct value' );
135 }
136
137 diag "check that we parse correct IPs only" if $ENV{'TEST_VERBOSE'};
138 {
139
140     my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
141     my @invalid =
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";
145         $agent->submit_form(
146             form_name => 'TicketCreate',
147             fields    => {
148                 Subject   => 'test ip',
149                 $cf_field => $invalid,
150             }
151         );
152
153         $agent->content_contains( 'is not a valid IP address',
154             'ticket fails to create' );
155     }
156 }
157
158 diag "create two tickets with different IPs and check several searches"
159   if $ENV{'TEST_VERBOSE'};
160 {
161     ok $agent->goto_create_ticket($q), "go to create ticket";
162     my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
163     $agent->submit_form(
164         form_name => 'TicketCreate',
165         fields    => {
166             Subject   => 'test ip',
167             $cf_field => 'abcd::',
168         }
169     );
170
171     my ($id1) = $agent->content =~ /Ticket (\d+) created/;
172     ok( $id1, "created first ticket $id1" );
173
174     ok $agent->goto_create_ticket($q), "go to create ticket";
175     $agent->submit_form(
176         form_name => 'TicketCreate',
177         fields    => {
178             Subject   => 'test ip',
179             $cf_field => 'bbcd::',
180         }
181     );
182
183     my ($id2) = $agent->content =~ /Ticket (\d+) created/;
184     ok( $id2, "created second ticket $id2" );
185
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'" );
189
190     # IP
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" );
201
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" );
211
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" );
216
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" );
221
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" );
226 }
227
228 diag "create a ticket with an IP of abcd:23:: and search for doesn't match 'abcd:23'."
229   if $ENV{'TEST_VERBOSE'};
230 {
231     ok $agent->goto_create_ticket($q), "go to create ticket";
232     my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
233     $agent->submit_form(
234         form_name => 'TicketCreate',
235         fields    => {
236             Subject   => 'local',
237             $cf_field => 'abcd:23::',
238         }
239     );
240
241     my ($id) = $agent->content =~ /Ticket (\d+) created/;
242     ok( $id, "created first ticket $id" );
243
244     my $tickets = RT::Tickets->new($RT::SystemUser);
245     warning_like {
246         $tickets->FromSQL("id=$id AND CF.{IP} NOT LIKE 'abcd:23'");
247     } [qr/not a valid IPAddress/], "caught warning about IPAddress";
248
249     SKIP: {
250         skip "partical ip parse can causes ambiguity", 1;
251         is( $tickets->Count, 0, "should not have found the ticket" );
252     }
253 }
254
255 undef $agent;
256 done_testing;