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 $@;
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=.';
25 $i = instance(schema_class => 'ASchemaClass');
26 is $i->old_schema, 1, '->load_classes detected correctly';
28 throws_ok { $i = instance(args => [$static, 'DbI:SQLite:myapp.db']) }
29 qr/case matters/i, "wrong case for 'dbi:' DSN part";
31 $i = instance(args => ['traits=Caching']);
32 is_deeply $i->traits, ['Caching'], 'one trait';
33 is $i->helper->{traits}, "['Caching']", 'one trait as string';
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';
39 $i = instance(args => [$static]);
40 is $i->create, 'static', 'create=static';
42 $i = instance(args => [$static,
43 q{moniker_map={ authors => "AUTHORS", books => "BOOKS" }}]
45 is_deeply $i->loader_args->{moniker_map},
46 { authors => 'AUTHORS', books => 'BOOKS' },
48 is $i->helper->{loader_args}{moniker_map},
49 q{{authors => "AUTHORS",books => "BOOKS"}},
50 'loader hash arg as string';
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},
56 'loader array arg as string';
58 $i = instance(args => [$static, q{components=TimeStamp}]);
59 is_deeply $i->components, ['InflateColumn::DateTime', 'TimeStamp'],
61 is $i->helper->{loader_args}{components},
62 q{["InflateColumn::DateTime","TimeStamp"]},
63 'components as string';
66 schema_class => 'ASchemaClass',
67 args => [$static, q{components=TimeStamp}]
69 is_deeply $i->components, ['TimeStamp'],
70 'extra component with ->load_classes';
72 $i = instance(args => [$static, q{components=TimeStamp,Foo}]);
73 is_deeply $i->components, ['InflateColumn::DateTime', 'TimeStamp', 'Foo'],
74 'two extra components';
76 my $flags = qr// =~ /\^/ ? '^' : "-xism";
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 qq{qr/(?$flags:^(foo|bar)\$)/},
82 'constraint loader arg as string';
84 $i = instance(args => [$static, q{exclude=^(foo|bar)$}]);
85 is $i->loader_args->{exclude}, qr/^(foo|bar)$/,
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';
92 $i = instance(args => [
93 $static, 'components=TimeStamp', $sqlite, $on_connect_do,
94 $quote_char, $name_sep
97 is_deeply $i->components, ['InflateColumn::DateTime', 'TimeStamp'],
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';
104 is_deeply $i->connect_info->{on_connect_do},
105 ['select 1', 'select 2'], 'connect_info data struct';
107 is $i->helper->{connect_info}{on_connect_do},
108 q{["select 1", "select 2"]}, 'connect_info data struct as string';
110 is $i->connect_info->{quote_char}, '"', 'connect_info quote_char';
112 is $i->helper->{connect_info}{quote_char}, 'q{"}',
113 'connect_info quote_char as string';
115 is $i->connect_info->{name_sep}, '.', 'connect_info name_sep';
117 is $i->helper->{connect_info}{name_sep}, 'q{.}',
118 'connect_info name_sep as string';
120 $i = instance(args => [
121 $static, $sqlite, 'on_connect_do=PRAGMA foreign_keys = ON'
124 is $i->connect_info->{on_connect_do},
125 'PRAGMA foreign_keys = ON', 'on_connect_do string';
127 is $i->helper->{connect_info}{on_connect_do},
128 'q{PRAGMA foreign_keys = ON}', 'on_connect_do string as string';
130 $i = instance(args => [
131 $static, 'components=TimeStamp', $sqlite, '', $on_connect_do,
132 $quote_char, $name_sep
135 is $i->connect_info->{dsn}, $sqlite, 'connect_info dsn';
136 is $i->connect_info->{user}, '', 'sqlite user';
137 is $i->connect_info->{password}, '', 'sqlite omitted password';
139 $i = instance(args => [
140 $static, 'components=TimeStamp', $pg, 'user', 'pass', $on_connect_do,
141 $quote_char, $name_sep
144 is $i->connect_info->{dsn}, $pg, 'connect_info dsn';
145 is $i->connect_info->{user}, 'user', 'user';
146 is $i->connect_info->{password}, 'pass', 'password';
148 $i = instance(args => [
149 $static, $pg, 'user', 'pass', 'quote_char=[]', $name_sep
152 is_deeply $i->connect_info->{quote_char}, ['[', ']'],
153 '2 character quote_char';
154 is $i->helper->{connect_info}{quote_char}, '["[","]"]',
155 '2 character quote_char as string';
157 $i = instance(args => [
158 $static, 'components=TimeStamp', $sqlite, $on_connect_do,
159 $quote_char, $name_sep, '{ auto_savepoint => 1, AutoCommit => 0 }'
162 is $i->connect_info->{auto_savepoint}, 1, 'connect_info arg from extra hash';
163 is $i->connect_info->{AutoCommit}, 0, 'connect_info arg from extra hash';
164 is $i->helper->{connect_info}{auto_savepoint}, 'q{1}',
165 'connect_info arg from extra hash as string';
166 is $i->helper->{connect_info}{AutoCommit}, 'q{0}',
167 'connect_info arg from extra hash as string';
169 $i = instance(args => [
170 $static, 'components=TimeStamp', $sqlite, $on_connect_do,
171 $quote_char, $name_sep, 'auto_savepoint=1', 'AutoCommit=0',
172 'db_schema=myschema',
175 is $i->loader_args->{db_schema}, 'myschema',
176 'loader arg after connect_info';
181 Catalyst::Helper::Model::DBIC::Schema->new(
182 schema_class => 'AnotherSchemaClass',
183 helper => dclone($helper),
184 args => ['create=static'],