--- /dev/null
+#!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;
+ }
+ }
+}
+