066a69dcea450a323ff8aab3cd5953dfbb59e0d1
[catagits/Catalyst-Model-DBIC-Schema.git] / t / 08helper.t
1 use strict;
2 use warnings;
3
4 use FindBin '$Bin';
5 use lib "$Bin/lib";
6
7 use Test::More;
8 use Test::Exception;
9 use Catalyst::Helper::Model::DBIC::Schema;
10 use Storable 'dclone';
11 eval "use Catalyst::Helper";
12 plan skip_all => 'Catalyst::Helper required for tests' if $@;
13 plan tests => 41;
14
15 my $helper      = Catalyst::Helper->new;
16 $helper->{base} = $Bin;
17 my $static      = 'create=static';
18 my $dynamic     = 'create=dynamic';
19 my $sqlite      = 'dbi:SQLite:myapp.db';
20 my $pg          = 'dbi:Pg:dbname=foo';
21 my $on_connect_do = 'on_connect_do=["select 1", "select 2"]';
22 my $quote_char  = 'quote_char="';
23 my $name_sep    = 'name_sep=.';
24 my $i;
25
26 $i = instance(schema_class => 'ASchemaClass');
27 is $i->old_schema, 1, '->load_classes detected correctly';
28
29 throws_ok { $i = instance(args => [$static, 'DbI:SQLite:myapp.db']) }
30     qr/case matters/i, "wrong case for 'dbi:' DSN part";
31
32 $i = instance(args => ['traits=Caching']);
33 is_deeply $i->traits, ['Caching'], 'one trait';
34 is $i->helper->{traits}, "['Caching']", 'one trait as string';
35
36 $i = instance(args => ['traits=Caching,Replicated']);
37 is_deeply $i->traits, ['Caching', 'Replicated'], 'two traits';
38 is $i->helper->{traits}, "['Caching','Replicated']", 'two traits as string';
39
40 $i = instance(args => [$static]);
41 is $i->create, 'static', 'create=static';
42
43 $i = instance(args => [$static,
44     q{moniker_map={ authors => "AUTHORS", books => "BOOKS" }}]
45 );
46 is_deeply $i->loader_args->{moniker_map},
47     { authors => 'AUTHORS', books => 'BOOKS' },
48     'loader hash arg';
49 is $i->helper->{loader_args}{moniker_map},
50     q{{authors => "AUTHORS",books => "BOOKS"}},
51     'loader hash arg as string';
52
53 $i = instance(args => [$static, q{foo=["bar","baz"]}]);
54 is_deeply $i->loader_args->{foo}, ['bar', 'baz'], 'loader array arg';
55 is $i->helper->{loader_args}{foo},
56     q{["bar","baz"]},
57     'loader array arg as string';
58
59 $i = instance(args => [$static, q{components=TimeStamp}]);
60 is_deeply $i->components, ['InflateColumn::DateTime', 'TimeStamp'],
61     'extra component';
62 is $i->helper->{loader_args}{components},
63     q{["InflateColumn::DateTime","TimeStamp"]},
64     'components as string';
65
66 $i = instance(
67     schema_class => 'ASchemaClass',
68     args => [$static, q{components=TimeStamp}]
69 );
70 is_deeply $i->components, ['TimeStamp'],
71     'extra component with ->load_classes';
72
73 $i = instance(args => [$static, q{components=TimeStamp,Foo}]);
74 is_deeply $i->components, ['InflateColumn::DateTime', 'TimeStamp', 'Foo'],
75     'two extra components';
76
77 $i = instance(args => [$static, q{constraint=^(foo|bar)$}]);
78 is $i->loader_args->{constraint}, qr/^(foo|bar)$/,
79     'constraint loader arg';
80 is $i->helper->{loader_args}{constraint},
81     q{qr/(?-xism:^(foo|bar)$)/},
82     'constraint loader arg as string';
83
84 $i = instance(args => [$static, q{exclude=^(foo|bar)$}]);
85 is $i->loader_args->{exclude}, qr/^(foo|bar)$/,
86     'exclude loader arg';
87
88 $i = instance(args => [$static, q{db_schema=foo;bar::baz/quux}]);
89 is $i->loader_args->{db_schema}, q{foo;bar::baz/quux},
90     'simple value loader arg';
91
92 $i = instance(args => [
93     $static, 'components=TimeStamp', $sqlite, $on_connect_do,
94     $quote_char, $name_sep
95 ]);
96
97 is_deeply $i->components, ['InflateColumn::DateTime', 'TimeStamp'],
98     'extra component';
99
100 is $i->connect_info->{dsn}, $sqlite, 'connect_info dsn';
101 is $i->connect_info->{user}, '', 'sqlite omitted user';
102 is $i->connect_info->{password}, '', 'sqlite omitted password';
103
104 is_deeply $i->connect_info->{on_connect_do},
105     ['select 1', 'select 2'], 'connect_info data struct';
106
107 is $i->helper->{connect_info}{on_connect_do},
108     q{["select 1", "select 2"]}, 'connect_info data struct as string';
109
110 is $i->connect_info->{quote_char}, '"', 'connect_info quote_char';
111
112 is $i->helper->{connect_info}{quote_char}, 'q{"}',
113     'connect_info quote_char as string';
114
115 is $i->connect_info->{name_sep}, '.', 'connect_info name_sep';
116
117 is $i->helper->{connect_info}{name_sep}, 'q{.}',
118     'connect_info name_sep as string';
119
120 $i = instance(args => [
121     $static, 'components=TimeStamp', $sqlite, '', $on_connect_do,
122     $quote_char, $name_sep
123 ]);
124
125 is $i->connect_info->{dsn}, $sqlite, 'connect_info dsn';
126 is $i->connect_info->{user}, '', 'sqlite user';
127 is $i->connect_info->{password}, '', 'sqlite omitted password';
128
129 $i = instance(args => [
130     $static, 'components=TimeStamp', $pg, 'user', 'pass', $on_connect_do,
131     $quote_char, $name_sep
132 ]);
133
134 is $i->connect_info->{dsn}, $pg, 'connect_info dsn';
135 is $i->connect_info->{user}, 'user', 'user';
136 is $i->connect_info->{password}, 'pass', 'password';
137
138 $i = instance(args => [
139     $static, $pg, 'user', 'pass', 'quote_char=[]', $name_sep
140 ]);
141
142 is_deeply $i->connect_info->{quote_char}, ['[', ']'],
143     '2 character quote_char';
144 is $i->helper->{connect_info}{quote_char}, '["[","]"]',
145     '2 character quote_char as string';
146
147 $i = instance(args => [
148     $static, 'components=TimeStamp', $sqlite, $on_connect_do,
149     $quote_char, $name_sep, '{ auto_savepoint => 1, AutoCommit => 0 }'
150 ]);
151
152 is $i->connect_info->{auto_savepoint}, 1, 'connect_info arg from extra hash';
153 is $i->connect_info->{AutoCommit}, 0, 'connect_info arg from extra hash';
154 is $i->helper->{connect_info}{auto_savepoint}, 'q{1}',
155     'connect_info arg from extra hash as string';
156 is $i->helper->{connect_info}{AutoCommit}, 'q{0}',
157     'connect_info arg from extra hash as string';
158
159 sub instance {
160     Catalyst::Helper::Model::DBIC::Schema->new(
161         schema_class => 'AnotherSchemaClass',
162         helper => dclone($helper),
163         args => ['create=static'],
164         @_
165     )
166 }