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

# guard
Mojo::IOLoop->recurring(2 => sub { Mojo::IOLoop->stop });

my $port            = generate_port();
my $irc             = Mojo::IRC->new(nick => 'test123', name => 'testman', server => "127.0.0.1:$port");
my $first_stream_id = '';
my $server_stream;
my %events;

Mojo::IOLoop->server(
  {port => $port},
  sub {
    $events{connect}++;
    $server_stream = $_[1];
    Mojo::IOLoop->stop;
  },
);

$irc->on(
  close => sub {
    $events{close}++;
    $irc->connect(sub { });
  }
);

$irc->connect(sub { });
ok + ($first_stream_id = $irc->{stream_id}), 'got stream_id';
ok !$irc->{stream}, 'no stream';

Mojo::IOLoop->start;
ok $irc->{stream}, 'got stream';

$server_stream->close;
Mojo::IOLoop->start;

is_deeply(\%events, {close => 1, connect => 2}, 'got correct events');
is length($irc->{stream_id} || ''), length($first_stream_id), 'got stream_id on reconnect';
isnt $irc->{stream_id}, $first_stream_id, 'got new stream_id';
ok $irc->{stream}, 'and new stream';

done_testing;

sub irc_data {
  my $file = shift;
  diag "read $file";
  open my $FH, '<', "t/data/$file" or die $!;
  join '', map { s/\r?\n$/\r\n/; $_ } <$FH>;
}

sub start_ioloop {
  my $tid = Mojo::IOLoop->timer(1 => sub { Mojo::IOLoop->stop });
  Mojo::IOLoop->start;
  Mojo::IOLoop->remove($tid);
}