Skip to content

Commit

Permalink
Email notification when user's role is changed/removed.
Browse files Browse the repository at this point in the history
- Send email to the user whose role has been changed/removed.
- Send email to other owners of the project.
- The person who made the change will not receive the email.

Closes pypi#3264

Make linters happy

Improve the tests and coverage

Update email text.

Notify all owners for any role changes.

Update email subjects.
Update tests.

Since we're always sending email to all owners now when role changed,
email recipients shouldn't ever be empty.

The order matters?

Reordering list ordering issue

Minor changes

Resolved a lint issue

Resolved code reviews

Used {%- -%} to strip additional new lines

Resolved lint issue
  • Loading branch information
Mariatta authored and waseem18 committed May 5, 2018
1 parent 344adb1 commit 0baa4d0
Show file tree
Hide file tree
Showing 13 changed files with 775 additions and 10 deletions.
282 changes: 282 additions & 0 deletions tests/unit/email/test_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -540,3 +540,285 @@ def test_added_as_collaborator_email(
recipient="username <email@example.com>",
),
]


class TestRemovedAsCollaboratorEmail:

def test_removed_as_collaborator_email(
self, pyramid_request, pyramid_config, monkeypatch):

stub_user = pretend.stub(
email='email',
username='username',
)
stub_submitter_user = pretend.stub(
email='submiteremail',
username='submitterusername'
)
stub_role = pretend.stub(
role_name="Owner",
user=stub_user,
project=pretend.stub(
name="test_project"
),
)
pyramid_request.user = stub_submitter_user

subject_renderer = pyramid_config.testing_add_renderer(
'email/removed-as-collaborator.subject.txt'
)
subject_renderer.string_response = 'Email Subject'
body_renderer = pyramid_config.testing_add_renderer(
'email/removed-as-collaborator.body.txt'
)
body_renderer.string_response = 'Email Body'

send_email = pretend.stub(
delay=pretend.call_recorder(lambda *args, **kwargs: None)
)
pyramid_request.task = pretend.call_recorder(
lambda *args, **kwargs: send_email
)
monkeypatch.setattr(email, 'send_email', send_email)

result = email.send_removed_from_role_email(
pyramid_request,
role=stub_role,
)

assert result == {
'project': 'test_project',
'role': 'Owner',
'submitter': stub_submitter_user.username
}
subject_renderer.assert_()
body_renderer.assert_(submitter=stub_submitter_user.username)
body_renderer.assert_(project='test_project')
body_renderer.assert_(role='Owner')

assert pyramid_request.task.calls == [
pretend.call(send_email),
]
assert send_email.delay.calls == [
pretend.call(
'Email Subject',
'Email Body',
recipient=stub_user.email,
),
]


class TestUserRoleChangedEmail:

def test_user_role_changed_email(
self, pyramid_request, pyramid_config, monkeypatch):

stub_user = pretend.stub(
email='email',
username='username',
)
stub_submitter_user = pretend.stub(
email='submiteremail',
username='submitterusername'
)
stub_role = pretend.stub(
role_name="Owner",
user=stub_user,
project=pretend.stub(
name="test_project"
),
)
pyramid_request.user = stub_submitter_user

subject_renderer = pyramid_config.testing_add_renderer(
'email/role-removed-from-user.subject.txt'
)
subject_renderer.string_response = 'Email Subject'
body_renderer = pyramid_config.testing_add_renderer(
'email/role-removed-from-user.body.txt'
)
body_renderer.string_response = 'Email Body'

send_email = pretend.stub(
delay=pretend.call_recorder(lambda *args, **kwargs: None)
)
pyramid_request.task = pretend.call_recorder(
lambda *args, **kwargs: send_email
)
monkeypatch.setattr(email, 'send_email', send_email)

result = email.send_role_removed_from_user_email(
pyramid_request,
role=stub_role,
email_recipients=[stub_user.email, stub_submitter_user.email]
)

