testdef: allow setting status code of webservice response (#87542)
gitea/wcs/pipeline/head This commit looks good Details

This commit is contained in:
Valentin Deniaud 2024-03-04 14:32:24 +01:00
parent d784acba07
commit f418c515f5
4 changed files with 66 additions and 1 deletions

View File

@ -1369,6 +1369,7 @@ def test_tests_webservice_response(pub):
resp = resp.click('Test response')
resp.form['url'] = 'http://example.com/'
resp.form['payload'] = '{"a": "b"}'
resp.form['status_code'] = '400'
resp.form['qs_data$element0key'] = 'foo'
resp.form['method'] = 'POST (JSON)'
resp.form['post_data$element0key'] = 'bar'
@ -1381,6 +1382,7 @@ def test_tests_webservice_response(pub):
assert response.name == 'Test response'
assert response.url == 'http://example.com/'
assert response.payload == '{"a": "b"}'
assert response.status_code == 400
assert response.qs_data == {'foo': ''}
assert response.method == 'POST'
assert response.post_data == {'bar': ''}

View File

@ -543,3 +543,53 @@ def test_workflow_tests_webservice(pub):
with pytest.raises(WorkflowTestError) as excinfo:
testdef.run(formdef)
assert str(excinfo.value) == 'Webservice response Fake response was used 0 times (instead of 1).'
def test_workflow_tests_webservice_status_jump(pub):
user = pub.user_class(name='test user')
user.store()
workflow = Workflow(name='Workflow One')
new_status = workflow.add_status(name='New status')
end_status = workflow.add_status(name='Error status')
wscall = new_status.add_action('webservice_call')
wscall.url = 'http://example.com/json'
wscall.varname = 'test_webservice'
wscall.action_on_4xx = end_status.id
workflow.store()
formdef = FormDef()
formdef.name = 'test title'
formdef.workflow_id = workflow.id
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.agent_id = user.id
testdef.store()
response = WebserviceResponse()
response.testdef_id = testdef.id
response.name = 'Fake response'
response.url = 'http://example.com/json'
response.payload = '{"foo": "foo"}'
response.store()
testdef.workflow_tests.actions = [
workflow_tests.AssertStatus(status_name='New status'),
workflow_tests.AssertWebserviceCall(webservice_response_id=response.id, call_count=1),
]
testdef.run(formdef)
response.status_code = 400
response.store()
testdef.workflow_tests.actions = [
workflow_tests.AssertStatus(status_name='End status'),
workflow_tests.AssertWebserviceCall(webservice_response_id=response.id, call_count=1),
]

View File

@ -754,6 +754,16 @@ class WebserviceResponsePage(Directory):
validation_function=validate_json,
)
form.add(
RadiobuttonsWidget,
'status_code',
title=_('Response status code'),
required=True,
options=[200, 204, 400, 401, 403, 404, 500, 502, 503],
value=self.webservice_response.status_code,
extra_css_class='widget-inline-radio',
)
form.add(
WidgetDict,
'qs_data',
@ -820,6 +830,7 @@ class WebserviceResponsePage(Directory):
self.webservice_response.name = form.get_widget('name').parse()
self.webservice_response.payload = form.get_widget('payload').parse()
self.webservice_response.url = form.get_widget('url').parse()
self.webservice_response.status_code = form.get_widget('status_code').parse()
self.webservice_response.qs_data = form.get_widget('qs_data').parse()
self.webservice_response.method = form.get_widget('method').parse()
self.webservice_response.post_data = form.get_widget('post_data').parse()

View File

@ -640,7 +640,7 @@ class MockWebserviceResponseAdapter(requests.adapters.HTTPAdapter):
}
raw_response = HTTPResponse(
status=200,
status=response.status_code,
body=io.BytesIO(response.payload.encode()),
headers=headers,
original_response=self.make_original_response(headers),
@ -669,6 +669,7 @@ class WebserviceResponse(XmlStorableObject):
name = ''
payload = None
url = None
status_code = 200
qs_data = None
method = ''
post_data = None
@ -678,6 +679,7 @@ class WebserviceResponse(XmlStorableObject):
('name', 'str'),
('payload', 'str'),
('url', 'str'),
('status_code', 'int'),
('qs_data', 'kv_data'),
('method', 'str'),
('post_data', 'kv_data'),