The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
BEGIN{ if (not $] < 5.006) { require warnings; warnings->import } }

select(STDERR); $|=1;
select(STDOUT); $|=1;

use Test::More;
use Config::Tiny;
use IO::CaptureOutput qw/capture/;
use File::Spec;
use File::Temp qw/tempdir/;
use File::Path qw/mkpath rmtree/;
use t::Frontend;

plan tests => 9;

#--------------------------------------------------------------------------#
# Fixtures
#--------------------------------------------------------------------------#

my $temp_home = File::Spec->catdir( File::Spec->tmpdir(), $$ );

my $old_home = File::Spec->rel2abs( $temp_home );
my $old_config_dir = File::Spec->catdir( $old_home, ".cpanreporter" );
my $old_config_file = File::Spec->catfile( $old_config_dir, "config.ini" );
my $new_home = $old_home . "-new";
my $new_config_dir = File::Spec->catdir( $new_home, ".cpanreporter" );
my $new_config_file = File::Spec->catfile( $new_config_dir, "config.ini" );

my ($rc, $stdout, $stderr);
my $email_line = "email_address = johndoe\@doe.org\n";

mkpath $old_config_dir;
open FILE, ">$old_config_file" or die $!;
print FILE $email_line;
close FILE;

#--------------------------------------------------------------------------#
# Mocking -- override support/system functions
#--------------------------------------------------------------------------#

BEGIN {
    $INC{"File/HomeDir.pm"} = 1; # fake load
}

package File::HomeDir;
our $VERSION = 999;
sub my_documents { return $old_home };
sub my_home { return $new_home };

package main;

#--------------------------------------------------------------------------#

# Make sure nothing happens when OS is not Darwin

{
    local $^O = 'unknown';
    require_ok('CPAN::Reporter::Config');
    ok( -d $old_config_dir,
        "non-darwin logic: old config dir still in place"
    );
    ok( ! -d $new_config_dir,
        "non-darwin logic: new config dir not created"
    );
}

# Reset %INC to get CPAN::Reporter to load again
delete $INC{'CPAN/Reporter/Config.pm'};
delete ${*CPAN::Reporter::Config}{$_} for ( keys %{*CPAN::Reporter::Config} );

{
    local $^O = 'darwin';
    capture sub {
        require_ok( "CPAN::Reporter::Config" );
    };
    ok( $INC{'CPAN/Reporter/Config.pm'},
        "CPAN::Reporter::Config reloaded"
    );
    ok( ! -d $old_config_dir,
        "darwin logic: old config-dir removed"
    );
    ok( -d $new_config_dir,
        "darwin logic: new config-dir created"
    );
    open CONFIG, "<$new_config_file" or die $!;
    is( scalar <CONFIG>, $email_line,
        "darwin logic: new config contents correct"
    );
    close CONFIG;
}

# cleanup

rmtree $new_home;
rmtree $old_home;

ok( ( ! -d $old_home) && ( ! -d $new_home ),
    "cleaned up temp directories"
);