Use prepared statement from the start for populate on PostgreSQL
[dbsrgits/DBIx-Class.git] / t / delete / related.t
1 BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
2
3 use strict;
4 use warnings;
5 use Test::More;
6
7
8 use DBICTest;
9
10 my $schema = DBICTest->init_schema();
11
12 my $ars = $schema->resultset('Artist');
13 my $cdrs = $schema->resultset('CD');
14 my $cd2pr_rs = $schema->resultset('CD_to_Producer');
15
16 # create some custom entries
17 $ars->populate ([
18   [qw/artistid  name/],
19   [qw/71        a1/],
20   [qw/72        a2/],
21   [qw/73        a3/],
22 ]);
23
24 $cdrs->populate ([
25   [qw/cdid artist title   year/],
26   [qw/70   71     delete0 2005/],
27   [qw/71   72     delete1 2005/],
28   [qw/72   72     delete2 2005/],
29   [qw/73   72     delete3 2006/],
30   [qw/74   72     delete4 2007/],
31   [qw/75   73     delete5 2008/],
32 ]);
33
34 my $prod = $schema->resultset('Producer')->create ({ name => 'deleter' });
35 my $prod_cd = $cdrs->find (70);
36 my $cd2pr = $cd2pr_rs->create ({
37   producer => $prod,
38   cd => $prod_cd,
39 });
40
41 my $total_cds = $cdrs->count;
42
43 # test that delete_related w/o conditions deletes all related records only
44 $ars->search ({name => 'a3' })->search_related ('cds')->delete;
45 is ($cdrs->count, $total_cds -= 1, 'related delete ok');
46
47 my $a2_cds = $ars->search ({ name => 'a2' })->search_related ('cds');
48
49 # test that related deletion w/conditions deletes just the matched related records only
50 $a2_cds->search ({ year => 2005 })->delete;
51 is ($cdrs->count, $total_cds -= 2, 'related + condition delete ok');
52
53 # test that related deletion with limit condition works
54 $a2_cds->search ({}, { rows => 1})->delete;
55 is ($cdrs->count, $total_cds -= 1, 'related + limit delete ok');
56
57 {
58   local $TODO = 'delete_related is based on search_related which is based on search which does not understand object arguments';
59   local $SIG{__WARN__} = sub {}; # trap the non-numeric warning, remove when the TODO is removed
60
61   my $cd2pr_count = $cd2pr_rs->count;
62   $prod_cd->delete_related('cd_to_producer', { producer => $prod } );
63   is ($cd2pr_rs->count, $cd2pr_count -= 1, 'm2m link deleted succesfully');
64
65   # see 187ec69a for why this is neccessary
66   $prod->result_source(undef);
67 }
68
69 done_testing;