fix and regression test for RT #62642
[dbsrgits/DBIx-Class.git] / t / storage / on_connect_do.t
1 use strict;
2 use warnings;
3
4 use Test::More tests => 12;
5
6 use lib qw(t/lib);
7 use base 'DBICTest';
8 require DBI;
9
10
11 my $schema = DBICTest->init_schema(
12     no_connect  => 1,
13     no_deploy   => 1,
14 );
15
16 ok $schema->connection(
17   DBICTest->_database,
18   {
19     on_connect_do => 'CREATE TABLE TEST_empty (id INTEGER)',
20   },
21 ), 'connection()';
22
23 is_deeply (
24   $schema->storage->dbh->selectall_arrayref('SELECT * FROM TEST_empty'),
25   [],
26   'string version on_connect_do() worked'
27 );
28
29 $schema->storage->disconnect;
30
31 ok $schema->connection(
32     sub { DBI->connect(DBICTest->_database) },
33     {
34         on_connect_do       => [
35             'CREATE TABLE TEST_empty (id INTEGER)',
36             [ 'INSERT INTO TEST_empty VALUES (?)', {}, 2 ],
37             \&insert_from_subref,
38         ],
39         on_disconnect_do    =>
40             [\&check_exists, 'DROP TABLE TEST_empty', \&check_dropped],
41     },
42 ), 'connection()';
43
44 is_deeply (
45   $schema->storage->dbh->selectall_arrayref('SELECT * FROM TEST_empty'),
46   [ [ 2 ], [ 3 ], [ 7 ] ],
47   'on_connect_do() worked'
48 );
49 eval { $schema->storage->dbh->do('SELECT 1 FROM TEST_nonexistent'); };
50 ok $@, 'Searching for nonexistent table dies';
51
52 $schema->storage->disconnect();
53
54 my($connected, $disconnected, @cb_args);
55 ok $schema->connection(
56     DBICTest->_database,
57     {
58         on_connect_do       => sub { $connected = 1; @cb_args = @_; },
59         on_disconnect_do    => sub { $disconnected = 1 },
60     },
61 ), 'second connection()';
62 $schema->storage->dbh->do('SELECT 1');
63 ok $connected, 'on_connect_do() called after connect()';
64 ok ! $disconnected, 'on_disconnect_do() not called after connect()';
65 $schema->storage->disconnect();
66 ok $disconnected, 'on_disconnect_do() called after disconnect()';
67
68 isa_ok($cb_args[0], 'DBIx::Class::Storage', 'first arg to on_connect_do hook');
69
70 sub check_exists {
71     my $storage = shift;
72     ok $storage->dbh->do('SELECT 1 FROM TEST_empty'), 'Table still exists';
73     return;
74 }
75
76 sub check_dropped {
77     my $storage = shift;
78     eval { $storage->dbh->do('SELECT 1 FROM TEST_empty'); };
79     ok $@, 'Reading from dropped table fails';
80     return;
81 }
82
83 sub insert_from_subref {
84     my $storage = shift;
85     return [
86         [ 'INSERT INTO TEST_empty VALUES (?)', {}, 3 ],
87         'INSERT INTO TEST_empty VALUES (7)',
88     ];
89 }