2874a9ddb8ebe30fcd35701ce65391265e5da1dc
[dbsrgits/DBIx-Class.git] / t / storage / on_connect_do.t
1 use strict;
2 use warnings;
3
4 # !!! do not replace this with done_testing - tests reside in the callbacks
5 # !!! number of calls is important
6 use Test::More tests => 13;
7 # !!!
8 use Test::Warn;
9 use Test::Exception;
10
11 use lib qw(t/lib);
12 use DBICTest;
13 require DBI;
14
15
16 my $schema = DBICTest->init_schema(
17     no_connect  => 1,
18     no_deploy   => 1,
19 );
20
21 ok $schema->connection(
22   DBICTest->_database,
23   {
24     on_connect_do => 'CREATE TABLE TEST_empty (id INTEGER)',
25   },
26 ), 'connection()';
27
28 is_deeply (
29   $schema->storage->dbh->selectall_arrayref('SELECT * FROM TEST_empty'),
30   [],
31   'string version on_connect_do() worked'
32 );
33
34 $schema->storage->disconnect;
35
36 ok $schema->connection(
37     sub { DBI->connect(DBICTest->_database, undef, undef, { AutoCommit => 0 }) },
38     {
39         on_connect_do       => [
40             'CREATE TABLE TEST_empty (id INTEGER)',
41             [ 'INSERT INTO TEST_empty VALUES (?)', {}, 2 ],
42             \&insert_from_subref,
43         ],
44         on_disconnect_do    =>
45             [\&check_exists, 'DROP TABLE TEST_empty', \&check_dropped],
46     },
47 ), 'connection()';
48
49 warnings_exist {
50   $schema->storage->ensure_connected
51 } qr/The 'RaiseError' of the externally supplied DBI handle is set to false/,
52 'Warning on clobbered AutoCommit => 0 fired';
53
54 is_deeply (
55   $schema->storage->dbh->selectall_arrayref('SELECT * FROM TEST_empty'),
56   [ [ 2 ], [ 3 ], [ 7 ] ],
57   'on_connect_do() worked'
58 );
59 dies_ok {
60   $schema->storage->dbh->do('SELECT 1 FROM TEST_nonexistent');
61 } 'Searching for nonexistent table dies';
62
63 $schema->storage->disconnect();
64
65 my($connected, $disconnected, @cb_args);
66 ok $schema->connection(
67     DBICTest->_database,
68     {
69         on_connect_do       => sub { $connected = 1; @cb_args = @_; },
70         on_disconnect_do    => sub { $disconnected = 1 },
71     },
72 ), 'second connection()';
73 $schema->storage->dbh->do('SELECT 1');
74 ok $connected, 'on_connect_do() called after connect()';
75 ok ! $disconnected, 'on_disconnect_do() not called after connect()';
76 $schema->storage->disconnect();
77 ok $disconnected, 'on_disconnect_do() called after disconnect()';
78
79 isa_ok($cb_args[0], 'DBIx::Class::Storage', 'first arg to on_connect_do hook');
80 @cb_args = ();
81
82 sub check_exists {
83     my $storage = shift;
84     ok $storage->dbh->do('SELECT 1 FROM TEST_empty'), 'Table still exists';
85     return;
86 }
87
88 sub check_dropped {
89     my $storage = shift;
90
91     dies_ok {
92       $storage->dbh->do('SELECT 1 FROM TEST_empty');
93     } 'Reading from dropped table fails';
94     return;
95 }
96
97 sub insert_from_subref {
98     my $storage = shift;
99     return [
100         [ 'INSERT INTO TEST_empty VALUES (?)', {}, 3 ],
101         'INSERT INTO TEST_empty VALUES (7)',
102     ];
103 }