package tests::ReportParserReportBuilderTest; use strict; use base qw/Lire::Test::TestCase tests::ChartTypesFixture/; use Lire::Report; use Lire::Report::TableInfo; use Lire::Report::Subreport; use Lire::Report::Section; use Lire::ReportParser::ReportBuilder; use Lire::Test::Mock; use Lire::Utils qw/tempfile/; use Lire::Report::ChartConfig; use Lire::PluginManager; use File::Basename qw/dirname/; sub set_up { my $self = $_[0]; $self->SUPER::set_up(); $self->{'testdir'} = dirname( __FILE__ ); $self->{'parser'} = new_proxy Lire::Test::Mock( 'Lire::ReportParser::ReportBuilder' ); $self->{'parser'}->set_result( 'error' => sub { shift; die @_ } ); $self->{'parser'}->init_stack( 'lrp_group' ); $self->{'parser'}->init_stack( 'lrp_group-info' ); $self->{'parser'}->init_stack( 'lrp_entry' ); $self->{'table_info'} = new Lire::Report::TableInfo(); $self->{'table_info'}->create_column_info( 'cell1', 'categorical', 'string' ); my $group = $self->{'table_info'}->create_group_info( 'group' ); $group->create_column_info( 'cell2', 'categorical', 'string' ); $group->create_column_info( 'data1', 'numerical', 'int' ); $group->create_column_info( 'data2', 'numerical', 'int' ); $self->{'table_info'}->compute_group_layout(); $self->{'subreport'} = new Lire::Report::Subreport( 'test', 'test' ); $self->{'subreport'}->table_info( $self->{'table_info'} ); $self->{'subreport'}->id( 'test.0' ); return; } sub tear_down { my $self = $_[0]; $self->SUPER::tear_down(); unlink $self->{'_unlink'} if defined $self->{'_unlink'}; return; } sub test_entry_start { my $self = $_[0]; $self->{'parser'}{'curr_subreport'} = $self->{'subreport'}; $self->{'parser'}->init_stack( 'group' ); $self->{'parser'}->stack_push( 'group', $self->{'subreport'} ); $self->{'parser'}->init_stack( 'entry' ); $self->{'parser'}->stack_push( 'lrp_group', {} ); $self->{'parser'}->entry_start( 'lire:entry', { 'row-idx' => 0 } ); $self->assert_equals( 1, $self->{'parser'}->stack_depth( 'entry' ) ); $self->assert_equals( 0, $self->{'parser'}->stack_peek( 'entry' )->row_idx() ); } sub test_group_summary_start { my $self = $_[0]; $self->{'parser'}->init_stack( 'group' ); $self->{'parser'}->stack_push( 'group', $self->{'subreport'} ); $self->{'parser'}->group_summary_start( 'lire:group-summary', { 'nrecords' => 24, 'missing-cases' => 1 } ); $self->assert_equals( 24, $self->{'subreport'}->nrecords() ); $self->assert_equals( 1, $self->{'subreport'}->missing_cases() ); $self->assert_null( $self->{'subreport'}->row_idx() ); $self->{'parser'}->group_summary_start( 'lire:group-summary', { 'nrecords' => 24, 'missing-cases' => 1, 'row-idx' => 0 } ); $self->assert_equals( 0, $self->{'subreport'}->row_idx() ); } sub test_handle_timespan { my $self = $_[0]; $self->{'parser'}{'report'} = new Lire::Report(); my $now = time; $self->{'parser'}->handle_timespan( 'My timespan', $now, $now + 86400, 'daily' ); $self->assert_num_equals( $now, $self->{'parser'}{'report'}->timespan_start() ); $self->assert_num_equals( $now + 86400, $self->{'parser'}{'report'}->timespan_end() ); $self->assert_str_equals( 'daily', $self->{'parser'}{'report'}->timespan_period() ); } sub test_handle_date { my $self = $_[0]; $self->{'parser'}{'report'} = new Lire::Report(); my $now = time; $self->{'parser'}->handle_date( 'My date', $now ); $self->assert_num_equals( $now, $self->{'parser'}{'report'}->date() ); } sub test_subreport_start { my $self = $_[0]; my $subreport = new Lire::Report::Subreport( 'test', 'top-dirs' ); $subreport->id( 'top-dirs.0' ); $self->{'parser'}{'report'} = new Lire::Report(); $self->{'parser'}{'curr_section'} = new Lire::Report::Section(); $self->{'parser'}->subreport_start( 'lire:subreport', { 'type' => 'top-dirs', 'superservice' => 'test' } ); $self->assert_deep_equals( $subreport, $self->{'parser'}{'curr_subreport'} ); $self->assert_deep_equals( $subreport, $self->{'parser'}{'curr_section'}->subreports() ); $self->{'parser'}{'curr_section'} = new Lire::Report::Section(); $self->{'parser'}->subreport_start( 'lire:subreport', { 'type' => 'top-dirs', 'superservice' => 'test', 'id' => 'my_id' } ); $subreport->id( 'my_id' ); $self->assert_deep_equals( $subreport, $self->{'parser'}{'curr_subreport'} ); } sub test_table_start { my $self = $_[0]; $self->{'parser'}{'curr_subreport'} = $self->{'subreport'}; $self->{'parser'}->table_start( 'lire:table', { 'show' => 5, 'charttype' => 'bars' } ); $self->assert_num_equals( 5, $self->{'subreport'}->show() ); $self->assert_str_equals( 'bars', $self->{'parser'}{'curr_charttype'} ); } sub test_table_info_end { my $self = $_[0]; $self->set_up_chart_types(); $self->{'parser'}->stack_push( 'lrp_group', {} ); $self->{'parser'}->stack_push( 'lrp_group-info', $self->{'subreport'}->table_info() ); $self->{'parser'}{'curr_subreport'} = $self->{'subreport'}; $self->{'parser'}->set_result( 'current_table_info' => $self->{'subreport'}->table_info() ); $self->{'parser'}->{'curr_charttype'} = undef; $self->{'parser'}->table_info_end(); $self->assert_num_equals( 0, scalar @{$self->{'subreport'}->chart_configs()} ); $self->{'parser'}->stack_push( 'lrp_group', {} ); $self->{'parser'}->stack_push( 'lrp_group-info', $self->{'subreport'}->table_info() ); $self->{'parser'}->{'curr_charttype'} = 'pie'; $self->{'parser'}->table_info_end(); $self->assert_num_equals( 1, scalar @{$self->{'subreport'}->chart_configs()} ); } sub set_up_table_info { my $self = $_[0]; my $info =$self->{'table_info'} = new Lire::Report::TableInfo(); $info->create_column_info( 'host', 'categorical', 'string', 'Host' ); my $group = $info->create_group_info( 'file_group' ); $group->create_column_info( 'file', 'categorical', 'string', 'File' ); $group->create_column_info( 'downloads', 'numerical', 'int', 'Downloads' ); $group->create_column_info( 'users', 'numerical', 'int', 'Users' ); $info->compute_group_layout(); return; } sub set_up_subreport { my $self = $_[0]; my $sub = new Lire::Report::Subreport( 'test', 'top-files-by-host' ); $sub->table_info( $self->{'table_info'} ); $sub->id( 'top-files-by-host.i' ); $sub->title( 'Top files by host' ); $sub->schemas( 'test' ); $sub->description( 'File by host report.' ); $sub->set_summary_value( 'downloads', 'value' => 100 ); $sub->set_summary_value( 'users', 'value' => 10 ); my $host = $sub->create_entry(); $host->add_name( 'Host 1' ); my $file_group = $host->create_group(); $file_group->show( 5 ); $file_group->set_summary_value( 'downloads', 'value' => 64 ); $file_group->set_summary_value( 'users', 'value' => 8 ); my $file = $file_group->create_entry(); $file->add_name( 'File 1' ); $file->add_value( 'value' => 40 ); $file->add_value( 'value' => 7 ); $file = $file_group->create_entry(); $file->add_name( 'File 2' ); $file->add_value( 'value' => 24 ); $file->add_value( 'value' => 1 ); $host = $sub->create_entry(); $host->add_name( 'Host 2' ); $file_group= $host->create_group(); $file_group->show( 5 ); $file_group->set_summary_value( 'downloads', 'value' => 36 ); $file_group->set_summary_value( 'users', 'value' => 2 ); $file = $file_group->create_entry(); $file->add_name( 'File 3' ); $file->add_value( 'value' => 36 ); $file->add_value( 'value' => 2 ); $sub->finalize(); ( $self->{'report'}->sections() )[0]->add_subreport( $sub ); return; } sub set_up_simple_report { my $self = $_[0]; $self->set_up_table_info(); my $report = $self->{'report'} = new Lire::Report( 'daily', time, time + 86400 ); $report->title( 'My Test Report' ); $report->description( 'Test report' ); my $section = new Lire::Report::Section( 'First section' ); $section->description( 'A section' ); $report->add_section( $section ); $self->set_up_subreport(); my $cfg = new Lire::Report::ChartConfig(); $cfg->basename( 'users-downloads-by-file' ); $cfg->get( 'case_var' )->set( 'file' ); $cfg->type( Lire::PluginManager->get_plugin( 'chart_type', 'vbars' ) ); $cfg->type_properties()->get( 'y' )->set( 'downloads' ); $cfg->type_properties()->get( 'y2' )->set( 'users' ); $cfg->type_properties()->get( 'numbers' )->set( 1 ); $self->{'report'}->subreport_by_id( 'top-files-by-host.i' )->add_chart_config( $cfg ); $cfg = new Lire::Report::ChartConfig(); $cfg->basename( 'users-downloads-by-host' ); $cfg->get( 'case_var' )->set( 'host' ); $cfg->type( Lire::PluginManager->get_plugin( 'chart_type', 'vbars' ) ); $cfg->type_properties()->get( 'y' )->set( 'downloads' ); $cfg->type_properties()->get( 'y2' )->set( 'users' ); $cfg->type_properties()->get( 'numbers' )->set( 1 ); $self->{'report'}->subreport_by_id( 'top-files-by-host.i' )->add_chart_config( $cfg ); $section = new Lire::Report::Section( 'Second section' ); $report->add_section( $section ); my $sub2 = new_missing Lire::Report::Subreport( 'test', 'top-files-by-host', 'Error' ); $sub2->id( 'top-files-by-host.ii' ); $sub2->schemas( 'test' ); $section->add_subreport( $sub2 ); return; } sub test_parsefile { my $self = $_[0]; $self->set_up_chart_types(); $self->set_up_simple_report(); my ( $fh, $file ) = tempfile( $self->name() . "_XXXXXX" ); $self->{'_unlink'} = $file; $self->{'report'}->write_report( $fh ); close $fh; system ( "cp $file /tmp/report.xml" ); my $parser = new Lire::ReportParser::ReportBuilder(); my $report = $parser->parsefile( $file ); $report->generator( $self->{'report'}->generator() ); $self->assert_deep_equals( $self->{'report'}, $report ); } 1;