assert result == {
'project': 'test_project',
'role': 'Owner',
'submitter': stub_submitter_user.username,
'username': stub_user.username,
}
subject_renderer.assert_()
body_renderer.assert_(submitter=stub_submitter_user.username)
body_renderer.assert_(project='test_project')
body_renderer.assert_(role='Owner')

assert pyramid_request.task.calls == [
pretend.call(send_email),
pretend.call(send_email),
]

assert send_email.delay.calls == [
pretend.call(
'Email Subject',
'Email Body',
recipient=stub_user.email,
),
pretend.call(
'Email Subject',
'Email Body',
recipient=stub_submitter_user.email,
),
]


class TestUserRoleChangedEmailEmail:

def test_user_role_changed_email(
self, pyramid_request, pyramid_config, monkeypatch):

stub_user = pretend.stub(
email='email',
username='username',
)
stub_submitter_user = pretend.stub(
email='submiteremail',
username='submitterusername'
)
stub_role = pretend.stub(
role_name="Owner",
user=stub_user,
project=pretend.stub(
name="test_project"
),
)
pyramid_request.user = stub_submitter_user

subject_renderer = pyramid_config.testing_add_renderer(
'email/user-role-changed.subject.txt'
)
subject_renderer.string_response = 'Email Subject'
body_renderer = pyramid_config.testing_add_renderer(
'email/user-role-changed.body.txt'
)
body_renderer.string_response = 'Email Body'

send_email = pretend.stub(
delay=pretend.call_recorder(lambda *args, **kwargs: None)
)
pyramid_request.task = pretend.call_recorder(
lambda *args, **kwargs: send_email
)
monkeypatch.setattr(email, 'send_email', send_email)

result = email.send_user_role_changed_email(
pyramid_request,
role=stub_role,
)

assert result == {
'project': 'test_project',
'role': 'Owner',
'submitter': stub_submitter_user.username
}
subject_renderer.assert_()
body_renderer.assert_(submitter=stub_submitter_user.username)
body_renderer.assert_(project='test_project')
body_renderer.assert_(role='Owner')

assert pyramid_request.task.calls == [
pretend.call(send_email),
]
assert send_email.delay.calls == [
pretend.call(
'Email Subject',
'Email Body',
recipient=stub_user.email,
),
]


class TestRoleChangedForUserEmail:

def test_role_changed_for_user_email(
self, pyramid_request, pyramid_config, monkeypatch):

stub_user = pretend.stub(
email='email',
username='username',
)
stub_submitter_user = pretend.stub(
email='submiteremail',
username='submitterusername'
)
stub_role = pretend.stub(
role_name="Owner",
user=stub_user,
project=pretend.stub(
name="test_project"
),
)
pyramid_request.user = stub_submitter_user

subject_renderer = pyramid_config.testing_add_renderer(
'email/role-changed-for-user.subject.txt'
)
subject_renderer.string_response = 'Email Subject'
body_renderer = pyramid_config.testing_add_renderer(
'email/role-changed-for-user.body.txt'
)
body_renderer.string_response = 'Email Body'

send_email = pretend.stub(
delay=pretend.call_recorder(lambda *args, **kwargs: None)
)
pyramid_request.task = pretend.call_recorder(
lambda *args, **kwargs: send_email
)
monkeypatch.setattr(email, 'send_email', send_email)

result = email.send_role_changed_for_user_email(
pyramid_request,
role=stub_role,
email_recipients=[stub_user.email, stub_submitter_user.email]
)

assert result == {
'project': 'test_project',
'role': 'Owner',
'submitter': stub_submitter_user.username,
'username': stub_user.username,
}
subject_renderer.assert_()
body_renderer.assert_(submitter=stub_submitter_user.username)
body_renderer.assert_(project='test_project')
body_renderer.assert_(role='Owner')

assert pyramid_request.task.calls == [
pretend.call(send_email),
pretend.call(send_email),
]

assert send_email.delay.calls == [
pretend.call(
'Email Subject',
'Email Body',
recipient=stub_user.email,
),
pretend.call(
'Email Subject',
'Email Body',
recipient=stub_submitter_user.email,
),
]
Loading

0 comments on commit 0baa4d0

Please sign in to comment.