Restore ability to handle underdefined root (t/prefetch/incomplete.t)
[dbsrgits/DBIx-Class.git] / t / 87ordered.t
index 4844053..324be84 100644 (file)
@@ -1,6 +1,6 @@
 # vim: filetype=perl
 use strict;
-use warnings;  
+use warnings;
 
 use Test::More;
 use lib qw(t/lib);
@@ -10,8 +10,6 @@ use POSIX qw(ceil);
 
 my $schema = DBICTest->init_schema();
 
-plan tests => 1269;
-
 my $employees = $schema->resultset('Employee');
 $employees->delete();
 
@@ -42,14 +40,16 @@ foreach my $group_id (1..4) {
 my $group_3 = $employees->search({group_id=>3});
 my $to_group = 1;
 my $to_pos = undef;
-while (my $employee = $group_3->next) {
-       $employee->move_to_group($to_group, $to_pos);
-       $to_pos++;
-       $to_group = $to_group==1 ? 2 : 1;
+{
+  my @empl = $group_3->all;
+  while (my $employee = shift @empl) {
+    $employee->move_to_group($to_group, $to_pos);
+    $to_pos++;
+    $to_group = $to_group==1 ? 2 : 1;
+  }
 }
 foreach my $group_id (1..4) {
     my $group_employees = $employees->search({group_id=>$group_id});
-    $group_employees->all();
     ok( check_rs($group_employees), "group positions after move_to_group" );
 }
 
@@ -64,53 +64,78 @@ $employee = $employees->search({group_id=>4})->first;
 $employee->group_id(1);
 $employee->update;
 ok(
-       check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})),
-       "overloaded update 3"
+  check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})),
+  "overloaded update 3"
 );
 $employee = $employees->search({group_id=>4})->first;
 $employee->update({group_id=>2});
 ok(
-       check_rs($employees->search_rs({group_id=>2})) && check_rs($employees->search_rs({group_id=>4})),
-       "overloaded update 4"
+  check_rs($employees->search_rs({group_id=>2})) && check_rs($employees->search_rs({group_id=>4})),
+  "overloaded update 4"
 );
 $employee = $employees->search({group_id=>4})->first;
 $employee->group_id(1);
 $employee->position(3);
 $employee->update;
 ok(
-       check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})),
-       "overloaded update 5"
+  check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})),
+  "overloaded update 5"
 );
 $employee = $employees->search({group_id=>4})->first;
 $employee->group_id(2);
 $employee->position(undef);
 $employee->update;
 ok(
-       check_rs($employees->search_rs({group_id=>2})) && check_rs($employees->search_rs({group_id=>4})),
-       "overloaded update 6"
+  check_rs($employees->search_rs({group_id=>2})) && check_rs($employees->search_rs({group_id=>4})),
+  "overloaded update 6"
 );
 $employee = $employees->search({group_id=>4})->first;
 $employee->update({group_id=>1,position=>undef});
 ok(
-       check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})),
-       "overloaded update 7"
+  check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})),
+  "overloaded update 7"
+);
+
+$employee->group_id(2);
+$employee->name('E of the month');
+$employee->update({ employee_id => 666, position => 2 });
+is_deeply(
+  { $employee->get_columns },
+  {
+    employee_id => 666,
+    encoded => undef,
+    group_id => 2,
+    group_id_2 => undef,
+    group_id_3 => undef,
+    name => "E of the month",
+    position => 2
+  },
+  'combined update() worked correctly'
+);
+is_deeply(
+  { $employee->get_columns },
+  { $employee->get_from_storage->get_columns },
+  'object matches database state',
 );
 
+#####
 # multicol tests begin here
-DBICTest::Employee->grouping_column(['group_id', 'group_id_2']);
+#####
+
+DBICTest::Employee->grouping_column(['group_id_2', 'group_id_3']);
 $employees->delete();
