Joins work for search, some refactoring
[dbsrgits/DBIx-Class.git] / t / 16joins.t
1 use strict;
2 use Test::More;
3
4 BEGIN {
5     eval "use DBD::SQLite";
6     plan $@
7         ? ( skip_all => 'needs DBD::SQLite for testing' )
8         : ( tests => 12 );
9 }
10
11 use lib qw(t/lib);
12
13 use_ok('DBICTest');
14
15 # test the abstract join => SQL generator
16 my $sa = new DBIC::SQL::Abstract;
17
18 my @j = (
19     { child => 'person' },
20     [ { father => 'person' }, { 'father.person_id' => 'child.father_id' }, ],
21     [ { mother => 'person' }, { 'mother.person_id' => 'child.mother_id' } ],
22 );
23 my $match = 'person child JOIN person father ON ( father.person_id = '
24           . 'child.father_id ) JOIN person mother ON ( mother.person_id '
25           . '= child.mother_id )'
26           ;
27 is( $sa->_recurse_from(@j), $match, 'join 1 ok' );
28
29 my @j2 = (
30     { mother => 'person' },
31     [   [   { child => 'person' },
32             [   { father             => 'person' },
33                 { 'father.person_id' => 'child.father_id' }
34             ]
35         ],
36         { 'mother.person_id' => 'child.mother_id' }
37     ],
38 );
39 $match = 'person mother JOIN (person child JOIN person father ON ('
40        . ' father.person_id = child.father_id )) ON ( mother.person_id = '
41        . 'child.mother_id )'
42        ;
43 is( $sa->_recurse_from(@j2), $match, 'join 2 ok' );
44
45 my @j3 = (
46     { child => 'person' },
47     [ { father => 'person', -join_type => 'inner' }, { 'father.person_id' => 'child.father_id' }, ],
48     [ { mother => 'person', -join_type => 'inner'  }, { 'mother.person_id' => 'child.mother_id' } ],
49 );
50 my $match = 'person child INNER JOIN person father ON ( father.person_id = '
51           . 'child.father_id ) INNER JOIN person mother ON ( mother.person_id '
52           . '= child.mother_id )'
53           ;
54
55 is( $sa->_recurse_from(@j3), $match, 'join 3 (inner join) ok');
56
57 my $rs = DBICTest::CD->search(
58            { 'year' => 2001, 'artist.name' => 'Caterwauler McCrae' },
59            { from => [ { 'cd' => 'cd' },
60                          [
61                            { artist => 'artist' },
62                            { 'cd.artist' => 'artist.artistid' }
63                          ] ] }
64          );
65
66 cmp_ok( $rs->count, '==', 1, "Single record in resultset");
67
68 is($rs->first->title, 'Forkful of bees', 'Correct record returned');
69
70 $rs = DBICTest::CD->search(
71            { 'year' => 2001, 'artist.name' => 'Caterwauler McCrae' },
72            { join => 'artist' });
73
74 cmp_ok( $rs->count, '==', 1, "Single record in resultset");
75
76 is($rs->first->title, 'Forkful of bees', 'Correct record returned');
77
78 $rs = DBICTest::CD->search(
79            { 'artist.name' => 'We Are Goth',
80              'liner_notes.notes' => 'Kill Yourself!' },
81            { join => [ qw/artist liner_notes/ ] });
82
83 cmp_ok( $rs->count, '==', 1, "Single record in resultset");
84
85 is($rs->first->title, 'Come Be Depressed With Us', 'Correct record returned');
86
87 $rs = DBICTest::Artist->search(
88         { 'liner_notes.notes' => 'Kill Yourself!' },
89         { join => { 'cds' => 'liner_notes' } });
90
91 cmp_ok( $rs->count, '==', 1, "Single record in resultset");
92
93 is($rs->first->name, 'We Are Goth', 'Correct record returned');