Indices auf OneToOne relationships werden jetzt mit Fehler quittiert.
authorSven Schöling <s.schoeling@linet-services.de>
Thu, 24 Feb 2011 09:53:04 +0000 (10:53 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Thu, 16 Jun 2011 06:44:05 +0000 (08:44 +0200)
SL/Helper/Csv/Dispatcher.pm
t/helper/csv.t

index 31c5eba..9626fed 100644 (file)
@@ -87,10 +87,21 @@ sub make_spec {
   for my $step_index ( split /\.(?!\d)/, $path ) {
     my ($step, $index) = split /\./, $step_index;
     if ($cur_class->can($step)) {
-      if ($cur_class->meta->relationship($step)) { #a
-        my $next_class = $cur_class->meta->relationship($step)->class;
-        push @{ $spec->{steps} }, [ $step, $next_class, $index ];
-        $cur_class = $next_class;
+      if (my $rel = $cur_class->meta->relationship($step)) { #a
+        if ($index && ! $rel->isa('Rose::DB::Object::Metadata::Relationship::OneToMany')) {
+          $self->_push_error([
+            $path,
+            undef,
+            "Profile path error. Indexed relationship is not OneToMany around here: '$step_index'",
+            undef,
+            0,
+          ]);
+          return;
+        } else {
+          my $next_class = $cur_class->meta->relationship($step)->class;
+          push @{ $spec->{steps} }, [ $step, $next_class, $index ];
+          $cur_class = $next_class;
+        }
       } else { # simple dispatch
         push @{ $spec->{steps} }, [ $step ];
         last;
index 7ac728f..0721434 100644 (file)
@@ -1,4 +1,4 @@
-use Test::More tests => 29;
+use Test::More tests => 31;
 use SL::Dispatcher;
 use Data::Dumper;
 use utf8;
@@ -208,4 +208,19 @@ 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   => \<<EOL,
+description;partnumber;sellprice;lastcost_as_number;buchungsgruppe;
+EOL
+  numberformat => '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';
+
 # vim: ft=perl