The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::Clustericious::Config;
use Test::Clustericious::Cluster;
use Test::More tests => 2;
use Mojo::ByteStream qw( b );
use File::stat;

my $root;
my $t;
my $url;

subtest 'prep' => sub {
  plan tests => 4;

  $root = create_directory_ok "data";

  create_config_helper_ok data_dir => sub { $root };

  my $cluster = Test::Clustericious::Cluster->new;

  $cluster->create_cluster_ok(qw( Yars ));

  $t = $cluster->t;

  $url = $cluster->url;
};

subtest 'basic' => sub {
  plan tests => 13;

  my $content = 'Yabba Dabba Dooo!';

  my $digest = b($content)->md5_sum->to_string;

  my $file = 'fred.txt';

  $t->put_ok("$url/file/$file", {}, $content)
    ->status_is(201);

  my $location = $t->tx->res->headers->location;

  ok $location, "got location header";

  $t->get_ok($location)
    ->status_is(200)
    ->content_is($content);

  $t->get_ok($location => { 'X-Yars-Use-X-Accel' => 'yes' })
    ->status_is(200)
    ->content_is('');

  chomp (my $b64 = b(pack 'H*',$digest)->b64_encode);
  is $t->tx->res->headers->header("Content-MD5"), $b64, "Check Content-MD5";

  like($t->tx->res->headers->content_type, qr{^text/plain},
       "Check Content-Type");

  my $local_file = $t->tx->res->headers->header('X-Accel-Redirect');

  my $digest_path = '/data/' . join('/', ($digest =~ m/../g)) . "/$file";

  like($local_file, qr(^/static(.*$digest_path)$),
       "Got X-Accel-Redirect with full path");

  $local_file =~ s{^/static}{};

  is(slurp($local_file), $content, "X-Accel-Redirect file content correct");
};

sub slurp {
    open my $fh, '<', shift;
    local $/ = undef;
    my $content = <$fh>;
    close $fh;
    return $content;
}

__DATA__

@@ etc/Yars.conf
---
% use Test::Clustericious::Config;
url: <%= cluster->url %>
servers:
  - url: <%= cluster->url %>
    disks:
      - root: <%= data_dir %>
        buckets: [ 0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f' ]

state_file: <%= create_directory_ok("state") . "/state.txt" %>