The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More;
use t::LeakTrap;

plan skip_all => 'Set REDIS_SERVER=127.0.0.1:6379' unless $ENV{REDIS_SERVER};

my $publisher = Mojo::Redis->new(server => "redis://$ENV{REDIS_SERVER}/14", timeout => 5);

{
  my $redis = Mojo::Redis->new(server => "redis://$ENV{REDIS_SERVER}/14", timeout => 5);
  my $n = 0;
  my(@errors, @message);

  $redis->on(error => sub { push @errors, $_[1]; Mojo::IOLoop->stop; });
  $redis->once(message => "test:pub:sub" => sub {
    shift;
    push @message, [@_];
    Mojo::IOLoop->stop;
  });

  Mojo::IOLoop->timer(0.02, sub {
    $publisher->publish("test:pub:sub" => ++$n);
  });

  Mojo::IOLoop->timer(1 => sub { Mojo::IOLoop->stop; });
  Mojo::IOLoop->start;

  is_deeply \@errors, [], 'no errors';

  is_deeply(
    \@message,
    [[ "", "1", "test:pub:sub" ]],
    'message received expected events without error',
  );

  is int(keys %{$redis->{connections}}), 1, 'got a connection';

  $redis->once(message => test_message => sub {});
  $redis->disconnect;
  is int(keys %{$redis->{connections}}), 0, 'disconnected connections';

  $redis->once(message => test_message => sub {});
  $redis->unsubscribe(message => 'test_message');
  is int(keys %{$redis->{connections}}), 0, 'unsubscribe connection';
}

undef $publisher;

is_deeply [values %::trap], [], 'no leakage' or diag join ' ', 'leak obj:', sort values %::trap;

done_testing;