X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F008_configfromfile.t;h=3e420ac610b7c0c6997b75f4a3fbd96b95012eb6;hb=bde911ddcfdec86961080d6292ff414753671793;hp=93700b9c5ac7ab0b24c44c0abde13cc59fd7a066;hpb=9f1ec7c0c8860dae99efddfcbba9b30b4dd4bb3f;p=gitmo%2FMooseX-Getopt.git diff --git a/t/008_configfromfile.t b/t/008_configfromfile.t index 93700b9..3e420ac 100644 --- a/t/008_configfromfile.t +++ b/t/008_configfromfile.t @@ -1,20 +1,15 @@ -#!/usr/bin/env perl - use strict; use warnings; -use Test::Exception; -use Test::More; - -if ( !eval { require MooseX::ConfigFromFile } ) -{ - plan skip_all => 'Test requires MooseX::ConfigFromFile'; -} -else -{ - plan tests => 25; -} +use Test::Requires { 'MooseX::ConfigFromFile' => '0.06' }; # skip all if not installed +use Test::More tests => 56; +use Test::Fatal; +use Test::Deep '!blessed'; +use Path::Tiny; +use Scalar::Util 'blessed'; +use Test::NoWarnings 1.04 ':early'; +my %constructor_args; { package App; @@ -55,12 +50,19 @@ else optional_from_config => 'from_config_2', ); - if ( $file ne '/notused/default' ) { + if ( $file ne Path::Tiny::path('/notused/default') ) { $config{config_from_override} = 1; } return \%config; } + + around BUILDARGS => sub + { + my ($orig, $class) = (shift, shift); + my $args = $class->$orig(@_); + $constructor_args{$class} = $args; + }; } { @@ -70,15 +72,39 @@ else extends 'App'; has '+configfile' => ( - default => '/notused/default', + default => Path::Tiny::path('/notused/default')->stringify, + ); +} + +{ + package App::DefaultConfigFileCodeRef; + + use Moose; + extends 'App'; + + has '+configfile' => ( + default => sub { return Path::Tiny::path('/notused/default') }, ); } +{ + package App::ConfigFileWrapped; + + use Moose; + extends 'App'; + + around configfile => sub { '/notused/default' }; +} + + # No config specified { local @ARGV = qw( --required_from_argv 1 ); - throws_ok { App->new_with_options } qr/Required option missing: required_from_config/; + like exception { App->new_with_options }, + ($Getopt::Long::Descriptive::VERSION >= 0.091 + ? qr/Mandatory parameter 'required_from_config' missing/ + : qr/Required option missing: required_from_config/); { my $app = App::DefaultConfigFile->new_with_options; @@ -88,14 +114,62 @@ else ok( !$app->config_from_override, '... config_from_override false as expected' ); - is( $app->configfile, '/notused/default', + is( $app->configfile, path('/notused/default'), + '... configfile is /notused/default as expected' ); + + cmp_deeply( + $constructor_args{blessed($app)}, + superhashof({ + configfile => str(path('/notused/default')), + }), + 'correct constructor args passed', + ); + } + + { + my $app = App::DefaultConfigFileCodeRef->new_with_options; + isa_ok( $app, 'App::DefaultConfigFileCodeRef' ); + app_ok( $app ); + + ok( !$app->config_from_override, + '... config_from_override false as expected' ); + + is( $app->configfile, path('/notused/default'), '... configfile is /notused/default as expected' ); + + cmp_deeply( + $constructor_args{blessed $app}, + superhashof({ + configfile => str(path('/notused/default')), + }), + 'correct constructor args passed', + ); + } + + { + my $app = App::ConfigFileWrapped->new_with_options; + isa_ok( $app, 'App::ConfigFileWrapped' ); + app_ok( $app ); + + ok( !$app->config_from_override, + '... config_from_override false as expected' ); + + is( $app->configfile, path('/notused/default'), + '... configfile is /notused/default as expected' ); + + cmp_deeply( + $constructor_args{blessed $app}, + superhashof({ + configfile => str(path('/notused/default')), + }), + 'correct constructor args passed', + ); } } # Config specified { - local @ARGV = qw( --configfile /notused --required_from_argv 1 ); + local @ARGV = qw( --configfile /notused/override --required_from_argv 1 ); { my $app = App->new_with_options; @@ -111,20 +185,73 @@ else ok( $app->config_from_override, '... config_from_override true as expected' ); - is( $app->configfile, '/notused', + is( $app->configfile, path('/notused/override'), + '... configfile is /notused/override as expected' ); + + cmp_deeply( + $constructor_args{blessed $app}, + superhashof({ + configfile => str(path('/notused/override')), + }), + 'correct constructor args passed', + ); + } + { + my $app = App::DefaultConfigFileCodeRef->new_with_options; + isa_ok( $app, 'App::DefaultConfigFileCodeRef' ); + app_ok( $app ); + + ok( $app->config_from_override, + '... config_from_override true as expected' ); + + is( $app->configfile, path('/notused/override'), + '... configfile is /notused/override as expected' ); + + cmp_deeply( + $constructor_args{blessed $app}, + superhashof({ + configfile => str(path('/notused/override')), + }), + 'correct constructor args passed', + ); + } + TODO: { + my $app = App::ConfigFileWrapped->new_with_options; + isa_ok( $app, 'App::ConfigFileWrapped' ); + app_ok( $app ); + + ok( $app->config_from_override, + '... config_from_override true as expected' ); + +# FIXME - in order for this to work, we need to fix CFF so the +# configfile method always returns the actual value of the attribute, +# not the default sub thingy. + local $TODO = 'MooseX::ConfigFromFile needs fixes'; + is( $app->configfile, path('/notused/override'), '... configfile is /notused as expected' ); + + cmp_deeply( + $constructor_args{blessed $app}, + superhashof({ + configfile => str(path('/notused/override')), + }), + 'correct constructor args passed', + ); } } # Required arg not supplied from cmdline { - local @ARGV = qw( --configfile /notused ); - throws_ok { App->new_with_options } qr/Required option missing: required_from_argv/; + local @ARGV = qw( --configfile /notused/override ); + like exception { App->new_with_options }, + ($Getopt::Long::Descriptive::VERSION >= 0.091 + ? qr/Mandatory parameter 'required_from_argv' missing/ + : qr/Required option missing: required_from_argv/); } # Config file value overriden from cmdline { - local @ARGV = qw( --configfile /notused --required_from_argv 1 --required_from_config override ); + local @ARGV = qw( --configfile /notused/override --required_from_argv 1 --required_from_config override ); my $app = App->new_with_options; isa_ok( $app, 'App' ); @@ -168,7 +295,7 @@ else # With DerivedApp, the Getopt role was applied at a different level # than the ConfigFromFile role { - lives_ok { DerivedApp::Getopt->new_with_options } 'Can create DerivedApp'; + ok ! exception { DerivedApp::Getopt->new_with_options }, 'Can create DerivedApp'; } sub app_ok {