X-Git-Url: http://wagnertech.de/git?p=kivitendo-erp.git;a=blobdiff_plain;f=t%2Fhelper%2Fcsv.t;fp=t%2Fhelper%2Fcsv.t;h=95ca14b36344c733d0e5f43015a4d5c3177bfd24;hp=bab3825df595fd24586336c86d0ea3aa2d2d5e70;hb=53593baa211863fbf66540cf1bcc36c8fb37257f;hpb=deb4d2dbb676d7d6f69dfe7815d6e0cb09bd4a44 diff --git a/t/helper/csv.t b/t/helper/csv.t index bab3825df..95ca14b36 100644 --- a/t/helper/csv.t +++ b/t/helper/csv.t @@ -1,4 +1,4 @@ -use Test::More tests => 75; +use Test::More tests => 91; use lib 't'; use utf8; @@ -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'; ##### @@ -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 => [ @@ -596,7 +629,7 @@ EOL ignore_unknown_columns => 1, ); ok !$csv->parse, 'multiplex check detects incosistent datatype field position'; -is_deeply( ($csv->errors)[0], [ 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'); +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'); ##### @@ -726,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: -