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::More;
use Test::Exception;
use Catalyst ();
use FindBin;
use DateTime;

# a simple package
{
    package MyApp::Controller::Js;
    use Moose;
    extends 'Catalyst::Controller::Combine';

    __PACKAGE__->config(
    #    expire    => 1,
    #    expire_in => 60 * 60, # 1 hour
    );
}


#
# test start...
#

# setup our Catalyst :-)
my $c = Catalyst->new();
$c->setup_log();
$c->setup_home("$FindBin::Bin");

my $controller;
lives_ok { $controller = $c->setup_component('MyApp::Controller::Js') } 'setup component worked';


#
# check if expires header is sent, if feature isn't turned on
#
$controller->do_combine($c, 'js1');
ok(!$c->response->header('expires'), "expires header not sent, if feature not active");


# okay, let's check the real stuff, turn this feature one
MyApp::Controller::Js->config->{expire} = 1;
$controller = $c->setup_component('MyApp::Controller::Js');


#
# combine and check if expire header is set and correct (no expire_in is explicitly set)
#
{
	no warnings 'redefine';
    my $now = DateTime->now( time_zone => 'floating' );
	my $test_date_time = DateTime->new(
		year => 2012, month => 1, day => 4,
		hour => 12, minute => 13, second => 14, 
	);
    
	local *DateTime::now = sub { return $test_date_time->clone };
    
    $controller->do_combine($c, 'js1');
    my $expected_date =
		$test_date_time->clone
                       ->add(seconds => $controller->{expire_in} || 0)
                       ->strftime('%a, %d %b %Y %H:%M:%S GMT');
    is $c->response->header('expires'), $expected_date, 'expired header date is OK 1';

    # set expiry to 1 hour
    MyApp::Controller::Js->config->{expire_in} = 60 * 60;
    $controller = $c->setup_component('MyApp::Controller::Js');

    $controller->do_combine($c, 'js1');
    $expected_date =
		$test_date_time->clone
		               ->add(seconds => 3600)
		               ->strftime('%a, %d %b %Y %H:%M:%S GMT');
    is $c->response->header('expires'), $expected_date, 'expired header date is OK 2';
}


done_testing;