Exemple #1
0
    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}>",
            )
        ]
Exemple #2
0
    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 == []
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
    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"
                        ),
                    )
                ),
            )
        ]
Exemple #7
0
    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"),
                    )),
            )
        ]
Exemple #8
0
    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}>",
            ),
        ]
Exemple #9
0
    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],
            ),
        ]
Exemple #10
0
    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 == []