From 3d3dbc97d5c67436a0e2831c275db912d410c1ad Mon Sep 17 00:00:00 2001 From: Ioannis Bonatakis Date: Mon, 30 Sep 2024 22:48:49 +0200 Subject: [PATCH 1/2] Add option to restart jobs upon comment submission - Renamed `addComments` to `restartOrCommentJobs` to handle both commenting and restarting jobs. - Added button-specific actions using `form.clickedButton`. - Updated `fetchWithCSRF` logic to dynamically determine request URLs based on the button clicked. - Introduced separate success and error messages for restarting and commenting actions. - Updated HTML to include "Restart and Comment" and "Comment" buttons with individual API endpoints via formaction. That removes action attribute from the form element. - Let "comments" be `btn-warning` and "restart" show more severe operation using `btn-danger`. - Adjusted modal to allow submission of comments or restarts through the correct action handlers. - Inform overview page with warning in case of errors in Response. - Redesign `restartOrCommentJobs` (previews addComments) to reflect the new features. These updates enhance the user experience by allowing users to either comment on jobs, or perform restart with a comment simultaneously from the overview page. Comments always add to the original job of the overview page. By integrating this functionality we provide a workflow for users managing multiple jobs on the overview page using the already existing API implementations. https://progress.opensuse.org/issues/166559 Signed-off-by: Ioannis Bonatakis --- assets/javascripts/overview.js | 34 +++++++++++---- t/ui/10-tests_overview.t | 58 +++++++++++++++++--------- templates/webapi/test/overview.html.ep | 28 +++++++++---- 3 files changed, 85 insertions(+), 35 deletions(-) diff --git a/assets/javascripts/overview.js b/assets/javascripts/overview.js index 003f65f6cbc..8f1d5322aa1 100644 --- a/assets/javascripts/overview.js +++ b/assets/javascripts/overview.js @@ -287,12 +287,16 @@ function showAddCommentsDialog() { modal.show(); } -function addComments(form) { +function restartOrCommentJobs(form) { const text = form.elements.text.value; if (!text.length) { return window.alert("The comment text mustn't be empty."); } - const progressIndication = document.getElementById('add-comments-progress-indication'); + const actionBtn = form.clickedButton ? form.clickedButton.value : null; + console.log(actionBtn); + let reqUrl = form.clickedButton.getAttribute('formaction'); + console.log(form.clickedButton.getAttribute('formaction')); + const progressIndication = document.getElementById('add-comments-progress-indication'); const controls = document.getElementById('add-comments-controls'); progressIndication.style.display = 'flex'; controls.style.display = 'none'; @@ -301,17 +305,31 @@ function addComments(form) { controls.style.display = 'inline'; window.addCommentsModal.hide(); }; - fetchWithCSRF(form.action, {method: 'POST', body: new FormData(form)}) + + let infoText = + 'The comments have been created. Reload the page to show changes.'; + let errText = 'The comments could not be added:'; + if (actionBtn === 'restartAndCommentJobs') { + infoText = 'Reload the page to show restarted jobs.'; + errText = 'Failed to restart jobs: '; + } + fetchWithCSRF(reqUrl, {method: 'POST', body: new FormData(form)}) .then(response => { if (!response.ok) throw `Server returned ${response.status}: ${response.statusText}`; - addFlash( - 'info', - 'The comments have been created. Reload the page to show changes.' - ); + addFlash('info', infoText); done(); + return response.json(); + }) + .then(resData => { + console.log(resData); + if (resData.errors && resData.errors.length > 0) { + for (let i in resData.errors) { + addFlash('warning', 'Warning: Errors found in Response:\n' + resData.errors[i].trim()); + } + } }) .catch(error => { - addFlash('danger', `The comments could not be added: ${error}`); + addFlash('danger', `${errText} ${error}`); done(); }); } diff --git a/t/ui/10-tests_overview.t b/t/ui/10-tests_overview.t index e3dc27eb633..9ba9199e105 100644 --- a/t/ui/10-tests_overview.t +++ b/t/ui/10-tests_overview.t @@ -543,18 +543,34 @@ subtest 'filter by result and state' => sub { ok !$driver->find_element_by_id('filter-failed')->is_selected, 'other checkbox not checked'; }; +subtest "job template names displayed on 'Test result overview' page" => sub { + $driver->get('/group_overview/1002'); + is($driver->find_element('.progress-bar-unfinished')->get_text(), + '1 unfinished', 'The number of unfinished jobs is right'); + + $driver->get('/tests/overview?distri=opensuse&version=13.1&build=0091&groupid=1002'); + my @tds = $driver->find_elements('#results_DVD tbody tr .name'); + is($tds[0]->get_text(), 'kde_variant', 'job template name kde_variant displayed correctly'); + + my @descriptions = $driver->find_elements('td.name a', 'css'); + is(scalar @descriptions, 2, 'only test suites with description content are shown as links'); + disable_bootstrap_animations; + $descriptions[0]->click(); + is(wait_for_element(selector => '.popover-header')->get_text, 'kde_variant', 'description popover shows content'); +}; + subtest 'add comments' => sub { - my @buttons = $driver->find_elements('button[title="Add comments"]'); + my @buttons = $driver->find_elements('button[title="Restart or comment jobs"]'); is @buttons, 0, 'button for adding comments not present if not logged-in'; $driver->find_element_by_link_text('Login')->click; $driver->get('/tests/overview?state=done&result=failed'); disable_bootstrap_animations; - $driver->find_element('button[title="Add comments"]')->click; + $driver->find_element('button[title="Restart or comment jobs"]')->click; my $comment_text = 'comment via add-comments'; - my $submit_button = $driver->find_element('#add-comments-controls button[type="submit"]'); + my $submit_button = $driver->find_element('#add-comments-controls button[id="commentJobsBtn"]'); $driver->find_element_by_id('text')->send_keys($comment_text); - is $submit_button->get_text, 'Submit comment on all 2 jobs', 'submit button displayed with number of jobs'; + is $submit_button->get_text, 'Comment on all 2 jobs', 'submit button displayed with number of jobs'; $submit_button->click; wait_for_ajax msg => 'comments created'; like $driver->find_element_by_id('flash-messages')->get_text, qr/The comments have been created. Reload/, @@ -565,23 +581,25 @@ subtest 'add comments' => sub { 'comments created on all relevant jobs'; is $comments->search({job_id => {-not_in => \@failed_job_ids}, text => $comment_text})->count, 0, 'comments not created on other jobs'; -}; - -subtest "job template names displayed on 'Test result overview' page" => sub { - $driver->get('/group_overview/1002'); - is($driver->find_element('.progress-bar-failed')->get_text(), '1 failed', 'The number of failed jobs is right'); - is($driver->find_element('.progress-bar-unfinished')->get_text(), - '1 unfinished', 'The number of unfinished jobs is right'); - - $driver->get('/tests/overview?distri=opensuse&version=13.1&build=0091&groupid=1002'); - my @tds = $driver->find_elements('#results_DVD tbody tr .name'); - is($tds[0]->get_text(), 'kde_variant', 'job template name kde_variant displayed correctly'); - my @descriptions = $driver->find_elements('td.name a', 'css'); - is(scalar @descriptions, 2, 'only test suites with description content are shown as links'); - disable_bootstrap_animations; - $descriptions[0]->click(); - is(wait_for_element(selector => '.popover-header')->get_text, 'kde_variant', 'description popover shows content'); + subtest 'restart jobs with comment' => sub { + $driver->get('/tests/overview?state=done&result=failed'); + disable_bootstrap_animations; + $driver->find_element('button[title="Restart or comment jobs"]')->click; + my $comment_text = 'comment current jobs and restart'; + my $submit_button = $driver->find_element('#add-comments-controls button[id="restartAndCommentJobsBtn"]'); + $driver->find_element_by_id('text')->send_keys($comment_text); + is $submit_button->get_text, 'Restart and comment on 2 jobs', 'submit button displayed with number of jobs'; + $submit_button->click; + wait_for_ajax msg => 'comments created'; + like $driver->find_element_by_id('flash-messages')->get_text, qr/Reload the page to show restarted jobs/, + 'info about successful restart shown'; + my @failed_job_ids = map { $_->id } $jobs->search({result => FAILED})->all; + is $comments->search({job_id => {-not_in => \@failed_job_ids}, text => $comment_text})->count, 0, + 'comments not created on other jobs'; + my $running_job_ids = map { $_->id } $jobs->search({state => RUNNING})->all; + is $running_job_ids, 2, 'all relevant jobs restarted'; + }; }; subtest "job dependencies displayed on 'Test result overview' page" => sub { diff --git a/templates/webapi/test/overview.html.ep b/templates/webapi/test/overview.html.ep index 28b00a37b3e..b0a9e10f672 100644 --- a/templates/webapi/test/overview.html.ep +++ b/templates/webapi/test/overview.html.ep @@ -42,8 +42,12 @@
% my $allow_commenting = @$job_ids && current_user; % if ($allow_commenting) { - % } % my @badges = qw(success secondary warning danger info primary light light); @@ -217,7 +221,7 @@