package tests::functional::LrXml2ReportTest;

use strict;

use base qw/Lire::Test::FunctionalTestCase tests::functional::TestSchemaFixture/;

use Lire::Config::Build qw/ac_info/;
use Lire::ReportParser::ReportBuilder;
use File::Basename qw/dirname/;
use Cwd 'realpath';
use Carp;

sub new {
    my $self = shift->SUPER::new(@_);

    $self->tests::functional::TestSchemaFixture::init();

    $self->{'testsdir'} = realpath(dirname( __FILE__ ) . "/..");
    $self->{'report_cfg'} = "$self->{'testsdir'}/data/test.cfg";
    $self->{'report_xml'} = "$self->{'testsdir'}/data/test-sqlite.xml";
    $self->{'empty_report_xml'} = "$self->{'testsdir'}/data/test-empty-sqlite.xml";

    return $self;
}

sub set_up {
    my $self = $_[0];
    $self->SUPER::set_up();

    $self->set_up_test_schemas();
    $self->set_up_test_specs();
}

sub tear_down {
    my $self = $_[0];
    $self->SUPER::tear_down();
    $self->tests::functional::TestSchemaFixture::tear_down();
}

sub test_version {
    my $self = $_[0];

    my $result = $self->lire_run( "lr_xml2report -v" );
    $self->annotate( $result->stderr() );
    $self->assert_equals( 0, $result->status() );
    $self->assert( !$result->stdout(), "stdout should be empty" );
    my $VERSION = ac_info( "VERSION" );
    $self->assert_matches( qr/shipped with Lire version $VERSION/, $result->stderr() );
}

sub test_merge_reports {
    my $self = $_[0];

    my $result = $self->lire_run( "lr_xml2report -o xml -c $self->{'report_cfg'} -U test --merge $self->{'report_xml'} $self->{'report_xml'} > report.xml" );

    $self->annotate( $result->stderr() );
    $self->assert_equals( 0, $result->status() );
    $self->assert( !$result->stdout(), "stdout should be empty" );
    $self->assert_does_not_match( qr/(ERROR|WARNING)/, $result->stderr(),
                                  "There were warnings or error messages." );

    $self->assert( -f $self->rundir() . "/report.xml",
                   "XML report wasn't created" );
    $self->assert( -s $self->rundir() . "/report.xml",
                   "XML report is empty" );

    $self->check_xml_report( "$self->{'testsdir'}/data/test-doublemerge.xml",
                             $self->rundir() . "/report.xml" );
}

sub test_double_empty_merge {
    my $self = $_[0];

    my $result = $self->lire_run( "lr_xml2report -o xml -c $self->{'report_cfg'} -U test --merge $self->{'empty_report_xml'} $self->{'empty_report_xml'} > report.xml" );

    $self->annotate( $result->stderr() );
    $self->assert_equals( 0, $result->status() );
    $self->assert( !$result->stdout(), "stdout should be empty" );
    $self->assert_does_not_match( qr/(ERROR|WARNING)/, $result->stderr(),
                                  "There were warnings or error messages." );

    $self->assert( -f $self->rundir() . "/report.xml",
                   "XML report wasn't created" );
    $self->assert( -s $self->rundir() . "/report.xml",
                   "XML report is empty" );

    # Merging with an empty report shouldn't change anything.
    $self->check_xml_report( "$self->{'testsdir'}/data/test-empty-merge.xml",
                             $self->rundir() . "/report.xml" );
}

sub test_merge_reports_with_empty {
    my $self = $_[0];

    my $result = $self->lire_run( "lr_xml2report -o xml -c $self->{'report_cfg'} -U test --merge $self->{'report_xml'} $self->{'empty_report_xml'} > report.xml" );

    $self->annotate( $result->stderr() );
    $self->assert_equals( 0, $result->status() );
    $self->assert( !$result->stdout(), "stdout should be empty" );
    $self->assert_does_not_match( qr/(ERROR|WARNING)/, $result->stderr(),
                                  "There were warnings or error messages." );

    $self->assert( -f $self->rundir() . "/report.xml",
                   "XML report wasn't created" );
    $self->assert( -s $self->rundir() . "/report.xml",
                   "XML report is empty" );

    # Merging with an empty report shouldn't change anything.
    $self->check_xml_report( "$self->{'testsdir'}/data/test-merge.xml",
                             $self->rundir() . "/report.xml" );
}

sub test_ascii_report {
    my $self = $_[0];

    my $result = $self->lire_run( "lr_xml2report -o txt $self->{'report_xml'}" );
    $self->annotate( $result->stderr() );
    $self->assert_equals( 0, $result->status() );
    $self->assert( length $result->stdout(), "report is empty" );
    $self->assert_does_not_match( qr/(ERROR|WARNING)/, $result->stderr(),
                                  "There were warnings or error messages." );

    $self->assert_matches( qr/^Report generated:/, $result->stdout() );
    $self->assert_matches( qr/All Files/, $result->stdout() );
    $self->assert_matches( qr/User's Downloads Report/, $result->stdout() );
}

sub check_xml_report {
    my ($self, $expected_report, $gen_report ) = @_;

    my $parser = new Lire::ReportParser::ReportBuilder();
    my $report_e = $parser->parsefile( $expected_report );
    my $report_t = $parser->parsefile( $gen_report  );

    # The difference in these fields are normal
    $report_t->date( $report_e->date );
    $report_t->generator( $report_e->generator() );
    delete $report_e->{'_id_cache'};

    $self->assert_deep_equals( $report_e, $report_t );
}

1;


syntax highlighted by Code2HTML, v. 0.9.1