Commit | Line | Data |
efe6365b |
1 | use strict; |
2 | use warnings; |
3 | |
4 | use Test::More; |
5 | use lib qw(t/lib); |
6 | use DBICTest; |
92fe2181 |
7 | use Data::Dumper; |
efe6365b |
8 | |
baa31d2f |
9 | { |
10 | package DBICTest::ExplodingStorage::Sth; |
11 | use strict; |
12 | use warnings; |
13 | |
14 | sub execute { die "Kablammo!" } |
15 | |
16 | sub bind_param {} |
17 | |
18 | package DBICTest::ExplodingStorage; |
19 | use strict; |
20 | use warnings; |
21 | use base 'DBIx::Class::Storage::DBI::SQLite'; |
22 | |
23 | my $count = 0; |
24 | sub sth { |
25 | my ($self, $sql) = @_; |
26 | return bless {}, "DBICTest::ExplodingStorage::Sth" unless $count++; |
27 | return $self->next::method($sql); |
28 | } |
29 | |
30 | sub connected { |
31 | return 0 if $count == 1; |
32 | return shift->next::method(@_); |
33 | } |
34 | } |
35 | |
92fe2181 |
36 | plan tests => 17; |
efe6365b |
37 | |
fcf741b1 |
38 | my $schema = DBICTest->init_schema( sqlite_use_file => 1 ); |
efe6365b |
39 | |
40 | is( ref($schema->storage), 'DBIx::Class::Storage::DBI::SQLite', |
41 | 'Storage reblessed correctly into DBIx::Class::Storage::DBI::SQLite' ); |
42 | |
baa31d2f |
43 | my $storage = $schema->storage; |
44 | $storage->ensure_connected; |
45 | |
19fb8520 |
46 | eval { |
47 | $schema->storage->throw_exception('test_exception_42'); |
48 | }; |
49 | like($@, qr/\btest_exception_42\b/, 'basic exception'); |
50 | |
51 | eval { |
52 | $schema->resultset('CD')->search_literal('broken +%$#$1')->all; |
53 | }; |
54 | like($@, qr/prepare_cached failed/, 'exception via DBI->HandleError, etc'); |
55 | |
baa31d2f |
56 | bless $storage, "DBICTest::ExplodingStorage"; |
57 | $schema->storage($storage); |
58 | |
59 | eval { |
19fb8520 |
60 | $schema->resultset('Artist')->create({ name => "Exploding Sheep" }); |
baa31d2f |
61 | }; |
62 | |
63 | is($@, "", "Exploding \$sth->execute was caught"); |
64 | |
65 | is(1, $schema->resultset('Artist')->search({name => "Exploding Sheep" })->count, |
66 | "And the STH was retired"); |
67 | |
9a0891be |
68 | |
92fe2181 |
69 | # testing various invocations of connect_info ([ ... ]) |
70 | |
71 | my $coderef = sub { 42 }; |
72 | my $invocations = { |
73 | 'connect_info ([ $d, $u, $p, \%attr, \%extra_attr])' => { |
74 | args => [ |
75 | 'foo', |
76 | 'bar', |
77 | undef, |
78 | { |
79 | on_connect_do => [qw/a b c/], |
80 | PrintError => 0, |
81 | }, |
82 | { |
83 | AutoCommit => 1, |
84 | on_disconnect_do => [qw/d e f/], |
85 | }, |
86 | { |
87 | unsafe => 1, |
88 | auto_savepoint => 1, |
89 | }, |
90 | ], |
91 | dbi_connect_info => [ |
92 | 'foo', |
93 | 'bar', |
94 | undef, |
95 | { |
3a4c1d89 |
96 | %{$storage->_default_dbi_connect_attributes || {} }, |
92fe2181 |
97 | PrintError => 0, |
98 | AutoCommit => 1, |
99 | }, |
100 | ], |
101 | }, |
102 | |
103 | 'connect_info ([ \%code, \%extra_attr ])' => { |
104 | args => [ |
105 | $coderef, |
106 | { |
107 | on_connect_do => [qw/a b c/], |
108 | PrintError => 0, |
109 | AutoCommit => 1, |
110 | on_disconnect_do => [qw/d e f/], |
111 | }, |
112 | { |
113 | unsafe => 1, |
114 | auto_savepoint => 1, |
115 | }, |
116 | ], |
117 | dbi_connect_info => [ |
118 | $coderef, |
119 | ], |
120 | }, |
121 | |
122 | 'connect_info ([ \%attr ])' => { |
123 | args => [ |
124 | { |
125 | on_connect_do => [qw/a b c/], |
3a4c1d89 |
126 | PrintError => 1, |
127 | AutoCommit => 0, |
92fe2181 |
128 | on_disconnect_do => [qw/d e f/], |
129 | user => 'bar', |
130 | dsn => 'foo', |
131 | }, |
132 | { |
133 | unsafe => 1, |
134 | auto_savepoint => 1, |
135 | }, |
136 | ], |
137 | dbi_connect_info => [ |
138 | 'foo', |
139 | 'bar', |
140 | undef, |
141 | { |
3a4c1d89 |
142 | %{$storage->_default_dbi_connect_attributes || {} }, |
143 | PrintError => 1, |
144 | AutoCommit => 0, |
92fe2181 |
145 | }, |
146 | ], |
147 | }, |
148 | }; |
149 | |
150 | for my $type (keys %$invocations) { |
151 | |
152 | # we can not use a cloner portably because of the coderef |
153 | # so compare dumps instead |
154 | local $Data::Dumper::Sortkeys = 1; |
155 | my $arg_dump = Dumper ($invocations->{$type}{args}); |
156 | |
157 | $storage->connect_info ($invocations->{$type}{args}); |
9a0891be |
158 | |
92fe2181 |
159 | is ($arg_dump, Dumper ($invocations->{$type}{args}), "$type didn't modify passed arguments"); |
160 | |
161 | |
162 | is_deeply ($storage->_dbi_connect_info, $invocations->{$type}{dbi_connect_info}, "$type produced correct _dbi_connect_info"); |
163 | ok ( (not $storage->auto_savepoint and not $storage->unsafe), "$type correctly ignored extra hashref"); |
164 | |
165 | is_deeply ( |
166 | [$storage->on_connect_do, $storage->on_disconnect_do ], |
167 | [ [qw/a b c/], [qw/d e f/] ], |
168 | "$type correctly parsed DBIC specific on_[dis]connect_do", |
169 | ); |
170 | } |
baa31d2f |
171 | |
efe6365b |
172 | 1; |