From 03d5a858a76cd4e59cfc1d51f12dd1fcc9f1591a Mon Sep 17 00:00:00 2001 From: Cole Helbling Date: Thu, 29 Apr 2021 17:41:23 -0700 Subject: [PATCH] Jobset: list known inputs in invalid input type response --- src/lib/Hydra/Controller/Jobset.pm | 21 +++++++++++++++++++-- t/Controller/Jobset/http.t | 30 ++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/lib/Hydra/Controller/Jobset.pm b/src/lib/Hydra/Controller/Jobset.pm index 24776994..ae0bb018 100644 --- a/src/lib/Hydra/Controller/Jobset.pm +++ b/src/lib/Hydra/Controller/Jobset.pm @@ -213,6 +213,22 @@ sub checkInputValue { } +sub knownInputTypes { + my ($c) = @_; + + my @keys = keys %{$c->stash->{inputTypes}}; + my $types = ""; + my $counter = 0; + + foreach my $key (@keys) { + $types = $types . "and ‘$key’" if ++$counter == scalar(@keys); + $types = $types . "‘$key’, " if $counter != scalar(@keys); + } + + return $types; +} + + sub updateJobset { my ($c, $jobset) = @_; @@ -275,9 +291,10 @@ sub updateJobset { my $type = $inputData->{type}; my $value = $inputData->{value}; my $emailresponsible = defined $inputData->{emailresponsible} ? 1 : 0; + my $types = knownInputTypes($c); - error($c, "Invalid input name ‘$name’.") unless $name =~ /^[[:alpha:]][\w-]*$/; - error($c, "Invalid input type ‘$type’.") unless defined $c->stash->{inputTypes}->{$type}; + badRequest($c, "Invalid input name ‘$name’.") unless $name =~ /^[[:alpha:]][\w-]*$/; + badRequest($c, "Invalid input type ‘$type’; valid types: $types.") unless defined $c->stash->{inputTypes}->{$type}; my $input = $jobset->jobsetinputs->create( { name => $name, diff --git a/t/Controller/Jobset/http.t b/t/Controller/Jobset/http.t index dc11c7a2..be2950f0 100644 --- a/t/Controller/Jobset/http.t +++ b/t/Controller/Jobset/http.t @@ -157,6 +157,36 @@ subtest 'Update jobset "job" to legacy type' => sub { }; +subtest 'Update jobset "job" to have an invalid input type' => sub { + my $jobsetupdate = request(PUT '/jobset/tests/job', + Accept => 'application/json', + Content_Type => 'application/json', + Cookie => $cookie, + Content => encode_json({ + enabled => 3, + visible => JSON::true, + name => "job", + type => 0, + nixexprinput => "ofborg", + nixexprpath => "release.nix", + inputs => { + ofborg => { + name => "ofborg", + type => "123", + value => "https://github.com/NixOS/ofborg.git released" + } + }, + description => "test jobset", + checkinterval => 0, + schedulingshares => 50, + keepnr => 1 + }) + ); + ok(!$jobsetupdate->is_success); + ok($jobsetupdate->content =~ m/Invalid input type.*valid types:/); +}; + + subtest 'Delete jobset "job"' => sub { my $jobsetinfo = request(DELETE '/jobset/tests/job', Accept => 'application/json',