import rt 3.8.8
[freeside.git] / rt / t / mail / charsets-outgoing.t
1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 use Encode;
5
6 use RT::Test tests => 78;
7
8 my %string = (
9     ru => {
10         test      => "\x{442}\x{435}\x{441}\x{442}",
11         autoreply => "\x{410}\x{432}\x{442}\x{43e}\x{43e}\x{442}\x{432}\x{435}\x{442}",
12         support   => "\x{43f}\x{43e}\x{434}\x{434}\x{435}\x{440}\x{436}\x{43a}\x{430}",
13     },
14     latin1 => {
15         test      => Encode::decode('latin1', "t\xE9st"),
16         autoreply => Encode::decode('latin1', "a\xFCtoreply"),
17         support   => Encode::decode('latin1', "supp\xF5rt"),
18     },
19 );
20
21 RT::Test->set_mail_catcher;
22
23 my $queue = RT::Test->load_or_create_queue(
24     Name              => 'Regression',
25     CorrespondAddress => 'rt-recipient@example.com',
26     CommentAddress    => 'rt-recipient@example.com',
27 );
28 ok $queue && $queue->id, 'loaded or created queue';
29
30 diag "make sure queue has no subject tag" if $ENV{'TEST_VERBOSE'};
31 {
32     my ($status, $msg) = $queue->SetSubjectTag( undef );
33     ok $status, "set subject tag for the queue" or diag "error: $msg";
34 }
35
36 diag "set intial simple autoreply template" if $ENV{'TEST_VERBOSE'};
37 {
38     my $template = RT::Template->new( $RT::SystemUser );
39     $template->Load('Autoreply');
40     ok $template->id, "loaded autoreply tempalte";
41
42     my ($status, $msg) = $template->SetContent(
43         "Subject: Autreply { \$Ticket->Subject }\n"
44         ."\n"
45         ."hi there it's an autoreply.\n"
46         ."\n"
47     );
48     ok $status, "changed content of the template"
49         or diag "error: $msg";
50 }
51
52 diag "basic test of autoreply" if $ENV{'TEST_VERBOSE'};
53 {
54     my $ticket = RT::Ticket->new( $RT::SystemUser );
55     $ticket->Create(
56         Queue => $queue->id,
57         Subject => 'test',
58         Requestor => 'root@localhost',
59     );
60     my @mails = RT::Test->fetch_caught_mails;
61     ok @mails, "got some outgoing emails";
62 }
63
64 diag "non-ascii Subject with ascii prefix set in the template"
65     if $ENV{'TEST_VERBOSE'};
66 foreach my $set ( 'ru', 'latin1' ) {
67     my $ticket = RT::Ticket->new( $RT::SystemUser );
68     $ticket->Create(
69         Queue => $queue->id,
70         Subject => $string{$set}{test},
71         Requestor => 'root@localhost',
72     );
73     my @mails = RT::Test->fetch_caught_mails;
74     ok @mails, "got some outgoing emails";
75
76     my $status = 1;
77     foreach my $mail ( @mails ) {
78         my $entity = parse_mail( $mail );
79         my $subject = Encode::decode_utf8( $entity->head->get('Subject') );
80         $subject =~ /$string{$set}{test}/
81             or do { $status = 0; diag "wrong subject: $subject" };
82     }
83     ok $status, "all mails have correct data";
84 }
85
86 foreach my $tag_set ( 'ru', 'latin1' ) {
87
88 diag "set non-ascii subject tag for the queue" if $ENV{'TEST_VERBOSE'};
89 {
90     my ($status, $msg) = $queue->SetSubjectTag( $string{$tag_set}{support} );
91     ok $status, "set subject tag for the queue" or diag "error: $msg";
92 }
93
94 diag "ascii subject with non-ascii subject tag" if $ENV{'TEST_VERBOSE'};
95 {
96     my $ticket = RT::Ticket->new( $RT::SystemUser );
97     $ticket->Create(
98         Queue => $queue->id,
99         Subject => 'test',
100         Requestor => 'root@localhost',
101     );
102     my @mails = RT::Test->fetch_caught_mails;
103     ok @mails, "got some outgoing emails";
104
105     my $status = 1;
106     foreach my $mail ( @mails ) {
107         my $entity = parse_mail( $mail );
108         my $subject = Encode::decode_utf8( $entity->head->get('Subject') );
109         $subject =~ /$string{$tag_set}{support}/
110             or do { $status = 0; diag "wrong subject: $subject" };
111     }
112     ok $status, "all mails have correct data";
113 }
114
115 diag "non-ascii subject with non-ascii subject tag" if $ENV{'TEST_VERBOSE'};
116 foreach my $set ( 'ru', 'latin1' ) {
117     my $ticket = RT::Ticket->new( $RT::SystemUser );
118     $ticket->Create(
119         Queue => $queue->id,
120         Subject => $string{$set}{test},
121         Requestor => 'root@localhost',
122     );
123     my @mails = RT::Test->fetch_caught_mails;
124     ok @mails, "got some outgoing emails";
125
126     my $status = 1;
127     foreach my $mail ( @mails ) {
128         my $entity = parse_mail( $mail );
129         my $subject = Encode::decode_utf8( $entity->head->get('Subject') );
130         $subject =~ /$string{$tag_set}{support}/
131             or do { $status = 0; diag "wrong subject: $subject" };
132         $subject =~ /$string{$set}{test}/
133             or do { $status = 0; diag "wrong subject: $subject" };
134     }
135     ok $status, "all mails have correct data";
136 }
137
138 } # subject tag
139
140 diag "return back the empty subject tag" if $ENV{'TEST_VERBOSE'};
141 {
142     my ($status, $msg) = $queue->SetSubjectTag( undef );
143     ok $status, "set subject tag for the queue" or diag "error: $msg";
144 }
145
146
147 foreach my $prefix_set ( 'ru', 'latin1' ) {
148
149 diag "add non-ascii subject prefix in the autoreply template" if $ENV{'TEST_VERBOSE'};
150 {
151     my $template = RT::Template->new( $RT::SystemUser );
152     $template->Load('Autoreply');
153     ok $template->id, "loaded autoreply tempalte";
154
155     my ($status, $msg) = $template->SetContent(
156         "Subject: $string{$prefix_set}{autoreply} { \$Ticket->Subject }\n"
157         ."\n"
158         ."hi there it's an autoreply.\n"
159         ."\n"
160     );
161     ok $status, "changed content of the template" or diag "error: $msg";
162 }
163
164 diag "ascii subject with non-ascii subject prefix in template" if $ENV{'TEST_VERBOSE'};
165 {
166     my $ticket = RT::Ticket->new( $RT::SystemUser );
167     $ticket->Create(
168         Queue => $queue->id,
169         Subject => 'test',
170         Requestor => 'root@localhost',
171     );
172     my @mails = RT::Test->fetch_caught_mails;
173     ok @mails, "got some outgoing emails";
174
175     my $status = 1;
176     foreach my $mail ( @mails ) {
177         my $entity = parse_mail( $mail );
178         my $subject = Encode::decode_utf8( $entity->head->get('Subject') );
179         $subject =~ /$string{$prefix_set}{autoreply}/
180             or do { $status = 0; diag "wrong subject: $subject" };
181     }
182     ok $status, "all mails have correct data";
183 }
184
185 diag "non-ascii subject with non-ascii subject prefix in template"
186     if $ENV{'TEST_VERBOSE'};
187 foreach my $set ( 'ru', 'latin1' ) {
188     my $ticket = RT::Ticket->new( $RT::SystemUser );
189     $ticket->Create(
190         Queue => $queue->id,
191         Subject => $string{$set}{test},
192         Requestor => 'root@localhost',
193     );
194     my @mails = RT::Test->fetch_caught_mails;
195     ok @mails, "got some outgoing emails";
196
197     my $status = 1;
198     foreach my $mail ( @mails ) {
199         my $entity = parse_mail( $mail );
200         my $subject = Encode::decode_utf8( $entity->head->get('Subject') );
201         $subject =~ /$string{$prefix_set}{autoreply}/
202             or do { $status = 0; diag "wrong subject: $subject" };
203         $subject =~ /$string{$set}{test}/
204             or do { $status = 0; diag "wrong subject: $subject" };
205     }
206     ok $status, "all mails have correct data";
207 }
208
209 foreach my $tag_set ( 'ru', 'latin1' ) {
210 diag "set non-ascii subject tag for the queue" if $ENV{'TEST_VERBOSE'};
211 {
212     my ($status, $msg) = $queue->SetSubjectTag( $string{$tag_set}{support} );
213     ok $status, "set subject tag for the queue" or diag "error: $msg";
214 }
215
216 diag "non-ascii subject, non-ascii prefix in template and non-ascii tag"
217     if $ENV{'TEST_VERBOSE'};
218 foreach my $set ( 'ru', 'latin1' ) {
219     my $ticket = RT::Ticket->new( $RT::SystemUser );
220     $ticket->Create(
221         Queue => $queue->id,
222         Subject => $string{$set}{test},
223         Requestor => 'root@localhost',
224     );
225     my @mails = RT::Test->fetch_caught_mails;
226     ok @mails, "got some outgoing emails";
227
228     my $status = 1;
229     foreach my $mail ( @mails ) {
230         my $entity = parse_mail( $mail );
231         my $subject = Encode::decode_utf8( $entity->head->get('Subject') );
232         $subject =~ /$string{$prefix_set}{autoreply}/
233             or do { $status = 0; diag "wrong subject: $subject" };
234         $subject =~ /$string{$tag_set}{support}/
235             or do { $status = 0; diag "wrong subject: $subject" };
236         $subject =~ /$string{$set}{test}/
237             or do { $status = 0; diag "wrong subject: $subject" };
238     }
239     ok $status, "all mails have correct data";
240 }
241
242 } # subject tag
243
244 diag "flush subject tag of the queue" if $ENV{'TEST_VERBOSE'};
245 {
246     my ($status, $msg) = $queue->SetSubjectTag( undef );
247     ok $status, "set subject tag for the queue" or diag "error: $msg";
248 }
249
250 } # prefix set
251
252
253 diag "don't change subject via template" if $ENV{'TEST_VERBOSE'};
254 # clean DB has autoreply that always changes subject in template,
255 # we should test situation when subject is not changed from template
256 {
257     my $template = RT::Template->new( $RT::SystemUser );
258     $template->Load('Autoreply');
259     ok $template->id, "loaded autoreply tempalte";
260
261     my ($status, $msg) = $template->SetContent(
262         "\n"
263         ."\n"
264         ."hi there it's an autoreply.\n"
265         ."\n"
266     );
267     ok $status, "changed content of the template" or diag "error: $msg";
268 }
269
270 diag "non-ascii Subject without changes in template" if $ENV{'TEST_VERBOSE'};
271 foreach my $set ( 'ru', 'latin1' ) {
272     my $ticket = RT::Ticket->new( $RT::SystemUser );
273     $ticket->Create(
274         Queue => $queue->id,
275         Subject => $string{$set}{test},
276         Requestor => 'root@localhost',
277     );
278     my @mails = RT::Test->fetch_caught_mails;
279     ok @mails, "got some outgoing emails";
280
281     my $status = 1;
282     foreach my $mail ( @mails ) {
283         my $entity = parse_mail( $mail );
284         my $subject = Encode::decode_utf8( $entity->head->get('Subject') );
285         $subject =~ /$string{$set}{test}/
286             or do { $status = 0; diag "wrong subject: $subject" };
287     }
288     ok $status, "all mails have correct data";
289 }
290
291 foreach my $tag_set ( 'ru', 'latin1' ) {
292 diag "set non-ascii subject tag for the queue" if $ENV{'TEST_VERBOSE'};
293 {
294     my ($status, $msg) = $queue->SetSubjectTag( $string{$tag_set}{support} );
295     ok $status, "set subject tag for the queue" or diag "error: $msg";
296 }
297
298 diag "non-ascii Subject without changes in template and with non-ascii subject tag"
299     if $ENV{'TEST_VERBOSE'};
300 foreach my $set ( 'ru', 'latin1' ) {
301     my $ticket = RT::Ticket->new( $RT::SystemUser );
302     $ticket->Create(
303         Queue => $queue->id,
304         Subject => $string{$set}{test},
305         Requestor => 'root@localhost',
306     );
307     my @mails = RT::Test->fetch_caught_mails;
308     ok @mails, "got some outgoing emails";
309
310     my $status = 1;
311     foreach my $mail ( @mails ) {
312         my $entity = parse_mail( $mail );
313         my $subject = Encode::decode_utf8( $entity->head->get('Subject') );
314         $subject =~ /$string{$set}{test}/
315             or do { $status = 0; diag "wrong subject: $subject" };
316         $subject =~ /$string{$tag_set}{support}/
317             or do { $status = 0; diag "wrong subject: $subject" };
318     }
319     ok $status, "all mails have correct data";
320 }
321
322 } # subject tag set
323
324 sub parse_mail {
325     my $mail = shift;
326     require RT::EmailParser;
327     my $parser = new RT::EmailParser;
328     $parser->ParseMIMEEntityFromScalar( $mail );
329     return $parser->Entity;
330 }
331