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()
20 ok ( (! grep { $_ =~ m|DBIx/Class| } @$inc_before ), 'Nothing DBIC related was loaded before inc-test')
21 unless $ENV{PERL5OPT}; # a defined PERL5OPT may inject extra deps crashing this test
25 [ sort (@$inc_before, qw( DBIx/Class/Optional/Dependencies.pm if.pm )) ],
26 'Nothing loaded other than DBIx::Class::OptDeps',
27 ) 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
45 local @INC = (sub { confess('Optional Dep Test') } );
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/Optional Dep Test/,
82 'custom 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};
133 DBIx::Class::Optional::Dependencies->modreq_list_for('test_rdbms_pg'),
134 { 'DBD::Pg' => '2.009002' },
135 'optional dependencies list for testing Postgres without envvar',
139 DBIx::Class::Optional::Dependencies->req_list_for('test_rdbms_pg'),
141 'optional dependencies list for testing Postgres without envvar',
145 DBIx::Class::Optional::Dependencies->req_list_for('rdbms_pg'),
146 { 'DBD::Pg' => '0', },
147 'optional dependencies list for using Postgres matches',
150 # test combination of different requirements on same module (pg's are relatively stable)
152 DBIx::Class::Optional::Dependencies->req_list_for([qw( rdbms_pg test_rdbms_pg )]),
153 { 'DBD::Pg' => '0' },
154 'optional module dependencies list for testing Postgres matches without envvar',
158 DBIx::Class::Optional::Dependencies->req_missing_for([qw( rdbms_pg test_rdbms_pg )]),
159 '"DBD::Pg~>=2.009002" as well as the following group(s) of environment variables: DBICTEST_PG_DSN/..._USER/..._PASS',
160 'optional dependencies for testing Postgres without envvar'
164 DBIx::Class::Optional::Dependencies->req_missing_for([qw( test_rdbms_mysql test_rdbms_pg )]),
165 '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',
166 'optional dependencies for testing Postgres+MySQL without envvars'
169 $ENV{DBICTEST_PG_DSN} = 'boo';
171 DBIx::Class::Optional::Dependencies->modreq_list_for([qw( rdbms_pg test_rdbms_pg )]),
172 { 'DBD::Pg' => '2.009002' },
173 'optional module dependencies list for testing Postgres matches with envvar',
177 DBIx::Class::Optional::Dependencies->req_missing_for([qw( rdbms_pg test_rdbms_pg )]),
178 '"DBD::Pg~>=2.009002"',
179 'optional dependencies error text for testing Postgres matches with evvar',
184 # test multiple times to find autovivification bugs
185 for my $meth (qw(req_list_for modreq_list_for)) {
187 DBIx::Class::Optional::Dependencies->$meth();
188 } qr/\Qreq_list_for() expects a requirement group name/,
189 "$meth without groupname throws exception";
192 DBIx::Class::Optional::Dependencies->$meth('');
193 } qr/\Q$meth() expects a requirement group name/,
194 "$meth with empty groupname throws exception";
197 DBIx::Class::Optional::Dependencies->$meth('invalid_groupname');
198 } qr/Requirement group 'invalid_groupname' is not defined/,
199 "$meth with invalid groupname throws exception";