Skip to content

Commit

Permalink
Refactor update case text version to use jsonRpc. Fixes kiwitcms#1063
Browse files Browse the repository at this point in the history
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
  • Loading branch information
rsasov committed May 6, 2020
1 parent 550d8d8 commit 4ad0b83
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 165 deletions.
30 changes: 20 additions & 10 deletions tcms/rpc/api/testexecution.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
"""
Expand Down
14 changes: 13 additions & 1 deletion tcms/static/js/testrun_actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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') {
Expand Down
2 changes: 1 addition & 1 deletion tcms/templates/run/get_case_runs.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<li><a href="#" title="{% trans 'Remove selected cases form this test run' %}" data-param="{{ test_run.pk }}" class="removeBlue9 js-del-case">{% trans "Remove" %}</a></li>
{% endif %}
{% if perms.testruns.change_testexecution %}
<li><a href="#" title="{% trans 'Update the IDLE case runs to newest case text' %}" href="javascript:void(0)" data-param="{% url 'testruns-update_case_run_text' test_run.pk %}" class="updateBlue9 js-update-case" id="update_case_run_text">{% trans "Update" %}</a></li>
<li><a href="#" title="{% trans 'Update the IDLE case runs to newest case text' %}" class="updateBlue9 js-update-case" id="update_case_run_text">{% trans "Update" %}</a></li>
{% endif %}
{% if perms.testruns.change_testexecution %}
<li><a href="#" title="{% trans 'Assign this case(s) to other people' %}" class="assigneeBlue9 js-change-assignee">{% trans "Assignee" %}</a></li>
Expand Down
118 changes: 0 additions & 118 deletions tcms/testruns/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"""

Expand Down Expand Up @@ -560,16 +462,6 @@ def setUpTestData(cls):
_('Remove')
)

cls.update_case_run_text_html = \
'<a href="#" title="{0}" \
href="javascript:void(0)" data-param="{1}" \
class="updateBlue9 js-update-case" id="update_case_run_text">{2}</a>' \
.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 = \
'<a href="#" title="{0}" \
class="assigneeBlue9 js-change-assignee">{1}</a>' \
Expand All @@ -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)
Expand All @@ -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)
Expand Down
3 changes: 0 additions & 3 deletions tcms/testruns/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,5 @@
name='add-cases-to-run'),

url(r'^(?P<pk>\d+)/cc/$', views.ManageTestRunCC.as_view(), name='testruns-cc'),
url(r'^(?P<pk>\d+)/update/$', views.UpdateCaseRunTextView.as_view(),
name='testruns-update_case_run_text'),

url(r'^search/$', views.SearchTestRunView.as_view(), name='testruns-search'),
]
32 changes: 0 additions & 32 deletions tcms/testruns/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 -
Expand Down

0 comments on commit 4ad0b83

Please sign in to comment.