From 4ad0b83b5e1df5badfb3938ef79040436965b4ce Mon Sep 17 00:00:00 2001 From: Rosen Sasov Date: Wed, 15 Apr 2020 20:22:37 +0300 Subject: [PATCH] Refactor update case text version to use jsonRpc. Fixes #1063 Fix remarks Change latest flag to integer -1 value. Revert form field of case text version to integer. Extract case text version from form in variable --- tcms/rpc/api/testexecution.py | 30 ++++--- tcms/static/js/testrun_actions.js | 14 ++- tcms/templates/run/get_case_runs.html | 2 +- tcms/testruns/tests/test_views.py | 118 -------------------------- tcms/testruns/urls.py | 3 - tcms/testruns/views.py | 32 ------- 6 files changed, 34 insertions(+), 165 deletions(-) diff --git a/tcms/rpc/api/testexecution.py b/tcms/rpc/api/testexecution.py index 024315e605..21d12a3709 100644 --- a/tcms/rpc/api/testexecution.py +++ b/tcms/rpc/api/testexecution.py @@ -149,36 +149,46 @@ def update(execution_id, values, **kwargs): :raises: PermissionDenied if missing *testruns.change_testexecution* permission """ - tcr = TestExecution.objects.get(pk=execution_id) + execution = TestExecution.objects.get(pk=execution_id) form = UpdateExecutionForm(values) if form.is_valid(): if form.cleaned_data['build']: - tcr.build = form.cleaned_data['build'] + execution.build = form.cleaned_data['build'] if form.cleaned_data['assignee']: - tcr.assignee = form.cleaned_data['assignee'] + execution.assignee = form.cleaned_data['assignee'] if form.cleaned_data['status']: - tcr.status = form.cleaned_data['status'] + execution.status = form.cleaned_data['status'] request = kwargs.get(REQUEST_KEY) - tcr.tested_by = request.user + execution.tested_by = request.user if form.cleaned_data['sortkey'] is not None: - tcr.sortkey = form.cleaned_data['sortkey'] + execution.sortkey = form.cleaned_data['sortkey'] if form.cleaned_data['tested_by']: - tcr.tested_by = form.cleaned_data['tested_by'] + execution.tested_by = form.cleaned_data['tested_by'] + + case_text_version = form.cleaned_data['case_text_version'] + if case_text_version: + update_case_text_version(execution, case_text_version) - tcr.save() + execution.save() else: raise ValueError(form_errors_to_list(form)) - return tcr.serialize() + return execution.serialize() + + +def update_case_text_version(execution, case_text_version): + if case_text_version == -1: + execution.case_text_version = execution.case.history.latest().history_id + else: + execution.case_text_version = case_text_version -# todo: missing permissions @rpc_method(name='TestExecution.add_link') def add_link(values, update_tracker=False): """ diff --git a/tcms/static/js/testrun_actions.js b/tcms/static/js/testrun_actions.js index 5272e394f2..5b20dd46b1 100644 --- a/tcms/static/js/testrun_actions.js +++ b/tcms/static/js/testrun_actions.js @@ -167,7 +167,7 @@ Nitrate.TestRuns.Details.on_load = function() { delCaseRun(jQ(this).data('param')); }); jQ('.js-update-case').bind('click', function() { - postToURL(jQ(this).data('param'), serializeCaseRunFromInputList('id_table_cases', 'case_run')); + updateCaseRunText(); }); jQ('.js-change-assignee').bind('click', function() { changeCaseRunAssignee(); @@ -541,6 +541,18 @@ function changeCaseRunAssignee() { window.location.reload(); } +function updateCaseRunText() { + const executions = serializeCaseRunFromInputList(jQ('#id_table_cases')[0]); + if (!executions.length) { + window.alert(default_messages.alert.no_case_selected); + return false; + } + executions.forEach(executionId => + jsonRPC('TestExecution.update', [executionId, {'case_text_version': -1}], () => { }, sync=true) + ); + window.location.reload(true); +} + function serializeCaseRunFromInputList(table, name) { var elements; if (typeof table === 'string') { diff --git a/tcms/templates/run/get_case_runs.html b/tcms/templates/run/get_case_runs.html index 1920c09ea8..225aa7fed1 100644 --- a/tcms/templates/run/get_case_runs.html +++ b/tcms/templates/run/get_case_runs.html @@ -23,7 +23,7 @@
  • {% trans "Remove" %}
  • {% endif %} {% if perms.testruns.change_testexecution %} -
  • {% trans "Update" %}
  • +
  • {% trans "Update" %}
  • {% endif %} {% if perms.testruns.change_testexecution %}
  • {% trans "Assignee" %}
  • diff --git a/tcms/testruns/tests/test_views.py b/tcms/testruns/tests/test_views.py index 3a2ddcaeab..cb26d8e8cb 100644 --- a/tcms/testruns/tests/test_views.py +++ b/tcms/testruns/tests/test_views.py @@ -364,104 +364,6 @@ def test_should_not_be_able_use_cc_when_user_has_no_pemissions(self): ) -class TestUpdateCaseRunText(BaseCaseRun): - """Test update_case_run_text view method""" - - @classmethod - def setUpTestData(cls): - super().setUpTestData() - - cls.testruns_url = reverse('testruns-get', args=[cls.test_run.pk]) - cls.update_url = reverse('testruns-update_case_run_text', - args=[cls.test_run.pk]) - - # To increase case text version - cls.execution_1.case.text = "Scenario Version 1" - cls.execution_1.case.save() - - cls.execution_1.case.text = "Scenario Version 2" - cls.execution_1.case.save() - - def test_get_update_caserun_text_with_permissions(self): - user_should_have_perm(self.tester, 'testruns.change_testexecution') - response = self.client.get(self.testruns_url) - self.assertContains(response, 'id="update_case_run_text"') - - def test_update_selected_case_runs_with_permissions(self): - user_should_have_perm(self.tester, 'testruns.change_testexecution') - - self.assertNotEqual(self.execution_1.case.history.latest().history_id, - self.execution_1.case_text_version) - - expected_text = "%s: %s -> %s" % ( - self.execution_1.case.summary, - self.execution_1.case_text_version, - self.execution_1.case.history.latest().history_id - ) - - response = self.client.post(self.update_url, - {'pk': [self.execution_1.pk]}, - follow=True) - - self.assertContains(response, expected_text) - - self.execution_1.refresh_from_db() - - self.assertEqual( - self.execution_1.case.get_text_with_version( - self.execution_1.case_text_version - ), - "Scenario Version 2" - ) - self.assertEqual( - self.execution_1.case.history.latest().history_id, - self.execution_1.case_text_version - ) - - def test_get_update_caserun_text_without_permissions(self): - remove_perm_from_user(self.tester, 'testruns.change_testexecution') - response = self.client.get(self.testruns_url) - self.assertNotContains(response, 'id="update_case_run_text"') - - def test_update_selected_case_runs_without_permissions(self): - self.execution_1.case.text = "Scenario Version 3" - self.execution_1.case.save() - - remove_perm_from_user(self.tester, 'testruns.change_testexecution') - - self.client.login( # nosec:B106:hardcoded_password_funcarg - username=self.tester.username, - password='password') - - self.assertNotEqual( - self.execution_1.case.history.latest().history_id, - self.execution_1.case_text_version - ) - - response = self.client.post(self.update_url, - {'pk': [self.execution_1.pk]}, - follow=True) - - self.assertRedirects( - response, - reverse('tcms-login') + '?next=' + self.update_url - ) - - self.execution_1.refresh_from_db() - - self.assertNotEqual( - self.execution_1.case.get_text_with_version( - self.execution_1.case_text_version - ), - "Scenario Version 3" - ) - - self.assertNotEqual( - self.execution_1.case.history.latest().history_id, - self.execution_1.case_text_version - ) - - class TestAddCasesToRun(BaseCaseRun): """Test AddCasesToRunView""" @@ -560,16 +462,6 @@ def setUpTestData(cls): _('Remove') ) - cls.update_case_run_text_html = \ - '{2}' \ - .format( - _('Update the IDLE case runs to newest case text'), - reverse('testruns-update_case_run_text', args=[cls.test_run.pk]), - _('Update') - ) - cls.change_assignee_html = \ '{1}' \ @@ -588,11 +480,6 @@ def test_remove_cases_from_run_with_permission(self): response = self.client.get(self.url) self.assertContains(response, self.remove_cases_html, html=True) - def test_update_caserun_text_with_permission(self): - user_should_have_perm(self.tester, 'testruns.change_testexecution') - response = self.client.get(self.url) - self.assertContains(response, self.update_case_run_text_html, html=True) - def test_change_assignee_with_permission(self): user_should_have_perm(self.tester, 'testruns.change_testexecution') response = self.client.get(self.url) @@ -608,11 +495,6 @@ def test_remove_cases_from_run_without_permission(self): response = self.client.get(self.url) self.assertNotContains(response, self.remove_cases_html, html=True) - def test_update_caserun_text_without_permission(self): - remove_perm_from_user(self.tester, 'testruns.change_testexecution') - response = self.client.get(self.url) - self.assertNotContains(response, self.update_case_run_text_html, html=True) - def test_change_assignee_without_permission(self): remove_perm_from_user(self.tester, 'testruns.change_testexecution') response = self.client.get(self.url) diff --git a/tcms/testruns/urls.py b/tcms/testruns/urls.py index c1dd2b47f5..ea0acc84cf 100644 --- a/tcms/testruns/urls.py +++ b/tcms/testruns/urls.py @@ -18,8 +18,5 @@ name='add-cases-to-run'), url(r'^(?P\d+)/cc/$', views.ManageTestRunCC.as_view(), name='testruns-cc'), - url(r'^(?P\d+)/update/$', views.UpdateCaseRunTextView.as_view(), - name='testruns-update_case_run_text'), - url(r'^search/$', views.SearchTestRunView.as_view(), name='testruns-search'), ] diff --git a/tcms/testruns/views.py b/tcms/testruns/views.py index 2f15fe2e46..4322e219ab 100755 --- a/tcms/testruns/views.py +++ b/tcms/testruns/views.py @@ -524,38 +524,6 @@ def get(self, request, pk): return render(request, self.template_name, context_data) -@method_decorator(permission_required('testruns.change_testexecution'), name='dispatch') -class UpdateCaseRunTextView(View): - """Update TC.text for executions which are not completed, aka status__weight=0""" - - http_method_names = ['post'] - - def post(self, request, pk): - test_run = get_object_or_404(TestRun, pk=pk) - - if request.POST.get('case_run'): - executions = test_run.case_run.filter(pk__in=request.POST.getlist('case_run')) - else: - executions = test_run.case_run.all() - - executions = executions.filter(status__weight=0) - - for execution in executions: - latest_version = execution.case.history.latest().history_id - if execution.case_text_version != latest_version: - info = "%s: %s -> %s" % ( - execution.case.summary, - execution.case_text_version, - latest_version - ) - messages.add_message(request, messages.SUCCESS, info) - - execution.case_text_version = latest_version - execution.save() - - return HttpResponseRedirect(reverse('testruns-get', args=[pk])) - - def get_caseruns_of_runs(runs, kwargs=None): """ Filtering argument -