diff --git a/t/csp-middleware.t b/t/csp-middleware.t new file mode 100644 index 0000000..cfb98d3 --- /dev/null +++ b/t/csp-middleware.t @@ -0,0 +1,50 @@ +use strict; +use warnings; + +use Test::More; +use Data::Dumper (); +use Digest::SHA (); +use Plack::Middleware::MetaCPAN::CSP; +use HTTP::Request::Common qw(GET); +use Plack::Test qw(test_psgi); + +my $make_app = sub { + my $cb = shift; + sub { + my $env = shift; + [ 200, [], [ $cb->($env) ] ]; + }; +}; + +subtest 'CSP middleware' => sub { + my $app = Plack::Middleware::MetaCPAN::CSP->wrap($make_app->(sub { + my $env = shift; + my $body = ''; + my $script_nonce = $env->{'csp.nonce_for'}->('script-src'); + $body .= qq[]; + my $script_content = "alert('welp')"; + my $script_digest = $env->{'csp.sha_for'}->('script-src', $script_content); + $body .= qq[]; + $env->{'csp.add'}->('img-src', 'data:'); + $body; + })); + + test_psgi $app, sub { + my $cb = shift; + my $res = $cb->( GET "/" ); + my $content = $res->content; + my $csp = $res->header('Content-Security-Policy'); + my %csp = map split(/ /, $_, 2), split /; /, $csp; + my ($script_nonce) = $content =~ /}; + my $sha = Digest::SHA::sha256_base64($script_content); + like $csp{'script-src'}, qr/'nonce-$script_nonce'/, + 'nonce added to headers'; + like $csp{'script-src'}, qr/'sha256-$sha=*'/, + 'digest added to headers'; + like $csp{'img-src'}, qr/data:/, + 'data: added to headers'; + }; +}; + +done_testing;