# NAME

Test::Net::RabbitMQ - A mock RabbitMQ implementation for use when testing.

# VERSION

version 0.11

# SYNOPSIS

    use Test::Net::RabbitMQ;

    my $mq = Test::Net::RabbitMQ->new;

    $mq->connect;

    $mq->channel_open(1);

    $mq->exchange_declare(1, 'order');
    $mq->queue_declare(1, 'new-orders');

    $mq->queue_bind(1, 'new-orders', 'order', 'order.new');

    $mq->publish(1, 'order.new', 'hello!', { exchange => 'order' });

    $mq->consume(1, 'new-orders');

    my $msg = $mq->recv;
    
    # Or
    
    my $msg = $mq->get(1, 'order.new', {});

# DESCRIPTION

Test::Net::RabbitMQ is a terrible approximation of using the real thing, but
hopefully will allow you to test systems that use [Net::RabbitMQ](https://metacpan.org/pod/Net::RabbitMQ) without
having to use an actual RabbitMQ instance.

The general overview is that calls to `publish` pushes a message into one
or more queues (or none if there are no bindings) and calls to `recv`
pop them.

# CAVEATS

This module has all the features I've needed to successfully test our 
RabbitMQ-using application. Patches are welcome if I'm missing something you
need! At the moment there are a number of shortcomings:

- `recv` doesn't block
- exchanges are all topic
- lots of other stuff!

# ATTRIBUTES

## connectable

If false then any calls to connect will die to emulate a failed connection.

## debug

If set to true (which you can do at any time) then a message will be emmitted
to STDERR any time a message is added to a queue.

# METHODS

## channel\_close($number)

Closes the specific channel.

## channel\_open($number)

Opens a channel with the specific number.

## connect

Connects this instance.  Does nothing except set `connected` to true.  Will
throw an exception if you've set `connectable` to false.

## consume($channel, $queue)

Sets the queue that will be popped when `recv` is called.

## disconnect

Disconnects this instance by setting `connected` to false.

## exchange\_declare($channel, $exchange, $options)

Creates an exchange of the specified name.

## tx\_select($channel)

Begins a transaction on the specified channel.  From this point forward all
publish() calls on the channel will be buffered until a call to ["tx_commit"](#tx_commit)
or ["tx_rollback"](#tx_rollback) is made.

## tx\_commit($channel)

Commits a transaction on the specified channel, causing all buffered publish()
calls to this point to be published.

## tx\_rollback($channel)

Rolls the transaction back, causing all buffered publish() calls to be wiped.

## get ($channel, $queue, $options)

Get a message from the queue, if there is one.

Like `Net::RabbitMQ`, this will return a hash containing the following
information:

     {
       body => 'Magic Transient Payload', # the reconstructed body
       routing_key => 'nr_test_q',        # route the message took
       exchange => 'nr_test_x',           # exchange used
       delivery_tag => 1,                 # (inc'd every recv or get)
       redelivered => 0,                  # always 0
       message_count => 0,                # always 0
     }

## queue\_bind($channel, $queue, $exchange, $routing\_key)

Binds the specified queue to the specified exchange using the provided
routing key.  __Note that, at the moment, this doesn't work with AMQP wildcards.
Only with exact matches of the routing key.__

## queue\_declare($channel, $queue, $options)

Creates a queue of the specified name.

## queue\_unbind($channel, $queue, $exchange, $routing\_key)

Unbinds the specified routing key from the provided queue and exchange.

## publish($channel, $routing\_key, $body, $options)

Publishes the specified body with the supplied routing key.  If there is a
binding that matches then the message will be added to the appropriate queue(s).

## recv

Provided you've called `consume` then calls to recv will `pop` the next
message of the queue.  __Note that this method does not block.__

Like `Net::RabbitMQ`, this will return a hash containing the following
information:

     {
       body => 'Magic Transient Payload', # the reconstructed body
       routing_key => 'nr_test_q',        # route the message took
       exchange => 'nr_test_x',           # exchange used
       delivery_tag => 1,                 # (inc'd every recv or get)
       consumer_tag => '',                # Always blank currently
       props => $props,                   # hashref sent in
     }

# AUTHOR

Cory G Watson <gphat@cpan.org>

# COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by Cory G Watson.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
