The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use warnings;
use strict;

use Test::More tests => 18;

use File::Basename;

my $class = 'CPAN::Mini';

use_ok($class);
can_ok($class, 'config_file');

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# command line option case
{
  my $filename = 'Changes';
  ok(-e $filename, "file name [$filename] exists");

  local $ENV{CPAN_MINI_CONFIG} = 'Buster';
  my $options = { config_file => $filename, };

  is($class->config_file($options),
    $filename, 'selects config file name from command line');
}

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# environment variable case
{
  my $filename = $0;
  ok(-e $filename, "file name [$filename] exists");

  local $ENV{CPAN_MINI_CONFIG} = $filename;

  is($class->config_file, $filename,
    'selects config file name from environment with no args');
  is($class->config_file({}),
    $filename, 'selects config file name from environment with empty hash ref');
  is($class->config_file('trash'),
    $filename, 'selects config file name from environment with non-ref arg');
}

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# default case
# this is the case where there is a ~/.minicpanrc
{

  my $filename = 'Changes';
  ok(-e $filename, "file name [$filename] exists");

  {
    no strict 'refs';
    no warnings 'redefine';

    *{"${class}::__homedir_configfile"} = sub { $filename };
    is($class->__homedir_configfile,
      $filename, "__homedir_configfile returns mocked name");
  }

  local $ENV{CPAN_MINI_CONFIG} = undef;

  is($class->config_file, $filename, 'selects default config file name');
}

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# last ditch case
# this is the case wehre there is no ~/.minicpanrc
{
  local $ENV{CPAN_MINI_CONFIG} = undef;
  my $is_there_filename = 'Changes';
  ok(-e $is_there_filename, "file name [$is_there_filename] does exist");

  {
    no strict 'refs';
    no warnings 'redefine';

    *{"${class}::__homedir_configfile"} = sub { undef };
    is($class->__homedir_configfile,
      undef, "__homedir_configfile returns mocked name");
    *{"${class}::__default_configfile"} = sub { $is_there_filename };
    is($class->__default_configfile,
      $is_there_filename, "__default_configfile returns mocked name");
  }

  is($class->config_file, $is_there_filename,
    'selects default config file name');
}

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# everything failed case
{
  local $ENV{CPAN_MINI_CONFIG} = undef;

  {
    no strict 'refs';
    no warnings 'redefine';

    *{"${class}::__homedir_configfile"} = sub { undef };
    is($class->__homedir_configfile,
      undef, "__homedir_configfile returns mocked name");
    *{"${class}::__default_configfile"} = sub { undef };
    is($class->__default_configfile,
      undef, "__default_configfile returns mocked name");
  }

  is($class->config_file, undef, 'returns undef when no config file is found');
}