This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
4bab81730328f4760540abb579a70fcd2492ff44
[perl5.git] / cpan / CPAN-Meta / t / converter.t
1 use strict;
2 use warnings;
3 use Test::More 0.88;
4
5 use CPAN::Meta;
6 use CPAN::Meta::Validator;
7 use CPAN::Meta::Converter;
8 use File::Spec;
9 use IO::Dir;
10 use Parse::CPAN::Meta 1.4400;
11 use version;
12
13 # mock file object
14 package
15   File::StringObject;
16
17 use overload q{""} => sub { ${$_[0]} }, fallback => 1;
18
19 sub new {
20   my ($class, $file) = @_;
21   bless \$file, $class;
22 }
23
24 package main;
25
26 my $data_dir = IO::Dir->new( 't/data' );
27 my @files = sort grep { /^\w/ } $data_dir->read;
28
29 sub _spec_version { return $_[0]->{'meta-spec'}{version} || "1.0" }
30
31 #use Data::Dumper;
32
33 for my $f ( reverse sort @files ) {
34   my $path = File::Spec->catfile('t','data',$f);
35   my $original = Parse::CPAN::Meta->load_file( $path  );
36   ok( $original, "loaded $f" );
37   my $original_v = _spec_version($original);
38   # UPCONVERSION
39   {
40     my $cmc = CPAN::Meta::Converter->new( $original );
41     my $converted = $cmc->convert( version => 2 );
42     is ( _spec_version($converted), 2, "up converted spec version $original_v to spec version 2");
43     my $cmv = CPAN::Meta::Validator->new( $converted );
44     ok ( $cmv->is_valid, "up converted META is valid" )
45       or diag( "ERRORS:\n" . join( "\n", $cmv->errors )
46 #      . "\nMETA:\n" . Dumper($converted)
47     );
48   }
49   # UPCONVERSION - partial
50   if ( _spec_version( $original ) < 2 ) {
51     my $cmc = CPAN::Meta::Converter->new( $original );
52     my $converted = $cmc->convert( version => '1.4' );
53     is ( _spec_version($converted), 1.4, "up converted spec version $original_v to spec version 1.4");
54     my $cmv = CPAN::Meta::Validator->new( $converted );
55     ok ( $cmv->is_valid, "up converted META is valid" )
56       or diag( "ERRORS:\n" . join( "\n", $cmv->errors )
57 #      . "\nMETA:\n" . Dumper($converted)
58     );
59   }
60   # DOWNCONVERSION - partial
61   if ( _spec_version( $original ) >= 1.2 ) {
62     my $cmc = CPAN::Meta::Converter->new( $original );
63     my $converted = $cmc->convert( version => '1.2' );
64     is ( _spec_version($converted), '1.2', "down converted spec version $original_v to spec version 1.2");
65     my $cmv = CPAN::Meta::Validator->new( $converted );
66     ok ( $cmv->is_valid, "down converted META is valid" )
67       or diag( "ERRORS:\n" . join( "\n", $cmv->errors )
68 #      . "\nMETA:\n" . Dumper($converted)
69     );
70
71     if (_spec_version( $original ) == 2) {
72       is_deeply(
73         $converted->{build_requires},
74         {
75           'Test::More'      => '0.88',
76           'Build::Requires' => '1.1',
77           'Test::Requires'  => '1.2',
78         },
79         "downconversion from 2 merge test and build requirements",
80       );
81     }
82   }
83   # DOWNCONVERSION
84   {
85     my $cmc = CPAN::Meta::Converter->new( $original );
86     my $converted = $cmc->convert( version => '1.0' );
87     is ( _spec_version($converted), '1.0', "down converted spec version $original_v to spec version 1.0");
88     my $cmv = CPAN::Meta::Validator->new( $converted );
89     ok ( $cmv->is_valid, "down converted META is valid" )
90       or diag( "ERRORS:\n" . join( "\n", $cmv->errors )
91 #      . "\nMETA:\n" . Dumper($converted)
92     );
93
94     unless ($original_v eq '1.0') {
95       like ( $converted->{generated_by},
96         qr(\Q$original->{generated_by}\E, CPAN::Meta::Converter version \S+$),
97         "added converter mark to generated_by",
98       );
99     }
100   }
101 }
102
103 # specific test for custom key handling
104 {
105   my $path = File::Spec->catfile('t','data','META-1_4.yml');
106   my $original = Parse::CPAN::Meta->load_file( $path  );
107   ok( $original, "loaded META-1_4.yml" );
108   my $cmc = CPAN::Meta::Converter->new( $original );
109   my $up_converted = $cmc->convert( version => 2 );
110   ok ( $up_converted->{x_whatever} && ! $up_converted->{'x-whatever'},
111     "up converted 'x-' to 'x_'"
112   );
113   ok ( $up_converted->{x_whatelse},
114     "up converted 'x_' as 'x_'"
115   );
116   ok ( $up_converted->{x_WhatNow} && ! $up_converted->{XWhatNow},
117     "up converted 'XFoo' to 'x_Foo'"
118   ) or diag join("\n", keys %$up_converted);
119 }
120
121 # specific test for custom key handling
122 {
123   my $path = File::Spec->catfile('t','data','META-2.json');
124   my $original = Parse::CPAN::Meta->load_file( $path  );
125   ok( $original, "loaded META-2.json" );
126   my $cmc = CPAN::Meta::Converter->new( $original );
127   my $down_converted = $cmc->convert( version => 1.4 );
128   ok ( $down_converted->{x_whatever},
129     "down converted 'x_' as 'x_'"
130   );
131 }
132
133 # specific test for generalization of unclear licenses
134 {
135   my $path = File::Spec->catfile('t','data','gpl-1_4.yml');
136   my $original = Parse::CPAN::Meta->load_file( $path  );
137   ok( $original, "loaded gpl-1_4.yml" );
138   my $cmc = CPAN::Meta::Converter->new( $original );
139   my $up_converted = $cmc->convert( version => 2 );
140   is_deeply ( $up_converted->{license},
141     [ "open_source" ],
142     "up converted 'gpl' to 'open_source'"
143   );
144 }
145
146 # specific test for upconverting resources
147 {
148   my $path = File::Spec->catfile('t','data','resources.yml');
149   my $original = Parse::CPAN::Meta->load_file( $path  );
150   ok( $original, "loaded resources.yml" );
151   my $cmc = CPAN::Meta::Converter->new( $original );
152   my $converted = $cmc->convert( version => 2 );
153   is_deeply(
154     $converted->{resources},
155     { x_MailingList => 'http://groups.google.com/group/www-mechanize-users',
156       x_Repository  => 'http://code.google.com/p/www-mechanize/source',
157       homepage      => 'http://code.google.com/p/www-mechanize/',
158       bugtracker    => {web => 'http://code.google.com/p/www-mechanize/issues/list',},
159       license       => ['http://dev.perl.org/licenses/'],
160     },
161     "upconversion of resources"
162   );
163 }
164
165 # specific test for object conversion
166 {
167   my $path = File::Spec->catfile('t','data','resources.yml');
168   my $original = Parse::CPAN::Meta->load_file( $path  );
169   ok( $original, "loaded resources.yml" );
170   $original->{version} = version->new("1.64");
171   $original->{no_index}{file} = File::StringObject->new(".gitignore");
172   pass( "replaced some data fields with objects" );
173   my $cmc = CPAN::Meta::Converter->new( $original );
174   ok( my $converted = $cmc->convert( version => 2 ), "conversion successful" );
175 }
176
177 done_testing;