1use strict; 2use Test::More; 3 4BEGIN { 5 eval "use DBIx::Class::CDBICompat;"; 6 if ($@) { 7 plan (skip_all => 'Class::Trigger and DBIx::ContextualFetch required'); 8 next; 9 } 10 eval "use DBD::SQLite"; 11 plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 50); 12} 13 14use lib 't/cdbi/testlib'; 15use Actor; 16use Film; 17Film->has_many(actors => 'Actor'); 18Actor->has_a('film' => 'Film'); 19Actor->add_constructor(double_search => 'name = ? AND salary = ?'); 20 21my $film = Film->create({ Title => 'MY Film' }); 22my $film2 = Film->create({ Title => 'Another Film' }); 23 24my @act = ( 25 Actor->create( 26 { 27 name => 'Actor 1', 28 film => $film, 29 salary => 10, 30 } 31 ), 32 Actor->create( 33 { 34 name => 'Actor 2', 35 film => $film, 36 salary => 20, 37 } 38 ), 39 Actor->create( 40 { 41 name => 'Actor 3', 42 film => $film, 43 salary => 30, 44 } 45 ), 46 Actor->create( 47 { 48 name => 'Actor 4', 49 film => $film2, 50 salary => 50, 51 } 52 ), 53); 54 55eval { 56 my @actors = $film->actors(name => 'Actor 1'); 57 is @actors, 1, "Got one actor from restricted has_many"; 58 is $actors[0]->name, "Actor 1", "Correct name"; 59}; 60is $@, '', "No errors"; 61 62{ 63 my @actors = Actor->double_search("Actor 1", 10); 64 is @actors, 1, "Got one actor"; 65 is $actors[0]->name, "Actor 1", "Correct name"; 66} 67 68{ 69 ok my @actors = Actor->salary_between(0, 100), "Range 0 - 100"; 70 is @actors, 4, "Got all"; 71} 72 73{ 74 my @actors = Actor->salary_between(100, 200); 75 is @actors, 0, "None in Range 100 - 200"; 76} 77 78{ 79 ok my @actors = Actor->salary_between(0, 10), "Range 0 - 10"; 80 is @actors, 1, "Got 1"; 81 is $actors[0]->name, $act[0]->name, "Actor 1"; 82} 83 84{ 85 ok my @actors = Actor->salary_between(20, 30), "Range 20 - 20"; 86 @actors = sort { $a->salary <=> $b->salary } @actors; 87 is @actors, 2, "Got 2"; 88 is $actors[0]->name, $act[1]->name, "Actor 2"; 89 is $actors[1]->name, $act[2]->name, "and Actor 3"; 90} 91 92{ 93 ok my @actors = Actor->search(Film => $film), "Search by object"; 94 is @actors, 3, "3 actors in film 1"; 95} 96 97#---------------------------------------------------------------------- 98# Iterators 99#---------------------------------------------------------------------- 100 101my $it_class = 'DBIx::Class::ResultSet'; 102 103sub test_normal_iterator { 104 my $it = $film->actors; 105 isa_ok $it, $it_class; 106 is $it->count, 3, " - with 3 elements"; 107 my $i = 0; 108 while (my $film = $it->next) { 109 is $film->name, $act[ $i++ ]->name, "Get $i"; 110 } 111 ok !$it->next, "No more"; 112 is $it->first->name, $act[0]->name, "Get first"; 113} 114 115test_normal_iterator; 116{ 117 Film->has_many(actor_ids => [ Actor => 'id' ]); 118 my $it = $film->actor_ids; 119 isa_ok $it, $it_class; 120 is $it->count, 3, " - with 3 elements"; 121 my $i = 0; 122 while (my $film_id = $it->next) { 123 is $film_id, $act[ $i++ ]->id, "Get id $i"; 124 } 125 ok !$it->next, "No more"; 126 is $it->first, $act[0]->id, "Get first"; 127} 128 129# make sure nothing gets clobbered; 130test_normal_iterator; 131 132SKIP: { 133 #skip "dbic iterators don't support slice yet", 12; 134 135 136{ 137 my @acts = $film->actors->slice(1, 2); 138 is @acts, 2, "Slice gives 2 actor"; 139 is $acts[0]->name, "Actor 2", "Actor 2"; 140 is $acts[1]->name, "Actor 3", "and actor 3"; 141} 142 143{ 144 my @acts = $film->actors->slice(1); 145 is @acts, 1, "Slice of 1 actor"; 146 is $acts[0]->name, "Actor 2", "Actor 2"; 147} 148 149{ 150 my @acts = $film->actors->slice(2, 8); 151 is @acts, 1, "Slice off the end"; 152 is $acts[0]->name, "Actor 3", "Gets last actor only"; 153} 154 155package Class::DBI::My::Iterator; 156 157use vars qw/@ISA/; 158 159@ISA = ($it_class); 160 161sub slice { qw/fred barney/ } 162 163package main; 164 165Actor->iterator_class('Class::DBI::My::Iterator'); 166 167delete $film->{related_resultsets}; 168 169{ 170 my @acts = $film->actors->slice(1, 2); 171 is @acts, 2, "Slice gives 2 results"; 172 ok eq_set(\@acts, [qw/fred barney/]), "Fred and Barney"; 173 174 ok $film->actors->delete_all, "Can delete via iterator"; 175 is $film->actors, 0, "no actors left"; 176 177 eval { $film->actors->delete_all }; 178 is $@, '', "Deleting again does no harm"; 179} 180 181} # end SKIP block 182