# I don't have any idea how MQ works, and I don't have it handy. # I'll just mock enough of MQ for testing SOAP::Lite's module, which may # or may not be correct. use strict; use Test::More; # use SOAP::Lite +trace; eval "require Test::MockObject" or plan skip_all => 'Cannot test without Test__MockObject'; plan tests => 12; my $mock = Test::MockObject->new(); $mock->fake_module('MQClient::MQSeries', new => sub { return bless {}, $_[0]; }, ); $mock->fake_module('MQSeries::QueueManager', new => sub { return bless {}, $_[0]; }, ); # This is quite difficult. # The server's handle method pulls out a message, then puts one in in a loop. # handle() terminates if Reason returns MQRC_NO_MSG_AVAILABLE (23). # So, decrementing the count and returning 23 allows handle to grab one # message, and terminate before putting another one in the reply queue. # The server's parent's handle() is never called this way. # This behaviour could also be influenced by testing the client, so be # aware of it when adding tests. my $MESSAGE_COUNT = 1; $mock->fake_module('MQSeries::Queue', new => sub { return bless {}, $_[0]; }, Get => sub { my ($self , %arg_of) = @_; return $MQSeries::Queue::GET ? $arg_of{ Message }->Data( $MQSeries::Queue::GET ) : (); }, Reason => sub { if ($MQSeries::Queue::GET) { undef $MQSeries::Queue::GET; return --$MESSAGE_COUNT ? () : 23; } return; }, Put => sub { return 1; }, ); $mock->fake_module('MQSeries::Message', new => sub { return bless {}, $_[0]; }, MsgDesc => sub {}, Data => sub { return $#_ ? $_[0]->{ Data } = $_[1] : $_[0]->{ Data }; }, ); $mock->fake_module('MQSeries', new => sub { return bless {}, $_[0]; }, import => sub { my $caller = caller(); # warn $caller; no strict qw(refs); *{ "$caller\::MQFMT_STRING" } = sub { 42 }; *{ "$caller\::MQRC_NO_MSG_AVAILABLE" } = sub { 23 }; }, ); use_ok qw(SOAP::Transport::MQ); my $transport = SOAP::Transport::MQ::Client->new(); isa_ok $transport, 'SOAP::Client'; is $transport, $transport->new(), '$transport->new() is $transport'; my $endpoint = 'mq://user@localhost:42?Channel=A;QueueManager=B;RequestQueue=C;ReplyQueue=D'; is $transport->endpoint($endpoint) , $transport, '$transport->endpoint($endpoint) is $transport'; is $transport->endpoint($endpoint) , $transport, '$transport->endpoint($endpoint) is $transport'; is $transport->endpoint(), $endpoint, '$transport->endpoint() is $endpoint'; isa_ok $transport->requestqueue(), 'MQSeries::Queue'; isa_ok $transport->replyqueue(), 'MQSeries::Queue'; # server my $server; eval { $server = SOAP::Transport::MQ::Server->new() }; like $@, qr{ \A missing \s parameter \s \(uri\) \s}xms, 'new throws without uri'; ok $server = SOAP::Transport::MQ::Server->new($endpoint), 'new($endpoint)'; eval { $server->handle() }; is $@, "Error occured while waiting for requests\n", 'error without message'; $MQSeries::Queue::GET = q{ }; is $server->handle(), 0, 'Count after one message is 0';