def test_account_deletion_email(self, pyramid_request, pyramid_config, monkeypatch): stub_user = pretend.stub(email="*****@*****.**", username="******", name="") subject_renderer = pyramid_config.testing_add_renderer( "email/account-deleted.subject.txt") subject_renderer.string_response = "Email Subject" body_renderer = pyramid_config.testing_add_renderer( "email/account-deleted.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_account_deletion_email(pyramid_request, user=stub_user) assert result == {"username": stub_user.username} subject_renderer.assert_() body_renderer.assert_(username=stub_user.username) assert pyramid_request.task.calls == [pretend.call(send_email)] assert send_email.delay.calls == [ pretend.call( "Email Subject", "Email Body", recipient=f"{stub_user.username} <{stub_user.email}>", ) ]
def test_account_deletion_email_unverified(self, pyramid_request, pyramid_config, monkeypatch): stub_user = pretend.stub( username="******", name="", email="*****@*****.**", primary_email=pretend.stub(email="*****@*****.**", verified=False), ) subject_renderer = pyramid_config.testing_add_renderer( "email/account-deleted/subject.txt") subject_renderer.string_response = "Email Subject" body_renderer = pyramid_config.testing_add_renderer( "email/account-deleted/body.txt") body_renderer.string_response = "Email Body" html_renderer = pyramid_config.testing_add_renderer( "email/account-deleted/body.html") html_renderer.string_response = "Email HTML 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_account_deletion_email(pyramid_request, stub_user) assert result == {"username": stub_user.username} subject_renderer.assert_() body_renderer.assert_(username=stub_user.username) html_renderer.assert_(username=stub_user.username) assert pyramid_request.task.calls == [] assert send_email.delay.calls == []
def delete_account(self): username = self.request.params.get('confirm_username') if not username: self.request.session.flash( "Must confirm the request.", queue='error' ) return self.default_response if username != self.request.user.username: self.request.session.flash( f"Could not delete account - {username!r} is not the same as " f"{self.request.user.username!r}", queue='error' ) return self.default_response if self.active_projects: self.request.session.flash( "Cannot delete account with active project ownerships.", queue='error', ) return self.default_response # Update all journals to point to `deleted-user` instead deleted_user = ( self.request.db.query(User) .filter(User.username == 'deleted-user') .one() ) journals = ( self.request.db.query(JournalEntry) .filter(JournalEntry.submitted_by == self.request.user) .all() ) for journal in journals: journal.submitted_by = deleted_user # Send a notification email send_account_deletion_email(self.request, self.request.user) # Actually delete the user self.request.db.delete(self.request.user) return logout(self.request)
def delete_account(self): username = self.request.params.get('confirm_username') if not username: self.request.session.flash( "Must confirm the request", queue='error' ) return self.default_response if username != self.request.user.username: self.request.session.flash( f"Could not delete account - {username!r} is not the same as " f"{self.request.user.username!r}", queue='error' ) return self.default_response if self.active_projects: self.request.session.flash( "Cannot delete account with active project ownerships", queue='error', ) return self.default_response # Update all journals to point to `deleted-user` instead deleted_user = ( self.request.db.query(User) .filter(User.username == 'deleted-user') .one() ) journals = ( self.request.db.query(JournalEntry) .filter(JournalEntry.submitted_by == self.request.user) .all() ) for journal in journals: journal.submitted_by = deleted_user # Send a notification email send_account_deletion_email(self.request, self.request.user) # Actually delete the user self.request.db.delete(self.request.user) return logout(self.request)
def delete_account(self): confirm_password = self.request.params.get("confirm_password") if not confirm_password: self.request.session.flash("Confirm the request", queue="error") return self.default_response form = ConfirmPasswordForm( password=confirm_password, username=self.request.user.username, user_service=self.user_service, ) if not form.validate(): self.request.session.flash( f"Could not delete account - Invalid credentials. Please try again.", queue="error", ) return self.default_response if self.active_projects: self.request.session.flash( "Cannot delete account with active project ownerships", queue="error" ) return self.default_response # Update all journals to point to `deleted-user` instead deleted_user = ( self.request.db.query(User).filter(User.username == "deleted-user").one() ) journals = ( self.request.db.query(JournalEntry) .options(joinedload("submitted_by")) .filter(JournalEntry.submitted_by == self.request.user) .all() ) for journal in journals: journal.submitted_by = deleted_user # Send a notification email send_account_deletion_email(self.request, self.request.user) # Actually delete the user self.request.db.delete(self.request.user) return logout(self.request)
def test_account_deletion_email(self, pyramid_request, pyramid_config, monkeypatch): stub_user = pretend.stub( username="******", name="", email="*****@*****.**", primary_email=pretend.stub(email="*****@*****.**", verified=True), ) subject_renderer = pyramid_config.testing_add_renderer( "email/account-deleted/subject.txt" ) subject_renderer.string_response = "Email Subject" body_renderer = pyramid_config.testing_add_renderer( "email/account-deleted/body.txt" ) body_renderer.string_response = "Email Body" html_renderer = pyramid_config.testing_add_renderer( "email/account-deleted/body.html" ) html_renderer.string_response = "Email HTML 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_account_deletion_email(pyramid_request, stub_user) assert result == {"username": stub_user.username} subject_renderer.assert_() body_renderer.assert_(username=stub_user.username) html_renderer.assert_(username=stub_user.username) assert pyramid_request.task.calls == [pretend.call(send_email)] assert send_email.delay.calls == [ pretend.call( f"{stub_user.username} <{stub_user.email}>", attr.asdict( EmailMessage( subject="Email Subject", body_text="Email Body", body_html=( "<html>\n<head></head>\n" "<body><p>Email HTML Body</p></body>\n</html>\n" ), ) ), ) ]
def test_account_deletion_email(self, pyramid_request, pyramid_config, monkeypatch): stub_user = pretend.stub( username="******", name="", email="*****@*****.**", primary_email=pretend.stub(email="*****@*****.**", verified=True), ) subject_renderer = pyramid_config.testing_add_renderer( "email/account-deleted/subject.txt") subject_renderer.string_response = "Email Subject" body_renderer = pyramid_config.testing_add_renderer( "email/account-deleted/body.txt") body_renderer.string_response = "Email Body" html_renderer = pyramid_config.testing_add_renderer( "email/account-deleted/body.html") html_renderer.string_response = "Email HTML 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_account_deletion_email(pyramid_request, stub_user) assert result == {"username": stub_user.username} subject_renderer.assert_() body_renderer.assert_(username=stub_user.username) html_renderer.assert_(username=stub_user.username) assert pyramid_request.task.calls == [pretend.call(send_email)] assert send_email.delay.calls == [ pretend.call( f"{stub_user.username} <{stub_user.email}>", attr.asdict( EmailMessage( subject="Email Subject", body_text="Email Body", body_html=( "<html>\n<head></head>\n" "<body><p>Email HTML Body</p></body>\n</html>\n"), )), ) ]
def test_account_deletion_email( self, pyramid_request, pyramid_config, monkeypatch): stub_user = pretend.stub( email='*****@*****.**', username='******', name="", ) subject_renderer = pyramid_config.testing_add_renderer( 'email/account-deleted.subject.txt' ) subject_renderer.string_response = 'Email Subject' body_renderer = pyramid_config.testing_add_renderer( 'email/account-deleted.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_account_deletion_email( pyramid_request, user=stub_user, ) assert result == { 'username': stub_user.username, } subject_renderer.assert_() body_renderer.assert_(username=stub_user.username) assert pyramid_request.task.calls == [ pretend.call(send_email), ] assert send_email.delay.calls == [ pretend.call( 'Email Subject', 'Email Body', recipient=f"{stub_user.username} <{stub_user.email}>", ), ]
def test_account_deletion_email( self, pyramid_request, pyramid_config, monkeypatch): stub_user = pretend.stub( email='email', username='******', ) subject_renderer = pyramid_config.testing_add_renderer( 'email/account-deleted.subject.txt' ) subject_renderer.string_response = 'Email Subject' body_renderer = pyramid_config.testing_add_renderer( 'email/account-deleted.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_account_deletion_email( pyramid_request, user=stub_user, ) assert result == { 'username': stub_user.username, } subject_renderer.assert_() body_renderer.assert_(username=stub_user.username) assert pyramid_request.task.calls == [ pretend.call(send_email), ] assert send_email.delay.calls == [ pretend.call( 'Email Body', 'Email Subject', recipients=[stub_user.email], ), ]
def test_account_deletion_email_unverified( self, pyramid_request, pyramid_config, monkeypatch ): stub_user = pretend.stub( username="******", name="", email="*****@*****.**", primary_email=pretend.stub(email="*****@*****.**", verified=False), ) subject_renderer = pyramid_config.testing_add_renderer( "email/account-deleted/subject.txt" ) subject_renderer.string_response = "Email Subject" body_renderer = pyramid_config.testing_add_renderer( "email/account-deleted/body.txt" ) body_renderer.string_response = "Email Body" html_renderer = pyramid_config.testing_add_renderer( "email/account-deleted/body.html" ) html_renderer.string_response = "Email HTML 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_account_deletion_email(pyramid_request, stub_user) assert result == {"username": stub_user.username} subject_renderer.assert_() body_renderer.assert_(username=stub_user.username) html_renderer.assert_(username=stub_user.username) assert pyramid_request.task.calls == [] assert send_email.delay.calls == []