1use warnings; 2use strict; 3 4use Test::More; 5use List::Util (); 6use lib qw(t/lib); 7use DBICTest; 8 9# Don't run tests for installs 10unless ( DBICTest::AuthorCheck->is_author || $ENV{AUTOMATED_TESTING} || $ENV{RELEASE_TESTING} ) { 11 plan( skip_all => "Author tests not required for installation" ); 12} 13 14require DBIx::Class; 15unless ( DBIx::Class::Optional::Dependencies->req_ok_for ('test_podcoverage') ) { 16 my $missing = DBIx::Class::Optional::Dependencies->req_missing_for ('test_podcoverage'); 17 $ENV{RELEASE_TESTING} || DBICTest::AuthorCheck->is_author 18 ? die ("Failed to load release-testing module requirements: $missing") 19 : plan skip_all => "Test needs: $missing" 20} 21 22# Since this is about checking documentation, a little documentation 23# of what this is doing might be in order. 24# The exceptions structure below is a hash keyed by the module 25# name. Any * in a name is treated like a wildcard and will behave 26# as expected. Modules are matched by longest string first, so 27# A::B::C will match even if there is A::B* 28 29# The value for each is a hash, which contains one or more 30# (although currently more than one makes no sense) of the following 31# things:- 32# skip => a true value means this module is not checked 33# ignore => array ref containing list of methods which 34# do not need to be documented. 35my $exceptions = { 36 'DBIx::Class' => { 37 ignore => [qw/ 38 MODIFY_CODE_ATTRIBUTES 39 component_base_class 40 mk_classdata 41 mk_classaccessor 42 /] 43 }, 44 'DBIx::Class::Row' => { 45 ignore => [qw/ 46 MULTICREATE_DEBUG 47 /], 48 }, 49 'DBIx::Class::ResultSource' => { 50 ignore => [qw/ 51 compare_relationship_keys 52 pk_depends_on 53 resolve_condition 54 resolve_join 55 resolve_prefetch 56 /], 57 }, 58 'DBIx::Class::ResultSourceHandle' => { 59 ignore => [qw/ 60 schema 61 source_moniker 62 /], 63 }, 64 'DBIx::Class::Storage' => { 65 ignore => [qw/ 66 schema 67 cursor 68 /] 69 }, 70 'DBIx::Class::Schema' => { 71 ignore => [qw/ 72 setup_connection_class 73 /] 74 }, 75 76 'DBIx::Class::Schema::Versioned' => { 77 ignore => [ qw/ 78 connection 79 /] 80 }, 81 82 'DBIx::Class::Storage::DBI::Replicated*' => { 83 ignore => [ qw/ 84 connect_call_do_sql 85 disconnect_call_do_sql 86 /] 87 }, 88 89 'DBIx::Class::Admin::*' => { skip => 1 }, 90 'DBIx::Class::ClassResolver::PassThrough' => { skip => 1 }, 91 'DBIx::Class::Componentised' => { skip => 1 }, 92 'DBIx::Class::Relationship::*' => { skip => 1 }, 93 'DBIx::Class::ResultSetProxy' => { skip => 1 }, 94 'DBIx::Class::ResultSourceProxy' => { skip => 1 }, 95 'DBIx::Class::Storage::Statistics' => { skip => 1 }, 96 'DBIx::Class::Storage::DBI::Replicated::Types' => { skip => 1 }, 97 98# test some specific components whose parents are exempt below 99 'DBIx::Class::Relationship::Base' => {}, 100 101# internals 102 'DBIx::Class::SQLAHacks*' => { skip => 1 }, 103 'DBIx::Class::Storage::DBI*' => { skip => 1 }, 104 'SQL::Translator::*' => { skip => 1 }, 105 106# deprecated / backcompat stuff 107 'DBIx::Class::CDBICompat*' => { skip => 1 }, 108 'DBIx::Class::ResultSetManager' => { skip => 1 }, 109 'DBIx::Class::DB' => { skip => 1 }, 110 111# skipped because the synopsis covers it clearly 112 'DBIx::Class::InflateColumn::File' => { skip => 1 }, 113}; 114 115my $ex_lookup = {}; 116for my $string (keys %$exceptions) { 117 my $ex = $exceptions->{$string}; 118 $string =~ s/\*/'.*?'/ge; 119 my $re = qr/^$string$/; 120 $ex_lookup->{$re} = $ex; 121} 122 123my @modules = sort { $a cmp $b } (Test::Pod::Coverage::all_modules()); 124 125foreach my $module (@modules) { 126 SKIP: { 127 128 my ($match) = List::Util::first 129 { $module =~ $_ } 130 (sort { length $b <=> length $a || $b cmp $a } (keys %$ex_lookup) ) 131 ; 132 133 my $ex = $ex_lookup->{$match} if $match; 134 135 skip ("$module exempt", 1) if ($ex->{skip}); 136 137 # build parms up from ignore list 138 my $parms = {}; 139 $parms->{trustme} = 140 [ map { qr/^$_$/ } @{ $ex->{ignore} } ] 141 if exists($ex->{ignore}); 142 143 # run the test with the potentially modified parm set 144 Test::Pod::Coverage::pod_coverage_ok($module, $parms, "$module POD coverage"); 145 } 146} 147 148done_testing; 149