Changeset 1d92bf2 in OpenWorkouts-current for ow/tests/views/test_user.py


Ignore:
Timestamp:
Dec 16, 2018, 1:07:04 AM (5 years ago)
Author:
borja <borja@…>
Branches:
current, feature/docs, master
Children:
6560b8f
Parents:
929097a
Message:

(#37) Allow login using email address instead of username:

  • Use user uids as keys in the root folder for referencing user objects (instead of username)
  • Use uids for referencing users all over the place (auth, permissions, traversal urls, etc)
  • Replaced the username concept with nickname. This nickname will be used as a shortcut to access "public profile" pages for users
  • Reworked lots of basic methods in the OpenWorkouts root object (s/username/nickname, marked as properties some methods like users, emails, etc)
  • Added new add_user() and delete_user() helpers to the OpenWorkouts root object
  • Fixed bug in the dashboard redirect view, causing an endless loop if an authenticated user does not exist anymore when loading a page.
  • Lots of tests fixes, adaptations and catch up.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • ow/tests/views/test_user.py

    r929097a r1d92bf2  
    2424
    2525    @pytest.fixture
    26     def root(self):
     26    def john(self):
     27        user = User(firstname='John', lastname='Doe',
     28                    email='john.doe@example.net')
     29        user.password = 's3cr3t'
     30        return user
     31
     32    @pytest.fixture
     33    def root(self, john):
    2734        root = OpenWorkouts()
    28         root['john'] = User(firstname='John', lastname='Doe',
    29                             email='john.doe@example.net')
    30         root['john'].password = 's3cr3t'
     35        root.add_user(john)
    3136        workout = Workout(
    3237            start=datetime(2015, 6, 28, 12, 55, tzinfo=timezone.utc),
     
    3439            distance=30
    3540        )
    36         root['john'].add_workout(workout)
     41        john.add_workout(workout)
    3742        return root
    3843
     
    4449
    4550    @pytest.fixture
    46     def profile_post_request(self, root):
     51    def profile_post_request(self, root, john):
    4752        """
    4853        This is a valid POST request to update an user profile.
    4954        Form will validate, but nothing will be really updated/changed.
    5055        """
    51         user = root['john']
     56        user = john
    5257        request = DummyRequest()
    5358        request.root = root
     
    9499        request.POST = MultiDict({
    95100            'submit': True,
    96             'username': 'JackBlack',
     101            'nickname': 'JackBlack',
    97102            'email': 'jack.black@example.net',
    98103            'firstname': 'Jack',
     
    134139        assert response.location == '/dashboard'
    135140
    136     def test_dashboard(self, dummy_request):
     141    def test_dashboard(self, dummy_request, john):
    137142        """
    138143        Renders the user dashboard
    139144        """
    140145        request = dummy_request
    141         user = request.root['john']
    142         response = user_views.dashboard(user, request)
     146        response = user_views.dashboard(john, request)
    143147        assert response == {}
    144148
    145     def test_profile(self, dummy_request):
     149    def test_profile(self, dummy_request, john):
    146150        """
    147151        Renders the user profile page
    148152        """
    149153        request = dummy_request
    150         user = request.root['john']
    151         response = user_views.profile(user, request)
     154        response = user_views.profile(john, request)
    152155        assert response == {}
    153156
     
    159162        response = user_views.login(request.root, request)
    160163        assert response['message'] == ''
    161         assert response['username'] == ''
     164        assert response['email'] == ''
    162165        assert response['password'] == ''
    163166        assert response['redirect_url'] == request.resource_url(request.root)
    164167
    165     def test_login_get_return_to(self, dummy_request):
     168    def test_login_get_return_to(self, dummy_request, john):
    166169        """
    167170        GET request to access the login page, if there is a page set to where
     
    170173        """
    171174        request = dummy_request
    172         workout = request.root['john'].workouts()[0]
     175        workout = john.workouts()[0]
    173176        workout_url = request.resource_url(workout)
    174177        request.params['return_to'] = workout_url
     
    176179        assert response['redirect_url'] == workout_url
    177180
    178     def test_login_post_bad_username(self, dummy_request):
     181    def test_login_post_wrong_email(self, dummy_request):
    179182        request = dummy_request
    180183        request.method = 'POST'
    181184        request.POST['submit'] = True
    182         request.POST['username'] = 'jack'
     185        request.POST['email'] = 'jack@example.net'
    183186        response = user_views.login(request.root, request)
    184         assert response['message'] == u'Bad username'
    185 
    186     def test_login_post_bad_password(self, dummy_request):
     187        assert response['message'] == u'Wrong email address'
     188
     189    def test_login_post_wrong_password(self, dummy_request):
    187190        request = dummy_request
    188191        request.method = 'POST'
    189192        request.POST['submit'] = True
    190         request.POST['username'] = 'john'
     193        request.POST['email'] = 'john.doe@example.net'
    191194        request.POST['password'] = 'badpassword'
    192195        response = user_views.login(request.root, request)
    193         assert response['message'] == u'Bad password'
     196        assert response['message'] == u'Wrong password'
    194197
    195198    @patch('ow.views.user.remember')
     
    198201        request.method = 'POST'
    199202        request.POST['submit'] = True
    200         request.POST['username'] = 'john'
     203        request.POST['email'] = 'john.doe@example.net'
    201204        request.POST['password'] = 's3cr3t'
    202205        response = user_views.login(request.root, request)
     
    216219
    217220    @pytest.mark.parametrize('extension', extensions)
    218     def test_profile_picture(self, extension, dummy_request):
     221    def test_profile_picture(self, extension, dummy_request, john):
    219222        """
    220223        GET request to get the profile picture of an user.
     
    222225        request = dummy_request
    223226        # Get the user
    224         user = request.root['john']
     227        user = john
    225228        # Get the path to the image, then open it and copy it to a new Blob
    226229        # object
     
    242245        assert response.content_type == 'image'
    243246
    244     def test_edit_profile_get(self, dummy_request):
     247    def test_edit_profile_get(self, dummy_request, john):
    245248        """
    246249        GET request to the edit profile page, returns the form ready to
     
    248251        """
    249252        request = dummy_request
    250         user = request.root['john']
     253        user = john
    251254        response = user_views.edit_profile(user, request)
    252255        assert isinstance(response['form'], OWFormRenderer)
     
    261264        assert response['form'].data['email'] == 'john.doe@example.net'
    262265
    263     def test_edit_profile_post_ok(self, profile_post_request):
     266    def test_edit_profile_post_ok(self, profile_post_request, john):
    264267        request = profile_post_request
    265         user = request.root['john']
     268        user = john
    266269        # Update the bio field
    267270        bio = 'Some text about this user'
     
    272275        assert user.bio == bio
    273276
    274     def test_edit_profile_post_missing_required(self, profile_post_request):
     277    def test_edit_profile_post_missing_required(
     278            self, profile_post_request, john):
    275279        request = profile_post_request
    276280        request.POST['email'] = ''
    277         user = request.root['john']
     281        user = john
    278282        response = user_views.edit_profile(user, request)
    279283        assert isinstance(response['form'], OWFormRenderer)
     
    284288        assert response['form'].errors_for('email') == [error]
    285289
    286     def test_change_password_get(self, dummy_request):
    287         request = dummy_request
    288         user = request.root['john']
     290    def test_change_password_get(self, dummy_request, john):
     291        request = dummy_request
     292        user = john
    289293        response = user_views.change_password(user, request)
    290294        assert isinstance(response['form'], OWFormRenderer)
     
    292296        assert response['form'].errorlist() == ''
    293297
    294     def test_change_password_post_ok(self, passwd_post_request):
     298    def test_change_password_post_ok(self, passwd_post_request, john):
    295299        request = passwd_post_request
    296         user = request.root['john']
     300        user = john
    297301        request.POST['old_password'] = 's3cr3t'
    298302        request.POST['password'] = 'h1dd3n s3cr3t'
     
    305309        assert user.check_password('h1dd3n s3cr3t')
    306310
    307     def test_change_password_post_no_values(self, passwd_post_request):
     311    def test_change_password_post_no_values(self, passwd_post_request, john):
    308312        request = passwd_post_request
    309         user = request.root['john']
     313        user = john
    310314        response = user_views.change_password(user, request)
    311315        assert isinstance(response['form'], OWFormRenderer)
     
    322326        assert user.check_password('s3cr3t')
    323327
    324     def test_change_password_post_bad_old_password(self, passwd_post_request):
     328    def test_change_password_post_bad_old_password(
     329            self, passwd_post_request, john):
    325330        request = passwd_post_request
    326         user = request.root['john']
     331        user = john
    327332        request.POST['old_password'] = 'FAIL PASSWORD'
    328333        request.POST['password'] = 'h1dd3n s3cr3t'
     
    338343        assert not user.check_password('h1dd3n s3cr3t')
    339344
    340     def test_change_password_post_password_mismatch(self, passwd_post_request):
     345    def test_change_password_post_password_mismatch(
     346            self, passwd_post_request, john):
    341347        request = passwd_post_request
    342         user = request.root['john']
     348        user = john
    343349        request.POST['old_password'] = 's3cr3t'
    344350        request.POST['password'] = 'h1dd3n s3cr3ts'
     
    363369    def test_signup_post_ok(self, signup_post_request):
    364370        request = signup_post_request
    365         assert 'JackBlack' not in request.root.all_usernames()
     371        assert 'jack.black@example.net' not in request.root.emails
     372        assert 'JackBlack' not in request.root.all_nicknames
    366373        response = user_views.signup(request.root, request)
    367374        assert isinstance(response, HTTPFound)
    368375        assert response.location == request.resource_url(request.root)
    369         assert 'JackBlack' in request.root.all_usernames()
     376        assert 'jack.black@example.net' in request.root.emails
     377        assert 'JackBlack' in request.root.all_nicknames
    370378
    371379    def test_signup_missing_required(self, signup_post_request):
    372380        request = signup_post_request
    373381        request.POST['email'] = ''
    374         assert 'JackBlack' not in request.root.all_usernames()
     382        assert 'jack.black@example.net' not in request.root.emails
     383        assert 'JackBlack' not in request.root.all_nicknames
    375384        response = user_views.signup(request.root, request)
    376385        assert isinstance(response['form'], OWFormRenderer)
     
    382391        assert errorlist == html_error
    383392        assert response['form'].errors_for('email') == [error]
    384         assert 'JackBlack' not in request.root.all_usernames()
    385 
    386     def test_signup_existing_username(self, signup_post_request):
     393        assert 'jack.black@example.net' not in request.root.emails
     394        assert 'JackBlack' not in request.root.all_nicknames
     395
     396    def test_signup_existing_nickname(self, signup_post_request, john):
    387397        request = signup_post_request
    388         request.POST['username'] = 'john'
    389         assert 'JackBlack' not in request.root.all_usernames()
     398        # assign john a nickname first
     399        john.nickname = 'john'
     400        # now set it for the POST request
     401        request.POST['nickname'] = 'john'
     402        # check jack is not there yet
     403        assert 'jack.black@example.net' not in request.root.emails
     404        assert 'JackBlack' not in request.root.all_nicknames
     405        # now signup as jack, but trying to set the nickname 'john'
    390406        response = user_views.signup(request.root, request)
    391407        assert isinstance(response['form'], OWFormRenderer)
    392         error = u'Another user is already registered with the username john'
     408        error = u'Another user is already using the nickname john'
    393409        html_error = '<ul class="error">'
    394410        html_error += '<li>' + error + '</li>'
     
    396412        errorlist = response['form'].errorlist().replace('\n', '')
    397413        assert errorlist == html_error
    398         assert response['form'].errors_for('username') == [error]
    399         assert 'JackBlack' not in request.root.all_usernames()
     414        assert response['form'].errors_for('nickname') == [error]
     415        # all the errors, and jack is not there
     416        assert 'jack.black@example.net' not in request.root.emails
     417        assert 'JackBlack' not in request.root.all_nicknames
    400418
    401419    def test_signup_existing_email(self, signup_post_request):
    402420        request = signup_post_request
    403421        request.POST['email'] = 'john.doe@example.net'
    404         assert 'JackBlack' not in request.root.all_usernames()
     422        assert 'jack.black@example.net' not in request.root.emails
     423        assert 'JackBlack' not in request.root.all_nicknames
    405424        response = user_views.signup(request.root, request)
    406425        assert isinstance(response['form'], OWFormRenderer)
     
    413432        assert errorlist == html_error
    414433        assert response['form'].errors_for('email') == [error]
    415         assert 'JackBlack' not in request.root.all_usernames()
     434        assert 'jack.black@example.net' not in request.root.emails
     435        assert 'JackBlack' not in request.root.all_nicknames
Note: See TracChangeset for help on using the changeset viewer.