The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;
use Test::More;
use HTTP::Request;
use HTTP::Message::PSGI;
use Plack::Builder;
use Plack::Test;

my @tests = (
    ['Content-Type' => 'text/csv']  => ['Content-Type' => 'text/plain'],
    [ ]                             => ['Content-Type' => 'text/plain'],
    ['Content-Type' => 'x-text/my'] => ['Content-Type' => 'text/plain'],
    ['Content-Type' => 'image/png'] => ['Content-Type' => 'image/png']
);

my @when = (
    [
        'Content-Type' => qr{^text/}, 
        'Content-Type' => 'x-text/my',
        'Content-Type' => undef, 
    ],
    sub { 
        my $value = Plack::Util::header_get(\@_, 'Content-Type');
        return !defined $value || $value =~ qr{^text/} || $value eq 'x-text/my';
    }
);

while (my ($has, $want) = splice @tests, 0, 2) {
    foreach my $when (@when) {
        my $app = builder {
            enable 'Headers',
                set  => ['Content-Type' => 'text/plain'],
                when => $when;
            sub { ['200', $has, []] };
        };

        my $env = HTTP::Request->new(GET => '/')->to_psgi;
        my $res = $app->($env);
        is_deeply $res->[1], $want;
    }
}

done_testing;