X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=t%2Fhelper%2Fcsv.t;h=95ca14b36344c733d0e5f43015a4d5c3177bfd24;hb=45ee0662e55cf328d365c1662694cc1b333c723d;hp=088ed68ab3b447339e6c9a368c9903bb1d4d8197;hpb=b8f9149b04ff28fb4747cfdf702aaed8f07a853e;p=kivitendo-erp.git diff --git a/t/helper/csv.t b/t/helper/csv.t index 088ed68ab..95ca14b36 100644 --- a/t/helper/csv.t +++ b/t/helper/csv.t @@ -1,4 +1,4 @@ -use Test::More tests => 47; +use Test::More tests => 91; use lib 't'; use utf8; @@ -11,9 +11,9 @@ use_ok 'SL::Helper::Csv'; Support::TestSetup::login(); my $csv = SL::Helper::Csv->new( - file => \"Kaffee\n", - header => [ 'description' ], - class => 'SL::DB::Part', + file => \"Kaffee\n", # " # make emacs happy + header => [ 'description' ], + profile => [{ class => 'SL::DB::Part', }], ); isa_ok $csv->_csv, 'Text::CSV_XS'; @@ -28,10 +28,10 @@ $::myconfig{numberformat} = '1.000,00'; $::myconfig{dateformat} = 'dd.mm.yyyy'; $csv = SL::Helper::Csv->new( - file => \"Kaffee;0.12;12,2;1,5234\n", - header => [ 'description', 'sellprice', 'lastcost_as_number', 'listprice' ], - profile => { listprice => 'listprice_as_number' }, - class => 'SL::DB::Part', + 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',}], ); $csv->parse; @@ -49,8 +49,8 @@ Kaffee,0.12,'12,2','1,5234' EOL sep_char => ',', quote_char => "'", - profile => { 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'; @@ -64,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'; @@ -77,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'; @@ -93,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'; @@ -106,8 +106,9 @@ $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', - class => 'SL::DB::Part', + profile => [{class => 'SL::DB::Part'}], ); is $csv->parse, undef, 'broken csv header won\'t get parsed'; @@ -119,8 +120,9 @@ 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', - 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'; @@ -136,10 +138,10 @@ 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'; +is $csv->get_objects->[0]->lastcost, '1221.52', 'ignore_unknown_columns works'; ##### @@ -150,10 +152,10 @@ 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 => [{ + profile => {buchungsgruppe => "buchungsgruppen.description"}, + class => 'SL::DB::Part', + }] ); $csv->parse; isa_ok $csv->get_objects->[0]->buchungsgruppe, 'SL::DB::Buchungsgruppe', 'deep dispatch auto vivify works'; @@ -169,11 +171,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 => [{ + profile => { + make_1 => "makemodels.0.make", + model_1 => "makemodels.0.model", + }, + class => 'SL::DB::Part', + }], ); $csv->parse; my @mm = $csv->get_objects->[0]->makemodel; @@ -189,13 +193,15 @@ 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 => [{ + 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; @@ -215,10 +221,10 @@ $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 => [{ + profile => {buchungsgruppe => "buchungsgruppen.1.description"}, + class => 'SL::DB::Part', + }] ); is $csv->parse, undef, 'wrong profile gets rejected'; is_deeply $csv->errors, [ 'buchungsgruppen.1.description', undef, "Profile path error. Indexed relationship is not OneToMany around here: 'buchungsgruppen.1'", undef ,0 ], 'error indicates wrong header'; @@ -235,10 +241,10 @@ EOL numberformat => '1,000.00', ignore_unknown_columns => 1, strict_profile => 1, - class => 'SL::DB::Part', - profile => { - lastcost => 'lastcost_as_number', - } + profile => [{ + profile => {lastcost => 'lastcost_as_number'}, + class => 'SL::DB::Part', + }] ); $csv->parse; is $csv->get_objects->[0]->lastcost, '1221.52', 'strict_profile with ignore'; @@ -254,10 +260,10 @@ 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 => [{ + profile => {lastcost => 'lastcost_as_number'}, + class => 'SL::DB::Part', + }] ); $csv->parse; @@ -266,9 +272,9 @@ is_deeply( ($csv->errors)[0], [ 'description', undef, 'header field \'descriptio ##### $csv = SL::Helper::Csv->new( - file => \"Kaffee", - header => [ 'description' ], - class => 'SL::DB::Part', + file => \"Kaffee", # " # make emacs happy + header => [ 'description' ], + profile => [{class => 'SL::DB::Part'}], ); $csv->parse; is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'eol bug at the end of files'; @@ -276,10 +282,12 @@ 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', + file => \"Description\nKaffee", # " # make emacs happy case_insensitive_header => 1, - profile => { description => 'description' }, + profile => [{ + profile => { description => 'description' }, + class => 'SL::DB::Part' + }], ); $csv->parse; is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive header from csv works'; @@ -287,11 +295,13 @@ is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive hea ##### $csv = SL::Helper::Csv->new( - file => \"Kaffee", - header => [ 'Description' ], - class => 'SL::DB::Part', + file => \"Kaffee", # " # make emacs happy + header => [ 'Description' ], case_insensitive_header => 1, - profile => { description => 'description' }, + profile => [{ + profile => { description => 'description' }, + class => 'SL::DB::Part' + }], ); $csv->parse; is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive header as param works'; @@ -299,8 +309,8 @@ is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive hea ##### $csv = SL::Helper::Csv->new( - file => \"\x{EF}\x{BB}\x{BF}description\nKaffee", - class => 'SL::DB::Part', + file => \"\x{EF}\x{BB}\x{BF}description\nKaffee", # " # make emacs happy + profile => [{class => 'SL::DB::Part'}], encoding => 'utf8', ); $csv->parse; @@ -309,9 +319,9 @@ is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'utf8 BOM works (bug ##### $csv = SL::Helper::Csv->new( - file => \"Kaffee", + file => \"Kaffee", # " # make emacs happy header => [ 'Description' ], - class => 'SL::DB::Part', + profile => [{class => 'SL::DB::Part'}], ); $csv->parse; is_deeply $csv->get_data, undef, 'case insensitive header without flag ignores'; @@ -319,10 +329,12 @@ is_deeply $csv->get_data, undef, 'case insensitive header without flag ignores'; ##### $csv = SL::Helper::Csv->new( - file => \"Kaffee", + file => \"Kaffee", # " # make emacs happy header => [ 'foo' ], - class => 'SL::DB::Part', - profile => { foo => '' }, + profile => [{ + profile => { foo => '' }, + class => 'SL::DB::Part', + }], ); $csv->parse; @@ -332,11 +344,13 @@ ok $csv->get_objects->[0], 'empty path gets ignored in object creation'; ##### $csv = SL::Helper::Csv->new( - file => \"Kaffee", + file => \"Kaffee", # " # make emacs happy header => [ 'foo' ], - class => 'SL::DB::Part', strict_profile => 1, - profile => { foo => '' }, + profile => [{ + profile => { foo => '' }, + class => 'SL::DB::Part', + }], ); $csv->parse; @@ -344,16 +358,547 @@ 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", + file => \"Phil", # " # make emacs happy header => [ 'CVAR_grOUnDHog' ], - class => 'SL::DB::Part', 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", # " # make emacs happy +); +$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 => [ + [ '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'; + +##### + +$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, + ignore_unknown_columns => 1, + profile => [ + { + profile => { datatype => 'datatype', description => 'description' }, + class => 'SL::DB::Part', + row_ident => 'P' + }, + { + profile => { datatype => 'datatype', name => 'name' }, + class => 'SL::DB::Customer', + row_ident => 'C' + } + ], +); +$csv->parse; +is_deeply $csv->get_data, [ { datatype => 'P', description => 'Kaffee' }, + { datatype => 'C', name => 'Meier'} ], + 'multiplex: case insensitive header from csv works'; + +##### + +$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' }, + class => 'SL::DB::Part', + row_ident => 'P' + }, + { + profile => { datatype => 'datatype', name => 'name' }, + class => 'SL::DB::Customer', + row_ident => 'C' + } + ], +); +$csv->parse; +is_deeply $csv->get_data, [ { datatype => 'P', description => 'Kaffee' }, + { datatype => 'C', name => 'Meier' } ], + 'multiplex: case insensitive header as param works'; + + +##### + +$csv = SL::Helper::Csv->new( + file => \"P;Kaffee\nC;Meier", # " # make emacs happy + header => [[ 'Datatype', 'Description' ], [ 'Datatype', 'Name']], + profile => [ + { + profile => { datatype => 'datatype', description => 'description' }, + class => 'SL::DB::Part', + row_ident => 'P' + }, + { + profile => { datatype => 'datatype', name => 'name' }, + class => 'SL::DB::Customer', + row_ident => 'C' + } + ], +); +$csv->parse; +is_deeply $csv->get_data, undef, 'multiplex: case insensitive header without flag ignores'; + +##### + +$csv = SL::Helper::Csv->new( + file => \< [[ 'datatype', 'Afoo', 'Abar' ], [ 'datatype', 'Bfoo', 'Bbar']], + profile => [{ + profile => { datatype => '', Afoo => '', Abar => '' }, + class => 'SL::DB::Part', + row_ident => 'P' + }, + { + profile => { datatype => '', Bfoo => '', Bbar => '' }, + class => 'SL::DB::Customer', + row_ident => 'C' + }], +); +$csv->parse; + +is_deeply $csv->get_data, + [ { datatype => 'P', Afoo => 'Kaffee', Abar => 'lecker' }, { datatype => 'C', Bfoo => 'Meier', Bbar => 'froh' } ], + 'multiplex: empty path still gets parsed into data'; +ok $csv->get_objects->[0], 'multiplex: empty path gets ignored in object creation'; + +##### + +$csv = SL::Helper::Csv->new( + file => \< [[ 'datatype', 'Afoo', 'Abar' ], [ 'datatype', 'Bfoo', 'Bbar']], + strict_profile => 1, + profile => [{ + profile => { datatype => '', Afoo => '', Abar => '' }, + class => 'SL::DB::Part', + row_ident => 'P' + }, + { + profile => { datatype => '', Bfoo => '', Bbar => '' }, + class => 'SL::DB::Customer', + row_ident => 'C' + }], +); +$csv->parse; + +is_deeply $csv->get_data, + [ { datatype => 'P', Afoo => 'Kaffee', Abar => 'lecker' }, { datatype => 'C', Bfoo => 'Meier', Bbar => 'froh' } ], + 'multiplex: empty path still gets parsed into data (strict profile)'; +ok $csv->get_objects->[0], 'multiplex: empty path gets ignored in object creation (strict profile)'; + +##### + +$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: