local copy of DBIC ordered_handle_updates branch
[dbsrgits/DBIx-Class.git] / t / 87ordered.t
CommitLineData
93cec8c3 1# vim: filetype=perl
70350518 2use strict;
3use warnings;
93cec8c3 4
70350518 5use Test::More;
6use lib qw(t/lib);
7use DBICTest;
93cec8c3 8
a47e1233 9my $schema = DBICTest->init_schema();
93cec8c3 10
79dc353a 11plan tests => 417;
93cec8c3 12
70350518 13my $employees = $schema->resultset('Employee');
14$employees->delete();
169bb185 15
70350518 16foreach (1..5) {
17 $employees->create({ name=>'temp' });
18}
19$employees = $employees->search(undef,{order_by=>'position'});
20ok( check_rs($employees), "intial positions" );
b1c66eea 21
70350518 22hammer_rs( $employees );
169bb185 23
70350518 24DBICTest::Employee->grouping_column('group_id');
25$employees->delete();
79dc353a 26foreach my $group_id (1..4) {
70350518 27 foreach (1..6) {
28 $employees->create({ name=>'temp', group_id=>$group_id });
169bb185 29 }
70350518 30}
31$employees = $employees->search(undef,{order_by=>'group_id,position'});
169bb185 32
79dc353a 33foreach my $group_id (1..4) {
70350518 34 my $group_employees = $employees->search({group_id=>$group_id});
35 $group_employees->all();
36 ok( check_rs($group_employees), "group intial positions" );
37 hammer_rs( $group_employees );
169bb185 38}
39
79dc353a 40my $group_3 = $employees->search({group_id=>3});
41my $to_group = 1;
42my $to_pos = undef;
43while (my $employee = $group_3->next) {
44 $employee->move_to_group($to_group, $to_pos);
45 $to_pos++;
46 $to_group = $to_group==1 ? 2 : 1;
47}
48foreach my $group_id (1..4) {
49 my $group_employees = $employees->search({group_id=>$group_id});
50 $group_employees->all();
51 ok( check_rs($group_employees), "group positions after move_to_group" );
52}
53
54my $employee = $employees->search({group_id=>4})->first;
55$employee->position(2);
56$employee->update;
57ok( check_rs($employees->search_rs({group_id=>4})), "overloaded update 1" );
58$employee = $employees->search({group_id=>4})->first;
59$employee->update({position=>3});
60ok( check_rs($employees->search_rs({group_id=>4})), "overloaded update 2" );
61$employee = $employees->search({group_id=>4})->first;
62$employee->group_id(1);
63$employee->update;
64ok(
65 check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})),
66 "overloaded update 3"
67);
68$employee = $employees->search({group_id=>4})->first;
69$employee->update({group_id=>2});
70ok(
71 check_rs($employees->search_rs({group_id=>2})) && check_rs($employees->search_rs({group_id=>4})),
72 "overloaded update 4"
73);
74$employee = $employees->search({group_id=>4})->first;
75$employee->group_id(1);
76$employee->position(3);
77$employee->update;
78ok(
79 check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})),
80 "overloaded update 5"
81);
82$employee = $employees->search({group_id=>4})->first;
83$employee->group_id(2);
84$employee->position(undef);
85$employee->update;
86ok(
87 check_rs($employees->search_rs({group_id=>2})) && check_rs($employees->search_rs({group_id=>4})),
88 "overloaded update 6"
89);
90$employee = $employees->search({group_id=>4})->first;
91$employee->update({group_id=>1,position=>undef});
92ok(
93 check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})),
94 "overloaded update 7"
95);
96
169bb185 97sub hammer_rs {
98 my $rs = shift;
707cbb2d 99 my $employee;
169bb185 100 my $count = $rs->count();
101 my $position_column = $rs->result_class->position_column();
58d387fe 102 my $row;
80010e2b 103
169bb185 104 foreach my $position (1..$count) {
80010e2b 105
dc66dea1 106 ($row) = $rs->search({ $position_column=>$position })->all();
169bb185 107 $row->move_previous();
108 ok( check_rs($rs), "move_previous( $position )" );
80010e2b 109
dc66dea1 110 ($row) = $rs->search({ $position_column=>$position })->all();
169bb185 111 $row->move_next();
112 ok( check_rs($rs), "move_next( $position )" );
80010e2b 113
dc66dea1 114 ($row) = $rs->search({ $position_column=>$position })->all();
169bb185 115 $row->move_first();
116 ok( check_rs($rs), "move_first( $position )" );
80010e2b 117
dc66dea1 118 ($row) = $rs->search({ $position_column=>$position })->all();
169bb185 119 $row->move_last();
120 ok( check_rs($rs), "move_last( $position )" );
80010e2b 121
169bb185 122 foreach my $to_position (1..$count) {
dc66dea1 123 ($row) = $rs->search({ $position_column=>$position })->all();
169bb185 124 $row->move_to($to_position);
125 ok( check_rs($rs), "move_to( $position => $to_position )" );
707cbb2d 126 }
80021def 127
dc66dea1 128 ($row) = $rs->search({ position=>$position })->all();
707cbb2d 129 if ($position==1) {
169bb185 130 ok( !$row->previous_sibling(), 'no previous sibling' );
131 ok( !$row->first_sibling(), 'no first sibling' );
132 }
133 else {
134 ok( $row->previous_sibling(), 'previous sibling' );
135 ok( $row->first_sibling(), 'first sibling' );
707cbb2d 136 }
169bb185 137 if ($position==$count) {
138 ok( !$row->next_sibling(), 'no next sibling' );
139 ok( !$row->last_sibling(), 'no last sibling' );
80021def 140 }
707cbb2d 141 else {
169bb185 142 ok( $row->next_sibling(), 'next sibling' );
143 ok( $row->last_sibling(), 'last sibling' );
707cbb2d 144 }
145
80010e2b 146 }
80010e2b 147}
148
169bb185 149sub check_rs {
150 my( $rs ) = @_;
151 $rs->reset();
152 my $position_column = $rs->result_class->position_column();
93cec8c3 153 my $expected_position = 0;
169bb185 154 while (my $row = $rs->next()) {
93cec8c3 155 $expected_position ++;
169bb185 156 if ($row->get_column($position_column)!=$expected_position) {
133dd22a 157 return 0;
80021def 158 }
93cec8c3 159 }
133dd22a 160 return 1;
93cec8c3 161}
162