6 use lib "$FindBin::Bin/lib";
7 use Test::More 'no_plan';
8 use Catalyst::Test 'TestApp';
10 our $HOME = "$FindBin::Bin/lib/TestApp";
11 our $STATE = "$HOME/scheduler.state";
12 our $URL = 'http://localhost/';
13 our $BASE = 'Catalyst::Plugin::Scheduler::Base';
18 [ '* * * * *' , '/cron/every_minute' , qr/every_minute/ ],
19 [ '@hourly' , \&every_hour , qr/every_hour/ ],
20 [ '*/2 * * * *' , '/cron/test_errors' , qr/$Error/ ],
21 [ '0 * * * *' , \&broken_event , qr/$Error/ ],
25 END { 1 while unlink $STATE }
27 ### filter expected error messages, when needed...
28 { my $org = Catalyst::Log->can('_send_to_log');
30 no warnings 'redefine';
31 *Catalyst::Log::_send_to_log = sub {
32 return if $Filter and "@_" =~ /Scheduler: Error executing/;
37 ### set up some schedules
38 { for my $aref ( @Map ) {
39 my($at,$event) = @$aref;
50 # write out a file so the test knows we did something
51 my $fh = IO::File->new( $c->path_to( 'every_hour.log' ), 'w' )
52 or die "Unable to write log file: $!";
57 sub broken_event { die $Error; }
61 # hack the last event check to make all events execute immediately
62 $BASE->_last_check_time( 0 );
64 ### test that all events execute, and that the error test doesn't break the app
65 { ### there's an event that dies on purpose. dont have the error message
66 ### appear on the terminal
68 ok( my $res = request($URL), 'request ok' );
69 is( $res->content, 'default',' response ok' );
72 ok( -e "$HOME/every_minute.log", ' every_minute executed ok' );
73 1 while unlink "$HOME/every_minute.log";
75 ok( -e "$HOME/every_hour.log", ' every_hour executed ok' );
76 1 while unlink "$HOME/every_hour.log";
81 ### run again, the events should not execute
82 { ok( request($URL), 'request ok' );
84 ok( !-e "$HOME/every_minute.log", ' every_minute did not execute, ok' );
85 1 while unlink "$HOME/every_minute.log";
87 ok( !-e "$HOME/every_hour.log", ' every_hour did not execute, ok' );
88 1 while unlink "$HOME/every_hour.log";
91 ### jump back in time by 2 hours, make sure both events run
92 { $BASE->_last_check_time( time - 60 * 120 );
94 ### there's an event that dies on purpose. dont have the error message
95 ### appear on the terminal
97 ok( request($URL), 'request ok' );
100 ok( -e "$HOME/every_minute.log", ' every_minute executed ok' );
101 1 while unlink "$HOME/every_minute.log";
103 ok( -e "$HOME/every_hour.log", ' every_hour executed ok' );
104 1 while unlink "$HOME/every_hour.log";
107 ### check the scheduler state
108 { my $ss = TestApp->scheduler_state;
110 ok( $ss, 'Scheduler state retrieved' );
111 isa_ok( $ss, 'ARRAY' );
112 is( scalar(@$ss), scalar(@Map), " All events found" );
114 ### key entries on 'event';
115 my %map = map { $_->{event} => $_ } @$ss;
117 for my $aref ( @Map ) {
118 my($at,$event,$expect) = @$aref;
120 my $entry = $map{$event};
121 ok( $entry, " Event found for $event" );
122 ok( $entry->{'last_run'}, " Event was run" );
123 like( $entry->{'last_output'}, $expect,
124 " Output as expected" );
128 ### extended API tests
129 ### test event listing
130 { my @events = TestApp->scheduler->list_events;
131 is( scalar(@events), scalar(@Map), "list_events() returns all events" );
132 isa_ok( $_, "Catalyst::Plugin::Scheduler::Event" )
136 ### test pending events
137 { ### all events should have run now
139 { my @pending = TestApp->scheduler->list_pending_events;
140 is( scalar(@pending), 0, "No more pending events" );
143 # hack the last event check to make all events execute immediately
144 { $BASE->_last_check_time( 0 );
146 my @pending = TestApp->scheduler->list_pending_events;
147 is( scalar(@pending), scalar(@Map),
148 " Events found after state reset" );
153 { ok( -e $STATE, "State file exists" );
154 1 while unlink $STATE;
155 ok(!-e $STATE, " State file removed" );