23fe945c32fde850252686eccf21ecb68872707a
[dbsrgits/DBIx-Class-ParameterizedJoinHack.git] / t / 00basic.t
1 use strict;
2 use warnings;
3 use lib 't/lib';
4 use Test::More;
5 use My::Schema;
6
7 my $schema = My::Schema->connect('dbi:SQLite:dbname=:memory:');
8
9 $schema->deploy;
10
11 my $people = $schema->resultset('Person');
12
13 my $bob = $people->create({
14     name => 'Bob Testuser',
15 });
16
17 $bob->create_related(assigned_tasks => {
18     summary => 'Task A',
19     urgency => 10,
20 });
21 $bob->create_related(assigned_tasks => {
22     summary => 'Task B',
23     urgency => 20,
24 });
25 $bob->create_related(assigned_tasks => {
26     summary => 'Task C',
27     urgency => 30,
28 });
29
30 subtest 'has_many' => sub {
31
32     my $join_with_min = sub {
33         return shift->with_parameterized_join(
34             urgent_assigned_tasks => { urgency_threshold => $_[0] },
35         );
36     };
37
38 #    my $join_with_range = sub {
39 #        return shift->with_parameterized_join(
40 #            tasks_in_urgency_range => {
41 #                min => $_[0],
42 #                max => $_[1],
43 #            },
44 #        );
45 #    };
46
47     my $search = sub {
48         return scalar shift->search(
49             { 'me.name' => { -like => 'Bob%' } },
50             {
51                 '+select' => [{
52                     count => \['urgent_assigned_tasks.id'],
53                 }],
54                 '+as' => ['task_count'],
55             },
56         );
57     };
58
59     my $fetch_count = sub {
60         return shift->next->get_column('task_count');
61     };
62
63     subtest 'simple filter' => sub {
64         is $people->$join_with_min(19)->$search->$fetch_count,
65             2, 'filter min 19';
66         is $people->$join_with_min(29)->$search->$fetch_count,
67             1, 'filter min 29';
68         is $people->$join_with_min(39)->$search->$fetch_count,
69             0, 'filter min 39';
70     };
71
72     subtest 'multiple filters' => sub {
73         my $rs1 = $people->$join_with_min(19)->$search;
74         my $rs2 = $people->$join_with_min(29)->$search;
75         is $rs1->$fetch_count, 2, 'first';
76         is $rs2->$fetch_count, 1, 'second';
77     };
78
79     subtest 'overrides' => sub {
80         is $people
81             ->$join_with_min(190)
82             ->$join_with_min(19)
83             ->$search
84             ->$fetch_count,
85             2, 'overridden parameter';
86     };
87
88 #    subtest 'multi parameter' => sub {
89 #        is $people->$join_with_range(10, 30)->$search->$fetch_count,
90 #            3, 'full range';
91 #    };
92 };
93
94 done_testing;