X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=t%2Fhelper%2Fcsv.t;h=088ed68ab3b447339e6c9a368c9903bb1d4d8197;hb=61cdba5d566357f3beabe0e7f3f0cb2d7bdccd73;hp=6de4e7216f43ed9cf261fd9f5a06721190aeab64;hpb=2f6ebd89e1d3580613f5fc6db5c49552fcc90947;p=kivitendo-erp.git diff --git a/t/helper/csv.t b/t/helper/csv.t index 6de4e7216..088ed68ab 100644 --- a/t/helper/csv.t +++ b/t/helper/csv.t @@ -1,43 +1,43 @@ -use Test::More; -use SL::Dispatcher; +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", +Support::TestSetup::login(); + +my $csv = SL::Helper::Csv->new( + file => \"Kaffee\n", header => [ 'description' ], + class => 'SL::DB::Part', ); -isa_ok $csv->_csv, 'Text::CSV'; +isa_ok $csv->_csv, 'Text::CSV_XS'; 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' ], - header_acc => { listprice => 'listprice_as_number' }, + profile => { listprice => 'listprice_as_number' }, class => 'SL::DB::Part', ); $csv->parse; is $csv->get_objects->[0]->sellprice, 0.12, 'numeric attr works'; is $csv->get_objects->[0]->lastcost, 12.2, 'attr helper works'; -is $csv->get_objects->[0]->listprice, 1.5234, 'header_acc works'; +is $csv->get_objects->[0]->listprice, 1.5234, 'dispatch works'; ##### @@ -49,7 +49,7 @@ Kaffee,0.12,'12,2','1,5234' EOL sep_char => ',', quote_char => "'", - header_acc => { listprice => 'listprice_as_number' }, + profile => { listprice => 'listprice_as_number' }, class => 'SL::DB::Part', ); $csv->parse; @@ -111,6 +111,249 @@ EOL ); is $csv->parse, undef, 'broken csv header won\'t get parsed'; +###### + +$csv = SL::Helper::Csv->new( + file => \< '1,000.00', + 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'; +isa_ok( ($csv->errors)[0], 'SL::Helper::Csv::Error', 'Errors get objectified'); + +#### + +$csv = SL::Helper::Csv->new( + file => \< '1,000.00', + ignore_unknown_columns => 1, + class => 'SL::DB::Part', +); +$csv->parse; +is $csv->get_objects->[0]->lastcost, '1221.52', 'ignore_unkown_columns works'; + +##### + +$csv = SL::Helper::Csv->new( + file => \< '1,000.00', + class => 'SL::DB::Part', + profile => { + buchungsgruppe => "buchungsgruppen.description", + } +); +$csv->parse; +isa_ok $csv->get_objects->[0]->buchungsgruppe, 'SL::DB::Buchungsgruppe', 'deep dispatch auto vivify works'; +is $csv->get_objects->[0]->buchungsgruppe->description, 'Standard 7%', '...and gets set correctly'; + + +##### + +$csv = SL::Helper::Csv->new( + file => \< '1,000.00', + class => 'SL::DB::Part', + profile => { + make_1 => "makemodels.0.make", + model_1 => "makemodels.0.model", + } +); +$csv->parse; +my @mm = $csv->get_objects->[0]->makemodel; +is scalar @mm, 1, 'one-to-many dispatch'; +is $csv->get_objects->[0]->makemodels->[0]->model, 'Chair 0815', '... and works'; + +##### + + +$csv = SL::Helper::Csv->new( + file => \< '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", + } +); +$csv->parse; + +print Dumper($csv->errors); + +@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'; +is $csv->get_objects->[0]->makemodels->[1]->model, 'Table 15', '...check 3'; +is $csv->get_objects->[0]->makemodels->[1]->make, '523', '...check 4'; + +###### + +$csv = SL::Helper::Csv->new( + file => \< '1,000.00', + class => 'SL::DB::Part', + profile => { + buchungsgruppe => "buchungsgruppen.1.description", + } +); +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'; +isa_ok( ($csv->errors)[0], 'SL::Helper::Csv::Error', 'Errors get objectified'); + +#### + +$csv = SL::Helper::Csv->new( + file => \< '1,000.00', + ignore_unknown_columns => 1, + strict_profile => 1, + class => 'SL::DB::Part', + profile => { + lastcost => 'lastcost_as_number', + } +); +$csv->parse; +is $csv->get_objects->[0]->lastcost, '1221.52', 'strict_profile with ignore'; +is $csv->get_objects->[0]->sellprice, undef, 'strict profile with ignore 2'; + +#### + +$csv = SL::Helper::Csv->new( + file => \< '1,000.00', + strict_profile => 1, + class => 'SL::DB::Part', + profile => { + lastcost => 'lastcost_as_number', + } +); +$csv->parse; + +is_deeply( ($csv->errors)[0], [ 'description', undef, 'header field \'description\' is not recognized', undef, 0 ], 'strict_profile without ignore_columns throws error'); + +##### + +$csv = SL::Helper::Csv->new( + file => \"Kaffee", + header => [ 'description' ], + class => 'SL::DB::Part', +); +$csv->parse; +is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'eol bug at the end of files'; + +##### + +$csv = SL::Helper::Csv->new( + file => \"Description\nKaffee", + class => 'SL::DB::Part', + case_insensitive_header => 1, + profile => { description => 'description' }, +); +$csv->parse; +is_deeply $csv->get_data, [ { description => 'Kaffee' } ], 'case insensitive header from csv works'; + +##### + +$csv = SL::Helper::Csv->new( + file => \"Kaffee", + header => [ 'Description' ], + class => 'SL::DB::Part', + case_insensitive_header => 1, + profile => { description => 'description' }, +); +$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", + 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'; -done_testing(); # vim: ft=perl