package Weather::OpenWeatherMap::Test;
$Weather::OpenWeatherMap::Test::VERSION = '0.005004';
=pod

=for Pod::Coverage .*

=cut

use strictures 2;
use Carp;

use Path::Tiny;

use File::ShareDir 'dist_dir', 'dist_file';

use parent 'Exporter::Tiny';
our @EXPORT = our @EXPORT_OK = qw/
  get_test_data
  mock_http_ua
/;


sub get_test_data {
  my $type = lc shift || confess "No type specified";
  my $base = 'Weather-OpenWeatherMap';
  my $path = dist_file( $base,
      $type eq 'current'  ? 'current.json'
    : $type =~ /^3day/    ? '3day.json'
    : $type eq 'forecast' ? '3day.json'
    : $type eq 'hourly'   ? 'hourly.json'
    : $type eq 'failure'  ? 'failure.json'
    : $type eq 'error'    ? 'failure.json'
    : $type eq 'find'     ? 'find.json'
    : $type eq 'search'   ? 'find.json'
    : confess "Unknown type $type"
  );
  path($path)->slurp_utf8
}

{ package
    Weather::OpenWeatherMap::Test::MockUA;
  use strict; use warnings FATAL => 'all';
  require HTTP::Response;
  use parent 'LWP::UserAgent';
  sub requested_count { my ($self) = @_; $self->{'__requested'} }
  sub request {
    my ($self, $http_request) = @_;
    my $url = $http_request->uri;
    $self->{'__requested'}++;
    if ($url =~ /forecast/) {
      return $url =~ /daily/ ?
        HTTP::Response->new( 200 => undef => [] => $self->{forecast_json} )
        : HTTP::Response->new( 200 => undef => [] => $self->{hourly_json} )
    } elsif ($url =~ /find/) {
      return HTTP::Response->new( 200 => undef => [] => $self->{find_json} )
    }
    HTTP::Response->new( 200 => undef => [] => $self->{current_json} )
  }
}

sub mock_http_ua {
  return bless +{
    map {; ($_ . '_json' => get_test_data($_) ) } qw/
      forecast
      hourly
      current
      find
    /
  }, 'Weather::OpenWeatherMap::Test::MockUA'
}

1;