Commit | Line | Data |
93cec8c3 |
1 | # vim: filetype=perl |
70350518 |
2 | use strict; |
3 | use warnings; |
93cec8c3 |
4 | |
70350518 |
5 | use Test::More; |
6 | use lib qw(t/lib); |
7 | use DBICTest; |
93cec8c3 |
8 | |
a47e1233 |
9 | my $schema = DBICTest->init_schema(); |
93cec8c3 |
10 | |
79dc353a |
11 | plan tests => 417; |
93cec8c3 |
12 | |
70350518 |
13 | my $employees = $schema->resultset('Employee'); |
14 | $employees->delete(); |
169bb185 |
15 | |
70350518 |
16 | foreach (1..5) { |
17 | $employees->create({ name=>'temp' }); |
18 | } |
19 | $employees = $employees->search(undef,{order_by=>'position'}); |
20 | ok( check_rs($employees), "intial positions" ); |
b1c66eea |
21 | |
70350518 |
22 | hammer_rs( $employees ); |
169bb185 |
23 | |
70350518 |
24 | DBICTest::Employee->grouping_column('group_id'); |
25 | $employees->delete(); |
79dc353a |
26 | foreach 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 |
33 | foreach 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 |
40 | my $group_3 = $employees->search({group_id=>3}); |
41 | my $to_group = 1; |
42 | my $to_pos = undef; |
43 | while (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 | } |
48 | foreach 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 | |
54 | my $employee = $employees->search({group_id=>4})->first; |
55 | $employee->position(2); |
56 | $employee->update; |
57 | ok( check_rs($employees->search_rs({group_id=>4})), "overloaded update 1" ); |
58 | $employee = $employees->search({group_id=>4})->first; |
59 | $employee->update({position=>3}); |
60 | ok( 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; |
64 | ok( |
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}); |
70 | ok( |
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; |
78 | ok( |
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; |
86 | ok( |
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}); |
92 | ok( |
93 | check_rs($employees->search_rs({group_id=>1})) && check_rs($employees->search_rs({group_id=>4})), |
94 | "overloaded update 7" |
95 | ); |
96 | |
169bb185 |
97 | sub 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 |
149 | sub 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 | |