exclude by dist in dependents test, with some refactoring
[gitmo/Moo.git] / xt / test-my-dependents.t
1 use Test::More;
2 BEGIN {
3   plan skip_all => <<'END_HELP' unless $ENV{MOO_TEST_MD};
4 This test will not run unless you set MOO_TEST_MD to a true value.
5
6   Valid values are:
7
8      all                  Test every dist which depends on Moose except those
9                           that we know cannot be tested. This is a lot of
10                           distros (hundreds).
11
12      Dist::1,Dist::2,...  Test the individual dists listed.
13
14      MooX                 Test all Moo extension distros.
15
16      1                    Run the default tests. We pick 200 random dists and
17                           test them.
18 END_HELP
19 }
20
21 use Test::DependentModules qw( test_modules );
22 use MetaCPAN::API;
23 use List::Util ();
24
25 # avoid any modules that depend on these
26 my @bad_prereqs = qw(Gtk2 Padre Wx);
27
28 my $mcpan = MetaCPAN::API->new;
29 my $res = $mcpan->post(
30   '/search/reverse_dependencies/Moo' => {
31     query => {
32       filtered => {
33         query => { "match_all" => {} },
34         filter => {
35           and => [
36             { term => { 'release.status' => 'latest' } },
37             { term => { 'release.authorized' => \1 } },
38             { not => { filter => {
39               or => [
40                 map { { term => { 'dependency.module' => $_ } } } @bad_prereqs,
41               ],
42             } } }
43           ],
44         },
45       },
46     },
47     size => 5000,
48     fields => ['distribution', 'provides', 'metadata.provides'],
49   },
50 );
51
52 my %bad_dist;
53 foreach my $line (<DATA>) {
54   chomp $line;
55   if ($line =~ /^\s*(\S+)?\s*(#|$)/) {
56     $bad_dist{$1}++
57       if $1;
58   }
59   else {
60     die "Invalid entry in DATA section: $line";
61   }
62 }
63
64 my @modules = sort grep !/^(?:Task|Bundle|Acme)::/, map {
65   my $dist = $_->{fields}{distribution};
66   $bad_dist{$dist} ? () : (sort { length $a <=> length $b || $a cmp $b } do {
67     if (my $provides = $_->{fields}{provides}) {
68       ref $provides ? @$provides : ($provides);
69     }
70     elsif (my $provides = $_->{fields}{'metadata.provides'}) {
71       keys %$provides;
72     }
73     else {
74       (my $module = $dist) =~ s/-/::/g;
75       ($module);
76     }
77   })[0]
78 } @{ $res->{hits}{hits} };
79
80 if ( $ENV{MOO_TEST_MD} eq 'MooX' ) {
81   @modules = grep /^MooX(?:$|::)/, @modules;
82 }
83 elsif ( $ENV{MOO_TEST_MD} eq '1' ) {
84   diag(<<'EOF');
85   Picking 200 random dependents to test. Set MOO_TEST_MD=all to test all
86   dependents or MOO_TEST_MD=MooX to test extension modules only.
87 EOF
88   @modules = (List::Util::shuffle(@modules))[0..199];
89 }
90 elsif ( $ENV{MOO_TEST_MD} ne 'all' ) {
91   my @chosen = split /,/, $ENV{MOO_TEST_MD};
92   my %modules = map { $_ => 1 } @modules;
93   if (my @unknown = grep { !$modules{$_} } @chosen) {
94       die "Unknown modules: @unknown";
95   }
96   @modules = @chosen;
97 }
98
99 if (grep { $_ eq '--show' } @ARGV) {
100   print "Dependencies:\n";
101   print "  $_\n" for @modules;
102   exit;
103 }
104
105 plan tests => scalar @modules;
106 test_modules(@modules);
107
108 __DATA__
109 # no tests
110 CPAN-Mirror-Finder
111 Catmandu-AlephX
112 Device-Hue
113 Novel-Robot
114 Novel-Robot-Browser
115 Novel-Robot-Parser
116 Thrift-API-HiveClient
117 Tiezi-Robot-Parser
118
119 # broken
120 App-Presto
121 Catmandu-Store-Lucy
122 Dancer2-Session-Sereal
123 Data-Localize
124 HTML-Zoom-Parser-HH5P
125 Message-Passing-ZeroMQ
126 Tak
127
128 # broken tests
129 Template-Flute
130 Uninets-Check-Modules-HTTP
131 Uninets-Check-Modules-MongoDB
132 Uninets-Check-Modules-Redis
133
134 # missing prereqs
135 Catmandu-Z3950
136 Tiezi-Robot
137
138 # bad prereq version listed
139 Dancer2-Session-Cookie
140 Dancer2-Session-JSON
141
142 # broken, pending release
143 Hg-Lib
144 P9Y-ProcessTable
145 Net-Easypost
146
147 # OS specific
148 Linux-AtaSmart
149
150 # broken by Moo change
151 Math-Rational-Approx        # RT#84035
152 App-Services                # RT#85255
153 GeoIP2                      # https://github.com/maxmind/GeoIP2-perl/pull/1