Added patch by rbo: New method hashref_pk: Calls hashref_array and returns a referenc...
[dbsrgits/DBIx-Class-ResultSet-HashRef.git] / t / 10-hashref.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5
6 BEGIN {
7     eval "use DBD::SQLite ();";
8     plan skip_all => 'DBD::SQLite required to run this test' if $@;
9
10     eval "use SQL::Translator ();";
11     plan skip_all => 'SQL::Translator required to run this test' if $@;
12
13     plan( tests => 11 );
14 }
15
16 use lib 't/lib';
17 use TestSchema;
18
19 # setup
20 my $schema = TestSchema->connect( "dbi:SQLite:dbname=:memory:", undef, undef );
21 $schema->deploy;
22
23 my @users = qw/root toor daemon operator bin tty/;
24 my @roles = qw/admin superuser user/;
25
26 @users = $schema->populate( 'User' => [ ['login'] => ( map { [$_] } @users ) ] );
27 @roles = $schema->populate( 'Role' => [ ['name']  => ( map { [$_] } @roles ) ] );
28
29 my $u          = 1;
30 my @user_roles = ();
31 foreach my $user (@users) {
32     my $r = 0;
33     foreach my $role (@roles) {
34         next if $r >= $u;
35         push @user_roles, [ $user->id, $role->id ];
36         $r++;
37     }
38     $u++;
39     $u = 1 if $u > scalar @roles;
40 }
41
42 @user_roles = $schema->populate( 'UserRole' => [ [qw/user_id role_id/] => @user_roles ] );
43
44 {
45     my $rs = $schema->resultset('User')->search(
46         {},
47         {
48             prefetch => { user_role => [qw/role/] },
49             order_by => 'me.id ASC'
50         }
51     )->hashref_array;
52
53     is_deeply(
54         $rs,
55         [
56             {
57                 'id'        => '1',
58                 'login'     => 'root',
59                 'user_role' => [
60                     {
61                         'role' => {
62                             'id'   => '1',
63                             'name' => 'admin'
64                         },
65                         'role_id' => '1',
66                         'user_id' => '1'
67                     }
68                 ]
69             },
70             {
71                 'id'        => '2',
72                 'login'     => 'toor',
73                 'user_role' => [
74                     {
75                         'role' => {
76                             'id'   => '1',
77                             'name' => 'admin'
78                         },
79                         'role_id' => '1',
80                         'user_id' => '2'
81                     },
82                     {
83                         'role' => {
84                             'id'   => '2',
85                             'name' => 'superuser'
86                         },
87                         'role_id' => '2',
88                         'user_id' => '2'
89                     }
90                 ]
91             },
92             {
93                 'id'        => '3',
94                 'login'     => 'daemon',
95                 'user_role' => [
96                     {
97                         'role' => {
98                             'id'   => '1',
99                             'name' => 'admin'
100                         },
101                         'role_id' => '1',
102                         'user_id' => '3'
103                     },
104                     {
105                         'role' => {
106                             'id'   => '2',
107                             'name' => 'superuser'
108                         },
109                         'role_id' => '2',
110                         'user_id' => '3'
111                     },
112                     {
113                         'role' => {
114                             'id'   => '3',
115                             'name' => 'user'
116                         },
117                         'role_id' => '3',
118                         'user_id' => '3'
119                     }
120                 ]
121             },
122             {
123                 'id'        => '4',
124                 'login'     => 'operator',
125                 'user_role' => [
126                     {
127                         'role' => {
128                             'id'   => '1',
129                             'name' => 'admin'
130                         },
131                         'role_id' => '1',
132                         'user_id' => '4'
133                     }
134                 ]
135             },
136             {
137                 'id'        => '5',
138                 'login'     => 'bin',
139                 'user_role' => [
140                     {
141                         'role' => {
142                             'id'   => '1',
143                             'name' => 'admin'
144                         },
145                         'role_id' => '1',
146                         'user_id' => '5'
147                     },
148                     {
149                         'role' => {
150                             'id'   => '2',
151                             'name' => 'superuser'
152                         },
153                         'role_id' => '2',
154                         'user_id' => '5'
155                     }
156                 ]
157             },
158             {
159                 'id'        => '6',
160                 'login'     => 'tty',
161                 'user_role' => [
162                     {
163                         'role' => {
164                             'id'   => '1',
165                             'name' => 'admin'
166                         },
167                         'role_id' => '1',
168                         'user_id' => '6'
169                     },
170                     {
171                         'role' => {
172                             'id'   => '2',
173                             'name' => 'superuser'
174                         },
175                         'role_id' => '2',
176                         'user_id' => '6'
177                     },
178                     {
179                         'role' => {
180                             'id'   => '3',
181                             'name' => 'user'
182                         },
183                         'role_id' => '3',
184                         'user_id' => '6'
185                     }
186                 ]
187             }
188         ],
189         'hashref_array'
190     );
191 }
192
193 {
194     my @rs = $schema->resultset('User')->search( {}, { order_by => 'me.id ASC' } )->hashref_array;
195     is_deeply(
196         \@rs,
197         [
198             {
199                 'id'    => '1',
200                 'login' => 'root'
201             },
202             {
203                 'id'    => '2',
204                 'login' => 'toor'
205             },
206             {
207                 'id'    => '3',
208                 'login' => 'daemon'
209             },
210             {
211                 'id'    => '4',
212                 'login' => 'operator'
213             },
214             {
215                 'id'    => '5',
216                 'login' => 'bin'
217             },
218             {
219                 'id'    => '6',
220                 'login' => 'tty'
221             }
222         ]
223     );
224 }
225
226 {
227     my $rs = $schema->resultset('User')->search(
228         {},
229         {
230             prefetch => { user_role => [qw/role/] },
231             order_by => 'me.id DESC'
232         }
233     )->hashref_rs->next;
234     is_deeply(
235         $rs,
236         {
237             'id'        => '6',
238             'login'     => 'tty',
239             'user_role' => [
240                 {
241                     'role' => {
242                         'id'   => '1',
243                         'name' => 'admin'
244                     },
245                     'role_id' => '1',
246                     'user_id' => '6'
247                 },
248                 {
249                     'role' => {
250                         'id'   => '2',
251                         'name' => 'superuser'
252                     },
253                     'role_id' => '2',
254                     'user_id' => '6'
255                 },
256                 {
257                     'role' => {
258                         'id'   => '3',
259                         'name' => 'user'
260                     },
261                     'role_id' => '3',
262                     'user_id' => '6'
263                 }
264             ]
265         },
266         'hashref_rs->next'
267     );
268 }
269
270 {
271     my $expected_users = [
272         {
273             'id'    => '1',
274             'login' => 'root'
275         },
276         {
277             'id'    => '2',
278             'login' => 'toor'
279         },
280         {
281             'id'    => '3',
282             'login' => 'daemon'
283         },
284         {
285             'id'    => '4',
286             'login' => 'operator'
287         },
288         {
289             'id'    => '5',
290             'login' => 'bin'
291         },
292         {
293             'id'    => '6',
294             'login' => 'tty'
295         }
296     ];
297     my $rs = $schema->resultset('User')->search( {}, { order_by => 'me.id ASC' } )->hashref_rs;
298     while ( my $row = $rs->next ) {
299         my $user = shift(@$expected_users);
300         is_deeply( $row, $user, "hashref_rs in while loop, user: " . $user->{login} );
301     }
302 }
303
304 {
305     my $first_row = $schema->resultset('User')->search( { login => 'root' } )->hashref_first;
306     is_deeply(
307         $first_row,
308         {
309             'id'    => '1',
310             'login' => 'root'
311         },
312         "hashref_first"
313     );
314 }
315
316 {
317     my $hashref = $schema->resultset('User')->search( {}, { order_by => 'me.id ASC' } )->hashref_pk;
318     is_deeply(
319         $hashref,
320         {
321             1 => {
322                 'id'    => '1',
323                 'login' => 'root'
324             },
325             2 => {
326                 'id'    => '2',
327                 'login' => 'toor'
328             },
329             3 => {
330                 'id'    => '3',
331                 'login' => 'daemon'
332             },
333             4 => {
334                 'id'    => '4',
335                 'login' => 'operator'
336             },
337             5 => {
338                 'id'    => '5',
339                 'login' => 'bin'
340             },
341             6 => {
342                 'id'    => '6',
343                 'login' => 'tty'
344             }
345         },
346         'hashref_pk'
347     );
348 }