The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use File::Temp ();
use Test::More;

plan tests => 30;

my ($config);
my %data = ( global => { profile => 'profile.json' } );

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

require_ok( 'CPAN::Testers::Config' );

ok( local $ENV{HOME} = File::Temp->newdir,
  "setting \$ENV{HOME} to temp directory for testing"
);
is( CPAN::Testers::Config->config_dir,
    File::Spec->catdir( $ENV{HOME}, '.cpantesters' ),
    "config_dir() gives expected directory"
);

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

SKIP: {
  eval { CPAN::Testers::Config->new(%data)->write };
  is( $@, '', "wrote config file without error" )
    or skip "no config to read", 3;
  $config = eval { CPAN::Testers::Config->read };
  is( $@, '', "read config file without error" );
  isa_ok( $config, 'CPAN::Testers::Config' );
  is( $config->{global}{profile}, 'profile.json', "found 'profile' in [global]" );

}

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

{
  ok( local $ENV{CPAN_TESTERS_CONFIG} = File::Spec->rel2abs('bogusfile'),
    "setting CPAN_TESTERS_CONFIG to non-existant file"
  );
  is( CPAN::Testers::Config->config_file,
      $ENV{CPAN_TESTERS_CONFIG},
      "config_file() gives expected file (though it doesn't exist)"
  );
  $config = eval { CPAN::Testers::Config->read };
  like( $@, qr/Error reading '$ENV{CPAN_TESTERS_CONFIG}': No such file or directory/,
    "bogus file in CPAN_TESTERS_CONFIG gives error"
  );
}

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

SKIP: {
  ok( local $ENV{CPAN_TESTERS_DIR} = File::Temp->newdir,
    "setting CPAN_TESTERS_DIR to new temp config directory"
  );
  is( CPAN::Testers::Config->config_dir, $ENV{CPAN_TESTERS_DIR},
      "config_dir() gives expected directory"
  );

  eval { CPAN::Testers::Config->new(%data)->write };
  is( $@, '', "wrote config file without error" )
    or skip "no config to read", 3;
  $config = eval { CPAN::Testers::Config->read };
  is( $@, '', "read config file" );
  isa_ok( $config, 'CPAN::Testers::Config' );
  is( $config->{global}{profile}, 'profile.json', "found 'profile' in [global]" );
}

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

SKIP: {
  ok( local $ENV{CPAN_TESTERS_DIR} = File::Temp->newdir,
    "setting CPAN_TESTERS_DIR to new temp config directory"
  );
  is( CPAN::Testers::Config->config_dir, $ENV{CPAN_TESTERS_DIR},
      "config_dir() gives expected directory"
  );
  ok( local $ENV{CPAN_TESTERS_CONFIG} = 'custom.pl',
    "setting CPAN_TESTERS_CONFIG to relative filename"
  );
  is( CPAN::Testers::Config->config_file,
      File::Spec->catdir( $ENV{CPAN_TESTERS_DIR}, 'custom.pl' ),
      "config_file() gives expected file in CPAN_TESTERS_DIR"
  );

  eval { CPAN::Testers::Config->new(%data)->write };
  is( $@, '', "wrote config file without error" )
    or skip "no config to read", 3;
  $config = eval { CPAN::Testers::Config->read };
  is( $@, '', "read config file" );
  isa_ok( $config, 'CPAN::Testers::Config' );
  is( $config->{global}{profile}, 'profile.json', "found 'profile' in [global]" );
}

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

SKIP: {
  my $filename = File::Spec->catfile( $ENV{HOME}, 'custom.pl' );
  eval { CPAN::Testers::Config->new(%data)->write($filename) };
  is( $@, '', "wrote config file without error" )
    or skip "no config to read", 5;
  $config = eval { CPAN::Testers::Config->read($filename)};
  is( $@, '', "read config file without error" );
  isa_ok( $config, 'CPAN::Testers::Config' );
  is( $config->{global}{profile}, 'profile.json', "found 'profile' in [global]" );
  $config->{global}{profile} = 'other.json';
  eval { $config->read($filename)};
  is( $@, '', "re-read config file without error" );
  is( $config->{global}{profile}, 'profile.json', "found 'profile' in [global]" );
}