xref: /openbsd-src/gnu/usr.bin/perl/cpan/CPAN-Meta/t/parse-cpan-meta/02_api.t (revision 5759b3d249badf144a6240f7eec4dcf9df003e6b)
1#!/usr/bin/perl
2
3delete $ENV{PERL_YAML_BACKEND};
4delete $ENV{PERL_JSON_BACKEND};
5delete $ENV{CPAN_META_JSON_BACKEND};
6delete $ENV{CPAN_META_JSON_DECODER};
7
8# Testing of a known-bad file from an editor
9
10use strict;
11BEGIN {
12	$|  = 1;
13	$^W = 1;
14}
15
16use lib 't/lib';
17use File::Spec::Functions ':ALL';
18use Parse::CPAN::Meta;
19use Parse::CPAN::Meta::Test;
20# use Test::More skip_all => 'Temporarily ignoring failing test';
21use Test::More 'no_plan';
22use utf8;
23
24#####################################################################
25# Testing that Perl::Smith config files work
26
27my $want = {
28  "abstract" => "a set of version requirements for a CPAN dist",
29  "author"   => [ 'Ricardo Signes <rjbs@cpan.org>' ],
30  "build_requires" => {
31     "Test::More" => "0.88"
32  },
33  "configure_requires" => {
34     "ExtUtils::MakeMaker" => "6.31"
35  },
36  "generated_by" => "Dist::Zilla version 2.100991",
37  "license" => "perl",
38  "meta-spec" => {
39     "url" => "http://module-build.sourceforge.net/META-spec-v1.4.html",
40     "version" => 1.4
41  },
42  "name" => "Version-Requirements",
43  "recommends" => {},
44  "requires" => {
45     "Carp" => "0",
46     "Scalar::Util" => "0",
47     "version" => "0.77"
48  },
49  "resources" => {
50     "repository" => "git://git.codesimply.com/Version-Requirements.git"
51  },
52  "version" => "0.101010",
53  "x_contributors" => [
54    "Dagfinn Ilmari Mannsåker <ilmari\@ilmari.org>",
55  ],
56};
57
58my $meta_json = catfile( test_data_directory(), 'META-VR.json' );
59my $meta_yaml = catfile( test_data_directory(), 'META-VR.yml' );
60my $bare_yaml_meta = catfile( test_data_directory(), 'bareyaml.meta' );
61my $bad_yaml_meta = catfile( test_data_directory(), 'BadMETA.yml' );
62my $CL018_yaml_meta = catfile( test_data_directory(), 'CL018_yaml.meta' );
63
64# These test YAML/JSON detection without the typical file name suffix
65my $yaml_meta = catfile( test_data_directory(), 'yaml.meta' );
66my $json_meta = catfile( test_data_directory(), 'json.meta' );
67
68### YAML tests
69{
70  local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML
71
72  is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML');
73  my $from_yaml = Parse::CPAN::Meta->load_file( $meta_yaml );
74  is_deeply($from_yaml, $want, "load from YAML file results in expected data");
75}
76
77{
78  local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML
79
80  note '';
81  is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML');
82  my $from_yaml = Parse::CPAN::Meta->load_file( $yaml_meta );
83  is_deeply($from_yaml, $want, "load from YAML .meta file results in expected data");
84}
85
86{
87  local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML
88
89  note '';
90  is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML');
91  my $from_yaml = Parse::CPAN::Meta->load_file( $bare_yaml_meta );
92  is_deeply($from_yaml, $want, "load from bare YAML .meta file results in expected data");
93}
94
95{
96  local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML
97
98  note '';
99  is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML');
100  my $from_yaml = Parse::CPAN::Meta->load_file( $CL018_yaml_meta );
101  like($from_yaml->{x_contributors}[5], qr/Olivier Mengu/, "Open question: what to expect from double encoded UTF-8");
102}
103
104{
105  local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML
106
107  note '';
108  is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML');
109  my $yaml   = load_ok( $meta_yaml, $meta_yaml, 100, ":encoding(UTF-8)");
110  my $from_yaml = Parse::CPAN::Meta->load_yaml_string( $yaml );
111  is_deeply($from_yaml, $want, "load from YAML str results in expected data");
112}
113
114{
115  local $ENV{PERL_YAML_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get CPAN::META::YAML
116
117  note '';
118  is(Parse::CPAN::Meta->yaml_backend(), 'CPAN::Meta::YAML', 'yaml_backend(): CPAN::Meta::YAML');
119  my @yaml   = Parse::CPAN::Meta::LoadFile( $bad_yaml_meta );
120  is($yaml[0]{author}[0], 'Olivier Mengu\xE9', "Bad UTF-8 is replaced");
121}
122
123
124SKIP: {
125  note '';
126  skip 'these tests are for cpan builds only', 2 if $ENV{PERL_CORE};
127  skip "YAML module not installed", 2
128    unless eval "require YAML; 1";
129  local $ENV{PERL_YAML_BACKEND} = 'YAML';
130
131  is(Parse::CPAN::Meta->yaml_backend(), 'YAML', 'yaml_backend(): YAML');
132  my $yaml   = load_ok( $meta_yaml, $meta_yaml, 100, ":encoding(UTF-8)");
133  my $from_yaml = Parse::CPAN::Meta->load_yaml_string( $yaml );
134  is_deeply($from_yaml, $want, "load_yaml_string using PERL_YAML_BACKEND");
135}
136
137### JSON tests
138{
139  # JSON tests with JSON::PP
140  local $ENV{PERL_JSON_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get JSON::PP
141
142  note '';
143  is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP');
144  my $from_json = Parse::CPAN::Meta->load_file( $meta_json );
145  is_deeply($from_json, $want, "load from JSON file results in expected data");
146}
147
148{
149  # JSON tests with JSON::PP
150  local $ENV{PERL_JSON_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get JSON::PP
151
152  note '';
153  is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP');
154  my $from_json = Parse::CPAN::Meta->load_file( $json_meta );
155  is_deeply($from_json, $want, "load from JSON .meta file results in expected data");
156}
157
158{
159  # JSON tests with JSON::PP
160  local $ENV{PERL_JSON_BACKEND} if not $ENV{PERL_CORE}; # ensure we always get JSON::PP
161
162  note '';
163  is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP');
164  my $json   = load_ok( $meta_json, $meta_json, 100, "encoding(UTF-8)");
165  my $from_json = Parse::CPAN::Meta->load_json_string( $json );
166  is_deeply($from_json, $want, "load from JSON str results in expected data");
167}
168
169{
170  # JSON tests with JSON::PP, take 2
171  local $ENV{PERL_JSON_BACKEND} = 0 if not $ENV{PERL_CORE}; # request JSON::PP
172
173  note '';
174  is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP');
175  my $json   = load_ok( $meta_json, $meta_json, 100, ":encoding(UTF-8)");
176  my $from_json = Parse::CPAN::Meta->load_json_string( $json );
177  is_deeply($from_json, $want, "load_json_string with PERL_JSON_BACKEND = 0");
178}
179
180{
181  # JSON tests with JSON::PP, take 3
182  local $ENV{PERL_JSON_BACKEND} = 'JSON::PP' if not $ENV{PERL_CORE}; # request JSON::PP
183
184  note '';
185  is(Parse::CPAN::Meta->json_backend(), 'JSON::PP', 'json_backend(): JSON::PP');
186  my $json   = load_ok( $meta_json, $meta_json, 100, ":encoding(UTF-8)");
187  my $from_json = Parse::CPAN::Meta->load_json_string( $json );
188  is_deeply($from_json, $want, "load_json_string with PERL_JSON_BACKEND = 'JSON::PP'");
189}
190
191SKIP: {
192  # JSON tests with fake backend
193
194  note '';
195  skip 'these tests are for cpan builds only', 2 if $ENV{PERL_CORE};
196
197  { package MyJSONThingy; $INC{'MyJSONThingy.pm'} = __FILE__; require JSON::PP;
198    sub decode_json { JSON::PP::decode_json(@_) } }
199
200  local $ENV{CPAN_META_JSON_DECODER} = 'MyJSONThingy'; # request fake backend
201
202  is(Parse::CPAN::Meta->json_decoder(), 'MyJSONThingy', 'json_decoder(): MyJSONThingy');
203  my $json   = load_ok( $meta_json, $meta_json, 100, ":encoding(UTF-8)");
204  my $from_json = Parse::CPAN::Meta->load_json_string( $json );
205  is_deeply($from_json, $want, "load_json_string with PERL_JSON_DECODER = 'MyJSONThingy'");
206}
207
208SKIP: {
209  note '';
210  skip 'these tests are for cpan builds only', 2 if $ENV{PERL_CORE};
211  skip "JSON module version 2.5 not installed", 2
212    unless eval "require JSON; JSON->VERSION(2.5); 1";
213  local $ENV{PERL_JSON_BACKEND} = 1;
214
215  is(Parse::CPAN::Meta->json_backend(), 'JSON', 'json_backend(): JSON');
216  my $json   = load_ok( $meta_json, $meta_json, 100, ":encoding(UTF-8)");
217  my $from_json = Parse::CPAN::Meta->load_json_string( $json );
218  is_deeply($from_json, $want, "load_json_string with PERL_JSON_BACKEND = 1");
219}
220
221