1use strict; 2use Test::More; 3 4BEGIN { 5 eval "use DBD::SQLite"; 6 plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 20); 7} 8 9use lib 't/testlib'; 10use Film; 11use Actor; 12Film->has_many(actors => Actor => { order_by => 'name' }); 13Actor->has_a(Film => 'Film'); 14 15my $film1 = Film->insert({ title => 'Film 1', rating => 'U' }); 16my $film2 = Film->insert({ title => 'Film 2', rating => '15' }); 17my $film3 = Film->insert({ title => 'Film 3', rating => '15' }); 18 19my $act1 = Actor->insert({ name => 'Fred', film => $film1, salary => 1 }); 20my $act2 = Actor->insert({ name => 'Fred', film => $film2, salary => 2 }); 21my $act3 = Actor->insert({ name => 'John', film => $film1, salary => 3 }); 22my $act4 = Actor->insert({ name => 'John', film => $film2, salary => 1 }); 23my $act5 = Actor->insert({ name => 'Pete', film => $film1, salary => 1 }); 24my $act6 = Actor->insert({ name => 'Pete', film => $film3, salary => 1 }); 25 26use Class::DBI::Query; 27$SIG{__WARN__} = sub {}; 28 29{ 30 my @actors = eval { 31 my $query = 32 Class::DBI::Query->new( 33 { owner => 'Actor', where_clause => 'name = "Fred"' }); 34 my $sth = $query->run(); 35 Actor->sth_to_objects($sth); 36 }; 37 is @actors, 2, "** Full where in query"; 38 is $@, '', "No errors"; 39 isa_ok $actors[0], "Actor"; 40} 41 42{ 43 my @actors = eval { 44 my $query = 45 Class::DBI::Query->new( 46 { owner => 'Actor', where_clause => 'name = ?' }); 47 my $sth = $query->run('Fred'); 48 Actor->sth_to_objects($sth); 49 }; 50 is @actors, 2, "** Placeholder in query"; 51 is $@, '', "No errors"; 52 isa_ok $actors[0], "Actor"; 53} 54 55{ 56 my @actors = eval { 57 my $query = Class::DBI::Query->new({ owner => 'Actor' }); 58 $query->add_restriction('name = ?'); 59 my $sth = $query->run('Fred'); 60 Actor->sth_to_objects($sth); 61 }; 62 is @actors, 2, "** Add restriction"; 63 is $@, '', "No errors"; 64 isa_ok $actors[0], "Actor"; 65} 66 67{ 68 my @actors = eval { 69 my $query = Class::DBI::Query->new({ owner => 'Actor' }); 70 my @tables = qw/Film Actor/; 71 my $film_pri = Film->primary_column; 72 $query->kings(@tables); 73 $query->add_restriction("$tables[1].film = $tables[0].$film_pri"); 74 $query->add_restriction('salary = ?'); 75 $query->add_restriction('rating = ?'); 76 my $sth = $query->run(1, 15); 77 Actor->sth_to_objects($sth); 78 }; 79 is @actors, 2, "** Join"; 80 is $@, '', "No errors"; 81 isa_ok $actors[0], "Actor"; 82} 83 84{ # Normal search 85 my @films = Film->search(rating => 15); 86 is @films, 2, "2 Films with 15 rating"; 87} 88 89{ # Restrict a has_many 90 my @actors = $film1->actors; 91 is @actors, 3, "3 Actors in film 1"; 92 my @underpaid = $film1->actors(salary => 1); 93 is @underpaid, 2, "2 of them underpaid"; 94} 95 96{ # Restrict a has_many as class method 97 my @underpaid = Film->actors(salary => 1); 98 my @under2 = Actor->search(salary => 1); 99 is_deeply [ sort map $_->id, @underpaid ], [ sort map $_->id, @under2 ], 100 "Can search on foreign key"; 101} 102 103{ # Fully qualify table names 104 my @actors = Film->actors(salary => 1, rating => 'U'); 105 is @actors, 2, "Cross table search"; 106 isa_ok $actors[0], "Actor"; 107} 108 109{ # Fully qualify table names 110 my @actors = Film->actors('actor.salary' => 1, 'film.rating' => 'U'); 111 is @actors, 2, "Fully qualified tables"; 112 isa_ok $actors[0], "Actor"; 113} 114 115