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"}
)
|