From 0044622198ace91978799b656369b2d8f931ce96 Mon Sep 17 00:00:00 2001 From: Graham Christensen Date: Fri, 14 Jan 2022 20:05:39 -0500 Subject: [PATCH 1/2] Projects: test deleting --- t/Hydra/Controller/Project/delete.t | 58 +++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 t/Hydra/Controller/Project/delete.t diff --git a/t/Hydra/Controller/Project/delete.t b/t/Hydra/Controller/Project/delete.t new file mode 100644 index 00000000..203fe106 --- /dev/null +++ b/t/Hydra/Controller/Project/delete.t @@ -0,0 +1,58 @@ +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" + ); +}; + +done_testing; \ No newline at end of file From f4c4b496d8c4887e7c81164b88f99bf2bd2ae278 Mon Sep 17 00:00:00 2001 From: Graham Christensen Date: Sun, 9 Jan 2022 10:14:03 -0500 Subject: [PATCH 2/2] 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. --- src/lib/Hydra/Controller/Project.pm | 2 +- t/Hydra/Controller/Project/delete.t | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/lib/Hydra/Controller/Project.pm b/src/lib/Hydra/Controller/Project.pm index c38ff6ad..c7e64544 100644 --- a/src/lib/Hydra/Controller/Project.pm +++ b/src/lib/Hydra/Controller/Project.pm @@ -78,8 +78,8 @@ sub project_DELETE { requireProjectOwner($c, $c->stash->{project}); $c->model('DB')->schema->txn_do(sub { - $c->stash->{project}->jobsets->delete; $c->stash->{project}->builds->delete; + $c->stash->{project}->jobsets->delete; $c->stash->{project}->delete; }); diff --git a/t/Hydra/Controller/Project/delete.t b/t/Hydra/Controller/Project/delete.t index 203fe106..f162a0f6 100644 --- a/t/Hydra/Controller/Project/delete.t +++ b/t/Hydra/Controller/Project/delete.t @@ -55,4 +55,21 @@ subtest "Deleting a simple project" => sub { ); }; -done_testing; \ No newline at end of file +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;