The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package TestAppClear;

use base 'CGI::Application';

use CGI::Application::Plugin::Session;
use CGI::Application::Plugin::MessageStack;

use Test::More;

## TEST PLAN ##
#* messages
# * first request:
#    - establish session
#    - push in a few messages
# * second request:
#    - pass in session
#    - call messages() and compare data structure
# * third request:
#    - pass in session
#    - call messages() with scope and compare data structure
# * fourth request:
#    - pass in session
#    - call messages() with classification and compare data structure
# * fifth request:
#    - pass in session
#    - call messages() with both scope & classification and compare data structure
#FILES: 04-messages.t, TestMessages.pm

sub setup {
    my $self = shift;
    $self->mode_param( 'rm' );
    $self->run_modes( [ qw( start second third fourth fifth cleanup ) ] );
}

sub cgiapp_init {
    my $self = shift;
    $self->session_config({
            CGI_SESSION_OPTIONS => [ "driver:File", $self->query, {Directory=>'t/'} ],
            SEND_COOKIE         => 1,
            COOKIE_PARAMS       => {
                                     -path    => '/',
                                     -domain  => 'mydomain.com',
                                     -expires => '+3M',
                                   },
        });
}

sub start {
    my $self = shift;
    my $session = $self->session;
    $session->clear( [ '__CAP_MessageStack_Stack' ] ); # muhahahahaha
    $self->push_message(
            -message        => 'this is a test',
        );
    $self->push_message(
            -message        => 'this is another test',
            -classification => 'INFO',
        );
    $self->push_message(
            -scope          => 'invalid',
            -message        => 'bad password!',
            -classification => 'ERROR',
        );
    $self->push_message(
            -scope          => 'start',
            -message        => 'there was a problem',
            -classification => 'ERROR',
        );
    $self->push_message(
            -scope          => 'fourth',
            -message        => 'got your stuff updated',
            -classification => 'INFO',
        );
    $self->push_message(
            -scope          => 'fourth',
            -message        => 'another info',
            -classification => 'INFO',
        );
    $self->push_message(
            -scope          => 'fourth',
            -message        => 'some bad stuff',
            -classification => 'ERROR',
        );
    return "all set";
}

sub second {
    my $self = shift;
    my $session = $self->session;
    $self->clear_messages();
    my $messages = $self->messages();
    
    my $expectation = [
        ];

    my $message = 'failed';
    if ( is_deeply( $expectation, $messages, undef ) ) {
        $message = 'succeeded';
    }
    return $message;
}

sub third {
    my $self = shift;
    my $session = $self->session;
    $self->clear_messages( -scope => 'fourth' );
    my $messages = $self->messages();
    my $expectation = [
            { -scope => 'invalid', -message => 'bad password!', -classification => 'ERROR' },
            { -scope => 'start', -message => 'there was a problem', -classification => 'ERROR' },
        ];

    my $message = 'failed';
    if ( is_deeply( $expectation, $messages, undef ) ) {
        $message = 'succeeded';
    }
    return $message;
}

sub fourth {
    my $self = shift;
    my $session = $self->session;
    $self->clear_messages( -classification => 'ERROR' );
    my $messages = $self->messages();
    my $expectation = [
            { -message => 'this is a test' },
            { -message => 'this is another test', -classification => 'INFO' },
            { -scope => 'fourth', -message => 'got your stuff updated', -classification => 'INFO' },            
            { -scope => 'fourth', -message => 'another info', -classification => 'INFO' },            
        ];

    my $message = 'failed';
    if ( is_deeply( $expectation, $messages, undef ) ) {
        $message = 'succeeded';
    }
    return $message;
}

sub fifth {
    my $self = shift;
    my $session = $self->session;
    $self->clear_messages( -scope => 'fourth', -classification => 'ERROR' );
    my $messages = $self->messages();
    my $expectation = [
            { -message => 'this is a test' },
            { -message => 'this is another test', -classification => 'INFO' },
            { -scope => 'invalid', -message => 'bad password!', -classification => 'ERROR' },
            { -scope => 'start', -message => 'there was a problem', -classification => 'ERROR' },
            { -scope => 'fourth', -message => 'got your stuff updated', -classification => 'INFO' },            
            { -scope => 'fourth', -message => 'another info', -classification => 'INFO' },            
        ];

    my $message = 'failed';
    if ( is_deeply( $expectation, $messages, undef ) ) {
        $message = 'succeeded';
    }
    return $message;
}

sub cleanup {
    my $self = shift;
    $self->session->delete;
    return "session deleted";
}

1;