make all warnings fatal in tests
[gitmo/MooseX-Getopt.git] / t / 008_configfromfile.t
index 4b78e51..39798a2 100644 (file)
@@ -1,20 +1,15 @@
-#!/usr/bin/env perl
-
 use strict;
-use warnings;
-
-use Test::Exception;
-use Test::More;
+use warnings FATAL => 'all';
 
-if ( !require MooseX::ConfigFromFile )
-{
-    plan skip_all => 'Test requires MooseX::ConfigFromFile';
-}
-else
-{
-    plan tests => 24;
-}
+use Test::Requires 'MooseX::ConfigFromFile';    # 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,68 +72,186 @@ 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')->stringify },
     );
 }
 
+{
+    package App::ConfigFileWrapped;
+
+    use Moose;
+    extends 'App';
+
+    sub _get_default_configfile { '/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;
+        isa_ok( $app, 'App::DefaultConfigFile' );
+        app_ok( $app );
 
-    TODO: {
-        local $TODO = 'Cannot supply required args from config';
+        ok(  !$app->config_from_override,
+            '... config_from_override false as expected' );
 
-        my $app = eval { App::DefaultConfigFile->new_with_options };
-        isa_ok( $app, 'App::DefaultConfigFile' );
+        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 && !$app->config_from_override,
+        ok(  !$app->config_from_override,
             '... config_from_override false as expected' );
 
-        is( $app && $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',
+        );
+    }
+
+    SKIP: {
+        eval "use MooseX::ConfigFromFile 0.08 (); 1;";
+        diag("MooseX::ConfigFromFile 0.08 needed to test this use of configfile defaults"),
+        skip "MooseX::ConfigFromFile 0.08 needed to test this use of configfile defaults", 7 if $@;
+
+        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 );
-
-    TODO: {
-        local $TODO = 'Cannot supply required args from config';
+    local @ARGV = qw( --configfile /notused/override --required_from_argv 1 );
 
-        my $app = eval { App->new_with_options };
+    {
+        my $app = App->new_with_options;
         isa_ok( $app, 'App' );
         app_ok( $app );
     }
 
-    TODO: {
-        local $TODO = 'Cannot supply required args from config';
-
-        my $app = eval { App::DefaultConfigFile->new_with_options };
+    {
+        my $app = App::DefaultConfigFile->new_with_options;
         isa_ok( $app, 'App::DefaultConfigFile' );
         app_ok( $app );
 
-        is ( $app && $app->config_from_override,
+        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',
+        );
+    }
+    {
+        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',
+        );
+    }
+    {
+        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' );
 
-        is( $app && $app->configfile, '/notused',
+        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' );
@@ -157,15 +277,36 @@ else
         '... optional_from_config is undef as expected' );
 }
 
+{
+    package BaseApp::WithConfig;
+    use Moose;
+    with 'MooseX::ConfigFromFile';
+
+    sub get_config_from_file { return {}; }
+}
+
+{
+    package DerivedApp::Getopt;
+    use Moose;
+    extends 'BaseApp::WithConfig';
+    with 'MooseX::Getopt';
+}
+
+# With DerivedApp, the Getopt role was applied at a different level
+# than the ConfigFromFile role
+{
+    ok ! exception { DerivedApp::Getopt->new_with_options }, 'Can create DerivedApp';
+}
+
 sub app_ok {
     my $app = shift;
 
-    is( $app && $app->required_from_config, 'from_config_1',
+    is( $app->required_from_config, 'from_config_1',
         '... required_from_config is from_config_1 as expected' );
 
-    is( $app && $app->optional_from_config, 'from_config_2',
+    is( $app->optional_from_config, 'from_config_2',
         '... optional_from_config is from_config_2 as expected' );
 
-    is( $app && $app->required_from_argv, '1',
+    is( $app->required_from_argv, '1',
         '... required_from_argv is 1 as expected' );
 }