@@ -1845,26 +1845,30 @@ def test_get(self, pyramid_request, user_service):
1845
1845
]
1846
1846
1847
1847
def test_request_password_reset (
1848
- self , monkeypatch , pyramid_request , pyramid_config , user_service , token_service
1848
+ self ,
1849
+ monkeypatch ,
1850
+ pyramid_request ,
1851
+ user_service ,
1852
+ token_service ,
1853
+ mocker ,
1849
1854
):
1850
- stub_user = pretend .stub (
1851
- id = pretend .stub (),
1852
- username = pretend .stub (),
1853
- emails = [
pretend .
stub (
email = "[email protected] " )],
1854
- can_reset_password = True ,
1855
- record_event = pretend .call_recorder (lambda * a , ** kw : None ),
1855
+ user = UserFactory .create (with_verified_primary_email = True )
1856
+ mock_record_event = mocker .patch (
1857
+ "warehouse.accounts.models.HasEvents.record_event" ,
1858
+ autospec = True ,
1859
+ return_value = True ,
1856
1860
)
1857
1861
pyramid_request .method = "POST"
1858
1862
token_service .dumps = pretend .call_recorder (lambda a : "TOK" )
1859
- user_service .get_user_by_username = pretend .call_recorder (lambda a : stub_user )
1863
+ user_service .get_user_by_username = pretend .call_recorder (lambda a : user )
1860
1864
pyramid_request .find_service = pretend .call_recorder (
1861
1865
lambda interface , ** kw : {
1862
1866
IUserService : user_service ,
1863
1867
ITokenService : token_service ,
1864
1868
}[interface ]
1865
1869
)
1866
1870
form_obj = pretend .stub (
1867
- username_or_email = pretend .stub (data = stub_user .username ),
1871
+ username_or_email = pretend .stub (data = user .username ),
1868
1872
validate = pretend .call_recorder (lambda : True ),
1869
1873
)
1870
1874
form_class = pretend .call_recorder (lambda d , user_service : form_obj )
@@ -1879,9 +1883,7 @@ def test_request_password_reset(
1879
1883
result = views .request_password_reset (pyramid_request , _form_class = form_class )
1880
1884
1881
1885
assert result == {"n_hours" : n_hours }
1882
- assert user_service .get_user_by_username .calls == [
1883
- pretend .call (stub_user .username )
1884
- ]
1886
+ assert user_service .get_user_by_username .calls == [pretend .call (user .username )]
1885
1887
assert pyramid_request .find_service .calls == [
1886
1888
pretend .call (IUserService , context = None ),
1887
1889
pretend .call (ITokenService , name = "password" ),
@@ -1891,22 +1893,21 @@ def test_request_password_reset(
1891
1893
pretend .call (pyramid_request .POST , user_service = user_service )
1892
1894
]
1893
1895
assert send_password_reset_email .calls == [
1894
- pretend .call (pyramid_request , (stub_user , None ))
1895
- ]
1896
- assert stub_user .record_event .calls == [
1897
- pretend .call (
1898
- tag = EventTag .Account .PasswordResetRequest ,
1899
- request = pyramid_request ,
1900
- )
1896
+ pretend .call (pyramid_request , (user , user .primary_email ))
1901
1897
]
1898
+ mock_record_event .assert_called_once_with (
1899
+ user ,
1900
+ tag = EventTag .Account .PasswordResetRequest ,
1901
+ request = pyramid_request ,
1902
+ )
1902
1903
1903
1904
def test_request_password_reset_with_email (
1904
1905
self , monkeypatch , pyramid_request , pyramid_config , user_service , token_service
1905
1906
):
1906
1907
stub_user = pretend .stub (
1907
1908
id = uuid .uuid4 (),
1908
1909
1909
- emails = [
pretend .
stub (
email = "[email protected] " )],
1910
+ emails = [
pretend .
stub (
email = "[email protected] " , verified = True )],
1910
1911
can_reset_password = True ,
1911
1912
record_event = pretend .call_recorder (lambda * a , ** kw : None ),
1912
1913
)
@@ -1977,8 +1978,8 @@ def test_request_password_reset_with_non_primary_email(
1977
1978
id = uuid .uuid4 (),
1978
1979
1979
1980
emails = [
1980
- pretend .
stub (
email = "[email protected] " ),
1981
- pretend .
stub (
email = "[email protected] " ),
1981
+ pretend .
stub (
email = "[email protected] " , verified = True ),
1982
+ pretend .
stub (
email = "[email protected] " , verified = True ),
1982
1983
],
1983
1984
can_reset_password = True ,
1984
1985
record_event = pretend .call_recorder (lambda * a , ** kw : None ),
@@ -2055,7 +2056,7 @@ def test_too_many_password_reset_requests(
2055
2056
stub_user = pretend .stub (
2056
2057
id = uuid .uuid4 (),
2057
2058
2058
- emails = [
pretend .
stub (
email = "[email protected] " )],
2059
+ emails = [
pretend .
stub (
email = "[email protected] " , verified = True )],
2059
2060
can_reset_password = True ,
2060
2061
record_event = pretend .call_recorder (lambda * a , ** kw : None ),
2061
2062
)
@@ -2100,26 +2101,26 @@ def test_too_many_password_reset_requests(
2100
2101
pretend .call (stub_user .id )
2101
2102
]
2102
2103
2103
- def test_password_reset_prohibited (
2104
- self , monkeypatch , pyramid_request , pyramid_config , user_service
2105
- ):
2106
- stub_user = pretend . stub (
2107
- id = pretend . stub (),
2108
- username = pretend . stub (),
2109
- emails = [ pretend . stub ( email = "[email protected] " )] ,
2110
- can_reset_password = False ,
2111
- record_event = pretend . call_recorder ( lambda * a , ** kw : None ) ,
2104
+ def test_password_reset_prohibited (self , pyramid_request , user_service , mocker ):
2105
+ user = UserFactory . create (
2106
+ with_verified_primary_email = True ,
2107
+ prohibit_password_reset = True ,
2108
+ )
2109
+ mock_record_event = mocker . patch (
2110
+ "warehouse.accounts.models.HasEvents.record_event" ,
2111
+ autospec = True ,
2112
+ return_value = True ,
2112
2113
)
2113
2114
pyramid_request .method = "POST"
2114
2115
pyramid_request .route_path = pretend .call_recorder (lambda a : "/the-redirect" )
2115
- user_service .get_user_by_username = pretend .call_recorder (lambda a : stub_user )
2116
+ user_service .get_user_by_username = pretend .call_recorder (lambda a : user )
2116
2117
pyramid_request .find_service = pretend .call_recorder (
2117
2118
lambda interface , ** kw : {
2118
2119
IUserService : user_service ,
2119
2120
}[interface ]
2120
2121
)
2121
2122
form_obj = pretend .stub (
2122
- username_or_email = pretend .stub (data = stub_user .username ),
2123
+ username_or_email = pretend .stub (data = user .username ),
2123
2124
validate = pretend .call_recorder (lambda : True ),
2124
2125
)
2125
2126
form_class = pretend .call_recorder (lambda d , user_service : form_obj )
@@ -2132,12 +2133,11 @@ def test_password_reset_prohibited(
2132
2133
]
2133
2134
assert result .headers ["Location" ] == "/the-redirect"
2134
2135
2135
- assert stub_user .record_event .calls == [
2136
- pretend .call (
2137
- tag = EventTag .Account .PasswordResetAttempt ,
2138
- request = pyramid_request ,
2139
- )
2140
- ]
2136
+ mock_record_event .assert_called_once_with (
2137
+ user ,
2138
+ tag = EventTag .Account .PasswordResetAttempt ,
2139
+ request = pyramid_request ,
2140
+ )
2141
2141
2142
2142
def test_password_reset_with_nonexistent_email (
2143
2143
self , monkeypatch , pyramid_request , pyramid_config , user_service , token_service
@@ -2169,6 +2169,52 @@ def test_redirect_authenticated_user(self):
2169
2169
assert isinstance (result , HTTPSeeOther )
2170
2170
assert result .headers ["Location" ] == "/the-redirect"
2171
2171
2172
+ @pytest .mark .parametrize (
2173
+ "user_input" ,
2174
+ [
2175
+ "email" ,
2176
+ "username" ,
2177
+ ],
2178
+ )
2179
+ def test_unverified_email_sends_alt_notice (self , db_request , mocker , user_input ):
2180
+ unverified_email = EmailFactory (verified = False )
2181
+
2182
+ form_input = {
2183
+ "email" : unverified_email .email ,
2184
+ "username" : unverified_email .user .username ,
2185
+ }.get (user_input )
2186
+
2187
+ mock_send_email = mocker .patch (
2188
+ "warehouse.accounts.views.send_password_reset_unverified_email" ,
2189
+ autospec = True ,
2190
+ return_value = None ,
2191
+ )
2192
+ # Prevent form's validation from checking deliverability
2193
+ mock_form_validation = mocker .patch (
2194
+ "warehouse.accounts.forms."
2195
+ "RequestPasswordResetForm.validate_username_or_email" ,
2196
+ autospec = True ,
2197
+ return_value = True ,
2198
+ )
2199
+
2200
+ db_request .method = "POST"
2201
+ db_request .POST = MultiDict ({"username_or_email" : form_input })
2202
+
2203
+ result = views .request_password_reset (db_request )
2204
+
2205
+ assert result == {"n_hours" : 6 }
2206
+ mock_form_validation .assert_called_once ()
2207
+ mock_send_email .assert_called_once_with (
2208
+ db_request , (unverified_email .user , unverified_email )
2209
+ )
2210
+ assert db_request .log .warning .calls == [
2211
+ pretend .call (
2212
+ "User requested password reset for unverified email" ,
2213
+ username = unverified_email .user .username ,
2214
+ email_address = unverified_email .email ,
2215
+ )
2216
+ ]
2217
+
2172
2218
2173
2219
class TestResetPassword :
2174
2220
@pytest .mark .parametrize ("dates_utc" , [True , False ])
0 commit comments