From: Tomas Doran Date: Mon, 7 Sep 2009 20:19:40 +0000 (+0000) Subject: Test for r11331 + fix to only report each action name once from get_action_methods X-Git-Tag: 5.80012~5 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=0da2dc3044ed62182fd3cf515b26c852edaa11b4;hp=c77865585f68f34422f7a6eacf2fa901531f05d9;p=catagits%2FCatalyst-Runtime.git Test for r11331 + fix to only report each action name once from get_action_methods --- diff --git a/lib/Catalyst/Controller.pm b/lib/Catalyst/Controller.pm index cb01c11..d52ae3f 100644 --- a/lib/Catalyst/Controller.pm +++ b/lib/Catalyst/Controller.pm @@ -187,20 +187,23 @@ sub get_action_methods { . $meta->name . " cannot support register_actions." ) unless $meta->can('get_nearest_methods_with_attributes'); - my @methods = $meta->get_nearest_methods_with_attributes; - # actions specified via config are also action_methods - push( - @methods, - map { + # Find (and de-dup) action methods from attributes and those from config. + my %methods = ( + map({ $_->name => 1 } $meta->get_nearest_methods_with_attributes), + %{ $self->_controller_actions } + ); + + if (ref $self) { + foreach (keys %methods) { $meta->find_method_by_name($_) || confess( 'Action "' . $_ . '" is not available from controller ' - . ( ref $self ) ) - } keys %{ $self->_controller_actions } - ) if ( ref $self ); - return @methods; + . ( ref $self ) ); + } + } + return keys %methods; } diff --git a/t/unit_controller_actions.t b/t/unit_controller_actions.t new file mode 100644 index 0000000..3ca705f --- /dev/null +++ b/t/unit_controller_actions.t @@ -0,0 +1,26 @@ +use strict; +use warnings; +use Test::More tests => 4; + +use Catalyst (); +{ + package TestController; + use Moose; + BEGIN { extends 'Catalyst::Controller' } + + sub action : Local {} + + sub foo : Path {} + + no Moose; +} + +my $mock_app = Class::MOP::Class->create_anon_class( superclasses => ['Catalyst'] ); +my $app = $mock_app->name->new; +my $controller = TestController->new($app, {actions => { foo => { Path => '/some/path' }}}); + +ok $controller->can('_controller_actions'); +is_deeply $controller->_controller_actions => { foo => { Path => '/some/path' }}; +is_deeply $controller->{actions} => { foo => { Path => '/some/path' }}; # Back compat. +is_deeply [ sort grep { ! /^_/ } $controller->get_action_methods ], [sort qw/action foo/]; +