X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=t%2Fhelper%2Fcsv.t;h=b9785000d13fc807d2e79c0f1bebd449cad5ca7e;hb=4301055997c4d0cd963758acdb7a04ba325fa8bc;hp=cd486ade41cf95788ae26377dc1eb3f2c07fbaba;hpb=af2053931fb484b246ba42f93df4889c4257ab42;p=kivitendo-erp.git diff --git a/t/helper/csv.t b/t/helper/csv.t index cd486ade4..b9785000d 100644 --- a/t/helper/csv.t +++ b/t/helper/csv.t @@ -1,4 +1,4 @@ -use Test::More tests => 56; +use Test::More tests => 64; use lib 't'; use utf8; @@ -28,7 +28,7 @@ $::myconfig{numberformat} = '1.000,00'; $::myconfig{dateformat} = 'dd.mm.yyyy'; $csv = SL::Helper::Csv->new( - file => \"Kaffee;0.12;12,2;1,5234\n", + file => \"Kaffee;0.12;12,2;1,5234\n", # " # make emacs happy header => [[ 'description', 'sellprice', 'lastcost_as_number', 'listprice' ]], profile => [{profile => { listprice => 'listprice_as_number' }, class => 'SL::DB::Part',}], @@ -106,6 +106,7 @@ $csv = SL::Helper::Csv->new( Kaffee;;0.12;1,221.52 Beer;1123245;0.12;1.5234 EOL +# " # make emacs happy numberformat => '1,000.00', profile => [{class => 'SL::DB::Part'}], ); @@ -119,6 +120,7 @@ description;partnumber;sellprice;lastcost_as_number; "Kaf"fee";;0.12;1,221.52 Beer;1123245;0.12;1.5234 EOL +# " # make emacs happy numberformat => '1,000.00', profile => [{class => 'SL::DB::Part'}], ); @@ -270,7 +272,7 @@ is_deeply( ($csv->errors)[0], [ 'description', undef, 'header field \'descriptio ##### $csv = SL::Helper::Csv->new( - file => \"Kaffee", + file => \"Kaffee", # " # make emacs happy header => [[ 'description' ]], profile => [{class => 'SL::DB::Part'}], ); @@ -280,9 +282,12 @@ is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'eol bug at the end o ##### $csv = SL::Helper::Csv->new( - file => \"Description\nKaffee", + file => \"Description\nKaffee", # " # make emacs happy case_insensitive_header => 1, - profile => {profile => { description => 'description' }, class => 'SL::DB::Part'}, + profile => [{ + profile => { description => 'description' }, + class => 'SL::DB::Part' + }], ); $csv->parse; is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive header from csv works'; @@ -290,10 +295,13 @@ is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive hea ##### $csv = SL::Helper::Csv->new( - file => \"Kaffee", - header => [ 'Description' ], + file => \"Kaffee", # " # make emacs happy + header => [[ 'Description' ]], case_insensitive_header => 1, - profile => {profile => { description => 'description' }, class => 'SL::DB::Part'}, + profile => [{ + profile => { description => 'description' }, + class => 'SL::DB::Part' + }], ); $csv->parse; is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive header as param works'; @@ -301,7 +309,7 @@ is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive hea ##### $csv = SL::Helper::Csv->new( - file => \"\x{EF}\x{BB}\x{BF}description\nKaffee", + file => \"\x{EF}\x{BB}\x{BF}description\nKaffee", # " # make emacs happy profile => [{class => 'SL::DB::Part'}], encoding => 'utf8', ); @@ -311,8 +319,8 @@ is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'utf8 BOM works (bug ##### $csv = SL::Helper::Csv->new( - file => \"Kaffee", - header => [ 'Description' ], + file => \"Kaffee", # " # make emacs happy + header => [[ 'Description' ]], profile => [{class => 'SL::DB::Part'}], ); $csv->parse; @@ -321,10 +329,12 @@ 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 => '' }, + file => \"Kaffee", # " # make emacs happy + header => [[ 'foo' ]], + profile => [{ + profile => { foo => '' }, + class => 'SL::DB::Part', + }], ); $csv->parse; @@ -334,11 +344,13 @@ 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', + file => \"Kaffee", # " # make emacs happy + header => [[ 'foo' ]], strict_profile => 1, - profile => { foo => '' }, + profile => [{ + profile => { foo => '' }, + class => 'SL::DB::Part', + }], ); $csv->parse; @@ -346,26 +358,201 @@ is_deeply $csv->get_data, [ { foo => 'Kaffee' } ], 'empty path still gets parsed 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', + file => \"Phil", # " # make emacs happy + header => [[ 'CVAR_grOUnDHog' ]], strict_profile => 1, case_insensitive_header => 1, - profile => { cvar_Groundhog => '' }, + profile => [{ + profile => { cvar_Groundhog => '' }, + class => 'SL::DB::Part', + }], + ); $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", + file => \"description\nKaffee", # " # make emacs happy ); $csv->parse; is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'without profile and class works'; +##### +$csv = SL::Helper::Csv->new( + file => \"Kaffee;1,50\nSchoke;0,89\n", + header => [ + [ 'datatype', 'description', 'sellprice' ], + ], + profile => [ + { profile => { sellprice => 'sellprice_as_number' }, + class => 'SL::DB::Part',} + ], +); + +ok $csv->_check_multiplexed, 'multiplex check works on not-multiplexed data'; +ok !$csv->is_multiplexed, 'not-multiplexed data is recognized'; + +##### +$csv = SL::Helper::Csv->new( + file => \"P;Kaffee;1,50\nC;Meier\n", + header => [ + [ 'datatype', 'description', 'listprice' ], + [ 'datatype', 'name' ], + ], + profile => [ + { profile => { listprice => 'listprice_as_number' }, + class => 'SL::DB::Part', + row_ident => 'P' }, + { class => 'SL::DB::Customer', + row_ident => 'C' } + ], +); + +ok $csv->_check_multiplexed, 'multiplex check works on multiplexed data'; +ok $csv->is_multiplexed, 'multiplexed data is recognized'; + +##### +$csv = SL::Helper::Csv->new( + file => \"P;Kaffee;1,50\nC;Meier\n", + header => [ + [ 'datatype', 'description', 'listprice' ], + [ 'datatype', 'name' ], + ], + profile => [ + { profile => { listprice => 'listprice_as_number' }, + class => 'SL::DB::Part', }, + { class => 'SL::DB::Customer', + row_ident => 'C' } + ], +); + +ok !$csv->_check_multiplexed, 'multiplex check works on multiplexed data and detects missing row_ident'; + +##### +$csv = SL::Helper::Csv->new( + file => \"P;Kaffee;1,50\nC;Meier\n", + header => [ + [ 'datatype', 'description', 'listprice' ], + [ 'datatype', 'name' ], + ], + profile => [ + { profile => { listprice => 'listprice_as_number' }, + row_ident => 'P' }, + { class => 'SL::DB::Customer', + row_ident => 'C' } + ], +); + +ok !$csv->_check_multiplexed, 'multiplex check works on multiplexed data and detects missing class'; + +##### +$csv = SL::Helper::Csv->new( + file => \"P;Kaffee;1,50\nC;Meier\n", # " # make emacs happy + header => [ + [ 'datatype', 'description', 'listprice' ], + ], + profile => [ + { profile => { listprice => 'listprice_as_number' }, + class => 'SL::DB::Part', + row_ident => 'P' }, + { class => 'SL::DB::Customer', + row_ident => 'C' } + ], +); + +ok !$csv->_check_multiplexed, 'multiplex check works on multiplexed data and detects missing header'; + +##### + +$csv = SL::Helper::Csv->new( + file => \"P;Kaffee;1,50\nC;Meier\n", # " # make emacs happy + header => [ + [ 'datatype', 'description', 'listprice' ], + [ 'datatype', 'name' ], + ], + profile => [ + { profile => { listprice => 'listprice_as_number' }, + class => 'SL::DB::Part', + row_ident => 'P' }, + { class => 'SL::DB::Customer', + row_ident => 'C' } + ], + ignore_unknown_columns => 1, +); + +$csv->parse; +is_deeply $csv->get_data, + [ { datatype => 'P', description => 'Kaffee', listprice => '1,50' }, { datatype => 'C', name => 'Meier' } ], + 'multiplex: simple case works'; +is scalar @{ $csv->get_objects }, 2, 'multiplex: multiple objects work'; +is $csv->get_objects->[0]->description, 'Kaffee', 'multiplex: first object'; +is $csv->get_objects->[1]->name, 'Meier', 'multiplex: second object'; + +##### + +$csv = SL::Helper::Csv->new( + file => \"datatype;description;listprice\ndatatype;name\nP;Kaffee;1,50\nC;Meier\n", # " # make emacs happy + profile => [ + { profile => { listprice => 'listprice_as_number' }, + class => 'SL::DB::Part', + row_ident => 'P' }, + { class => 'SL::DB::Customer', + row_ident => 'C' } + ], + ignore_unknown_columns => 1, +); + +$csv->parse; +is scalar @{ $csv->get_objects }, 2, 'multiplex: auto header works'; +is $csv->get_objects->[0]->description, 'Kaffee', 'multiplex: auto header first object'; +is $csv->get_objects->[1]->name, 'Meier', 'multiplex: auto header second object'; + +###### + +$csv = SL::Helper::Csv->new( + file => \< [ + {class => 'SL::DB::Part', row_ident => 'P'}, + {class => 'SL::DB::Customer', row_ident => 'C'}, + ], + ignore_unknown_columns => 1, +); +is $csv->parse, undef, 'multiplex: broken csv header won\'t get parsed'; + +###### + +$csv = SL::Helper::Csv->new( + file => \< [ + {class => 'SL::DB::Part', row_ident => 'P'}, + {class => 'SL::DB::Customer', row_ident => 'C'}, + ], + header => [ [], ['name'] ], + ignore_unknown_columns => 1, +); +ok !$csv->_check_multiplexed, 'multiplex check detects empty header'; + + # vim: ft=perl # set emacs to perl mode # Local Variables: # mode: perl # End: +