admin: create test from scratch instead of using existing formdata (#75170)
gitea/wcs/pipeline/head Build started... Details

This commit is contained in:
Valentin Deniaud 2023-03-08 14:49:42 +01:00
parent 34e1a30499
commit e1a6dbdb52
3 changed files with 39 additions and 83 deletions

View File

@ -61,7 +61,7 @@ def test_tests_link_on_formdef_page(pub):
def test_tests_page(pub):
user = create_superuser(pub)
create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
@ -71,77 +71,42 @@ def test_tests_page(pub):
formdef.store()
app = login(get_app(pub))
resp = app.get(formdef.get_admin_url())
resp = resp.click('Tests')
assert 'There are no tests yet.' in resp.text
assert 'Tests cannot be created because there are no completed forms.' in resp.text
assert 'New' not in resp.text
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = datetime.datetime(2021, 1, 1, 0, 0).timetuple()
formdata.data['1'] = 'a'
formdata.user_id = user.id
formdata.store()
resp = app.get(formdef.get_admin_url())
resp = resp.click('Tests')
assert 'There are no tests yet.' in resp.text
assert 'New tests cannot be created' not in resp.text
resp = resp.click('New')
resp.form['name'] = 'First test'
resp.form['formdata_id'].select(text='1-1 - admin')
assert len(resp.form['formdata_id'].options) == 1
resp = resp.form.submit().follow()
assert 'Edit test data' in resp.text
resp.form['f1'] = 'abcdefg'
resp = resp.form.submit('submit')
assert resp.location == 'http://example.net/backoffice/forms/1/tests/1/'
resp = resp.follow()
assert 'First test' in resp.text
assert 'abcdefg' in resp.text
assert 'This test is empty' not in resp.text
resp = app.get('/backoffice/forms/1/tests/')
assert 'First test' in resp.text
assert 'no tests yet' not in resp.text
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = datetime.datetime(2021, 1, 1, 0, 0).timetuple()
formdata.data['1'] = 'b'
formdata.store()
resp = app.get('/backoffice/forms/1/tests/new')
resp = resp.click('New')
resp.form['name'] = 'Second test'
resp.form['formdata_id'].select(text='1-2 - Unknown User')
assert len(resp.form['formdata_id'].options) == 2
# submit but skip redirection to edit page
resp.form.submit()
resp = resp.form.submit().follow()
resp = app.get('/backoffice/forms/1/tests/')
assert 'First test' in resp.text
assert 'Second test' in resp.text
resp = resp.click('Second test')
assert 'This test is empty' in resp.text
def test_tests_page_formdefs_isolation(pub):
formdef = FormDef()
formdef.name = 'dummy'
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.store()
other_formdef = FormDef()
other_formdef.name = 'dummy2'
other_formdef.store()
formdata2 = other_formdef.data_class()()
formdata2.just_created()
formdata2.store()
create_superuser(pub)
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/new')
assert len(resp.form['formdata_id'].options) == 1
assert resp.form['formdata_id'].options[0][2] == '1-1 - Unknown User'
resp = app.get('/backoffice/forms/2/tests/new')
assert len(resp.form['formdata_id'].options) == 1
assert resp.form['formdata_id'].options[0][2] == '2-1 - Unknown User'
# test run with empty test is allowed
app.get('/backoffice/forms/1/tests/results/run').follow()
def test_tests_page_deprecated_fields(pub):
@ -294,11 +259,13 @@ def test_tests_edit(pub):
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [fields.StringField(id='1', label='Text', varname='text')]
formdef.store()
formdata = formdef.data_class()()
formdata.receipt_time = datetime.datetime(2021, 1, 1, 0, 0).timetuple()
formdata.user_id = user.id
formdata.data = {'1': 'xxx'}
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
@ -481,7 +448,8 @@ def test_tests_manual_run(pub):
assert 'No test results yet.' in resp.text
resp = resp.click('Run tests')
assert resp.location == 'http://example.net/backoffice/forms/1/tests/results/1/'
result = TestResult.select()[-1]
assert resp.location == 'http://example.net/backoffice/forms/1/tests/results/%s/' % result.id
resp = resp.follow()
assert 'Started by: Manual run.' in resp.text
@ -502,14 +470,15 @@ def test_tests_manual_run(pub):
formdef.store()
resp = resp.click('Run tests')
assert resp.location == 'http://example.net/backoffice/forms/1/tests/results/2/'
result = TestResult.select()[-1]
assert resp.location == 'http://example.net/backoffice/forms/1/tests/results/%s/' % result.id
resp = app.get('/backoffice/forms/1/tests/results/')
assert len(resp.pyquery('tr')) == 2
assert len(resp.pyquery('span.test-success')) == 1
assert len(resp.pyquery('span.test-failure')) == 1
resp = resp.click('#2')
resp = resp.click('#%s' % result.id)
assert 'Started by: Manual run.' in resp.text
assert 'Success!' not in resp.text
assert 'Empty value for field' in resp.text

View File

@ -30,7 +30,7 @@ from wcs.qommon.backoffice.listing import pagination_links
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon.errors import TraversalError
from wcs.qommon.form import FileWidget, Form, SingleSelectWidget, StringWidget
from wcs.qommon.storage import Equal, StrictNotEqual
from wcs.qommon.storage import Equal
from wcs.testdef import TestDef, TestError, TestResult
@ -147,7 +147,10 @@ class TestPage(FormBackOfficeStatusPage):
r += htmltext('<div class="infonotice"><p>%s</p></div>') % _(
'This test is expected to fail on error "%s".' % self.testdef.data['expected_error']
)
r += self.receipt(always_include_user=True, mine=False)
if self.testdef.data['fields']:
r += self.receipt(always_include_user=True, mine=False)
else:
r += htmltext('<div class="infonotice"><p>%s</p></div>') % _('This test is empty.')
return r.getvalue()
def delete(self):
@ -266,7 +269,6 @@ class TestsDirectory(Directory):
def _q_index(self):
context = {
'testdefs': TestDef.select_for_objectdef(self.objectdef),
'formdata': self.objectdef.data_class().select([StrictNotEqual('status', 'draft')]),
'has_deprecated_fields': any(
x.type in ('table', 'table-select', 'tablerows', 'ranked-items')
for x in self.objectdef.fields
@ -281,13 +283,6 @@ class TestsDirectory(Directory):
def new(self):
form = Form(enctype='multipart/form-data')
form.add(StringWidget, 'name', title=_('Name'), required=True, size=50)
formadata_options = [
(x.id, '%s - %s' % (x.id_display, x.user or _('Unknown User')))
for x in self.objectdef.data_class().select(
[StrictNotEqual('status', 'draft')], order_by='-receipt_time'
)
]
form.add(SingleSelectWidget, 'formdata_id', title=_('Form'), required=True, options=formadata_options)
form.add_submit('submit', _('Submit'))
form.add_submit('cancel', _('Cancel'))
@ -300,15 +295,13 @@ class TestsDirectory(Directory):
r += htmltext('<h2>%s</h2>') % _('New test')
r += form.render()
return r.getvalue()
else:
formdata_id = form.get_widget('formdata_id').parse()
formdata = self.objectdef.data_class().get(formdata_id)
testdef = TestDef.create_from_formdata(self.objectdef, formdata)
testdef.name = form.get_widget('name').parse()
testdef.store()
# create empty test
testdef = TestDef.create_from_formdata(self.objectdef, self.objectdef.data_class()())
testdef.name = form.get_widget('name').parse()
testdef.store()
return redirect('.')
return redirect(testdef.get_admin_url() + 'edit-data/')
def p_import(self):
form = Form(enctype='multipart/form-data')

View File

@ -5,7 +5,7 @@
{% block sidebar-content %}
<h3>{% trans "Actions" %}</h3>
{% if formdata and not has_deprecated_fields %}
{% if not has_deprecated_fields %}
<a class="button button-paragraph" href="new" rel="popup">{% trans "New" %}</a>
{% endif %}
<a class="button button-paragraph" href="import" rel="popup">{% trans "Import" %}</a>
@ -23,12 +23,6 @@
</div>
{% endif %}
{% if not formdata %}
<div class="infonotice">
<p>{% trans "Tests cannot be created because there are no completed forms." %}</p>
</div>
{% endif %}
{% if testdefs %}
<ul class="objects-list single-links">
{% for test in testdefs %}