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

use strict;

use Test::More qw/no_plan/;
use t::Test;
#use JSON::XS;
#my $json = JSON::XS->new->allow_blessed->pretty;
my $scratch = t::Test::Scratch->new;

sub assets {
    my $assets = File::Assets->new(base => [ "http://example.com/", $scratch->base, "/static" ], @_);
    $assets->include("css/apple.css");
    $assets->include("css/banana.css");
    $assets->include("js/apple.js");
    return ($scratch, $assets);
}

my ($cache, $asset, $content, $digest, $size, $mtime);
{
    diag "First assets";
    my ($scratch, $assets) = assets(qw(output_path %n%-l.%e minify concat));

    compare($assets->export, qw(
        http://example.com/static/assets.css
        http://example.com/static/assets.js
    ));
    ok($scratch->exists("static/assets.css"));
    cmp_ok(-s $scratch->file("static/assets.css"), '>=' => 64);

    $cache = $assets->cache;
    $asset = $assets->fetch("/static/css/apple.css");
    $content = $asset->_content;
}

{
    diag "Second assets";
    my ($scratch, $assets) = assets(qw(output_path %n%-l.%e minify concat));

    compare($assets->export, qw(
        http://example.com/static/assets.css
        http://example.com/static/assets.js
    ));
    ok($scratch->exists("static/assets.css"));
    cmp_ok(-s $scratch->file("static/assets.css"), '>=' => 64);

    is($cache, $assets->cache);
    isnt($asset, $assets->fetch("/static/css/apple.css"));
    is($content, $assets->fetch("/static/css/apple.css")->_content);
    is($asset->digest, $assets->fetch("/static/css/apple.css")->digest);

    $digest = $asset->digest;
}

{
    diag "Third assets, alter 'apple.css'";
    $scratch->write("static/css/apple.css", <<_END_);
/* This is custom.css */
_END_

    my ($scratch, $assets) = assets(qw(output_path %n%-l.%e minify concat));

    compare($assets->export, qw(
        http://example.com/static/assets.css
        http://example.com/static/assets.js
    ));
    ok($scratch->exists("static/assets.css"));
    cmp_ok(-s $scratch->file("static/assets.css"), '>=' => 64);

    is($cache, $assets->cache);
    isnt($asset, $assets->fetch("/static/css/apple.css"));
    is($content, $assets->fetch("/static/css/apple.css")->_content);
    isnt($digest, $assets->fetch("/static/css/apple.css")->digest);

    $asset = $assets->fetch("/static/css/apple.css");
    $digest = $asset->digest;
}

{
    diag "Fourth assets";
    my ($scratch, $assets) = assets(qw(output_path %n%-l.%e minify concat));

    compare($assets->export, qw(
        http://example.com/static/assets.css
        http://example.com/static/assets.js
    ));
    ok($scratch->exists("static/assets.css"));
    cmp_ok(-s $scratch->file("static/assets.css"), '>=' => 64);

    is($digest, $assets->fetch("/static/css/apple.css")->digest);

    $digest = $asset->digest;
}