Files
.github
datadog
doc
examples
foreman
src
t
Helper
Hydra
Config
Controller
API
Admin
Build
Job
Jobset
JobsetEval
Project
builds.t
delete.t
Root
User
metrics.t
projects.t
Event
Helper
Plugin
Schema
View
Event.t
Math.t
PostgresListener.t
TaskDispatcher.t
evaluator
input-types
jobs
lib
queue-runner
scripts
Makefile.am
api-test.t
build-products.t
perlcritic.pl
s3-backup-test.config
s3-backup-test.pl
setup-notifications-jobset.pl
test.pl
.editorconfig
.gitignore
.perlcriticrc
.yath.rc
COPYING
INSTALL
Makefile.am
Procfile
README.md
bootstrap
configure.ac
default.nix
flake.lock
flake.nix
hydra-api.yaml
hydra-module.nix
shell.nix
version.txt
hydra/t/Hydra/Controller/Project/delete.t
Graham Christensen f4c4b496d8 Projects: delete: delete all builds first
Deleting jobsets first would fail because buildmetrics has an FK
to the jobset. However, the jobset / project relationship is not
marked as CASCADE.

Deleting all the builds automatically cascades to delete
buildmetrics, so deleting the relevant builds first, then deleting
the jobset solves it.
2022-01-14 20:37:55 -05:00

76 lines
2.2 KiB
Perl

use strict;
use warnings;
use Setup;
use Test2::V0;
use Catalyst::Test ();
use HTTP::Request;
use HTTP::Request::Common qw(GET POST DELETE);
use JSON::MaybeXS qw(decode_json encode_json);
my $ctx = test_context();
Catalyst::Test->import('Hydra');
my $user = $ctx->db()->resultset('Users')->create({
username => 'alice',
emailaddress => 'root@invalid.org',
password => '!'
});
$user->setPassword('foobar');
$user->userroles->update_or_create({ role => 'admin' });
# Login and save cookie for future requests
my $req = request(POST '/login',
Referer => 'http://localhost/',
Content => {
username => 'alice',
password => 'foobar'
}
);
is($req->code, 302, "Logging in gets a 302");
my $cookie = $req->header("set-cookie");
subtest "Deleting a simple project" => sub {
my $builds = $ctx->makeAndEvaluateJobset(
expression => "basic.nix"
);
my $project = $builds->{"empty_dir"}->project;
my $responseNoAuth = request(DELETE "/project/${\$project->name}");
is($responseNoAuth->code, 403, "Deleting a project without auth returns a 403");
my $responseAuthed = request(DELETE "/project/${\$project->name}",
Cookie => $cookie,
Accept => "application/json"
);
is($responseAuthed->code, 200, "Deleting a project with auth returns a 200");
my $response = request(GET "/project/${\$project->name}");
is($response->code, 404, "Then getting the project returns a 404");
is(
$ctx->db->resultset('Builds')->find({ id => $builds->{"empty_dir"}->id }),
undef,
"The build isn't in the database anymore"
);
};
subtest "Deleting a project with metrics" => sub {
my $builds = $ctx->makeAndEvaluateJobset(
expression => "runcommand.nix",
build => 1
);
my $project = $builds->{"metrics"}->project;
my $responseAuthed = request(DELETE "/project/${\$project->name}",
Cookie => $cookie,
Accept => "application/json"
);
is($responseAuthed->code, 200, "Deleting a project with auth returns a 200");
my $response = request(GET "/project/${\$project->name}");
is($response->code, 404, "Then getting the project returns a 404");
};
done_testing;