admin: view workflow traces in test result inspect (#87244)
gitea/wcs/pipeline/head This commit looks good Details

This commit is contained in:
Valentin Deniaud 2024-02-21 14:26:25 +01:00
parent 7e6f15155f
commit cac1018c21
5 changed files with 65 additions and 5 deletions

View File

@ -1003,6 +1003,11 @@ def test_tests_result_error_field(pub):
def test_tests_result_inspect(pub):
user = create_superuser(pub)
role = pub.role_class(name='test role')
role.store()
user.roles = [role.id]
user.store()
workflow = Workflow(name='Workflow One')
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
workflow.backoffice_fields_formdef.fields = [
@ -1013,6 +1018,11 @@ def test_tests_result_inspect(pub):
set_backoffice_fields = new_status.add_action('set-backoffice-fields')
set_backoffice_fields.fields = [{'field_id': '1', 'value': 'goodbye'}]
jump = new_status.add_action('choice')
jump.label = 'Loop on status'
jump.status = new_status.id
jump.by = [role.id]
workflow.store()
formdef = FormDef()
@ -1030,6 +1040,9 @@ def test_tests_result_inspect(pub):
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.agent_id = user.id
testdef.workflow_tests.actions = [
workflow_tests.ButtonClick(id='1', button_name='Loop on status'),
]
testdef.store()
app = login(get_app(pub))
@ -1041,6 +1054,13 @@ def test_tests_result_inspect(pub):
assert 'form_var_text' in resp.text
assert 'form_var_text_bo' in resp.text
assert [x.text_content() for x in resp.pyquery('div#inspect-timeline a')] == [
'New status',
'Backoffice Data',
'Action button - Manual Jump Loop on status',
'Backoffice Data',
]
resp.form['django-condition'] = 'form_var_text == "hello"'
resp = resp.form.submit()
assert 'Condition result' in resp.text

View File

@ -44,6 +44,7 @@ from wcs.qommon.form import (
from wcs.sql_criterias import Equal, Null, StrictNotEqual
from wcs.testdef import TestDef, TestError, TestResult, WebserviceResponse
from wcs.workflow_tests import WorkflowTestError
from wcs.workflow_traces import WorkflowTrace
class TestEditPage(FormBackofficeEditPage):
@ -548,6 +549,15 @@ class TestResultDetailPage(Directory):
# set status
formdata.status = formdata_json['workflow']['real_status']['id']
formdata.workflow_traces = [
WorkflowTrace.import_from_json_dict(x) for x in formdata_json['workflow_traces']
]
def get_workflow_traces():
return formdata.workflow_traces
formdata.get_workflow_traces = get_workflow_traces
return formdata
@ -671,6 +681,7 @@ class TestsAfterJob(AfterJob):
formdata_json = test.formdata.get_json_export_dict()
formdata_json['criticality_level'] = test.formdata.criticality_level
formdata_json['anonymised'] = test.formdata.anonymised
formdata_json['workflow_traces'] = [x.get_json_export_dict() for x in test.formdata.workflow_traces]
test_result = TestResult()
test_result.object_type = objectdef.get_table_name()

View File

@ -217,6 +217,8 @@ class TestDef(sql.TestDef):
formdata = objectdef.data_class()()
formdata.just_created()
formdata.workflow_traces = []
if self.data['user']:
formdata.set_user_from_json(self.data['user'])

View File

@ -59,10 +59,7 @@ class WorkflowTests(XmlStorableObject):
self.actions = []
def run(self, formdata, agent_user):
# mock methods so nothing is stored
formdata.record_workflow_event = lambda *args, **kwargs: None
formdata.record_workflow_action = lambda *args, **kwargs: None
formdata.store = lambda *args, **kwargs: None
self.mock_formdata_methods(formdata)
# mark formdata as running workflow tests
formdata.workflow_test = True
@ -81,6 +78,20 @@ class WorkflowTests(XmlStorableObject):
e.details.append(_('Form status when error occured: %s') % status.name)
raise e
def mock_formdata_methods(self, formdata):
from wcs.workflow_traces import WorkflowTrace
def record_workflow_event(event, **kwargs):
formdata.workflow_traces.append(WorkflowTrace(formdata=formdata, event=event, event_args=kwargs))
def record_workflow_action(action):
formdata.workflow_traces.append(WorkflowTrace(formdata=formdata, action=action))
formdata.record_workflow_event = record_workflow_event
formdata.record_workflow_action = record_workflow_action
formdata.store = lambda *args, **kwargs: None
def get_new_action_id(self):
if not self.actions:
return '1'

View File

@ -17,7 +17,7 @@
from quixote.html import TemplateIO, htmltext
from wcs import sql
from wcs.qommon import _
from wcs.qommon import _, misc
class WorkflowTrace(sql.WorkflowTrace):
@ -284,3 +284,19 @@ class WorkflowTrace(sql.WorkflowTrace):
status_admin_base_url,
status_label,
)
def get_json_export_dict(self):
return {field: getattr(self, field) for field, _ in self._table_static_fields}
@classmethod
def import_from_json_dict(cls, data):
workflow_trace = cls.__new__(cls)
for field, kind in cls._table_static_fields:
value = data.get(field)
if value and kind == 'timestamptz':
value = misc.get_as_datetime(value)
setattr(workflow_trace, field, value)
return workflow_trace