workflows: do not use after jobs when there's no http response (#23239)

This commit is contained in:
Frédéric Péters 2018-04-19 17:08:29 +02:00
parent 39bf9f6433
commit eb9d10524c
2 changed files with 31 additions and 12 deletions

View File

@ -549,19 +549,20 @@ def test_roles_idp(pub):
user.roles = None
user.store()
item = RemoveRoleWorkflowStatusItem()
item.perform(formdata)
item2 = RemoveRoleWorkflowStatusItem()
item2.perform(formdata)
assert not pub.user_class.get(user.id).roles
with mock.patch('wcs.wf.roles.http_delete_request') as http_delete_request:
http_delete_request.return_value = (None, 200, '', None)
get_response().process_after_jobs()
assert http_delete_request.call_count == 0
item.role_id = role.id
item2.role_id = role.id
user.roles = [role.id]
user.store()
item.perform(formdata)
item2.perform(formdata)
assert not pub.user_class.get(user.id).roles
with mock.patch('wcs.wf.roles.http_delete_request') as http_delete_request:
http_delete_request.return_value = (None, 200, '', None)
@ -571,6 +572,18 @@ def test_roles_idp(pub):
'http://idp.example.net/api/roles/bar1/members/xxx/')
assert 'signature=' in http_delete_request.call_args[0][0]
# out of http request/response cycle
pub._set_request(None)
with mock.patch('wcs.wf.roles.http_post_request') as http_post_request:
http_post_request.return_value = (None, 201, '', None)
item.perform(formdata)
assert pub.user_class.get(user.id).roles == [role.id]
with mock.patch('wcs.wf.roles.http_delete_request') as http_delete_request:
http_delete_request.return_value = (None, 200, '', None)
item2.perform(formdata)
assert pub.user_class.get(user.id).roles == []
def test_anonymise(pub):
# build a backoffice field
Workflow.wipe()

View File

@ -102,15 +102,18 @@ class AddRoleWorkflowStatusItem(WorkflowStatusItem):
except MissingSecret:
get_publisher().notify_of_exception(sys.exc_info(), context='[ROLES]')
return
def after_job(job):
def after_job(job=None):
signed_url = sign_ws_url(url)
response, status, data, auth_header = http_post_request(signed_url)
if status != 201:
get_logger().error('failed to add role %r to user %r',
role, user)
get_response().add_after_job(
str(N_('Adding role')),
after_job)
if get_request():
get_response().add_after_job(
str(N_('Adding role')),
after_job)
else:
after_job()
register_item_class(AddRoleWorkflowStatusItem)
@ -163,14 +166,17 @@ class RemoveRoleWorkflowStatusItem(WorkflowStatusItem):
except MissingSecret:
get_publisher().notify_of_exception(sys.exc_info(), context='[ROLES]')
return
def after_job(job):
def after_job(job=None):
signed_url = sign_ws_url(url)
response, status, data, auth_header = http_delete_request(signed_url)
if status != 200:
get_logger().error('failed to remove role %r from user %r',
role, user)
get_response().add_after_job(
str(N_('Removing role')),
after_job)
if get_request():
get_response().add_after_job(
str(N_('Removing role')),
after_job)
else:
after_job()
register_item_class(RemoveRoleWorkflowStatusItem)