X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=t%2Fhelper%2Fcsv.t;h=95ca14b36344c733d0e5f43015a4d5c3177bfd24;hb=94f5cb152afa9210162295b6727801c296af0631;hp=30a3c3a37ad8864fbc44833ea31364dc5bd8179a;hpb=de4b1e970660f9ab8ef22e357cc87639cb9be85e;p=kivitendo-erp.git diff --git a/t/helper/csv.t b/t/helper/csv.t index 30a3c3a37..95ca14b36 100644 --- a/t/helper/csv.t +++ b/t/helper/csv.t @@ -1,4 +1,4 @@ -use Test::More tests => 71; +use Test::More tests => 91; use lib 't'; use utf8; @@ -12,7 +12,7 @@ Support::TestSetup::login(); my $csv = SL::Helper::Csv->new( file => \"Kaffee\n", # " # make emacs happy - header => [[ 'description' ]], + header => [ 'description' ], profile => [{ class => 'SL::DB::Part', }], ); @@ -29,7 +29,7 @@ $::myconfig{dateformat} = 'dd.mm.yyyy'; $csv = SL::Helper::Csv->new( file => \"Kaffee;0.12;12,2;1,5234\n", # " # make emacs happy - header => [[ 'description', 'sellprice', 'lastcost_as_number', 'listprice' ]], + header => [ 'description', 'sellprice', 'lastcost_as_number', 'listprice' ], profile => [{profile => { listprice => 'listprice_as_number' }, class => 'SL::DB::Part',}], ); @@ -141,7 +141,7 @@ EOL profile => [{class => 'SL::DB::Part'}], ); $csv->parse; -is $csv->get_objects->[0]->lastcost, '1221.52', 'ignore_unkown_columns works'; +is $csv->get_objects->[0]->lastcost, '1221.52', 'ignore_unknown_columns works'; ##### @@ -273,7 +273,7 @@ is_deeply( ($csv->errors)[0], [ 'description', undef, 'header field \'descriptio $csv = SL::Helper::Csv->new( file => \"Kaffee", # " # make emacs happy - header => [[ 'description' ]], + header => [ 'description' ], profile => [{class => 'SL::DB::Part'}], ); $csv->parse; @@ -296,7 +296,7 @@ is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive hea $csv = SL::Helper::Csv->new( file => \"Kaffee", # " # make emacs happy - header => [[ 'Description' ]], + header => [ 'Description' ], case_insensitive_header => 1, profile => [{ profile => { description => 'description' }, @@ -320,7 +320,7 @@ is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'utf8 BOM works (bug $csv = SL::Helper::Csv->new( file => \"Kaffee", # " # make emacs happy - header => [[ 'Description' ]], + header => [ 'Description' ], profile => [{class => 'SL::DB::Part'}], ); $csv->parse; @@ -330,7 +330,7 @@ is_deeply $csv->get_data, undef, 'case insensitive header without flag ignores'; $csv = SL::Helper::Csv->new( file => \"Kaffee", # " # make emacs happy - header => [[ 'foo' ]], + header => [ 'foo' ], profile => [{ profile => { foo => '' }, class => 'SL::DB::Part', @@ -345,7 +345,7 @@ ok $csv->get_objects->[0], 'empty path gets ignored in object creation'; $csv = SL::Helper::Csv->new( file => \"Kaffee", # " # make emacs happy - header => [[ 'foo' ]], + header => [ 'foo' ], strict_profile => 1, profile => [{ profile => { foo => '' }, @@ -359,7 +359,7 @@ ok $csv->get_objects->[0], 'empty path gets ignored in object creation (strict p $csv = SL::Helper::Csv->new( file => \"Phil", # " # make emacs happy - header => [[ 'CVAR_grOUnDHog' ]], + header => [ 'CVAR_grOUnDHog' ], strict_profile => 1, case_insensitive_header => 1, profile => [{ @@ -382,6 +382,39 @@ $csv->parse; is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'without profile and class works'; ##### + +$csv = SL::Helper::Csv->new( + file => \<parse; +is_deeply $csv->get_data, [ {partnumber => 1, description => 'Kaffee'}, {partnumber => '', description => ' '}, {partnumber => 3, description => 'Tee'} ], 'ignoring empty lines works (header in csv file)'; + +##### + +$csv = SL::Helper::Csv->new( + file => \< ['description', 'partnumber'], +); +ok $csv->parse; +is_deeply $csv->get_data, [ {partnumber => 1, description => 'Kaffee'}, {partnumber => '', description => ' '}, {partnumber => 3, description => 'Tee'} ], 'ignoring empty lines works'; + +##### + $csv = SL::Helper::Csv->new( file => \"Kaffee;1,50\nSchoke;0,89\n", header => [ @@ -551,6 +584,55 @@ ok !$csv->_check_multiplexed, 'multiplex check detects empty header'; ##### +$csv = SL::Helper::Csv->new( + file => \ Encode::encode('utf-8', < [ + {class => 'SL::DB::Part', row_ident => 'P'}, + {class => 'SL::DB::Customer', row_ident => 'C'}, + ], + ignore_unknown_columns => 1, +); +$csv->parse; +is $csv->_multiplex_datatype_position, 2, 'multiplex check detects datatype field position right'; + +is_deeply $csv->get_data, [ { datatype => 'P', description => 'Kaffee', longdescription => 'lecker Kaffee' }, + { datatype => 'C', name => 'Meier', customernumber => 1}, + { datatype => 'P', description => 'Bier', longdescription => 'kühles Bier' }, + { datatype => 'C', name => 'Mueller', customernumber => 2} + ], + 'multiplex: datatype not at first position works'; + +##### + +$csv = SL::Helper::Csv->new( + file => \ Encode::encode('utf-8', < [ + {class => 'SL::DB::Part', row_ident => 'P'}, + {class => 'SL::DB::Customer', row_ident => 'C'}, + ], + ignore_unknown_columns => 1, +); +ok !$csv->parse, 'multiplex check detects incosistent datatype field position'; +is_deeply( ($csv->errors)[0], [ undef, 0, 'datatype field must be at the same position for all datatypes for multiplexed data', 0, 0 ], 'multiplex data with inconsistent datatype field posiotion throws error'); + +##### + $csv = SL::Helper::Csv->new( file => \"Datatype;Description\nDatatype;Name\nP;Kaffee\nC;Meier", # " # make emacs happy case_insensitive_header => 1, @@ -579,6 +661,7 @@ $csv = SL::Helper::Csv->new( file => \"P;Kaffee\nC;Meier", # " # make emacs happy header => [[ 'Datatype', 'Description' ], [ 'Datatype', 'Name']], case_insensitive_header => 1, + ignore_unknown_columns => 1, profile => [ { profile => { datatype => 'datatype', description => 'description' }, @@ -676,10 +759,146 @@ ok $csv->get_objects->[0], 'multiplex: empty path gets ignored in object creatio ##### +$csv = SL::Helper::Csv->new( + file => \< 1, + profile => [ { class => 'SL::DB::Customer', row_ident => 'C' }, + { class => 'SL::DB::Part', row_ident => 'P' }, + ], +); +$csv->parse; +is_deeply $csv->get_data, [ + {datatype => 'C', customernumber => 1000, name => 'Meier'}, + {datatype => 'P', partnumber => 1, description => 'Kaffee'}, + {datatype => 'C', customernumber => undef, name => undef}, + {datatype => 'P', partnumber => '', description => ' '}, + {datatype => 'C', customernumber => 2000, name => 'Meister'}, + {datatype => 'P', partnumber => '3', description => 'Tee'}, +], 'ignoring empty lines works (multiplex data)'; + +##### + +# Mappings +# simple case +$csv = SL::Helper::Csv->new( + file => \< ',', + quote_char => "'", + profile => [ + { + profile => { listprice => 'listprice_as_number' }, + mapping => { purchaseprice => 'listprice' }, + class => 'SL::DB::Part', + } + ], +); +ok $csv->parse, 'simple mapping parses'; +is $csv->get_objects->[0]->listprice, 1.5234, 'simple mapping works'; + +$csv = SL::Helper::Csv->new( + file => \< '1,000.00', + ignore_unknown_columns => 1, + strict_profile => 1, + profile => [{ + profile => { lastcost => 'lastcost_as_number' }, + mapping => { purchaseprice => 'lastcost' }, + class => 'SL::DB::Part', + }] +); +ok $csv->parse, 'strict mapping parses'; +is $csv->get_objects->[0]->lastcost, 1221.52, 'strict mapping works'; + +# swapping +$csv = SL::Helper::Csv->new( + file => \< '1,000.00', + ignore_unknown_columns => 1, + strict_profile => 1, + profile => [{ + mapping => { partnumber => 'description', description => 'partnumber' }, + class => 'SL::DB::Part', + }] +); +ok $csv->parse, 'swapping parses'; +is $csv->get_objects->[0]->partnumber, 'Kaffee', 'strict mapping works 1'; +is $csv->get_objects->[0]->description, '1', 'strict mapping works 2'; + +# case insensitive shit +$csv = SL::Helper::Csv->new( + file => \"Description\nKaffee", # " # make emacs happy + case_insensitive_header => 1, + profile => [{ + mapping => { description => 'description' }, + class => 'SL::DB::Part' + }], +); +$csv->parse; +is $csv->get_objects->[0]->description, 'Kaffee', 'case insensitive mapping without profile works'; + +# case insensitive shit +$csv = SL::Helper::Csv->new( + file => \"Price\n4,99", # " # make emacs happy + case_insensitive_header => 1, + profile => [{ + profile => { sellprice => 'sellprice_as_number' }, + mapping => { price => 'sellprice' }, + class => 'SL::DB::Part', + }], +); +$csv->parse; +is $csv->get_objects->[0]->sellprice, 4.99, 'case insensitive mapping with profile works'; + + +# self-mapping with profile +$csv = SL::Helper::Csv->new( + file => \"sellprice\n4,99", # " # make emacs happy + case_insensitive_header => 1, + profile => [{ + profile => { sellprice => 'sellprice_as_number' }, + mapping => { sellprice => 'sellprice' }, + class => 'SL::DB::Part', + }], +); +$csv->parse; +is $csv->get_objects->[0]->sellprice, 4.99, 'self-mapping with profile works'; + +# self-mapping without profile +$csv = SL::Helper::Csv->new( + file => \"sellprice\n4.99", # " # make emacs happy + case_insensitive_header => 1, + profile => [{ + mapping => { sellprice => 'sellprice' }, + class => 'SL::DB::Part', + }], +); +$csv->parse; +is $csv->get_objects->[0]->sellprice, 4.99, 'self-mapping without profile works'; # vim: ft=perl # set emacs to perl mode # Local Variables: # mode: perl # End: -