import rt 3.8.7
[freeside.git] / rt / t / mail / extractsubjecttag.t
1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 use utf8;
5
6 use RT::Test tests => 14;
7
8
9 my ($baseurl, $m) = RT::Test->started_ok;
10 RT::Test->set_mail_catcher;
11
12 my $queue = RT::Test->load_or_create_queue(
13     Name              => 'Regression',
14     CorrespondAddress => 'rt-recipient@example.com',
15     CommentAddress    => 'rt-recipient@example.com',
16 );
17 my $subject_tag = 'Windows/Servers-Desktops';
18 ok $queue && $queue->id, 'loaded or created queue';
19
20 diag "Set Subject Tag" if $ENV{'TEST_VERBOSE'};
21 {
22     is(RT->System->SubjectTag($queue), undef, 'No Subject Tag yet');
23     my ($status, $msg) = $queue->SetSubjectTag( $subject_tag );
24     ok $status, "set subject tag for the queue" or diag "error: $msg";
25     is(RT->System->SubjectTag($queue), $subject_tag, "Set Subject Tag to $subject_tag");
26 }
27
28 my $original_ticket = RT::Ticket->new( $RT::SystemUser );
29 diag "Create a ticket and make sure it has the subject tag" if $ENV{'TEST_VERBOSE'};
30 {
31     $original_ticket->Create(
32         Queue => $queue->id,
33         Subject => 'test',
34         Requestor => 'root@localhost'
35     );
36     my @mails = RT::Test->fetch_caught_mails;
37     ok @mails, "got some outgoing emails";
38
39     my $status = 1;
40     foreach my $mail ( @mails ) {
41         my $entity = parse_mail( $mail );
42         my $subject = $entity->head->get('Subject');
43         $subject =~ /\[\Q$subject_tag\E #\d+\]/
44             or do { $status = 0; diag "wrong subject: $subject" };
45     }
46     ok $status, "Correctly added subject tag to ticket";
47 }
48
49
50 diag "Test that a reply with a Subject Tag doesn't change the subject" if $ENV{'TEST_VERBOSE'};
51 {
52     my $ticketid = $original_ticket->Id;
53     my $text = <<EOF;
54 From: root\@localhost
55 To: general\@$RT::rtname
56 Subject: [$subject_tag #$ticketid] test
57
58 reply with subject tag
59 EOF
60     my ($status, $id) = RT::Test->send_via_mailgate($text, queue => $queue->Name);
61     is ($status >> 8, 0, "The mail gateway exited normally");
62     is ($id, $ticketid, "Replied to ticket $id correctly");
63
64     my $freshticket = RT::Ticket->new( $RT::SystemUser );
65     $freshticket->LoadById($id);
66     is($original_ticket->Subject,$freshticket->Subject,'Stripped Queue Subject Tag correctly');
67
68 }
69
70 diag "Test that a reply with another RT's subject tag changes the subject" if $ENV{'TEST_VERBOSE'};
71 {
72     my $ticketid = $original_ticket->Id;
73     my $text = <<EOF;
74 From: root\@localhost
75 To: general\@$RT::rtname
76 Subject: [$subject_tag #$ticketid] [remote-rt-system #79] test
77
78 reply with subject tag and remote rt subject tag
79 EOF
80     diag($text);
81     my ($status, $id) = RT::Test->send_via_mailgate($text, queue => $queue->Name);
82     is ($status >> 8, 0, "The mail gateway exited normally");
83     is ($id, $ticketid, "Replied to ticket $id correctly");
84
85     my $freshticket = RT::Ticket->new( $RT::SystemUser );
86     $freshticket->LoadById($id);
87     like($freshticket->Subject,qr/\[remote-rt-system #79\]/,"Kept remote rt's subject tag");
88     unlike($freshticket->Subject,qr/\[\Q$subject_tag\E #$ticketid\]/,'Stripped Queue Subject Tag correctly');
89
90 }
91
92 sub parse_mail {
93     my $mail = shift;
94     require RT::EmailParser;
95     my $parser = new RT::EmailParser;
96     $parser->ParseMIMEEntityFromScalar( $mail );
97     return $parser->Entity;
98 }