More tests and tighter code with better error reporting in collapser maker
[dbsrgits/DBIx-Class.git] / t / resultset / as_query.t
1 BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7
8
9 use DBICTest ':DiffSQL';
10
11 my $schema = DBICTest->init_schema();
12 my $art_rs = $schema->resultset('Artist');
13 my $cdrs = $schema->resultset('CD');
14
15 {
16   is_same_sql_bind(
17     $art_rs->as_query,
18     "(SELECT me.artistid, me.name, me.rank, me.charfield FROM artist me)", [],
19   );
20 }
21
22 $art_rs = $art_rs->search({ name => 'Billy Joel' });
23
24 my $name_resolved_bind = [
25   { sqlt_datatype => 'varchar', sqlt_size  => 100, dbic_colname => 'name' }
26     => 'Billy Joel'
27 ];
28
29 {
30   is_same_sql_bind(
31     $art_rs->as_query,
32     "(SELECT me.artistid, me.name, me.rank, me.charfield FROM artist me WHERE ( name = ? ))",
33     [ $name_resolved_bind ],
34   );
35 }
36
37 $art_rs = $art_rs->search({ rank => 2 });
38
39 my $rank_resolved_bind = [
40   { sqlt_datatype => 'integer', dbic_colname => 'rank' }
41     => 2
42 ];
43
44 {
45   is_same_sql_bind(
46     $art_rs->as_query,
47     "(SELECT me.artistid, me.name, me.rank, me.charfield FROM artist me WHERE name = ? AND rank = ? )",
48     [ $name_resolved_bind, $rank_resolved_bind ],
49   );
50 }
51
52 my $rscol = $art_rs->get_column( 'charfield' );
53
54 {
55   is_same_sql_bind(
56     $rscol->as_query,
57     "(SELECT me.charfield FROM artist me WHERE name = ? AND rank = ? )",
58     [ $name_resolved_bind, $rank_resolved_bind ],
59   );
60 }
61
62 {
63   my $rs = $schema->resultset("CD")->search(
64     { 'artist.name' => 'Caterwauler McCrae' },
65     { join => [qw/artist/]}
66   );
67   my $subsel_rs = $schema->resultset("CD")->search( { cdid => { IN => $rs->get_column('cdid')->as_query } } );
68   is($subsel_rs->count, $rs->count, 'Subselect on PK got the same row count');
69 }
70
71
72 is_same_sql_bind($schema->resultset('Artist')->search({
73    rank => 1,
74 }, {
75    from => $schema->resultset('Artist')->search({ 'name' => 'frew'})->as_query,
76 })->as_query,
77    '(SELECT me.artistid, me.name, me.rank, me.charfield FROM (
78      SELECT me.artistid, me.name, me.rank, me.charfield FROM
79        artist me
80        WHERE (
81          ( name = ? )
82        )
83      ) WHERE (
84        ( rank = ? )
85      )
86    )',
87    [
88       [{ dbic_colname => 'name', sqlt_datatype => 'varchar', sqlt_size => 100 }, 'frew'],
89       [{ dbic_colname => 'rank' }, 1],
90    ],
91    'from => ...->as_query works'
92 );
93
94 done_testing;