fix incorrect prereq declaration
[gitmo/MooseX-Getopt.git] / t / 008_configfromfile.t
1 use strict;
2 use warnings;
3
4 use Test::Requires { 'MooseX::ConfigFromFile' => '0.06' };    # skip all if not installed
5 use Test::More tests => 38;
6 use Test::Fatal;
7 use Path::Tiny;
8 use Test::NoWarnings 1.04 ':early';
9
10 {
11     package App;
12
13     use Moose;
14     with 'MooseX::Getopt';
15     with 'MooseX::ConfigFromFile';
16
17     has 'config_from_override' => (
18         is       => 'ro',
19         isa      => 'Bool',
20         default  => 0,
21     );
22
23     has 'optional_from_config' => (
24         is        => 'ro',
25         isa       => 'Str',
26         required  => 0,
27     );
28
29     has 'required_from_config' => (
30         is        => 'ro',
31         isa       => 'Str',
32         required  => 1,
33     );
34
35     has 'required_from_argv' => (
36         is        => 'ro',
37         isa       => 'Str',
38         required  => 1,
39     );
40
41     sub get_config_from_file
42     {
43         my ( $class, $file ) = @_;
44
45         my %config = (
46             required_from_config => 'from_config_1',
47             optional_from_config => 'from_config_2',
48         );
49
50         my $cpath = Path::Tiny::path('/notused/default');
51         if ( $file ne $cpath ) {
52             $config{config_from_override} = 1;
53         }
54
55         return \%config;
56     }
57 }
58
59 {
60     package App::DefaultConfigFile;
61
62     use Moose;
63     extends 'App';
64
65     has '+configfile' => (
66         default => Path::Tiny::path('/notused/default')->stringify,
67     );
68 }
69
70 {
71     package App::DefaultConfigFileCodeRef;
72
73     use Moose;
74     extends 'App';
75
76     has '+configfile' => (
77         default => sub { return Path::Tiny::path('/notused/default') },
78     );
79 }
80
81 # No config specified
82 {
83     local @ARGV = qw( --required_from_argv 1 );
84
85     like exception { App->new_with_options },
86         ($Getopt::Long::Descriptive::VERSION >= 0.091
87             ? qr/Mandatory parameter 'required_from_config' missing/
88             : qr/Required option missing: required_from_config/);
89
90     {
91         my $app = App::DefaultConfigFile->new_with_options;
92         isa_ok( $app, 'App::DefaultConfigFile' );
93         app_ok( $app );
94
95         ok(  !$app->config_from_override,
96             '... config_from_override false as expected' );
97
98         is( $app->configfile, path('/notused/default'),
99             '... configfile is /notused/default as expected' );
100     }
101 }
102
103 # No config specified
104 {
105     local @ARGV = qw( --required_from_argv 1 );
106
107     {
108         my $app = App::DefaultConfigFileCodeRef->new_with_options;
109         isa_ok( $app, 'App::DefaultConfigFileCodeRef' );
110         app_ok( $app );
111
112         ok(  !$app->config_from_override,
113             '... config_from_override false as expected' );
114
115         is( $app->configfile, path('/notused/default'),
116             '... configfile is /notused/default as expected' );
117     }
118 }
119
120 # Config specified
121 {
122     local @ARGV = qw( --configfile /notused --required_from_argv 1 );
123
124     {
125         my $app = App->new_with_options;
126         isa_ok( $app, 'App' );
127         app_ok( $app );
128     }
129
130     {
131         my $app = App::DefaultConfigFile->new_with_options;
132         isa_ok( $app, 'App::DefaultConfigFile' );
133         app_ok( $app );
134
135         ok( $app->config_from_override,
136              '... config_from_override true as expected' );
137
138         is( $app->configfile, path('/notused'),
139             '... configfile is /notused as expected' );
140     }
141     {
142         my $app = App::DefaultConfigFileCodeRef->new_with_options;
143         isa_ok( $app, 'App::DefaultConfigFileCodeRef' );
144         app_ok( $app );
145
146         ok( $app->config_from_override,
147              '... config_from_override true as expected' );
148
149         is( $app->configfile, path('/notused'),
150             '... configfile is /notused as expected' );
151     }
152 }
153
154 # Required arg not supplied from cmdline
155 {
156     local @ARGV = qw( --configfile /notused );
157     like exception { App->new_with_options },
158         ($Getopt::Long::Descriptive::VERSION >= 0.091
159             ? qr/Mandatory parameter 'required_from_argv' missing/
160             : qr/Required option missing: required_from_argv/);
161 }
162
163 # Config file value overriden from cmdline
164 {
165     local @ARGV = qw( --configfile /notused --required_from_argv 1 --required_from_config override );
166
167     my $app = App->new_with_options;
168     isa_ok( $app, 'App' );
169
170     is( $app->required_from_config, 'override',
171         '... required_from_config is override as expected' );
172
173     is( $app->optional_from_config, 'from_config_2',
174         '... optional_from_config is from_config_2 as expected' );
175 }
176
177 # No config file
178 {
179     local @ARGV = qw( --required_from_argv 1 --required_from_config noconfig );
180
181     my $app = App->new_with_options;
182     isa_ok( $app, 'App' );
183
184     is( $app->required_from_config, 'noconfig',
185         '... required_from_config is noconfig as expected' );
186
187     ok( !defined $app->optional_from_config,
188         '... optional_from_config is undef as expected' );
189 }
190
191 {
192     package BaseApp::WithConfig;
193     use Moose;
194     with 'MooseX::ConfigFromFile';
195
196     sub get_config_from_file { return {}; }
197 }
198
199 {
200     package DerivedApp::Getopt;
201     use Moose;
202     extends 'BaseApp::WithConfig';
203     with 'MooseX::Getopt';
204 }
205
206 # With DerivedApp, the Getopt role was applied at a different level
207 # than the ConfigFromFile role
208 {
209     ok ! exception { DerivedApp::Getopt->new_with_options }, 'Can create DerivedApp';
210 }
211
212 sub app_ok {
213     my $app = shift;
214
215     is( $app->required_from_config, 'from_config_1',
216         '... required_from_config is from_config_1 as expected' );
217
218     is( $app->optional_from_config, 'from_config_2',
219         '... optional_from_config is from_config_2 as expected' );
220
221     is( $app->required_from_argv, '1',
222         '... required_from_argv is 1 as expected' );
223 }