Browser tests for Emaillogin
============================

  >>> from Products.Five.testbrowser import Browser
  >>> from Products.PloneTestCase.setup import portal_owner, default_password
  >>> browser = Browser()
  >>> browser.handleErrors = False
  >>> portal_url = self.portal.absolute_url()
  
Set up a test user with a email that can login.

  >>> test_username = 'user1'
  >>> test_user_fullname = 'User 1'
  >>> test_user_pass = 'secret'
  >>> test_user_email = 'user1@host.com'
  
  >>> test_username2 = 'user2'
  >>> test_user2_fullname = 'User 2'
  >>> test_user2_pass = 'secret2'
  >>> test_user2_email = 'user2@host.com'
  
  >>> self.portal.portal_membership.addMember(test_username, test_user_pass, ['Member'], [], {'email': test_user_email, 'fullname': test_user_fullname})

  
Now we will try to register as new user via the web but with an email that already exists. Plone doesn't allow self registration by default
so we need to enable that:

  >>> browser.open(portal_url)
  >>> browser.getLink('Log in').click()
  >>> browser.getControl(name='__ac_name').value = portal_owner
  >>> browser.getControl(name='__ac_password').value = default_password
  >>> browser.getControl(name='submit').click()
  >>> "You are now logged in" in browser.contents
  True

Let's go directly to the security control panel:

  >>> browser.open(portal_url + '/@@security-controlpanel')
  >>> browser.getControl(name="form.enable_self_reg").value = "on"
  >>> browser.getControl(name="form.enable_user_pwd_choice").value = "on"
  >>> browser.getControl(name="form.actions.save").click()

Log out and then try to join as a new user but with the same email as the first:

  >>> browser.getLink('Log out').click()
  >>> "You are now logged out" in browser.contents
  True


  >>> browser.open(portal_url)
  >>> browser.getLink('Register').click()
  >>> browser.getControl('Full Name').value = test_user2_fullname
  >>> browser.getControl('User Name').value = test_username2
  >>> browser.getControl('E-mail').value = test_user_email
  >>> browser.getControl('Password').value = test_user2_pass
  >>> browser.getControl('Confirm password').value = test_user2_pass
  >>> browser.getControl('Register').click()
  >>> 'already in use or is not valid' in browser.contents
  True
  
We got the error that we wanted. Change to a unique email and try again.
  
  >>> browser.open(portal_url)
  >>> browser.getLink('Register').click()
  >>> browser.getControl('Full Name').value = test_user2_fullname
  >>> browser.getControl('User Name').value = test_username2
  >>> browser.getControl('E-mail').value = test_user2_email
  >>> browser.getControl('Password').value = test_user2_pass
  >>> browser.getControl('Confirm password').value = test_user2_pass
  >>> browser.getControl('Register').click()
  >>> 'You have been registered' in browser.contents
  True
  
  
Make sure that we can login as the first user.

  >>> browser.open(portal_url)
  >>> browser.getLink('Log in').click()
  >>> form = browser.getForm(id='login_form')
  >>> form.getControl('Login Name').value = test_username
  >>> form.getControl('Password').value =  test_user_pass
  >>> form.getControl('Log in').click()
  >>> "You are now logged in" in browser.contents and test_user_fullname in browser.contents
  True

First we will try to login with a wrong email and correct password.
  
  >>> browser.getLink('Log out').click()
  >>> test_user_fullname in  browser.contents
  False
  
  >>> browser.open(portal_url)
  >>> browser.getLink('Log in').click()
  >>> form = browser.getForm(id='login_form')
  >>> form.getControl('Login Name').value = test_user_email + 'fail'
  >>> form.getControl('Password').value =  test_user_pass
  >>> form.getControl('Log in').click()
  
  >>> "You are now logged in" in browser.contents and test_user_fullname in browser.contents
  False

That failed as it should, now try with the correct email, but wrong password.

  >>> browser.open(portal_url)
  >>> browser.getLink('Log in').click()
  >>> form = browser.getForm(id='login_form')
  >>> form.getControl('Login Name').value = test_user_email
  >>> form.getControl('Password').value =  test_user_pass + 'fail'
  >>> form.getControl('Log in').click()
  
  >>> "You are now logged in" in browser.contents and test_user_fullname in browser.contents
  False

That failed as it should as well, now try with the correct email and correct password.

  >>> browser.open(portal_url)
  >>> browser.getLink('Log in').click()
  >>> form = browser.getForm(id='login_form')
  >>> form.getControl('Login Name').value = test_user_email
  >>> form.getControl('Password').value =  test_user_pass
  >>> form.getControl('Log in').click()
  
  >>> "You are now logged in" in browser.contents and test_user_fullname in browser.contents
  True

