Changes:
[catagits/Catalyst-Plugin-Scheduler.git] / t / 10events.t
diff --git a/t/10events.t b/t/10events.t
new file mode 100755 (executable)
index 0000000..a8fa549
--- /dev/null
@@ -0,0 +1,113 @@
+#!perl
+use strict;
+use warnings;
+
+use FindBin;
+use lib             "$FindBin::Bin/lib";
+use Test::More      'no_plan';
+use Storable        qw/lock_store lock_retrieve/;
+use Catalyst::Test 'TestApp';
+
+our $HOME   = "$FindBin::Bin/lib/TestApp";
+our $STATE  = "$HOME/scheduler.state";
+our $URL    = 'http://localhost/';
+our $BASE   = 'Catalyst::Plugin::Scheduler::Base';
+our $Error  = 'oops';
+our @Map    = (
+    # event                                             # prio  # label
+    [ '/cron/every_minute',                             -10,            ],
+    [ TestApp::Controller::Cron->can('every_minute'),   10,     "EM"    ],
+);
+
+### clean up
+END { 1 while unlink $STATE }
+
+### set up some schedules
+{   for my $aref ( @Map ) {
+        
+        my %args;
+        my $i = 0;
+        for my $key ( qw[event priority label] ) {
+            my $val = $aref->[ $i++ ] or next;
+            $args{ $key } = $val;
+        };                            
+           
+        TestApp->schedule( at => '@always', %args );
+    }
+}    
+
+### get events, inspect them
+{   my @events = TestApp->scheduler->list_events;
+    ok( scalar(@events),        "Found events" );
+    is( scalar(@events), scalar(@Map),
+                                "   All events retrieved" );
+    isa_ok( $_, "Catalyst::Plugin::Scheduler::Event" ) for @events;
+
+    {   # hack the last event check to make all events execute immediately
+        $BASE->_last_check_time( 0 );
+
+        my @pending_events = TestApp->scheduler->list_pending_events;
+        is( scalar( @pending_events ), scalar( @events ),
+                                "   All pending events retrieved" );
+    
+        ### key our template on event name.
+        my %map = map { $_->[0] => $_ } @Map;
+    
+        my $prio;
+        for my $event ( @pending_events ) {
+            
+            ### check our accessors 
+            {   my $meth    = 'ls_accessors';
+                can_ok( $event,     $meth );
+                can_ok( $event,     $event->$meth );
+            }        
+        
+            ### check caller
+            {   my $re = __PACKAGE__        # package that sheduled
+                        . '.+?'
+                        . quotemeta($0)     # this file
+                        . ':\d+';           # the line number
+                my $by = $event->scheduled_by;                        
+                like( $by, qr/$re/,
+                                "       Caller registered: '$by'" );
+            }
+        
+            ### check activity
+            ok( $event->active, "       Event is active" );
+        
+            ### check prio
+            cmp_ok( $prio, '>=', $event->priority,
+                                "       Sorted in right order" 
+            ) unless defined $prio; # first in the chain.
+            $prio = $event->priority;
+
+            ### check some properties
+            my $aref = $map{ $event->event };
+            ok( $aref,          "   Event retrieved from template" );
+            is( $event->event, $aref->[0],
+                                "       Right event: ".$event->event );
+            is( $event->priority, $aref->[1],
+                                "       Right priority: ".$event->priority );
+            is( $event->label, ($aref->[2] || $aref->[0]),
+                                "       Right label: ".$event->label );
+        
+        
+            ### this should fail, our $c is not an object
+            eval { $event->run };
+            ok( $@,             "       Can not run event" );
+            like( $@, qr/not an object/,
+                                '           $c is not an object' );       
+        
+            
+        }
+        
+        # hack the last event check to make all events execute immediately
+        $BASE->_last_check_time( 0 );
+        {   $_->active(0) for @events;
+            ok( !scalar(TestApp->scheduler->list_pending_events), 
+                                "   All events disabled" );
+            $_->active(1) for @events;        
+        }
+    }    
+}
+