use strict; use warnings; use RT::Test tests => 181; use Test::Warn; use RT::Dashboard::Mailer; my ($baseurl, $m) = RT::Test->started_ok; ok($m->login, 'logged in'); sub create_dashboard { my ($baseurl, $m) = @_; local $Test::Builder::Level = $Test::Builder::Level + 1; $m->get_ok($baseurl . '/Dashboards/Modify.html?Create=1'); $m->form_name('ModifyDashboard'); $m->field('Name' => 'Testing!'); $m->click_button(value => 'Create'); $m->title_is('Modify the dashboard Testing!'); $m->follow_link_ok({text => 'Content'}); $m->title_is('Modify the content of dashboard Testing!'); my $form = $m->form_name('Dashboard-Searches-body'); my @input = $form->find_input('Searches-body-Available'); my ($dashboards_component) = map { ( $_->possible_values )[1] } grep { ( $_->value_names )[1] =~ /Dashboards/ } @input; $form->value('Searches-body-Available' => $dashboards_component ); $m->click_button(name => 'add'); $m->content_contains('Dashboard updated'); $m->follow_link_ok({text => 'Show'}); $m->title_is('Testing! Dashboard'); $m->content_contains('My dashboards'); $m->content_like(qr{Testing!}); } sub create_subscription { my ($baseurl, $m, %fields) = @_; local $Test::Builder::Level = $Test::Builder::Level + 1; # create a subscription $m->follow_link_ok({text => 'Subscription'}); $m->title_is('Subscribe to dashboard Testing!'); $m->form_name('SubscribeDashboard'); $m->set_fields(%fields); $m->click_button(name => 'Save'); $m->content_contains("Subscribed to dashboard Testing!"); } sub get_dash_sub_ids { my $user = RT::User->new(RT->SystemUser); $user->Load('root'); ok($user->Id, 'loaded user'); my ($subscription) = $user->Attributes->Named('Subscription'); my $subscription_id = $subscription->Id; ok($subscription_id, 'loaded subscription'); my $dashboard_id = $subscription->SubValue('DashboardId'); ok($dashboard_id, 'got dashboard id'); return ($dashboard_id, $subscription_id); } # first, create and populate a dashboard create_dashboard($baseurl, $m); # now test the mailer # without a subscription.. RT::Dashboard::Mailer->MailDashboards(); my @mails = RT::Test->fetch_caught_mails; is @mails, 0, 'no mail yet'; RT::Dashboard::Mailer->MailDashboards( All => 1, ); @mails = RT::Test->fetch_caught_mails; is @mails, 0, "no mail yet since there's no subscription"; create_subscription($baseurl, $m, Frequency => 'daily', Hour => '06:00', ); my ($dashboard_id, $subscription_id) = get_dash_sub_ids(); sub produces_dashboard_mail_ok { # {{{ my %args = @_; my $subject = delete $args{Subject}; local $Test::Builder::Level = $Test::Builder::Level + 1; RT::Dashboard::Mailer->MailDashboards(%args); my @mails = RT::Test->fetch_caught_mails; is @mails, 1, "got a dashboard mail"; my $mail = parse_mail( $mails[0] ); is($mail->head->get('Subject'), $subject); is($mail->head->get('From'), "root\n"); is($mail->head->get('X-RT-Dashboard-Id'), "$dashboard_id\n"); is($mail->head->get('X-RT-Dashboard-Subscription-Id'), "$subscription_id\n"); SKIP: { skip 'Weird MIME failure', 2; my $body = $mail->stringify_body; like($body, qr{My dashboards}); like($body, qr{Testing!}); }; } # }}} sub produces_no_dashboard_mail_ok { # {{{ my %args = @_; my $name = delete $args{Name}; local $Test::Builder::Level = $Test::Builder::Level + 1; RT::Dashboard::Mailer->MailDashboards(%args); @mails = RT::Test->fetch_caught_mails; is @mails, 0, $name; } # }}} sub delete_dashboard { # {{{ my $dashboard_id = shift; # delete the dashboard and make sure we get exactly one subscription failure # notice my $dashboard = RT::Dashboard->new(RT::CurrentUser->new('root')); my ($ok, $msg) = $dashboard->LoadById($dashboard_id); ok($ok, $msg); ($ok, $msg) = $dashboard->Delete; ok($ok, $msg); } # }}} my $good_time = 1290423660; # 6:01 EST on a monday my $bad_time = 1290427260; # 7:01 EST on a monday my $expected_subject = "[example.com] Daily Dashboard: Testing!\n"; produces_dashboard_mail_ok( Time => $good_time, Subject => $expected_subject, ); produces_dashboard_mail_ok( All => 1, Subject => $expected_subject, ); produces_dashboard_mail_ok( All => 1, Time => $good_time, Subject => $expected_subject, ); produces_dashboard_mail_ok( All => 1, Time => $bad_time, Subject => $expected_subject, ); produces_no_dashboard_mail_ok( Name => "no dashboard mail it's a dry run", All => 1, DryRun => 1, ); produces_no_dashboard_mail_ok( Name => "no dashboard mail it's a dry run", Time => $good_time, DryRun => 1, ); produces_no_dashboard_mail_ok( Name => "no mail because it's the wrong time", Time => $bad_time, ); @mails = RT::Test->fetch_caught_mails; is(@mails, 0, "no mail leftover"); $m->no_warnings_ok; RT::Test->stop_server; RT->Config->Set('DashboardSubject' => 'a %s b %s c'); RT->Config->Set('DashboardAddress' => 'dashboard@example.com'); RT->Config->Set('EmailDashboardRemove' => (qr/My dashboards/, "Testing!")); ($baseurl, $m) = RT::Test->started_ok; RT::Dashboard::Mailer->MailDashboards(All => 1); @mails = RT::Test->fetch_caught_mails; is(@mails, 1, "one mail"); my $mail = parse_mail($mails[0]); is($mail->head->get('Subject'), "[example.com] a Daily b Testing! c\n"); is($mail->head->get('From'), "dashboard\@example.com\n"); is($mail->head->get('X-RT-Dashboard-Id'), "$dashboard_id\n"); is($mail->head->get('X-RT-Dashboard-Subscription-Id'), "$subscription_id\n"); SKIP: { skip 'Weird MIME failure', 2; my $body = $mail->stringify_body; unlike($body, qr{My dashboards}); unlike($body, qr{Testing!}); }; delete_dashboard($dashboard_id); RT::Dashboard::Mailer->MailDashboards(All => 1); @mails = RT::Test->fetch_caught_mails; is(@mails, 0, "no mail because the subscription is deleted"); RT::Test->stop_server; RT::Test->clean_caught_mails; RT->Config->Set('EmailDashboardRemove' => ()); RT->Config->Set('DashboardAddress' => 'root'); ($baseurl, $m) = RT::Test->started_ok; $m->login; create_dashboard($baseurl, $m); create_subscription($baseurl, $m, Frequency => 'weekly', Hour => '06:00', ); ($dashboard_id, $subscription_id) = get_dash_sub_ids(); # bump $bad_time to Tuesday $bad_time = $good_time + 86400; produces_dashboard_mail_ok( Time => $good_time, Subject => "[example.com] a Weekly b Testing! c\n", ); produces_no_dashboard_mail_ok( Name => "no mail because it's the wrong time", Time => $bad_time, ); @mails = RT::Test->fetch_caught_mails; is(@mails, 0, "no mail leftover"); $m->no_warnings_ok; RT::Test->stop_server; RT->Config->Set('DashboardSubject' => 'a %s b %s c'); RT->Config->Set('DashboardAddress' => 'dashboard@example.com'); RT->Config->Set('EmailDashboardRemove' => (qr/My dashboards/, "Testing!")); ($baseurl, $m) = RT::Test->started_ok; delete_dashboard($dashboard_id); RT::Test->clean_caught_mails; RT::Test->stop_server; RT->Config->Set('EmailDashboardRemove' => ()); RT->Config->Set('DashboardAddress' => 'root'); ($baseurl, $m) = RT::Test->started_ok; $m->login; create_dashboard($baseurl, $m); create_subscription($baseurl, $m, Frequency => 'm-f', Hour => '06:00', ); ($dashboard_id, $subscription_id) = get_dash_sub_ids(); # bump $bad_time back to Sunday $bad_time = $good_time - 86400; produces_dashboard_mail_ok( Time => $good_time, Subject => "[example.com] a Weekday b Testing! c\n", ); produces_no_dashboard_mail_ok( Name => "no mail because it's the wrong time", Time => $bad_time, ); produces_no_dashboard_mail_ok( Name => "no mail because it's the wrong time", Time => $bad_time - 86400, # saturday ); produces_dashboard_mail_ok( Time => $bad_time - 86400 * 2, # friday Subject => "[example.com] a Weekday b Testing! c\n", ); @mails = RT::Test->fetch_caught_mails; is(@mails, 0, "no mail leftover"); $m->no_warnings_ok; RT::Test->stop_server; RT->Config->Set('DashboardSubject' => 'a %s b %s c'); RT->Config->Set('DashboardAddress' => 'dashboard@example.com'); RT->Config->Set('EmailDashboardRemove' => (qr/My dashboards/, "Testing!")); ($baseurl, $m) = RT::Test->started_ok; delete_dashboard($dashboard_id); RT::Test->clean_caught_mails; RT::Test->stop_server; RT->Config->Set('EmailDashboardRemove' => ()); RT->Config->Set('DashboardAddress' => 'root'); ($baseurl, $m) = RT::Test->started_ok; $m->login; create_dashboard($baseurl, $m); create_subscription($baseurl, $m, Frequency => 'monthly', Hour => '06:00', ); ($dashboard_id, $subscription_id) = get_dash_sub_ids(); $good_time = 1291201200; # dec 1 $bad_time = $good_time - 86400; # day before (i.e. different month) produces_dashboard_mail_ok( Time => $good_time, Subject => "[example.com] a Monthly b Testing! c\n", ); produces_no_dashboard_mail_ok( Name => "no mail because it's the wrong time", Time => $bad_time, ); @mails = RT::Test->fetch_caught_mails; is(@mails, 0, "no mail leftover"); $m->no_warnings_ok; RT::Test->stop_server; RT->Config->Set('DashboardSubject' => 'a %s b %s c'); RT->Config->Set('DashboardAddress' => 'dashboard@example.com'); RT->Config->Set('EmailDashboardRemove' => (qr/My dashboards/, "Testing!")); ($baseurl, $m) = RT::Test->started_ok; delete_dashboard($dashboard_id); RT::Test->clean_caught_mails; RT::Test->stop_server; RT->Config->Set('EmailDashboardRemove' => ()); RT->Config->Set('DashboardAddress' => 'root'); ($baseurl, $m) = RT::Test->started_ok; $m->login; create_dashboard($baseurl, $m); create_subscription($baseurl, $m, Frequency => 'never', ); ($dashboard_id, $subscription_id) = get_dash_sub_ids(); produces_no_dashboard_mail_ok( Name => "mail should never get sent", Time => $bad_time, );