aboutsummaryrefslogtreecommitdiff
path: root/server/szurubooru/tests/api/test_password_reset.py
blob: bf1ab5c7a6e997f989987c70bc408cd3f0c4ddd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
from unittest.mock import patch

import pytest

from szurubooru import api, db, errors, model
from szurubooru.func import auth, mailer


@pytest.fixture(autouse=True)
def inject_config(config_injector):
    config_injector(
        {
            "secret": "x",
            "domain": "http://example.com",
            "name": "Test instance",
            "smtp": {
                "from": "noreply@example.com",
            },
        }
    )


def test_reset_sending_email(context_factory, user_factory):
    db.session.add(
        user_factory(
            name="u1", rank=model.User.RANK_REGULAR, email="user@example.com"
        )
    )
    db.session.flush()
    for initiating_user in ["u1", "user@example.com"]:
        with patch("szurubooru.func.mailer.send_mail"):
            assert (
                api.password_reset_api.start_password_reset(
                    context_factory(), {"user_name": initiating_user}
                )
                == {}
            )
            mailer.send_mail.assert_called_once_with(
                "noreply@example.com",
                "user@example.com",
                "Password reset for Test instance",
                "You (or someone else) requested to reset your password "
                + "on Test instance.\nIf you wish to proceed, click this l"
                + "ink: http://example.com/password-reset/u1:4ac0be176fb36"
                + "4f13ee6b634c43220e2\nOtherwise, please ignore this email.",
            )


def test_trying_to_reset_non_existing(context_factory):
    with pytest.raises(errors.NotFoundError):
        api.password_reset_api.start_password_reset(
            context_factory(), {"user_name": "u1"}
        )


def test_trying_to_reset_without_email(context_factory, user_factory):
    db.session.add(
        user_factory(name="u1", rank=model.User.RANK_REGULAR, email=None)
    )
    db.session.flush()
    with pytest.raises(errors.ValidationError):
        api.password_reset_api.start_password_reset(
            context_factory(), {"user_name": "u1"}
        )


def test_confirming_with_good_token(context_factory, user_factory):
    user = user_factory(
        name="u1", rank=model.User.RANK_REGULAR, email="user@example.com"
    )
    old_hash = user.password_hash
    db.session.add(user)
    db.session.flush()
    context = context_factory(
        params={"token": "4ac0be176fb364f13ee6b634c43220e2"}
    )
    result = api.password_reset_api.finish_password_reset(
        context, {"user_name": "u1"}
    )
    assert user.password_hash != old_hash
    assert auth.is_valid_password(user, result["password"]) is True


def test_trying_to_confirm_non_existing(context_factory):
    with pytest.raises(errors.NotFoundError):
        api.password_reset_api.finish_password_reset(
            context_factory(), {"user_name": "u1"}
        )


def test_trying_to_confirm_without_token(context_factory, user_factory):
    db.session.add(
        user_factory(
            name="u1", rank=model.User.RANK_REGULAR, email="user@example.com"
        )
    )
    db.session.flush()
    with pytest.raises(errors.ValidationError):
        api.password_reset_api.finish_password_reset(
            context_factory(params={}), {"user_name": "u1"}
        )


def test_trying_to_confirm_with_bad_token(context_factory, user_factory):
    db.session.add(
        user_factory(
            name="u1", rank=model.User.RANK_REGULAR, email="user@example.com"
        )
    )
    db.session.flush()
    with pytest.raises(errors.ValidationError):
        api.password_reset_api.finish_password_reset(
            context_factory(params={"token": "bad"}), {"user_name": "u1"}
        )

© 2015 - 2026 Jakob L. Kreuze