Commit | Line | Data |
4cbe63e7 |
1 | use strict; |
2 | use warnings; |
3 | |
4 | use FindBin '$Bin'; |
5 | use lib "$Bin/lib"; |
6 | |
2a969b06 |
7 | use Test::More; |
4cbe63e7 |
8 | use Test::Exception; |
9 | use Catalyst::Helper::Model::DBIC::Schema; |
4cbe63e7 |
10 | use Storable 'dclone'; |
d71aa889 |
11 | use Data::Dumper; |
632e5da3 |
12 | use Test::Requires qw(Catalyst::Helper DBIx::Class::Schema::Loader); |
4cbe63e7 |
13 | |
14 | my $helper = Catalyst::Helper->new; |
15 | $helper->{base} = $Bin; |
16 | my $static = 'create=static'; |
17 | my $dynamic = 'create=dynamic'; |
18 | my $sqlite = 'dbi:SQLite:myapp.db'; |
19 | my $pg = 'dbi:Pg:dbname=foo'; |
20 | my $on_connect_do = 'on_connect_do=["select 1", "select 2"]'; |
21 | my $quote_char = 'quote_char="'; |
22 | my $name_sep = 'name_sep=.'; |
23 | my $i; |
24 | |
25 | $i = instance(schema_class => 'ASchemaClass'); |
26 | is $i->old_schema, 1, '->load_classes detected correctly'; |
27 | |
a4803ca6 |
28 | throws_ok { $i = instance(args => [$static, 'DbI:SQLite:myapp.db']) } |
29 | qr/case matters/i, "wrong case for 'dbi:' DSN part"; |
30 | |
c34bcab6 |
31 | $i = instance(args => ['traits=Caching']); |
32 | is_deeply $i->traits, ['Caching'], 'one trait'; |
33 | is $i->helper->{traits}, "['Caching']", 'one trait as string'; |
4cbe63e7 |
34 | |
c34bcab6 |
35 | $i = instance(args => ['traits=Caching,Replicated']); |
36 | is_deeply $i->traits, ['Caching', 'Replicated'], 'two traits'; |
37 | is $i->helper->{traits}, "['Caching','Replicated']", 'two traits as string'; |
4cbe63e7 |
38 | |
39 | $i = instance(args => [$static]); |
40 | is $i->create, 'static', 'create=static'; |
41 | |
42 | $i = instance(args => [$static, |
43 | q{moniker_map={ authors => "AUTHORS", books => "BOOKS" }}] |
44 | ); |
45 | is_deeply $i->loader_args->{moniker_map}, |
46 | { authors => 'AUTHORS', books => 'BOOKS' }, |
47 | 'loader hash arg'; |
48 | is $i->helper->{loader_args}{moniker_map}, |
49 | q{{authors => "AUTHORS",books => "BOOKS"}}, |
50 | 'loader hash arg as string'; |
51 | |
52 | $i = instance(args => [$static, q{foo=["bar","baz"]}]); |
53 | is_deeply $i->loader_args->{foo}, ['bar', 'baz'], 'loader array arg'; |
54 | is $i->helper->{loader_args}{foo}, |
55 | q{["bar","baz"]}, |
56 | 'loader array arg as string'; |
57 | |
58 | $i = instance(args => [$static, q{components=TimeStamp}]); |
59 | is_deeply $i->components, ['InflateColumn::DateTime', 'TimeStamp'], |
60 | 'extra component'; |
61 | is $i->helper->{loader_args}{components}, |
62 | q{["InflateColumn::DateTime","TimeStamp"]}, |
63 | 'components as string'; |
64 | |
65 | $i = instance( |
66 | schema_class => 'ASchemaClass', |
67 | args => [$static, q{components=TimeStamp}] |
68 | ); |
69 | is_deeply $i->components, ['TimeStamp'], |
70 | 'extra component with ->load_classes'; |
71 | |
72 | $i = instance(args => [$static, q{components=TimeStamp,Foo}]); |
73 | is_deeply $i->components, ['InflateColumn::DateTime', 'TimeStamp', 'Foo'], |
74 | 'two extra components'; |
75 | |
d71aa889 |
76 | # Different versions of perl and Data::Dumper serialise regexes differently |
77 | my ($flagstart, $flagend, $postflag) = Dumper(qr//) =~ m{qr/(.*?)(\)?)/([a-z]*)}; |
4cbe63e7 |
78 | $i = instance(args => [$static, q{constraint=^(foo|bar)$}]); |
79 | is $i->loader_args->{constraint}, qr/^(foo|bar)$/, |
80 | 'constraint loader arg'; |
81 | is $i->helper->{loader_args}{constraint}, |
d71aa889 |
82 | qq{qr/$flagstart^(foo|bar)\$$flagend/$postflag}, |
4cbe63e7 |
83 | 'constraint loader arg as string'; |
84 | |
85 | $i = instance(args => [$static, q{exclude=^(foo|bar)$}]); |
86 | is $i->loader_args->{exclude}, qr/^(foo|bar)$/, |
87 | 'exclude loader arg'; |
88 | |
5f9a34d7 |
89 | $i = instance(args => [$static, q{db_schema=foo;bar::baz/quux}]); |
90 | is $i->loader_args->{db_schema}, q{foo;bar::baz/quux}, |
91 | 'simple value loader arg'; |
92 | |
4cbe63e7 |
93 | $i = instance(args => [ |
94 | $static, 'components=TimeStamp', $sqlite, $on_connect_do, |
95 | $quote_char, $name_sep |
96 | ]); |
97 | |
98 | is_deeply $i->components, ['InflateColumn::DateTime', 'TimeStamp'], |
99 | 'extra component'; |
100 | |
101 | is $i->connect_info->{dsn}, $sqlite, 'connect_info dsn'; |
102 | is $i->connect_info->{user}, '', 'sqlite omitted user'; |
103 | is $i->connect_info->{password}, '', 'sqlite omitted password'; |
104 | |
105 | is_deeply $i->connect_info->{on_connect_do}, |
106 | ['select 1', 'select 2'], 'connect_info data struct'; |
107 | |
108 | is $i->helper->{connect_info}{on_connect_do}, |
109 | q{["select 1", "select 2"]}, 'connect_info data struct as string'; |
110 | |
111 | is $i->connect_info->{quote_char}, '"', 'connect_info quote_char'; |
112 | |
113 | is $i->helper->{connect_info}{quote_char}, 'q{"}', |
114 | 'connect_info quote_char as string'; |
115 | |
116 | is $i->connect_info->{name_sep}, '.', 'connect_info name_sep'; |
117 | |
118 | is $i->helper->{connect_info}{name_sep}, 'q{.}', |
119 | 'connect_info name_sep as string'; |
120 | |
121 | $i = instance(args => [ |
51062974 |
122 | $static, $sqlite, 'on_connect_do=PRAGMA foreign_keys = ON' |
123 | ]); |
124 | |
125 | is $i->connect_info->{on_connect_do}, |
126 | 'PRAGMA foreign_keys = ON', 'on_connect_do string'; |
127 | |
128 | is $i->helper->{connect_info}{on_connect_do}, |
129 | 'q{PRAGMA foreign_keys = ON}', 'on_connect_do string as string'; |
130 | |
131 | $i = instance(args => [ |
4cbe63e7 |
132 | $static, 'components=TimeStamp', $sqlite, '', $on_connect_do, |
133 | $quote_char, $name_sep |
134 | ]); |
135 | |
136 | is $i->connect_info->{dsn}, $sqlite, 'connect_info dsn'; |
137 | is $i->connect_info->{user}, '', 'sqlite user'; |
138 | is $i->connect_info->{password}, '', 'sqlite omitted password'; |
139 | |
140 | $i = instance(args => [ |
141 | $static, 'components=TimeStamp', $pg, 'user', 'pass', $on_connect_do, |
142 | $quote_char, $name_sep |
143 | ]); |
144 | |
145 | is $i->connect_info->{dsn}, $pg, 'connect_info dsn'; |
146 | is $i->connect_info->{user}, 'user', 'user'; |
147 | is $i->connect_info->{password}, 'pass', 'password'; |
148 | |
149 | $i = instance(args => [ |
c34bcab6 |
150 | $static, $pg, 'user', 'pass', 'quote_char=[]', $name_sep |
151 | ]); |
152 | |
153 | is_deeply $i->connect_info->{quote_char}, ['[', ']'], |
154 | '2 character quote_char'; |
155 | is $i->helper->{connect_info}{quote_char}, '["[","]"]', |
156 | '2 character quote_char as string'; |
157 | |
158 | $i = instance(args => [ |
4cbe63e7 |
159 | $static, 'components=TimeStamp', $sqlite, $on_connect_do, |
160 | $quote_char, $name_sep, '{ auto_savepoint => 1, AutoCommit => 0 }' |
161 | ]); |
162 | |
163 | is $i->connect_info->{auto_savepoint}, 1, 'connect_info arg from extra hash'; |
164 | is $i->connect_info->{AutoCommit}, 0, 'connect_info arg from extra hash'; |
165 | is $i->helper->{connect_info}{auto_savepoint}, 'q{1}', |
166 | 'connect_info arg from extra hash as string'; |
167 | is $i->helper->{connect_info}{AutoCommit}, 'q{0}', |
168 | 'connect_info arg from extra hash as string'; |
169 | |
f1b4a8fd |
170 | $i = instance(args => [ |
171 | $static, 'components=TimeStamp', $sqlite, $on_connect_do, |
172 | $quote_char, $name_sep, 'auto_savepoint=1', 'AutoCommit=0', |
173 | 'db_schema=myschema', |
174 | ]); |
175 | |
176 | is $i->loader_args->{db_schema}, 'myschema', |
177 | 'loader arg after connect_info'; |
178 | |
7dd1b1e9 |
179 | ok ((not exists $i->helper->{connect_info}{db_schema}), |
180 | 'loader args removed from connect_info'); |
181 | |
51062974 |
182 | done_testing; |
183 | |
4cbe63e7 |
184 | sub instance { |
185 | Catalyst::Helper::Model::DBIC::Schema->new( |
186 | schema_class => 'AnotherSchemaClass', |
187 | helper => dclone($helper), |
188 | args => ['create=static'], |
189 | @_ |
190 | ) |
191 | } |