Make tests use strict and warnings. Cleanup the killing of activemq so that it happen...
[catagits/Catalyst-Engine-STOMP.git] / lib / Catalyst / Test / MessageDriven.pm
CommitLineData
40e96678 1package Catalyst::Test::MessageDriven;
2use Class::MOP;
3use Sub::Exporter;
4use HTTP::Request;
5
6BEGIN {
7 $ENV{CATALYST_ENGINE} = 'Test::MessageDriven';
8};
9
10=head1 NAME
11
12Catalyst::Test::MessageDriven - test message-driven Catalyst apps
13
14=head1 DESCRIPTION
15
16Derived from Catalyst::Test, this module provides a way to run tests
17against message-driven Catalyst applications - those with
18Catalyst::Controller::MessageDriven-based controllers, and expect to
8edb2b46 19run with Catalyst::Engine::Stomp.
40e96678 20
21=head1 SYNOPSIS
22
23 BEGIN { use_ok 'Catalyst::Test::MessageDriven', 'SomeApp' };
24
25 my $req = '... some message text ...';
26 my $queue = 'somequeue';
27 my $res = request($queue, $req);
28 ok($res);
29
30=head1 EXPORTS
31
32=head2 request(queue, message)
33
34This function accepts a queue and a message, and runs the request in
8edb2b46 35that context. Returns a response object.
40e96678 36
37=head1 TODO
38
39Some test wrappers - successful / error message conditions?
40
41=cut
42
43my $build_exports = sub {
44 my ($self, $meth, $args, $defaults) = @_;
45
46 my $request;
47 my $class = $args->{class};
48
49 if (!$class) {
50 $request = sub { Catalyst::Exception->throw("Must specify a test app: use Catalyst::Test::MessageDriven 'TestApp'") };
51 }
52 else {
53 unless (Class::MOP::is_class_loaded($class)) {
54 Class::MOP::load_class($class);
55 }
56 $class->import;
57
58 my $app = $class->run();
59 $request = sub { message_driven_request( $app, @_ ) };
60 }
8edb2b46 61
40e96678 62 return {
63 request => $request,
64 };
65};
66
67{
68 my $import = Sub::Exporter::build_exporter({
69 groups => [ all => $build_exports ],
70 into_level => 1,
71 });
72
73 sub import {
74 my ($self, $class) = @_;
75 $import->($self, '-all' => { class => $class });
76 return 1;
77 }
78}
79
80sub message_driven_request {
81 my ($app, $path, $req_message) = @_;
82 my $url = "message://localhost:61613/$path";
83
84 my $request = HTTP::Request->new( POST => $url );
85 $request->content($req_message);
86 $request->content_length(length $req_message);
87 $request->content_type('application/octet-stream');
8edb2b46 88
40e96678 89 my $response;
90 $app->handle_request($request, \$response);
91
92 return $response;
93}
94
95package Catalyst::Engine::Test::MessageDriven;
96use base 'Catalyst::Engine::Embeddable';
97
98sub run {
99 my ($self, $app) = @_;
100 return $app;
101}
102
1031;
8edb2b46 104