lundi 27 juin 2016

Fail to test the rendered output after a redirect from a DELETE route - Mojolicious

I currently expand my test suite to increase the test coverage. I want to test my controller and the html output that it renders, but I found a problem by delete methods. Let me explain it in an example.

I have a route:

$r->delete('/backups/:id')
  ->to('backup#delete_backup')
  ->name('backup_delete');

that point to the following function in the controller:

sub delete_backup {
    my $self       = shift;
    my $id         = $self->param('id');


    if ( something ) {
        $self->flash( msg => "Backup id $id deleted!" );
    }
    else{
        $self->flash( msg => "Cannot delete, backup id $id not found!" );   
    }
    $self->redirect_to($self->url_for('backup_index'));
}

where the method that handles the route backup_index just displays the $msg and shows few other irrelevant data.

I want to test this method, so I write a test:

$t_logged_in->ua->max_redirects(3);
my $page = $t_logged_in->app->url_for( 'backup_delete', id => $backup_id );
$t_logged_in->delete_ok($page)
            ->status_isnt( 404, "Checking: 404 $page" )
            ->status_isnt( 500, "Checking: 500 $page" );

The test is passed. But now, I want to check if the text is correct on the web page that is shown after redirecting. So I do the following:

$t_logged_in->ua->max_redirects(3);
my $page = $t_logged_in->app->url_for( 'backup_delete', id => $backup_id );
$t_logged_in->delete_ok($page)
            ->status_isnt( 404, "Checking: 404 $page" )
            ->status_isnt( 500, "Checking: 500 $page" )
            ->content_unlike(qr/Cannot delete,/i)
            ->content_like(qr/deleted/i);

The test fails. It fails because the content is empty, so the matching is done as there were:

'' =~ /deleted/i;
'' !~ /Cannot delete,/i;

and this is of course false in both cases. Of course, in the browser, the redirects work perfectly and I see everything as designed in the test. I can change the method to POST or GET but I wanted to make the routing properly in the way an API would be designed.

Question: how to design the test such that the content can be matched after the redirect?

For those who want to dig deeper, I give links to Github.

Aucun commentaire:

Enregistrer un commentaire