The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use warnings;
use Test::Most;
use Test::Fatal;
use Data::Printer;
use HTTP::Request::Common;
use lib 't/lib';

BEGIN { $ENV{CATALYST_CONFIG} = 't/lib/test1.conf' }
use Catalyst::Test 'Test1';

# let's get all URLs from the controllers, to make sure they got
# created properly, 2 controllers for a single Foo, because of the
# configuration
my @destinations =
    map { '/'.$_ }
    map { Test1->controller($_)->action_namespace }
    Test1->controllers;

my $foo_one = Test1->component('Test1::Foo::One');
my $foo_two = Test1->component('Test1::Foo::Two');

sub run_test {
    my ($foo,$url,$action) = @_;

    $foo->calls([]);

    my $res = request POST "$url/$action",
        'My-Header' => 'my value',
        'Content-type' => 'text/plain',
        'Content-length' => 6,
        Content => 'a body';

    ok($res->is_success, 'the request works')
        or note p $res;

    cmp_deeply($foo->calls,
               [
                   [
                       all(isa('HTTP::Headers'),
                           methods([header => 'My-Header'] => 'my value'),
                       ),
                       'a body',
                   ],
               ],
               'request received and action run')
        or note p $foo->calls;
}

subtest 'request on a configured destination' => sub {
    run_test($foo_one,'/url/1','my_action');
};

subtest 'request on the other configured destination' => sub {
    run_test($foo_one,'/url/2','my_action');
};

subtest 'requests on configured destination & actions' => sub {
    run_test($foo_two,'/url2/1','action1');
    run_test($foo_two,'/url2/1','action2');
    run_test($foo_two,'/url2/2','action3');
    run_test($foo_two,'/url2/2','action4');
};

done_testing();