X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=trunk%2Ft%2Faggregate%2Flive_component_controller_action_chained.t;fp=trunk%2Ft%2Faggregate%2Flive_component_controller_action_chained.t;h=0000000000000000000000000000000000000000;hb=f436bc1bece2bcc2a04138068e5c22e70d9d6d35;hp=53dca926fcca82efbf0a3f56f4549bd788f15c3b;hpb=e28a6876ad3e11890226e5bab6df4b0725e0981e;p=catagits%2FCatalyst-Runtime.git diff --git a/trunk/t/aggregate/live_component_controller_action_chained.t b/trunk/t/aggregate/live_component_controller_action_chained.t deleted file mode 100644 index 53dca92..0000000 --- a/trunk/t/aggregate/live_component_controller_action_chained.t +++ /dev/null @@ -1,1048 +0,0 @@ -#!perl - -use strict; -use warnings; - -use FindBin; -use lib "$FindBin::Bin/../lib"; - -our $iters; - -BEGIN { $iters = $ENV{CAT_BENCH_ITERS} || 1; } - -use Test::More; -use Catalyst::Test 'TestApp'; - -if ( $ENV{CAT_BENCHMARK} ) { - require Benchmark; - Benchmark::timethis( $iters, \&run_tests ); -} -else { - for ( 1 .. $iters ) { - run_tests($_); - } -} - -sub run_tests { - my ($run_number) = @_; - - # - # This is a simple test where the parent and child actions are - # within the same controller. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->foo - TestApp::Controller::Action::Chained->endpoint - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/foo/1/end/2'), 'chained + local endpoint' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # This makes sure the above isn't found if the argument for the - # end action isn't supplied. - # - { - my $expected = undef; - - ok( my $response = request('http://localhost/chained/foo/1/end'), - 'chained + local endpoint; missing last argument' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->code, 500, 'Status OK' ); - } - - # - # Tests the case when the child action is placed in a subcontroller. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->foo - TestApp::Controller::Action::Chained::Foo->spoon - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/foo/1/spoon'), 'chained + subcontroller endpoint' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; ', 'Content OK' ); - } - - # - # Tests if the relative specification (e.g.: Chained('bar') ) works - # as expected. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->bar - TestApp::Controller::Action::Chained->finale - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/bar/1/spoon'), 'chained + relative endpoint' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '; 1, spoon', 'Content OK' ); - } - - # - # Just a test for multiple arguments. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->foo2 - TestApp::Controller::Action::Chained->endpoint2 - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/foo2/10/20/end2/15/25'), - 'chained + local (2 args each)' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '10, 20; 15, 25', 'Content OK' ); - } - - # - # The first three-chain test tries to call the action with :Args(1) - # specification. There's also a one action with a :CaptureArgs(1) - # attribute, that should not be dispatched to. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->one_end - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/one/23'), - 'three-chain (only first)' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '; 23', 'Content OK' ); - } - - # - # This is the second three-chain test, it goes for the action that - # handles "/one/$cap/two/$arg1/$arg2" paths. Should be the two action - # having :Args(2), not the one having :CaptureArgs(2). - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->one - TestApp::Controller::Action::Chained->two_end - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/one/23/two/23/46'), - 'three-chain (up to second)' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '23; 23, 46', 'Content OK' ); - } - - # - # Last of the three-chain tests. Has no concurrent action with :CaptureArgs - # and is more thought to simply test the chain as a whole and the 'two' - # action specifying :CaptureArgs. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->one - TestApp::Controller::Action::Chained->two - TestApp::Controller::Action::Chained->three_end - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/one/23/two/23/46/three/1/2/3'), - 'three-chain (all three)' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '23, 23, 46; 1, 2, 3', 'Content OK' ); - } - - # - # Tests dispatching on number of arguments for :Args. This should be - # dispatched to the action expecting one argument. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->multi1 - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/multi/23'), - 'multi-action (one arg)' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '; 23', 'Content OK' ); - } - - # - # Belongs to the former test and goes for the action expecting two arguments. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->multi2 - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/multi/23/46'), - 'multi-action (two args)' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '; 23, 46', 'Content OK' ); - } - - # - # Dispatching on argument count again, this time we provide too many - # arguments, so dispatching should fail. - # - { - my $expected = undef; - - ok( my $response = request('http://localhost/chained/multi/23/46/67'), - 'multi-action (three args, should lead to error)' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->code, 500, 'Status OK' ); - } - - # - # This tests the case when an action says it's the child of an action in - # a subcontroller. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained::Foo->higher_root - TestApp::Controller::Action::Chained->higher_root - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/higher_root/23/bar/11'), - 'root higher than child' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '23; 11', 'Content OK' ); - } - - # - # Just a more complex version of the former test. It tests if a controller -> - # subcontroller -> controller dispatch works. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->pcp1 - TestApp::Controller::Action::Chained::Foo->pcp2 - TestApp::Controller::Action::Chained->pcp3 - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/pcp1/1/pcp2/2/pcp3/3'), - 'parent -> child -> parent' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1, 2; 3', 'Content OK' ); - } - - # - # Tests dispatch on capture number. This test is for a one capture action. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->multi_cap1 - TestApp::Controller::Action::Chained->multi_cap_end1 - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/multi_cap/1/baz'), - 'dispatch on capture num 1' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; ', 'Content OK' ); - } - - # - # Belongs to the former test. This one goes for the action expecting two - # captures. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->multi_cap2 - TestApp::Controller::Action::Chained->multi_cap_end2 - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/multi_cap/1/2/baz'), - 'dispatch on capture num 2' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1, 2; ', 'Content OK' ); - } - - # - # Tests the priority of a slurpy arguments action (with :Args) against - # two actions chained together. The two actions should win. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->priority_a2 - TestApp::Controller::Action::Chained->priority_a2_end - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/priority_a/1/end/2'), - 'priority - slurpy args vs. parent/child' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # This belongs to the former test but tests if two chained actions have - # priority over an action with the exact arguments. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->priority_b2 - TestApp::Controller::Action::Chained->priority_b2_end - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/priority_b/1/end/2'), - 'priority - fixed args vs. parent/child' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # This belongs to the former test but tests if two chained actions have - # priority over an action with one child action not having the Args() attr set. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->priority_c1 - TestApp::Controller::Action::Chained->priority_c2_xyz - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/priority_c/1/xyz/'), - 'priority - no Args() order mismatch' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; ', 'Content OK' ); - } - - # - # Test dispatching between two controllers that are on the same level and - # therefor have no parent/child relationship. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained::Bar->cross1 - TestApp::Controller::Action::Chained::Foo->cross2 - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/cross/1/end/2'), - 'cross controller w/o par/child relation' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # This is for testing if the arguments got passed to the actions - # correctly. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained::PassedArgs->first - TestApp::Controller::Action::Chained::PassedArgs->second - TestApp::Controller::Action::Chained::PassedArgs->third - TestApp::Controller::Action::Chained::PassedArgs->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/passedargs/a/1/b/2/c/3'), - 'Correct arguments passed to actions' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2; 3', 'Content OK' ); - } - - # - # The :Args attribute is optional, we check the action not specifying - # it with these tests. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->opt_args - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/opt_args/1/2/3'), - 'Optional :Args attribute working' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '; 1, 2, 3', 'Content OK' ); - } - - # - # Tests for optional PathPart attribute. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->opt_pp_start - TestApp::Controller::Action::Chained->opt_pathpart - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/optpp/1/opt_pathpart/2'), - 'Optional :PathName attribute working' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # Tests for optional PathPart *and* Args attributes. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->opt_all_start - TestApp::Controller::Action::Chained->oa - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/optall/1/oa/2/3'), - 'Optional :PathName *and* :Args attributes working' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2, 3', 'Content OK' ); - } - - # - # Test if :Chained is the same as :Chained('/') - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->rootdef - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/rootdef/23'), - ":Chained is the same as :Chained('/')" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '; 23', 'Content OK' ); - } - - # - # Test if :Chained('.') is working - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->parentchain - TestApp::Controller::Action::Chained::ParentChain->child - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/parentchain/1/child/2'), - ":Chained('.') chains to parent controller action" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # Test if :Chained('../act') is working - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->one - TestApp::Controller::Action::Chained::ParentChain->chained_rel - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/one/1/chained_rel/3/2'), - ":Chained('../action') chains to correct action" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 3, 2', 'Content OK' ); - } - - # - # Test if ../ works to go up more than one level - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->one - TestApp::Controller::Action::Chained::ParentChain::Relative->chained_rel_two - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/one/1/chained_rel_two/42/23'), - "../ works to go up more than one level" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 42, 23', 'Content OK' ); - } - - # - # Test if :ChainedParent is working - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->loose - TestApp::Controller::Action::Chained::ParentChain->loose - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/loose/4/loose/a/b'), - ":Chained('../action') chains to correct action" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '4; a, b', 'Content OK' ); - } - - # - # Test if :Chained('../name/act') is working - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained::Bar->cross1 - TestApp::Controller::Action::Chained::ParentChain->up_down - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/cross/4/up_down/5'), - ":Chained('../action') chains to correct action" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '4; 5', 'Content OK' ); - } - - # - # Test behaviour of auto actions returning '1' for the chain. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained::Auto->auto - TestApp::Controller::Action::Chained::Auto::Foo->auto - TestApp::Controller::Action::Chained::Auto->foo - TestApp::Controller::Action::Chained::Auto::Foo->fooend - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/autochain1/1/fooend/2'), - "Behaviour when auto returns 1 correct" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # Test behaviour of auto actions returning '0' for the chain. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained::Auto->auto - TestApp::Controller::Action::Chained::Auto::Bar->auto - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/autochain2/1/barend/2'), - "Behaviour when auto returns 0 correct" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # Test what auto actions are run when namespaces are changed - # horizontally. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained::Auto->auto - TestApp::Controller::Action::Chained::Auto::Foo->auto - TestApp::Controller::Action::Chained::Auto::Bar->crossloose - TestApp::Controller::Action::Chained::Auto::Foo->crossend - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/auto_cross/1/crossend/2'), - "Correct auto actions are run on cross controller dispatch" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # Test forwarding from auto action in chain dispatch. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained::Auto->auto - TestApp::Controller::Action::Chained::Auto::Forward->auto - TestApp::Controller::Action::Chained::Auto->fw3 - TestApp::Controller::Action::Chained::Auto->fw1 - TestApp::Controller::Action::Chained::Auto::Forward->forwardend - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/auto_forward/1/forwardend/2'), - "Forwarding out of auto in chain" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # Detaching out of the auto action of a chain. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained::Auto->auto - TestApp::Controller::Action::Chained::Auto::Detach->auto - TestApp::Controller::Action::Chained::Auto->fw3 - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/auto_detach/1/detachend/2'), - "Detaching out of auto in chain" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # Test forwarding from auto action in chain dispatch. - # - { - my $expected = undef; - - ok( my $response = request('http://localhost/chained/loose/23'), - "Loose end is not callable" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->code, 500, 'Status OK' ); - } - - # - # Test forwarding out of a chain. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->chain_fw_a - TestApp::Controller::Action::Chained->fw_dt_target - TestApp::Controller::Action::Chained->chain_fw_b - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/chain_fw/1/end/2'), - "Forwarding out a chain" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # Test detaching out of a chain. - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->chain_dt_a - TestApp::Controller::Action::Chained->fw_dt_target - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/chain_dt/1/end/2'), - "Forwarding out a chain" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '1; 2', 'Content OK' ); - } - - # - # Tests that an uri_for to a chained root index action - # returns the right value. - # - { - ok( my $response = request( - 'http://localhost/action/chained/to_root' ), - 'uri_for with chained root action as arg' ); - like( $response->content, - qr(URI:https?://[^/]+/), - 'Correct URI generated' ); - } - - # - # Test interception of recursive chains. This test was added because at - # one point during the :Chained development, Catalyst used to hang on - # recursive chains. - # - { - eval { require 'TestAppChainedRecursive.pm' }; - if ($run_number == 1) { - ok( ! $@, "Interception of recursive chains" ); - } - else { pass( "Interception of recursive chains already tested" ) } - } - - # - # Test failure of absolute path part arguments. - # - { - eval { require 'TestAppChainedAbsolutePathPart.pm' }; - if ($run_number == 1) { - like( $@, qr(foo/foo), - "Usage of absolute path part argument emits error" ); - } - else { pass( "Error on absolute path part arguments already tested" ) } - } - - # - # Test chained actions in the root controller - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained::Root->rootsub - TestApp::Controller::Action::Chained::Root->endpointsub - TestApp::Controller::Root->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/rootsub/1/endpointsub/2'), 'chained in root namespace' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '', 'Content OK' ); - } - - # - # Complex path with multiple empty pathparts - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->mult_nopp_base - TestApp::Controller::Action::Chained->mult_nopp_all - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/mult_nopp'), - "Complex path with multiple empty pathparts" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '; ', 'Content OK' ); - } - - # - # Higher Args() hiding more specific CaptureArgs chains sections - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->cc_base - TestApp::Controller::Action::Chained->cc_link - TestApp::Controller::Action::Chained->cc_anchor - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join ', ', @expected; - - ok( my $response = request('http://localhost/chained/choose_capture/anchor.html'), - 'Choose between an early Args() and a later more ideal chain' ); - is( $response->header('X-Catalyst-Executed') => $expected, 'Executed actions'); - is( $response->content => '; ', 'Content OK' ); - } - - # - # Less specific chain not being seen correctly due to earlier looser capture - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->cc_base - TestApp::Controller::Action::Chained->cc_b - TestApp::Controller::Action::Chained->cc_b_link - TestApp::Controller::Action::Chained->cc_b_anchor - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join ', ', @expected; - - ok( my $response = request('http://localhost/chained/choose_capture/b/a/anchor.html'), - 'Choose between a more specific chain and an earlier looser one' ); - is( $response->header('X-Catalyst-Executed') => $expected, 'Executed actions'); - is( $response->content => 'a; ', 'Content OK' ); - } - - # - # Check we get the looser one when it's the correct match - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->cc_base - TestApp::Controller::Action::Chained->cc_a - TestApp::Controller::Action::Chained->cc_a_link - TestApp::Controller::Action::Chained->cc_a_anchor - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join ', ', @expected; - - ok( my $response = request('http://localhost/chained/choose_capture/a/a/anchor.html'), - 'Choose between a more specific chain and an earlier looser one' ); - is( $response->header('X-Catalyst-Executed') => $expected, 'Executed actions'); - is( $response->content => 'a; anchor.html', 'Content OK' ); - } - - # - # Args(0) should win over Args() if we actually have no arguments. - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained::ArgsOrder->base - TestApp::Controller::Action::Chained::ArgsOrder->index - TestApp::Controller::Action::Chained::ArgsOrder->end - ]; - - my $expected = join( ", ", @expected ); - - # With no args, we should run "index" - ok( my $response = request('http://localhost/argsorder/'), - 'Correct arg order ran' ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, 'base; ; index; ', 'Content OK' ); - - # With args given, run "all" - ok( $response = request('http://localhost/argsorder/X'), - 'Correct arg order ran' ); - is( $response->header('X-Catalyst-Executed'), - join(", ", - qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained::ArgsOrder->base - TestApp::Controller::Action::Chained::ArgsOrder->all - TestApp::Controller::Action::Chained::ArgsOrder->end - ]) - ); - is( $response->content, 'base; ; all; X', 'Content OK' ); - - } - - # - # PathPrefix - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained::PathPrefix->instance - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/action/chained/pathprefix/1'), - "PathPrefix (as an endpoint)" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - is( $response->content, '; 1', 'Content OK' ); - } - - # - # static paths vs. captures - # - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->apan - TestApp::Controller::Action::Chained->korv - TestApp::Controller::Action::Chained->static_end - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/action/chained/static_end'), - "static paths are prefered over captures" ); - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - } - - # - # */search - # doc/* - # - # request for doc/search should end up in doc/* - { - my @expected = qw[ - TestApp::Controller::Action::Chained->begin - TestApp::Controller::Action::Chained->doc_star - TestApp::Controller::Action::Chained->end - ]; - - my $expected = join( ", ", @expected ); - - ok( my $response = request('http://localhost/chained/doc/search'), - "we prefer static path parts earlier in the chain" ); - TODO: { - local $TODO = 'gbjk never got off his ass and fixed this'; - is( $response->header('X-Catalyst-Executed'), - $expected, 'Executed actions' ); - } - } - - { - ok( my $content = - get('http://localhost/chained/capture%2Farg%3B/return_arg/foo%2Fbar%3B'), - 'request with URI-encoded arg' ); - like( $content, qr{foo/bar;\z}, 'args decoded' ); - like( $content, qr{capture/arg;}, 'captureargs decoded' ); - } - { - ok( my $content = - get('http://localhost/chained/return_arg_decoded/foo%2Fbar%3B'), - 'request with URI-encoded arg' ); - like( $content, qr{foo/bar;\z}, 'args decoded' ); - } - - # Test round tripping, specifically the / character %2F in uri_for: - # not being able to feed it back action + captureargs and args into uri for - # and result in the original request uri is a major piece of suck ;) - foreach my $thing ( - ['foo', 'bar'], - ['foo%2Fbar', 'baz'], - ['foo', 'bar%2Fbaz'], - ['foo%2Fbar', 'baz%2Fquux'], - ['foo%2Fbar', 'baz%2Fquux', { foo => 'bar', 'baz' => 'quux%2Ffrood'}], - ['foo%2Fbar', 'baz%2Fquux', { foo => 'bar', 'baz%2Ffnoo' => 'quux%2Ffrood'}], - ) { - my $path = '/chained/roundtrip_urifor/' . - $thing->[0] . '/' . $thing->[1]; - $path .= '?' . join('&', - map { $_ .'='. $thing->[2]->{$_}} - sort keys %{$thing->[2]}) if $thing->[2]; - ok( my $content = - get('http://localhost/' . $path), - 'request ' . $path . ' ok'); - # Just check that the path matches, as who the hell knows or cares - # where the app is based (live tests etc) - ok( index($content, $path) > 1, 'uri can round trip through uri_for' ); - } -} - -done_testing; -