The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use utf8;
use strict;
use warnings;
use t::Util qw(compiled_js compiled_css);
use Test::More;
use Test::Name::FromLine;
use Test::Time;
use Digest::SHA1 qw(sha1_hex);
use Plack::Test;
use Plack::Builder;
use HTTP::Date;
use HTTP::Request::Common;

# Freeze
my $now = time();
my $expires_in_secs = 3 * 24 * 60 * 60;

my $app = builder {
    enable 'Assets::RailsLike', root => './t', expires => '3day', minify => 0;
    sub { [ 200, [ 'Content-Type', 'text/html' ], ['OK'] ] };
};

test_psgi(
    app    => $app,
    client => sub {
        my $cb = shift;

        subtest 'app' => sub {
            my $res = $cb->( GET '/' );
            is $res->code,    200;
            is $res->content, 'OK';
        };

        my $etag = sha1_hex(compiled_js);
        subtest 'javascript' => sub {
            my $res = $cb->( GET '/assets/application.js' );
            is $res->code,    200;
            is $res->content, compiled_js;
            is $res->header('Content-Type'), 'application/javascript';
            is $res->header('Cache-Control'), "max-age=$expires_in_secs";
            is $res->header('Expires'), time2str( $now + $expires_in_secs );
            is $res->header('Etag'), $etag;
        };

        subtest 'with etag' => sub {
            my $res = $cb->( GET '/assets/application.js', 'If-None-Match', $etag );
            is $res->code,    304;
            is $res->content, 'Not Modified';
        };

        subtest 'css' => sub {
            my $res = $cb->( GET '/assets/application.css' );
            is $res->code,    200;
            is $res->content, compiled_css;
        };
    }
);

done_testing;