import rt 3.8.7
[freeside.git] / rt / t / maildigest / attributes.t
1 #!/usr/bin/perl -w
2
3 use warnings;
4 use strict;
5 use RT;
6 use RT::Test tests => 31;
7 my @users = qw/ emailnormal@example.com emaildaily@example.com emailweekly@example.com emailsusp@example.com /;
8
9 my( $ret, $msg );
10 my $user_n = RT::User->new( $RT::SystemUser );
11 ( $ret, $msg ) = $user_n->LoadOrCreateByEmail( $users[0] );
12 ok( $ret, "user with default email prefs created: $msg" );
13 $user_n->SetPrivileged( 1 );
14
15 my $user_d = RT::User->new( $RT::SystemUser );
16 ( $ret, $msg ) = $user_d->LoadOrCreateByEmail( $users[1] );
17 ok( $ret, "user with daily digest email prefs created: $msg" );
18 # Set a username & password for testing the interface.
19 $user_d->SetPrivileged( 1 );
20 $user_d->SetPreferences($RT::System => { %{ $user_d->Preferences( $RT::System ) || {}}, EmailFrequency => 'Daily digest'});
21
22
23
24 my $user_w = RT::User->new( $RT::SystemUser );
25 ( $ret, $msg ) = $user_w->LoadOrCreateByEmail( $users[2] );
26 ok( $ret, "user with weekly digest email prefs created: $msg" );
27 $user_w->SetPrivileged( 1 );
28 $user_w->SetPreferences($RT::System => { %{ $user_w->Preferences( $RT::System ) || {}}, EmailFrequency => 'Weekly digest'});
29
30 my $user_s = RT::User->new( $RT::SystemUser );
31 ( $ret, $msg ) = $user_s->LoadOrCreateByEmail( $users[3] );
32 ok( $ret, "user with suspended email prefs created: $msg" );
33 $user_s->SetPreferences($RT::System => { %{ $user_s->Preferences( $RT::System ) || {}}, EmailFrequency => 'Suspended'});
34 $user_s->SetPrivileged( 1 );
35
36
37 is(RT::Config->Get('EmailFrequency' => $user_s), 'Suspended');
38
39 # Make a testing queue for ourselves.
40 my $testq = RT::Queue->new( $RT::SystemUser );
41 if( $testq->ValidateName( 'EmailDigest-testqueue' ) ) {
42     ( $ret, $msg ) = $testq->Create( Name => 'EmailDigest-testqueue' );
43     ok( $ret, "Our test queue is created: $msg" );
44 } else {
45     $testq->Load( 'EmailDigest-testqueue' );
46     ok( $testq->id, "Our test queue is loaded" );
47 }
48
49 # Allow anyone to open a ticket on the test queue.
50 my $everyone = RT::Group->new( $RT::SystemUser );
51 ( $ret, $msg ) = $everyone->LoadSystemInternalGroup( 'Everyone' );
52 ok( $ret, "Loaded 'everyone' group: $msg" );
53
54 ( $ret, $msg ) = $everyone->PrincipalObj->GrantRight( Right => 'CreateTicket',
55                                                       Object => $testq );
56 ok( $ret || $msg =~ /already has/, "Granted everyone CreateTicket on testq: $msg" );
57
58 # Make user_d an admincc for the queue.
59 ( $ret, $msg ) = $user_d->PrincipalObj->GrantRight( Right => 'AdminQueue',
60                                                     Object => $testq );
61 ok( $ret || $msg =~ /already has/, "Granted dduser AdminQueue on testq: $msg" );
62 ( $ret, $msg ) = $testq->AddWatcher( Type => 'AdminCc',
63                              PrincipalId => $user_d->PrincipalObj->id );
64 ok( $ret || $msg =~ /already/, "dduser added as a queue watcher: $msg" );
65
66 # Give the others queue rights.
67 ( $ret, $msg ) = $user_n->PrincipalObj->GrantRight( Right => 'AdminQueue',
68                                                     Object => $testq );
69 ok( $ret || $msg =~ /already has/, "Granted emailnormal right on testq: $msg" );
70 ( $ret, $msg ) = $user_w->PrincipalObj->GrantRight( Right => 'AdminQueue',
71                                                     Object => $testq );
72 ok( $ret || $msg =~ /already has/, "Granted emailweekly right on testq: $msg" );
73 ( $ret, $msg ) = $user_s->PrincipalObj->GrantRight( Right => 'AdminQueue',
74                                                     Object => $testq );
75 ok( $ret || $msg =~ /already has/, "Granted emailsusp right on testq: $msg" );
76
77 # Create a ticket with To: Cc: Bcc: fields using our four users.
78 my $id;
79 my $ticket = RT::Ticket->new( $RT::SystemUser );
80 ( $id, $ret, $msg ) = $ticket->Create( Queue => $testq->Name,
81                                        Requestor => [ $user_w->Name ],
82                                        Subject => 'Test ticket for RT::Extension::EmailDigest',
83                                        );
84 ok( $ret, "Ticket $id created: $msg" );
85
86 # Make the other users ticket watchers.
87 ( $ret, $msg ) = $ticket->AddWatcher( Type => 'Cc',
88                       PrincipalId => $user_n->PrincipalObj->id );
89 ok( $ret, "Added user_n as a ticket watcher: $msg" );
90 ( $ret, $msg ) = $ticket->AddWatcher( Type => 'Cc',
91                       PrincipalId => $user_s->PrincipalObj->id );
92 ok( $ret, "Added user_s as a ticket watcher: $msg" );
93
94 my $obj;
95 ($id, $msg, $obj ) = $ticket->Correspond(
96         Content => "This is a ticket response for CC action" );
97 ok( $ret, "Transaction created: $msg" );
98
99 # Get the deferred notifications that should result.  Should be two for
100 # email daily, and one apiece for emailweekly and emailsusp.
101 my @notifications;
102
103 my $txns = RT::Transactions->new( $RT::SystemUser );
104 $txns->LimitToTicket( $ticket->id );
105 my( $c_daily, $c_weekly, $c_susp ) = ( 0, 0, 0 );
106 while( my $txn = $txns->Next ) {
107     my @daily_rcpt = $txn->DeferredRecipients( 'daily' );
108     my @weekly_rcpt = $txn->DeferredRecipients('weekly' );
109     my @susp_rcpt = $txn->DeferredRecipients(  'susp' );
110
111     $c_daily++ if @daily_rcpt;
112     $c_weekly++ if @weekly_rcpt;
113     $c_susp++ if @susp_rcpt;
114
115     # If the transaction has content...
116     if( $txn->ContentObj ) {
117         # ...none of the deferred folk should be in the header.
118         my $headerstr = $txn->ContentObj->Headers;
119         foreach my $rcpt( @daily_rcpt, @weekly_rcpt, @susp_rcpt ) {
120             ok( $headerstr !~ /$rcpt/, "Deferred recipient $rcpt not found in header" );
121         }
122     }
123 }
124
125 # Finally, check to see that we got the correct number of each sort of
126 # deferred recipient.
127 is( $c_daily, 2, "correct number of daily-sent messages" );
128 is( $c_weekly, 2, "correct number of weekly-sent messages" );
129 is( $c_susp, 1, "correct number of suspended messages" );
130
131
132
133
134
135 # Now let's actually run the daily and weekly digest tool to make sure we generate those
136
137 # the first time get the content
138 email_digest_like( '--mode daily --print', qr/in the last day/ );
139 # The second time run it for real so we make sure that we get RT to mark the txn as sent
140 email_digest_like( '--mode daily', qr/maildaily\@/ );
141 # now we should have nothing to do, so no content.
142 email_digest_like( '--mode daily --print', '' );
143
144 # the first time get the content
145 email_digest_like( '--mode weekly --print', qr/in the last seven days/ );
146 # The second time run it for real so we make sure that we get RT to mark the txn as sent
147 email_digest_like( '--mode weekly', qr/mailweekly\@/ );
148 # now we should have nothing to do, so no content.
149 email_digest_like( '--mode weekly --print', '' );
150
151 sub email_digest_like {
152     my $arg = shift;
153     my $pattern = shift;
154
155     local $Test::Builder::Level = $Test::Builder::Level + 1;
156
157     my $perl = $^X . ' ' . join ' ', map { "-I$_" } @INC;
158     open my $digester, "-|", "$perl $RT::SbinPath/rt-email-digest $arg";
159     my @results = <$digester>;
160     my $content = join '', @results;
161     if ( ref $pattern && ref $pattern eq 'Regexp' ) {
162         like($content, $pattern);
163     }
164     else {
165         is( $content, $pattern );
166     }
167     close $digester;
168 }