I've always done this manually. Something like this:
$t->get_ok('/')->status_is(200)->element_exists('a[href*="msgid"]');
$t->get_ok($t->tx->res->dom->at('a[href*="msgid"]')->{href})->status_is(302)->header_like(Location => qr{something});
$t->get_ok($t->tx->res->headers->location)->status_is(200)->element_exists_not('a[href*="msgid="]');
I like how it's dynamic, but at the same time very explicit.