CatalystX::Test::MessageDriven - test message-driven Catalyst apps


Catalyst-Engine-Stomp documentation Contained in the Catalyst-Engine-Stomp distribution.

Index


Code Index:

NAME

Top

CatalystX::Test::MessageDriven - test message-driven Catalyst apps

DESCRIPTION

Top

Derived from Catalyst::Test, this module provides a way to run tests against message-driven Catalyst applications - those with Catalyst::Controller::MessageDriven-based controllers, and expect to run with Catalyst::Engine::Stomp.

SYNOPSIS

Top

  BEGIN { use_ok 'CatalystX::Test::MessageDriven', 'SomeApp' };

  my $req = '... some message text ...';
  my $queue = 'somequeue';
  my $res = request($queue, $req);
  ok($res);

EXPORTS

Top

request(queue, message)

This function accepts a queue and a message, and runs the request in that context. Returns a response object.

TODO

Top

Some test wrappers - successful / error message conditions?

AUTHOR AND CONTRIBUTORS

Top

See information in Catalyst::Engine::Stomp

LICENCE AND COPYRIGHT

Top


Catalyst-Engine-Stomp documentation Contained in the Catalyst-Engine-Stomp distribution.
package CatalystX::Test::MessageDriven;
use Class::MOP;
use Sub::Exporter;
use HTTP::Request;

BEGIN {
    $ENV{CATALYST_ENGINE} = 'Test::MessageDriven';
};

my $message_driven_request = sub {
    my ($app, $path, $req_message) = @_;
    my $url = "message://localhost:61613/$path";

    my $request = HTTP::Request->new( POST => $url );
    $request->content($req_message);
    $request->content_length(length $req_message);
    $request->content_type('application/octet-stream');

    my $response;
    $app->handle_request($request, \$response);

    return $response;
};

my $build_exports = sub {
    my ($self, $meth, $args, $defaults) = @_;

    my $request;
    my $class = $args->{class};

    if (!$class) {
        $request = sub { Catalyst::Exception->throw("Must specify a test app: use CatalystX::Test::MessageDriven 'TestApp'") };
    }
    else {
        unless (Class::MOP::is_class_loaded($class)) {
            Class::MOP::load_class($class);
        }
        $class->import;

        my $app = $class->run();
        $request = sub { $message_driven_request->( $app, @_ ) };
    }

    return {
        request => $request,
    };
};

{
    my $import = Sub::Exporter::build_exporter({
        groups => [ all => $build_exports ],
        into_level => 1,
    });

    sub import {
        my ($self, $class) = @_;
        $import->($self, '-all' => { class => $class });
        return 1;
    }
}

package # Hide from PAUSE
    Catalyst::Engine::Test::MessageDriven;
use base 'Catalyst::Engine::Embeddable';

sub run {
    my ($self, $app) = @_;
    return $app;
}

1;