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

use strict;
use warnings;

use Test::More 0.88;            # done_testing

plan tests => 20;

use Apache2::Const qw(OK DECLINED);
use Apache2::HttpEquiv;
use File::Temp;

#=====================================================================
{
  package Mock_Request;

  use Moo;

  has content_type => qw(
    is      rw
    default text/html
  );

  has is_initial_req => qw(
    is      ro
    default 1
  );

  has filename => qw(
    is       ro
  );

  has _headers => (qw(
    is          ro
    default) => sub { [] },
  );

  sub headers_out { shift }     # Just return the same mock object

  sub set
  {
    my $self = shift;

    push @{ $self->_headers }, [ @_ ];
  } # end set

  sub _test_results
  {
    my $self = shift;

    [ $self->content_type, @{ $self->_headers } ];
  } # end _test_results
} # end class Mock_Request
#=====================================================================

sub test
{
  my ($name, $params, $text, $expected, $exResult) = @_;

  local $Test::Builder::Level = $Test::Builder::Level + 1;

  my $tmp = File::Temp->new(UNLINK => 1);

  binmode $tmp, ':encoding(latin1)';
  print $tmp $text;
  $tmp->close;

  my $r = Mock_Request->new(filename => "$tmp", %$params);

  $exResult = OK unless defined $exResult;

  is(Apache2::HttpEquiv::handler($r), $exResult, "$name result");

  is_deeply($r->_test_results, $expected, "$name headers");
} # end test

#---------------------------------------------------------------------

test('meta charset', {}, <<'END',
<html><head><meta charset="UTF-8"></head>
END
     [ 'text/html; charset=UTF-8' ]);

test('meta charset and http-equiv', {}, <<'END',
<html><head><meta charset="UTF-8">
<meta http-equiv="New-Header" content="value">
</head><body></body></html>
END
     [ 'text/html; charset=UTF-8',
       [ 'New-Header' => 'value' ] ]);

test('http-equiv in body', {}, <<'END',
<html><head><meta charset="UTF-8"></head><body>
<meta http-equiv="New-Header" content="value">
</body></html>
END
     [ 'text/html; charset=UTF-8' ]);

test('not initial request', {is_initial_req => 0}, <<'END',
<html><head><meta charset="UTF-8">
<meta http-equiv="New-Header" content="value">
</head><body></body></html>
END
     [ 'text/html'], DECLINED);

test('not text/html', {content_type => 'text/plain'}, <<'END',
<html><head><meta charset="UTF-8">
<meta http-equiv="New-Header" content="value">
</head><body></body></html>
END
     [ 'text/plain'], DECLINED);

test('multiple headers', {}, <<'END',
<html><head><meta charset="Windows-1252">
<meta http-equiv="New-Header" content="header 1">
<meta content="header 2" http-equiv="Another-Header">
</head><body></body></html>
END
     [ 'text/html; charset=Windows-1252',
       [ 'New-Header'     => 'header 1' ],
       [ 'Another-Header' => 'header 2' ] ]);

test('repeated header', {}, <<'END',
<html><head><meta charset="ISO-8859-1">
<meta http-equiv="New-Header" content="header 1">
<meta content="header 2" http-equiv="New-Header">
</head><body></body></html>
END
     [ 'text/html; charset=ISO-8859-1',
       [ 'New-Header' => 'header 1' ],
       [ 'New-Header' => 'header 2' ] ]);

test('http-equiv content-type', {}, <<'END',
<html><head>
<meta http-equiv="New-Header" content="header 1">
<meta content="header 2" http-equiv="New-Header">
<meta http-equiv="Content-Type" content="text/html; charset='Windows-1252'">
</head><body></body></html>
END
     [ "text/html; charset='Windows-1252'",
       [ 'New-Header' => 'header 1' ],
       [ 'New-Header' => 'header 2' ] ]);

test('claims text/xhtml', {}, <<'END',
<html><head>
<meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8">
</head><body></body></html>
END
     [ "text/html; charset=UTF-8" ]);

{
  my $r = Mock_Request->new(filename => 'does_not_exist');

  is(Apache2::HttpEquiv::handler($r), DECLINED, 'missing file is not error');
  is_deeply($r->_test_results, [ 'text/html' ], 'missing file no changes');
}

done_testing;