The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Mojo::Base -strict;
use Mojo::IOLoop;
use Mojo::Redis;
use Test::More;
use utf8;

plan skip_all => 'Setup $REDIS_SERVER' unless $ENV{REDIS_SERVER};
plan tests => 6;

my $redis = Mojo::Redis->new(server => $ENV{REDIS_SERVER}, timeout => 3);
my(@mcb, @scb);

my $s = $redis->psubscribe('alpha*', 'beta*');

$_->on(error => sub {
  diag $_[1];
  $redis->ioloop->stop;
}) for $redis, $s;

my $psub_message_cb=0;

$s->on(
  message => sub {
    my($s, $message, $channel, $pattern) = @_;

    push @mcb, [ $message, $channel, $pattern ];

    if(@scb == 4 and @mcb == 2) {
      Mojo::IOLoop->stop;
    }
  }
);

$s->on(
  data => sub {
    my($s, $res)=@_;

    push @scb, $res;

    if(@scb == 1) {
      $redis->publish('alpha.foo', 'Easy as 123');
      $redis->publish('beta.foo', 'Simple as do re mi');
    }
    if(@scb == 4 and @mcb == 2) {
      Mojo::IOLoop->stop;
    }
  }
);

Mojo::IOLoop->start;

is_deeply $mcb[0], ['Easy as 123', 'alpha.foo', 'alpha*'], "first pattern message";
is_deeply $mcb[1], ['Simple as do re mi', 'beta.foo', 'beta*'], "second pattern message";

is_deeply $scb[0], ['psubscribe', 'alpha*', 1], "first pattern data, subscription ack #1";
is_deeply $scb[1], ['psubscribe', 'beta*', 2], "second pattern data, subscription ack #2";
is_deeply $scb[2], ['pmessage', 'alpha*', 'alpha.foo', 'Easy as 123'], "third pattern data, message #1";
is_deeply $scb[3], ['pmessage', 'beta*','beta.foo', 'Simple as do re mi'], "fourth pattern data, message #2";