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