def test_success(self): "Set preferred email address" # Create user with email address user = self.makeUserWithEmail() # Add another one user.emails.append( model.Email(address=u'*****@*****.**', is_preferred=True)) model.save(user) transaction.commit() Session.add(user) email1, email2 = user.emails # Sanity check self.assertNotEquals(user.preferred_email, email1) self.assertEquals(user.preferred_email, email2) # Attempt to make the address primary self.authenticate() self.app.post('/auth/prefer_email', {'email_address': email1.address}) # Verify that email is not the user's preferred email Session.add(email1) Session.refresh(email1) self.assertEquals(user.preferred_email, email1) self.assertNotEquals(user.preferred_email, email2)
def makeUserWithEmail(self): "Helper method that creates a user with an email" user = self.makeUser(u'thruflo', u'Password') Session.add(user) user.emails.append(model.Email(address=u'*****@*****.**')) transaction.commit() Session.add(user) return user
def test_preferred_if_only_one(self): "If user has only one email, consider it as preferred email" # Create user without any email address user = self.makeUser('bob', '123') # Directly set new email as preferred email email = model.Email(address=u'*****@*****.**') user.emails.append(email) model.save(user) transaction.commit() # Verify that the new email is now the preferred email Session.add(user) self.assertEquals(user.preferred_email.address, u'*****@*****.**')
def test_prefer_non_persisted_email(self): "Set non-persisted email object as new preferred email" # Create user without any email address user = self.makeUser('bob', '123') # Directly set new email as preferred email email = model.Email(address=u'*****@*****.**') user.preferred_email = email model.save(user) transaction.commit() # Verify that the new email is now the preferred email Session.add(user) self.assertEquals(user.preferred_email.address, u'*****@*****.**')
def signup_view(request): """Render and handle signup form. Setup:: >>> from mock import Mock >>> from pyramid.testing import DummyRequest >>> from pyramid_simpleauth import model, view >>> _get_existing_email = model.get_existing_email >>> _get_existing_user = model.get_existing_user >>> _save = model.save >>> _remember = view.remember >>> view.remember = Mock() >>> model.save = Mock() >>> model.get_existing_user = Mock() >>> model.get_existing_user.return_value = None >>> model.get_existing_email = Mock() >>> model.get_existing_email.return_value = None If it's not a POST, renders the form:: >>> dummy_request = DummyRequest() >>> return_value = signup_view(dummy_request) >>> return_value['renderer'].data {'failed': False} Otherwise it validates the request data against ``schema.Signup``:: >>> dummy_request = DummyRequest(post={'foo': 'bar'}) >>> return_value = signup_view(dummy_request) >>> return_value['renderer'].data {'failed': True, 'foo': 'bar'} If provided with valid data, it saves a ``User`` with related ``Email``, logs them in by calling ``remember`` and redirects to the user's profile:: >>> valid_post = { ... 'username': '******', ... 'email': '*****@*****.**', ... 'password': '******', ... 'confirm': 'password' ... } >>> dummy_request = DummyRequest(post=valid_post) >>> dummy_request.registry.settings = {} >>> dummy_request.route_url = Mock() >>> return_value = signup_view(dummy_request) >>> model.save.called True >>> view.remember.called True >>> isinstance(return_value, HTTPFound) True Teardown:: >>> view.remember = _remember >>> model.save = _save >>> model.get_existing_user = _get_existing_user >>> model.get_existing_email = _get_existing_email """ form = Form(request, schema=schema.Signup, defaults={'failed': False}) if request.method == 'POST': if form.validate(): d = form.data # Determine whether to skip confirmation. s = request.registry.settings should_skip_confirmation = s.get('auth.skip_confirmation', False) # Instantiate the email instance. email = model.Email() email.address = d['email'] email.is_confirmed = should_skip_confirmation # Instantiate the user instance. user = model.User() user.username = d['username'] user.password = model.encrypt(d['password']) user.emails = [email] # Save the user and email to the db. model.save(user) # Log the user in. remember(request, user.canonical_id) # Fire a ``UserSignedUp`` event. request.registry.notify(events.UserSignedUp(request, user)) # Redirect to the user's profile url. settings = request.registry.settings route_name = settings.get('simpleauth.after_signup_route', 'users') try: location = request.route_url(route_name, traverse=(user.username, )) except (KeyError, ComponentLookupError): location = '/' return HTTPFound(location=location) form.data['failed'] = True return {'renderer': FormRenderer(form)}