#!/usr/bin/perl use strict; use warnings; $ENV{TMPDIR} = 't/var'; use Test::More tests => 37; my $notrap = 1; if ($^O ne 'MSWin32') { #Test::Trap known to crash Win32 eval 'use Test::Trap'; if ($@) { $notrap = 1; } else { use Test::Trap qw(trap $trap); $notrap = 0; } } use LedgerSMB::Form; use LedgerSMB::Menu; my $ini; my @r; my $form; my $myconfig; # general new and add_file checks $ini = new Menu; ok(defined $ini, 'new: File not provided'); isa_ok($ini, 'Menu', 'new: File not provided gives correct type'); $ini->add_file('t/data/12-menu1.ini'); is_deeply($ini->{'AR--Add Transaction'}, {'action' => 'add', 'module' => 'ar.pl'}, 'add_file: First file added, leaf correct'); is_deeply($ini->{'ORDER'}, ['AR', 'AR--Add Transaction'], 'add_file: First file added, order correct'); $ini->add_file('t/data/12-menu2.ini'); is_deeply($ini->{'AR--Add Transaction'}, {'action' => 'add', 'module' => 'ar.pl'}, 'add_file: Second file added, old leaf correct'); is_deeply($ini->{'AR--foo'}, {'module' => 'am.pl'}, 'add_file: Second file added, new leaf correct'); is_deeply($ini->{'ORDER'}, ['AR', 'AR--Add Transaction', 'section', 'AR--foo'], 'add_file: Second file added, order correct'); $ini = Menu->new('t/data/12-menu2.ini'); ok(defined $ini, 'new: File provided'); isa_ok($ini, 'Menu', 'new: File provided gives correct type'); is_deeply($ini->{'AR--foo'}, {'module' => 'am.pl'}, 'new: File provided, leaf correct'); is_deeply($ini->{'ORDER'}, ['section', 'AR--foo'], 'new: File provided, order correct'); $ini->add_file('t/data/12-menu3.ini'); is_deeply($ini->{'AR--foo'}, {'module' => 'ax.pl'}, 'add_file: Data re-added, leaf correct, not duplicated'); is_deeply($ini->{'ORDER'}, ['section', 'AR--foo'], 'add_file: Data re-added, order correct, not duplicated'); # menuitem checks $form = new Form; $form->{script} = 'tt.pl'; $form->{tag} = '1'; $myconfig = {'login' => 'testuser', 'numberformat' => '1000.00'}; $ini = new Menu('t/data/12-menu4.ini'); is_deeply($ini->{'AR--foo'}, {'module' => 'ax.pl', 'action' => 'add', 'type' => 'foo'}, 'new: Data for menu item test 1 correct'); is_deeply($ini->{'New Window'}, {'target' => '_blank'}, 'new: Data for menu item test 2 correct'); is_deeply($ini->{'Website'}, {'href' => 'ledgersmb.org'}, 'new: Data for menu item test 3 correct'); is_deeply($ini->{'AR--test'}, {'module' => 'test', 'apples' => 'login=', 'pears' => 'numberformat=2'}, 'new: Data for menu item test 4 correct'); is_deeply($ini->{'AR'}, {'target' => 'acc_menu', 'type' => 'test'}, 'new: Data for menu item test 5 correct'); is($ini->menuitem($myconfig, $form, 'AR--foo'), '', 'menuitem: Menu item test 1, base'); ok(!defined $ini->{'AR--foo'}->{'module'}, 'menuitem: Deleted module'); ok(!defined $ini->{'AR--foo'}->{'action'}, 'menuitem: Deleted action'); is($ini->menuitem($myconfig, $form, 'New Window'), '', 'menuitem: Menu item test 2, target'); is($ini->menuitem($myconfig, $form, 'Website'), '', 'menuitem: Menu item test 3, href'); ok(!defined $ini->{'Website'}->{'href'}, 'menuitem: Deleted href'); $form->{menubar} = 1; is($ini->menuitem($myconfig, $form, 'AR--test'), '', 'menuitem: Menu item test 4, myconfig substitutions'); is($ini->menuitem($myconfig, $form, 'AR'), '', 'menuitem: Menu item test 5, acc_menu'); ok(!defined $ini->{'AR'}->{'target'}, 'menuitem: Deleted target'); # access_control check $myconfig = {'acs' => 'AR--test'}; $ini = new Menu('t/data/12-menu4.ini'); is_deeply([$ini->access_control($myconfig)], ['AR', 'New Window', 'Website'], 'access_control: Single item, not top exclusion, top'); is_deeply([$ini->access_control($myconfig, 'AR')], ['AR--foo'], 'access_control: Single item, not top exclusion, submenu'); $myconfig = {'acs' => 'Website'}; is_deeply([$ini->access_control($myconfig)], ['AR', 'New Window'], 'access_control: Single item, top exclusion, top'); is_deeply([$ini->access_control($myconfig, 'AR')], ['AR--foo', 'AR--test'], 'access_control: Single item, top exclusion, sub menu'); $myconfig = {'acs' => 'AR--test;AR--foo;New Window'}; is_deeply([$ini->access_control($myconfig)], ['AR', 'Website'], 'access_control: Multiple items, top'); is_deeply([$ini->access_control($myconfig, 'AR')], [], 'access_control: Multiple items, sub menu'); $myconfig = {'acs' => 'AR'}; is_deeply([$ini->access_control($myconfig)], ['New Window', 'Website'], 'access_control: Top menu exclusion, top'); is_deeply([$ini->access_control($myconfig, 'AR')], ['AR--foo', 'AR--test'], 'access_control: Top menu exclusion, sub menu'); # file not found check SKIP: { skip 'file not found test, Test::Trap not usable', 2 if $notrap; $ini = new Menu; @r = trap{$ini->add_file('t/data/12-not-a-file')}; is_deeply($ini->{'ORDER'}, [], 'add_file: Non-existent file added, order correct'); like($trap->die, qr|12-not-a-file :|, 'add_file: Non-existent file causes error display'); } ### Gratuitous testing to increase coverage rating ##$ini = undef; ##@r = trap{$ini = Menu::new}; ##isa_ok($ini, 'main', 'new: No type passed gives main type'); ## ##my $pkg = 'foo'; ##$ini = undef; ##@r = trap{$ini = Menu::new(\$pkg)}; ##like($trap->{warn}[0], qr|has no copy constructor! creating a new object|, ## 'new: Type passed scalar reference'); ##isa_ok($ini, 'SCALAR', 'new: Type passed scalar reference gives SCALAR type'); ##Menu::add_file($ini, 't/data/12-menu1.ini'); ##is_deeply($ini->{'AR--Add Transaction'}, ## {'action' => 'add', 'module' => 'ar.pl'}, ## 'add_file: File added to SCALAR, leaf correct'); ##is_deeply($ini->{'ORDER'}, ## ['AR', 'AR--Add Transaction'], ## 'add_file: File added to SCALAR, order correct');