X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/72b340de2352eec7d3f99a00e2141a2df35f07f3..c8473408202bb3b821a14cee9f8945405d8eeffc:/t/helper/csv.t diff --git a/t/helper/csv.t b/t/helper/csv.t index 434626f8f..972b3adb3 100644 --- a/t/helper/csv.t +++ b/t/helper/csv.t @@ -1,14 +1,19 @@ -use Test::More tests => 39; -use SL::Dispatcher; -use Data::Dumper; +use Test::More tests => 47; + +use lib 't'; use utf8; +use Data::Dumper; +use Support::TestSetup; + use_ok 'SL::Helper::Csv'; -my $csv; -$csv = SL::Helper::Csv->new( - file => \"Kaffee\n", - header => [ 'description' ], +Support::TestSetup::login(); + +my $csv = SL::Helper::Csv->new( + file => \"Kaffee\n", + header => [ 'description' ], + profile => { class => 'SL::DB::Part', }, ); isa_ok $csv->_csv, 'Text::CSV_XS'; @@ -16,23 +21,17 @@ isa_ok $csv->_io, 'IO::File'; isa_ok $csv->parse, 'SL::Helper::Csv', 'parsing returns self'; is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'simple case works'; -$csv->class('SL::DB::Part'); - is $csv->get_objects->[0]->description, 'Kaffee', 'get_object works'; #### -SL::Dispatcher::pre_startup_setup(); - -$::form = Form->new; $::myconfig{numberformat} = '1.000,00'; $::myconfig{dateformat} = 'dd.mm.yyyy'; -$::locale = Locale->new('de'); $csv = SL::Helper::Csv->new( - file => \"Kaffee;0.12;12,2;1,5234\n", - header => [ 'description', 'sellprice', 'lastcost_as_number', 'listprice' ], - dispatch => { listprice => 'listprice_as_number' }, - class => 'SL::DB::Part', + file => \"Kaffee;0.12;12,2;1,5234\n", + header => [ 'description', 'sellprice', 'lastcost_as_number', 'listprice' ], + profile => {profile => { listprice => 'listprice_as_number' }, + class => 'SL::DB::Part',}, ); $csv->parse; @@ -50,8 +49,8 @@ Kaffee,0.12,'12,2','1,5234' EOL sep_char => ',', quote_char => "'", - dispatch => { listprice => 'listprice_as_number' }, - class => 'SL::DB::Part', + profile => {profile => { listprice => 'listprice_as_number' }, + class => 'SL::DB::Part',} ); $csv->parse; is scalar @{ $csv->get_objects }, 1, 'auto header works'; @@ -65,7 +64,7 @@ $csv = SL::Helper::Csv->new( ;;description;sellprice;lastcost_as_number; #####;Puppy;Kaffee;0.12;12,2;1,5234 EOL - class => 'SL::DB::Part', + profile => {class => 'SL::DB::Part'}, ); $csv->parse; is scalar @{ $csv->get_objects }, 1, 'bozo header doesn\'t blow things up'; @@ -78,7 +77,7 @@ description;partnumber;sellprice;lastcost_as_number; Kaffee;;0.12;12,2;1,5234 Beer;1123245;0.12;12,2;1,5234 EOL - class => 'SL::DB::Part', + profile => {class => 'SL::DB::Part'}, ); $csv->parse; is scalar @{ $csv->get_objects }, 2, 'multiple objects work'; @@ -94,7 +93,7 @@ Kaffee;;0.12;1,221.52 Beer;1123245;0.12;1.5234 EOL numberformat => '1,000.00', - class => 'SL::DB::Part', + profile => {class => 'SL::DB::Part'}, ); $csv->parse; is $csv->get_objects->[0]->lastcost, '1221.52', 'formatnumber'; @@ -108,7 +107,7 @@ Kaffee;;0.12;1,221.52 Beer;1123245;0.12;1.5234 EOL numberformat => '1,000.00', - class => 'SL::DB::Part', + profile => {class => 'SL::DB::Part'}, ); is $csv->parse, undef, 'broken csv header won\'t get parsed'; @@ -121,7 +120,7 @@ description;partnumber;sellprice;lastcost_as_number; Beer;1123245;0.12;1.5234 EOL numberformat => '1,000.00', - class => 'SL::DB::Part', + profile => {class => 'SL::DB::Part'}, ); is $csv->parse, undef, 'broken csv content won\'t get parsed'; is_deeply $csv->errors, [ '"Kaf"fee";;0.12;1,221.52'."\n", 2023, 'EIQ - QUO character not allowed', 5, 2 ], 'error'; @@ -137,7 +136,7 @@ Beer;1123245;0.12;1.5234;nein kein wieder EOL numberformat => '1,000.00', ignore_unknown_columns => 1, - class => 'SL::DB::Part', + profile => {class => 'SL::DB::Part'}, ); $csv->parse; is $csv->get_objects->[0]->lastcost, '1221.52', 'ignore_unkown_columns works'; @@ -151,9 +150,9 @@ Kaffee;;0.12;1,221.52;Standard 7% Beer;1123245;0.12;1.5234;16 % EOL numberformat => '1,000.00', - class => 'SL::DB::Part', profile => { - buchungsgruppe => "buchungsgruppen.description", + profile => {buchungsgruppe => "buchungsgruppen.description"}, + class => 'SL::DB::Part', } ); $csv->parse; @@ -170,11 +169,13 @@ description;partnumber;sellprice;lastcost_as_number;make_1;model_1; Beer;1123245;0.12;1.5234; EOL numberformat => '1,000.00', - class => 'SL::DB::Part', profile => { - make_1 => "makemodels.0.make", - model_1 => "makemodels.0.model", - } + profile => { + make_1 => "makemodels.0.make", + model_1 => "makemodels.0.model", + }, + class => 'SL::DB::Part', + }, ); $csv->parse; my @mm = $csv->get_objects->[0]->makemodel; @@ -190,19 +191,21 @@ description;partnumber;sellprice;lastcost_as_number;make_1;model_1;make_2;model_ Kaffee;;0.12;1,221.52;213;Chair 0815;523;Table 15 EOL numberformat => '1,000.00', - class => 'SL::DB::Part', profile => { - make_1 => "makemodels.0.make", - model_1 => "makemodels.0.model", - make_2 => "makemodels.1.make", - model_2 => "makemodels.1.model", + profile => { + make_1 => "makemodels.0.make", + model_1 => "makemodels.0.model", + make_2 => "makemodels.1.make", + model_2 => "makemodels.1.model", + }, + class => 'SL::DB::Part', } ); $csv->parse; print Dumper($csv->errors); -my @mm = $csv->get_objects->[0]->makemodel; +@mm = $csv->get_objects->[0]->makemodel; is scalar @mm, 1, 'multiple one-to-many dispatch'; is $csv->get_objects->[0]->makemodels->[0]->model, 'Chair 0815', '...check 1'; is $csv->get_objects->[0]->makemodels->[0]->make, '213', '...check 2'; @@ -216,9 +219,9 @@ $csv = SL::Helper::Csv->new( description;partnumber;sellprice;lastcost_as_number;buchungsgruppe; EOL numberformat => '1,000.00', - class => 'SL::DB::Part', profile => { - buchungsgruppe => "buchungsgruppen.1.description", + profile => {buchungsgruppe => "buchungsgruppen.1.description"}, + class => 'SL::DB::Part', } ); is $csv->parse, undef, 'wrong profile gets rejected'; @@ -236,9 +239,9 @@ EOL numberformat => '1,000.00', ignore_unknown_columns => 1, strict_profile => 1, - class => 'SL::DB::Part', profile => { - lastcost => 'lastcost_as_number', + profile => {lastcost => 'lastcost_as_number'}, + class => 'SL::DB::Part', } ); $csv->parse; @@ -255,9 +258,9 @@ Beer;1123245;0.12;1.5234;nein kein wieder EOL numberformat => '1,000.00', strict_profile => 1, - class => 'SL::DB::Part', profile => { - lastcost => 'lastcost_as_number', + profile => {lastcost => 'lastcost_as_number'}, + class => 'SL::DB::Part', } ); $csv->parse; @@ -269,7 +272,7 @@ is_deeply( ($csv->errors)[0], [ 'description', undef, 'header field \'descriptio $csv = SL::Helper::Csv->new( file => \"Kaffee", header => [ 'description' ], - class => 'SL::DB::Part', + profile => {class => 'SL::DB::Part'}, ); $csv->parse; is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'eol bug at the end of files'; @@ -278,7 +281,8 @@ is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'eol bug at the end o $csv = SL::Helper::Csv->new( file => \"Description\nKaffee", - class => 'SL::DB::Part', + case_insensitive_header => 1, + profile => {profile => { description => 'description' }, class => 'SL::DB::Part'}, ); $csv->parse; is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive header from csv works'; @@ -288,9 +292,76 @@ is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive hea $csv = SL::Helper::Csv->new( file => \"Kaffee", header => [ 'Description' ], - class => 'SL::DB::Part', + case_insensitive_header => 1, + profile => {profile => { description => 'description' }, class => 'SL::DB::Part'}, ); $csv->parse; is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive header as param works'; +##### + +$csv = SL::Helper::Csv->new( + file => \"\x{EF}\x{BB}\x{BF}description\nKaffee", + profile => {class => 'SL::DB::Part'}, + encoding => 'utf8', +); +$csv->parse; +is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'utf8 BOM works (bug 1872)'; + +##### + +$csv = SL::Helper::Csv->new( + file => \"Kaffee", + header => [ 'Description' ], + class => 'SL::DB::Part', +); +$csv->parse; +is_deeply $csv->get_data, undef, 'case insensitive header without flag ignores'; + +##### + +$csv = SL::Helper::Csv->new( + file => \"Kaffee", + header => [ 'foo' ], + class => 'SL::DB::Part', + profile => { foo => '' }, +); +$csv->parse; + +is_deeply $csv->get_data, [ { foo => 'Kaffee' } ], 'empty path still gets parsed into data'; +ok $csv->get_objects->[0], 'empty path gets ignored in object creation'; + +##### + +$csv = SL::Helper::Csv->new( + file => \"Kaffee", + header => [ 'foo' ], + class => 'SL::DB::Part', + strict_profile => 1, + profile => { foo => '' }, +); +$csv->parse; + +is_deeply $csv->get_data, [ { foo => 'Kaffee' } ], 'empty path still gets parsed into data (strict profile)'; +ok $csv->get_objects->[0], 'empty path gets ignored in object creation (strict profile)'; + +$csv = SL::Helper::Csv->new( + file => \"Phil", + header => [ 'CVAR_grOUnDHog' ], + class => 'SL::DB::Part', + strict_profile => 1, + case_insensitive_header => 1, + profile => { cvar_Groundhog => '' }, +); +$csv->parse; + +is_deeply $csv->get_data, [ { cvar_Groundhog => 'Phil' } ], 'using empty path to get cvars working'; +ok $csv->get_objects->[0], '...and not destorying the objects'; + +$csv = SL::Helper::Csv->new( + file => \"description\nKaffee", +); +$csv->parse; +is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'without profile and class works'; + # vim: ft=perl