1
+ from datetime import datetime , timedelta
1
2
from unittest .mock import Mock
2
3
3
4
import colander
6
7
7
8
from h .accounts import schemas
8
9
from h .services .user_password import UserPasswordService
10
+ from h .util .user import format_userid
9
11
10
12
pytestmark = pytest .mark .usefixtures ("pyramid_config" )
11
13
@@ -72,7 +74,6 @@ def test_it_is_valid_when_authorized_users_email(
72
74
schemas .
unique_email (
dummy_node ,
"[email protected] " )
73
75
74
76
75
- @pytest .mark .usefixtures ("user_model" )
76
77
class TestRegisterSchema :
77
78
def test_it_is_invalid_when_password_too_short (self , pyramid_request ):
78
79
schema = schemas .RegisterSchema ().bind (request = pyramid_request )
@@ -81,26 +82,21 @@ def test_it_is_invalid_when_password_too_short(self, pyramid_request):
81
82
schema .deserialize ({"password" : "a" })
82
83
assert exc .value .asdict ()["password" ] == ("Must be 8 characters or more." )
83
84
84
- def test_it_is_invalid_when_username_too_short (self , pyramid_request , user_model ):
85
+ def test_it_is_invalid_when_username_too_short (self , pyramid_request ):
85
86
schema = schemas .RegisterSchema ().bind (request = pyramid_request )
86
- user_model .get_by_username .return_value = None
87
87
88
88
with pytest .raises (colander .Invalid ) as exc :
89
89
schema .deserialize ({"username" : "a" })
90
90
assert exc .value .asdict ()["username" ] == ("Must be 3 characters or more." )
91
91
92
- def test_it_is_invalid_when_username_too_long (self , pyramid_request , user_model ):
92
+ def test_it_is_invalid_when_username_too_long (self , pyramid_request ):
93
93
schema = schemas .RegisterSchema ().bind (request = pyramid_request )
94
- user_model .get_by_username .return_value = None
95
94
96
95
with pytest .raises (colander .Invalid ) as exc :
97
96
schema .deserialize ({"username" : "a" * 500 })
98
97
assert exc .value .asdict ()["username" ] == ("Must be 30 characters or less." )
99
98
100
- def test_it_is_invalid_with_invalid_characters_in_username (
101
- self , pyramid_request , user_model
102
- ):
103
- user_model .get_by_username .return_value = None
99
+ def test_it_is_invalid_with_invalid_characters_in_username (self , pyramid_request ):
104
100
schema = schemas .RegisterSchema ().bind (request = pyramid_request )
105
101
106
102
with pytest .raises (colander .Invalid ) as exc :
@@ -128,24 +124,51 @@ def test_it_is_invalid_when_privacy_accepted_missing(self, pyramid_request):
128
124
129
125
assert exc .value .asdict ()["privacy_accepted" ] == "Required"
130
126
131
- def test_it_validates_with_valid_payload (self , pyramid_csrf_request , user_model ):
132
- user_model .get_by_username .return_value = None
133
- user_model .get_by_email .return_value = None
127
+ def test_it_is_invalid_when_user_recently_deleted (
128
+ self , factories , pyramid_request , valid_params
129
+ ):
130
+ """If an account with the same username was recently deleted it should be invalid."""
131
+ schema = schemas .RegisterSchema ().bind (request = pyramid_request )
132
+ factories .UserDeletion (
133
+ userid = format_userid (
134
+ username = valid_params ["username" ],
135
+ authority = pyramid_request .default_authority ,
136
+ )
137
+ )
138
+
139
+ with pytest .raises (colander .Invalid ) as exc :
140
+ schema .deserialize (valid_params )
134
141
142
+ assert exc .value .asdict () == {"username" : "This username is already taken." }
143
+
144
+ def test_it_validates_with_valid_payload (
145
+ self , pyramid_csrf_request , valid_params , factories
146
+ ):
135
147
schema = schemas .RegisterSchema ().bind (request = pyramid_csrf_request )
136
- params = {
148
+ # A user with the same username was deleted over a month ago.
149
+ # This should not prevent registration.
150
+ factories .UserDeletion (
151
+ userid = format_userid (
152
+ valid_params ["username" ], pyramid_csrf_request .default_authority
153
+ ),
154
+ requested_at = datetime .now () - timedelta (days = 32 ),
155
+ )
156
+
157
+ result = schema .deserialize (valid_params )
158
+
159
+ assert result == dict (
160
+ valid_params , privacy_accepted = True , comms_opt_in = None , csrf_token = None
161
+ )
162
+
163
+ @pytest .fixture
164
+ def valid_params (self ):
165
+ return {
137
166
"username" : "filbert" ,
138
167
139
168
"password" : "sdlkfjlk3j3iuei" ,
140
169
"privacy_accepted" : "true" ,
141
170
}
142
171
143
- result = schema .deserialize (params )
144
-
145
- assert result == dict (
146
- params , privacy_accepted = True , comms_opt_in = None , csrf_token = None
147
- )
148
-
149
172
150
173
@pytest .mark .usefixtures ("models" , "user_password_service" )
151
174
class TestEmailChangeSchema :
0 commit comments