75 lines
2.5 KiB
Perl
75 lines
2.5 KiB
Perl
![]() |
use strict;
|
||
|
use warnings;
|
||
|
use Setup;
|
||
|
use Test2::V0;
|
||
|
use Catalyst::Test ();
|
||
|
use HTTP::Request::Common;
|
||
|
|
||
|
my %ctx = test_init();
|
||
|
|
||
|
Catalyst::Test->import('Hydra');
|
||
|
|
||
|
my $db = Hydra::Model::DB->new;
|
||
|
hydra_setup($db);
|
||
|
|
||
|
my $project = $db->resultset('Projects')->create({name => "tests", displayname => "", owner => "root"});
|
||
|
|
||
|
# Create a simple Nix expression that uses the existing build-product-simple.sh
|
||
|
my $jobsdir = $ctx{jobsdir};
|
||
|
my $nixfile = "$jobsdir/simple.nix";
|
||
|
open(my $fh, '>', $nixfile) or die "Cannot create simple.nix: $!";
|
||
|
print $fh <<"EOF";
|
||
|
with import ./config.nix;
|
||
|
{
|
||
|
simple = mkDerivation {
|
||
|
name = "build-product-simple";
|
||
|
builder = ./build-product-simple.sh;
|
||
|
};
|
||
|
}
|
||
|
EOF
|
||
|
close($fh);
|
||
|
|
||
|
# Create a jobset that uses the simple build
|
||
|
my $jobset = createBaseJobset("simple", "simple.nix", $ctx{jobsdir});
|
||
|
|
||
|
ok(evalSucceeds($jobset), "Evaluating simple.nix should succeed");
|
||
|
is(nrQueuedBuildsForJobset($jobset), 1, "Should have 1 build queued");
|
||
|
|
||
|
my $build = (queuedBuildsForJobset($jobset))[0];
|
||
|
ok(runBuild($build), "Build should succeed");
|
||
|
|
||
|
$build->discard_changes();
|
||
|
|
||
|
subtest "Test downloading build products (regression test for #1520)" => sub {
|
||
|
# Get the build URL
|
||
|
my $build_id = $build->id;
|
||
|
|
||
|
# First, check that the build has products
|
||
|
my @products = $build->buildproducts;
|
||
|
ok(scalar @products >= 1, "Build should have at least 1 product");
|
||
|
|
||
|
# Find the doc product (created by build-product-simple.sh)
|
||
|
my ($doc_product) = grep { $_->type eq "doc" } @products;
|
||
|
ok($doc_product, "Should have a doc product");
|
||
|
|
||
|
if ($doc_product) {
|
||
|
# Test downloading via the download endpoint
|
||
|
# This tests the serveFile function which was broken in #1520
|
||
|
my $download_url = "/build/$build_id/download/" . $doc_product->productnr . "/text.txt";
|
||
|
my $response = request(GET $download_url);
|
||
|
|
||
|
# The key test: should not return 500 error with "Can't use string ("1") as a HASH ref"
|
||
|
isnt($response->code, 500, "Download should not return 500 error (regression test for #1520)");
|
||
|
is($response->code, 200, "Download should succeed with 200")
|
||
|
or diag("Response code: " . $response->code . ", Content: " . $response->content);
|
||
|
|
||
|
like($response->header('Content-Security-Policy') // '', qr/\bsandbox\b/, 'CSP header present with sandbox');
|
||
|
|
||
|
# Check that we get actual content
|
||
|
ok(length($response->content) > 0, "Should receive file content");
|
||
|
is($response->content, "Hello\n", "Should get expected content");
|
||
|
}
|
||
|
};
|
||
|
|
||
|
done_testing();
|