1 my ($inc_before, $inc_after);
3 $inc_before = [ keys %INC ];
4 require DBIx::Class::Optional::Dependencies;
5 $inc_after = [ keys %INC ];
15 # load before we break require()
19 use List::Util 'shuffle';
21 ok ( (! grep { $_ =~ m|DBIx/Class| } @$inc_before ), 'Nothing DBIC related was loaded before inc-test')
22 unless $ENV{PERL5OPT}; # a defined PERL5OPT may inject extra deps crashing this test
26 [ sort (@$inc_before, qw( DBIx/Class/Optional/Dependencies.pm if.pm )) ],
27 'Nothing loaded other than DBIx::Class::OptDeps',
28 ) unless $ENV{RELEASE_TESTING};
30 # check the project-local groups for sanity
32 DBIx::Class::Optional::Dependencies->req_group_list
33 } "The entire optdep list is well formed";
36 [ keys %{ DBIx::Class::Optional::Dependencies->req_list_for ('deploy') } ],
37 [ 'SQL::Translator' ],
38 'Correct deploy() dependency list',
41 # scope to break require()
44 # make module loading impossible, regardless of actual libpath contents
47 # basic test using the deploy target
48 for ('deploy', ['deploy']) {
50 # explicitly blow up cache
51 %DBIx::Class::Optional::Dependencies::req_unavailability_cache = ();
54 ! DBIx::Class::Optional::Dependencies->req_ok_for ($_),
55 'deploy() deps missing',
59 DBIx::Class::Optional::Dependencies->modreq_missing_for ($_),
62 " SQL::Translator \~ \>\= [\d\.]+ "
65 'expected modreq missing string contents',
69 DBIx::Class::Optional::Dependencies->req_missing_for ($_),
72 " SQL::Translator \~ \>\= [\d\.]+ "
73 \Q (see DBIx::Class::Optional::Dependencies documentation for details)\E
76 'expected missing string contents',
80 DBIx::Class::Optional::Dependencies->modreq_errorlist_for ($_)->{'SQL::Translator'},
81 qr|\QCan't locate SQL/Translator.pm|,
82 'correct "unable to locate" exception found in errorlist',
85 #make it so module appears loaded
86 local $INC{'SQL/Translator.pm'} = 1;
87 local $SQL::Translator::VERSION = 999;
90 ! DBIx::Class::Optional::Dependencies->req_ok_for ($_),
91 'deploy() deps missing cached properly from previous run',
95 %DBIx::Class::Optional::Dependencies::req_unavailability_cache = ();
98 DBIx::Class::Optional::Dependencies->req_ok_for ($_),
99 'deploy() deps present',
103 DBIx::Class::Optional::Dependencies->req_missing_for ($_),
105 'expected null missing string',
109 # use the deprecated method name
110 DBIx::Class::Optional::Dependencies->req_errorlist_for ($_),
112 'expected empty errorlist',
116 # test single-db text
117 local $ENV{DBICTEST_MYSQL_DSN};
119 DBIx::Class::Optional::Dependencies->req_list_for('test_rdbms_mysql'),
121 'unknown optional dependencies list for testing MySQL without ENV var',
124 DBIx::Class::Optional::Dependencies->modreq_list_for('test_rdbms_mysql'),
125 { 'DBD::mysql' => 0 },
126 'correct optional module dependencies list for testing MySQL without ENV var',
129 local $ENV{DBICTEST_MYSQL_DSN};
130 local $ENV{DBICTEST_PG_DSN};
134 DBIx::Class::Optional::Dependencies->modreq_list_for('test_rdbms_pg'),
135 { 'DBD::Pg' => '2.009002' },
136 'optional dependencies list for testing Postgres without envvar',
140 DBIx::Class::Optional::Dependencies->req_list_for('test_rdbms_pg'),
142 'optional dependencies list for testing Postgres without envvar',
146 DBIx::Class::Optional::Dependencies->req_list_for('rdbms_pg'),
147 { 'DBD::Pg' => '0', },
148 'optional dependencies list for using Postgres matches',
152 DBIx::Class::Optional::Dependencies->req_missing_for('rdbms_pg'),
153 'DBD::Pg (see DBIx::Class::Optional::Dependencies documentation for details)',
154 'optional dependencies missing list for using Postgres matches',
157 # test combination of different requirements on same module (pg's are relatively stable)
159 DBIx::Class::Optional::Dependencies->req_list_for([shuffle qw( rdbms_pg test_rdbms_pg )]),
160 { 'DBD::Pg' => '0' },
161 'optional module dependencies list for testing Postgres matches without envvar',
165 DBIx::Class::Optional::Dependencies->req_missing_for([qw( rdbms_pg test_rdbms_pg )]),
166 '"DBD::Pg~>=2.009002" as well as the following group(s) of environment variables: DBICTEST_PG_DSN/..._USER/..._PASS',
167 'optional dependencies for testing Postgres without envvar'
171 DBIx::Class::Optional::Dependencies->req_missing_for([shuffle qw( test_rdbms_mysql test_rdbms_pg )]),
172 'DBD::mysql "DBD::Pg~>=2.009002" as well as the following group(s) of environment variables: DBICTEST_MYSQL_DSN/..._USER/..._PASS and DBICTEST_PG_DSN/..._USER/..._PASS',
173 'optional dependencies for testing Postgres+MySQL without envvars'
176 $ENV{DBICTEST_PG_DSN} = 'boo';
178 DBIx::Class::Optional::Dependencies->modreq_list_for([shuffle qw( rdbms_pg test_rdbms_pg )]),
179 { 'DBD::Pg' => '2.009002' },
180 'optional module dependencies list for testing Postgres matches with envvar',
184 DBIx::Class::Optional::Dependencies->req_missing_for([shuffle qw( rdbms_pg test_rdbms_pg )]),
185 '"DBD::Pg~>=2.009002"',
186 'optional dependencies error text for testing Postgres matches with evvar',
190 my $mysql_icdt = [shuffle qw( test_rdbms_mysql icdt )];
193 DBIx::Class::Optional::Dependencies->modreq_list_for($mysql_icdt),
195 'DateTime' => '0.55',
197 'DateTime::Format::MySQL' => 0,
199 'optional module dependencies list for testing ICDT MySQL without envvar',
203 DBIx::Class::Optional::Dependencies->req_list_for($mysql_icdt),
205 'DateTime' => '0.55',
207 'optional dependencies list for testing ICDT MySQL without envvar',
211 DBIx::Class::Optional::Dependencies->req_missing_for($mysql_icdt),
212 '"DateTime~>=0.55" DateTime::Format::MySQL DBD::mysql as well as the following group(s) of environment variables: DBICTEST_MYSQL_DSN/..._USER/..._PASS',
213 'missing optional dependencies for testing ICDT MySQL without envvars'
216 # test multi-level include with a variable and mandatory part converging on same included dep
217 local $ENV{DBICTEST_MSACCESS_ODBC_DSN};
218 local $ENV{DBICTEST_MSSQL_ODBC_DSN} = 'foo';
219 my $msaccess_mssql_icdt = [ shuffle qw( test_rdbms_msaccess_odbc test_rdbms_mssql_odbc icdt ) ];
221 DBIx::Class::Optional::Dependencies->req_missing_for($msaccess_mssql_icdt),
222 'Data::GUID "DateTime~>=0.55" "DateTime::Format::Strptime~>=1.2" DBD::ODBC as well as the following group(s) of environment variables: DBICTEST_MSACCESS_ODBC_DSN/..._USER/..._PASS',
223 'Correct req_missing_for on multi-level converging include',
227 DBIx::Class::Optional::Dependencies->modreq_missing_for($msaccess_mssql_icdt),
228 'Data::GUID "DateTime~>=0.55" "DateTime::Format::Strptime~>=1.2" DBD::ODBC',
229 'Correct modreq_missing_for on multi-level converging include',
233 DBIx::Class::Optional::Dependencies->req_list_for($msaccess_mssql_icdt),
236 'DateTime' => '0.55',
237 'DateTime::Format::Strptime' => '1.2',
239 'Correct req_list_for on multi-level converging include',
243 DBIx::Class::Optional::Dependencies->modreq_list_for($msaccess_mssql_icdt),
247 'DateTime' => '0.55',
248 'DateTime::Format::Strptime' => '1.2',
250 'Correct modreq_list_for on multi-level converging include',
255 # test multiple times to find autovivification bugs
256 for my $meth (qw(req_list_for modreq_list_for)) {
258 DBIx::Class::Optional::Dependencies->$meth();
259 } qr/\Qreq_list_for() expects a requirement group name/,
260 "$meth without groupname throws exception";
263 DBIx::Class::Optional::Dependencies->$meth('');
264 } qr/\Q$meth() expects a requirement group name/,
265 "$meth with empty groupname throws exception";
268 DBIx::Class::Optional::Dependencies->$meth('invalid_groupname');
269 } qr/Requirement group 'invalid_groupname' is not defined/,
270 "$meth with invalid groupname throws exception";