-foreach my $group_id (1..4) {
-    foreach my $group_id_2 (1..4) {
+foreach my $group_id_2 (1..4) {
+    foreach my $group_id_3 (1..4) {
         foreach (1..4) {
-            $employees->create({ name=>'temp', group_id=>$group_id, group_id_2=>$group_id_2 });
+            $employees->create({ name=>'temp', group_id_2=>$group_id_2, group_id_3=>$group_id_3 });
         }
     }
 }
-$employees = $employees->search(undef,{order_by=>'group_id,group_id_2,position'});
+$employees = $employees->search(undef,{order_by=>[qw/group_id_2 group_id_3 position/]});
 
-foreach my $group_id (1..3) {
-    foreach my $group_id_2 (1..3) {
-        my $group_employees = $employees->search({group_id=>$group_id, group_id_2=>$group_id_2});
+foreach my $group_id_2 (1..3) {
+    foreach my $group_id_3 (1..3) {
+        my $group_employees = $employees->search({group_id_2=>$group_id_2, group_id_3=>$group_id_3});
         $group_employees->all();
         ok( check_rs($group_employees), "group intial positions" );
         hammer_rs( $group_employees );
@@ -118,73 +143,76 @@ foreach my $group_id (1..3) {
 }
 
 # move_to_group, specifying group by hash
-my $group_4 = $employees->search({group_id=>4});
+my $group_4 = $employees->search({group_id_2=>4});
 $to_group = 1;
 my $to_group_2_base = 7;
 my $to_group_2 = 1;
 $to_pos = undef;
-while (my $employee = $group_4->next) {
-       $employee->move_to_group({group_id=>$to_group, group_id_2=>$to_group_2}, $to_pos);
-       $to_pos++;
+
+{
+  my @empl = $group_3->all;
+  while (my $employee = shift @empl) {
+    $employee->move_to_group({group_id_2=>$to_group, group_id_3=>$to_group_2}, $to_pos);
+    $to_pos++;
     $to_group = ($to_group % 3) + 1;
     $to_group_2_base++;
     $to_group_2 = (ceil($to_group_2_base/3.0) %3) +1
+  }
 }
-foreach my $group_id (1..4) {
-    foreach my $group_id_2 (1..4) {
-        my $group_employees = $employees->search({group_id=>$group_id,group_id_2=>$group_id_2});
-        $group_employees->all();
+foreach my $group_id_2 (1..4) {
+    foreach my $group_id_3 (1..4) {
+        my $group_employees = $employees->search({group_id_2=>$group_id_2,group_id_3=>$group_id_3});
         ok( check_rs($group_employees), "group positions after move_to_group" );
     }
 }
 
 $employees->delete();
-foreach my $group_id (1..4) {
-    foreach my $group_id_2 (1..4) {
+foreach my $group_id_2 (1..4) {
+    foreach my $group_id_3 (1..4) {
         foreach (1..4) {
-            $employees->create({ name=>'temp', group_id=>$group_id, group_id_2=>$group_id_2 });
+            $employees->create({ name=>'temp', group_id_2=>$group_id_2, group_id_3=>$group_id_3 });
         }
     }
 }
-$employees = $employees->search(undef,{order_by=>'group_id,group_id_2,position'});
+$employees = $employees->search(undef,{order_by=>[qw/group_id_2 group_id_3 position/]});
 
-$employee = $employees->search({group_id=>4, group_id_2=>1})->first;
-$employee->group_id(1);
+$employee = $employees->search({group_id_2=>4, group_id_3=>1})->first;
+$employee->group_id_2(1);
 $employee->update;
-ok( 
-    check_rs($employees->search_rs({group_id=>4, group_id_2=>1}))
-    && check_rs($employees->search_rs({group_id=>1, group_id_2=>1})), 
-    "overloaded multicol update 1" 
+ok(
+    check_rs($employees->search_rs({group_id_2=>4, group_id_3=>1}))
+    && check_rs($employees->search_rs({group_id_2=>1, group_id_3=>1})),
+    "overloaded multicol update 1"
 );
 
-$employee = $employees->search({group_id=>4, group_id_2=>1})->first;
-$employee->update({group_id=>2});
-ok( check_rs($employees->search_rs({group_id=>4, group_id_2=>1}))
-    && check_rs($employees->search_rs({group_id=>2, group_id_2=>1})), 
-    "overloaded multicol update 2" 
+$employee = $employees->search({group_id_2=>4, group_id_3=>1})->first;
+$employee->update({group_id_2=>2});
+ok( check_rs($employees->search_rs({group_id_2=>4, group_id_3=>1}))
+    && check_rs($employees->search_rs({group_id_2=>2, group_id_3=>1})),
+   "overloaded multicol update 2"
 );
 
-$employee = $employees->search({group_id=>3, group_id_2=>1})->first;
-$employee->group_id(1);
-$employee->group_id_2(3);
+$employee = $employees->search({group_id_2=>3, group_id_3=>1})->first;
+$employee->group_id_2(1);
+$employee->group_id_3(3);
 $employee->update();
-ok( check_rs($employees->search_rs({group_id=>3, group_id_2=>1}))
-    && check_rs($employees->search_rs({group_id=>1, group_id_2=>3})),
-    "overloaded multicol update 3" 
+ok( check_rs($employees->search_rs({group_id_2=>3, group_id_3=>1}))
+    && check_rs($employees->search_rs({group_id_2=>1, group_id_3=>3})),
+    "overloaded multicol update 3"
 );
 
-$employee = $employees->search({group_id=>3, group_id_2=>1})->first;
-$employee->update({group_id=>2, group_id_2=>3});
-ok( check_rs($employees->search_rs({group_id=>3, group_id_2=>1}))
-    && check_rs($employees->search_rs({group_id=>2, group_id_2=>3})), 
-    "overloaded multicol update 4" 
+$employee = $employees->search({group_id_2=>3, group_id_3=>1})->first;
+$employee->update({group_id_2=>2, group_id_3=>3});
+ok( check_rs($employees->search_rs({group_id_2=>3, group_id_3=>1}))
+    && check_rs($employees->search_rs({group_id_2=>2, group_id_3=>3})),
+    "overloaded multicol update 4"
 );
 
-$employee = $employees->search({group_id=>3, group_id_2=>2})->first;
-$employee->update({group_id=>2, group_id_2=>4, position=>2});
-ok( check_rs($employees->search_rs({group_id=>3, group_id_2=>2}))
-    && check_rs($employees->search_rs({group_id=>2, group_id_2=>4})), 
-    "overloaded multicol update 5" 
+$employee = $employees->search({group_id_2=>3, group_id_3=>2})->first;
+$employee->update({group_id_2=>2, group_id_3=>4, position=>2});
+ok( check_rs($employees->search_rs({group_id_2=>3, group_id_3=>2}))
+    && check_rs($employees->search_rs({group_id_2=>2, group_id_3=>4})),
+    "overloaded multicol update 5"
 );
 
 sub hammer_rs {
@@ -265,3 +293,4 @@ sub check_rs {
     return 1;
 }
 
+done_testing;