It worked to login nicely. Great. now we are logged in as "User 1"
Now let's try to change the email to a email that is already registered for another user.

  >>> browser.open(portal_url)
  >>> browser.getLink('Preferences').click()
  >>> browser.getLink('Personal Information').click()
  >>> browser.getControl('Full Name').value = test_user_fullname
  >>> browser.getControl('E-mail').value = test_user2_email
  >>> browser.getControl('Save').click()
  >>> 'already in use or is not valid' in browser.contents
  True
  
  >>> browser.open(portal_url)
  >>> browser.getLink('Preferences').click()
  >>> browser.getLink('Personal Information').click()
  >>> browser.getControl('Full Name').value = test_user_fullname
  >>> browser.getControl('E-mail').value = 'new' + test_user_email
  >>> browser.getControl('Save').click()
  >>> 'Your personal settings have been saved.' in browser.contents or 'Changes saved.' in browser.contents
  True

User 1 should however be able to edit their other settings without getting a warning
about the email already being in use.

  >>> browser.open(portal_url)
  >>> browser.getLink('Preferences').click()
  >>> browser.getLink('Personal Information').click()
  >>> browser.getControl('Full Name').value = test_user_fullname
  >>> browser.getControl('E-mail').value = 'new' + test_user_email
  >>> browser.getControl('Save').click()
  >>> 'Your personal settings have been saved.' in browser.contents or 'Changes saved.' in browser.contents
  True
  
Now that we have tested login in and updating the email address using several different ways it is time to 
test the lost password retrieval process. But first reset the email.

  >>> browser.open(portal_url)
  >>> browser.getLink('Preferences').click()
  >>> browser.getLink('Personal Information').click()
  >>> browser.getControl('Full Name').value = test_user_fullname
  >>> browser.getControl('E-mail').value = test_user_email
  >>> browser.getControl('Save').click()
  >>> 'Your personal settings have been saved.' in browser.contents or 'Changes saved.' in browser.contents
  True

Since we use email for retrieving the password we need a mock mailhost. Let's use the one in PasswordResetTool.

  >>> from Products.CMFPlone.tests.utils import MockMailHost
  >>> self.portal._original_mail_host = self.portal.MailHost
  >>> self.portal.MailHost = MockMailHost('MailHost')

  >>> browser.getLink('Log out').click()
  >>> test_user_fullname in browser.contents
  False
  >>> len(self.portal.MailHost.messages)
  0
  >>> browser.open(portal_url + '/mail_password_form')
  >>> browser.getControl(name = 'email').value = test_user_email
  >>> browser.getForm(name = 'mail_password').submit()
  >>> 'The username you entered could not be found' in browser.contents
  False
  >>> len(self.portal.MailHost.messages)
  1
  >>> email_message = self.portal.MailHost.messages[0]
  >>> retrieval_url = email_message[email_message.find('http://'):]
  >>> retrieval_url = retrieval_url[:retrieval_url.find('\n')]
  >>> browser.open(retrieval_url)
  >>> browser.getControl(name = 'email').value = test_user_email
  >>> browser.getControl(name = 'password').value = 'new'+test_user_pass
  >>> browser.getControl(name = 'password2').value = 'new'+test_user_pass  
  >>> browser.getForm(name = 'pwreset_action').submit()
  >>> browser.url == 'http://nohost/plone/pwreset_finish'
  True
  >>> 'Your password has been set successfully.' in browser.contents
  True

Let's just make sure the password is set by using it, and changing it back to the standard.

  >>> browser.open(portal_url)
  >>> browser.getLink('Log in').click()
  >>> form = browser.getForm(id='login_form')
  >>> form.getControl('Login Name').value = test_user_email
  >>> form.getControl('Password').value = 'new' + test_user_pass
  >>> form.getControl('Log in').click()
  
  >>> "You are now logged in" in browser.contents and test_user_fullname in browser.contents
  True
  
  >>> browser.open(portal_url+'/password_form')
  >>> form = browser.getForm(name = 'change_password')
  >>> form.getControl(name = 'current').value = 'new' + test_user_pass
  >>> form.getControl(name = 'password').value = test_user_pass
  >>> form.getControl(name = 'password_confirm').value = test_user_pass
  >>> form.submit()
  >>> browser.url == 'http://nohost/plone/plone_memberprefs_panel'
  True
  >>> 'Password changed.' in browser.contents
  True
