Testing Expiry of Subscribemembers
==================================

    >>> from collective.subscribemember import config
    >>> from Products.Five.testbrowser import Browser
    >>> portal_url = self.portal.absolute_url()
    >>> from Products.PloneTestCase.setup import portal_owner, default_password
    >>> self.portal.error_log._ignored_exceptions = ()

Lets clear out the mail queue first of all.

    >>> mailhost = self.dummyMailHost
    >>> mailhost.sent = []

Delete the test member so we can control the member
expiry dates more accurately.

    >>> self.deleteTestMember('member')

We open a browser as a user with the 'Manager' role.

    >>> manager_browser = Browser()
    >>> manager_browser.handleErrors = False
    >>> manager_browser.open(portal_url+'/login_form')
    >>> manager_browser.getControl(name='__ac_name').value = portal_owner
    >>> manager_browser.getControl(name='__ac_password').value = default_password
    >>> manager_browser.getControl(name='submit').click()
    >>> "You are now logged in" in manager_browser.contents
    True

We open a browser as Anonymous,

    >>> anon_browser = Browser()
    >>> anon_browser.handleErrors = False

and also another anonymous browser for our subscribing member.

    >>> subscribemember_browser = Browser()
    >>> subscribemember_browser.handleErrors = False

Setup PloneGetPaid for our tests.

    >>> manager_browser.getLink('Site Setup').click()
    >>> manager_browser.getLink('GetPaid').click()
    >>> manager_browser.getLink('Site Profile').click()
    >>> manager_browser.getControl('Contact Email').value = 'info@plonegetpaid.com'
    >>> manager_browser.getControl( name="form.store_name").value = 'Fake Company'
    >>> manager_browser.getControl('Apply').click()
    >>> from Products.PloneGetPaid.interfaces import IGetPaidManagementPaymentOptions
    >>> getpaidoptions = IGetPaidManagementPaymentOptions(self.portal)
    >>> getpaidoptions.payment_processor = 'Testing Processor'
    >>> getpaidoptions.accepted_credit_cards = ['Visa']

Provide the processor with the appropriate settings:

    >>> manager_browser.getLink('GetPaid').click()
    >>> manager_browser.getLink('Payment Processor Settings').click()
    >>> manager_browser.getControl(name="form.allow_authorization").displayValue = ['allow_authorization']
    >>> manager_browser.getControl(name="form.allow_capture").displayValue = ['allow_capture']
    >>> manager_browser.getControl(name="form.allow_refunds").displayValue = ['allow_refund']    
    >>> manager_browser.getControl('Apply').click()

We'll also manually set the day so we can more accurately
test the reminder emails and member expiry.

    >>> self.setToday(2009,5,25)

A visitor to the site signs up as an 'Individual'.

    >>> username = 'bsmith'
    >>> subscribemember_browser.open(portal_url+'/join_form')
    >>> subscribemember_browser.getControl(name="id").value = username
    >>> subscribemember_browser.getControl(name="fullname").value = 'Bob Smith'
    >>> subscribemember_browser.getControl('E-mail').value = 'bob@email.com'
    >>> subscribemember_browser.getControl(name="billFirstLine").value = '123 Ritz Street'
    >>> subscribemember_browser.getControl(name="billCity").value = 'Hoboville'
    >>> subscribemember_browser.getControl(name="billState").value = ['NZ-WGN']
    >>> subscribemember_browser.getControl(name="billCountry").value = ['NZ']
    >>> subscribemember_browser.getControl(name="billPostalCode").value = '12345'
    >>> subscribemember_browser.getControl(name="phoneNumber").value = '12345678'
    >>> subscribemember_browser.getControl(name='memberType').displayOptions
    ['Student members - $15/Year (No Journal Subscription)', 'Student Members - $30/Year', 'Individual Members - $135/Year', 'Individual Members - $250/2 Years', 'Individual Members - $360/3 Years', 'Associate Members - $30/Year (No Journal Subscription)', 'Corporate Members - $700/Year', 'Corporate Members - $1300/2 Years', 'Corporate Members - $1800/3 Years']    
    >>> subscribemember_browser.getControl(name='memberType').displayValue = ['Individual Members - $135/Year']
    >>> subscribemember_browser.getControl('Register').click()
    >>> print subscribemember_browser.contents
    <BLANKLINE>                                                                                                                                                 
    ...                                                                                                                                                         
        You will receive an e-mail shortly containing a URL that will allow you to                                                                              
        set your password.                                                                              
    ...

The user will be sent an email with a link to click to complete the
registration process.

    >>> '<test@test.com>' in mailhost.sent[0]['From']
    True
    
    >>> mailhost.mto == ['bob@email.com']
    True
    
    >>> 'User_Account_Information_for_Plone_site' in mailhost.sent[0]['Subject']
    True

    >>> message = mailhost.sent[0].get_payload()
    >>> reglinkstart = message.find('http://')
    >>> reglinkfinish = message.find(username)
    >>> reglink = message[reglinkstart:reglinkfinish+6]
    
Lets click on the link in the email now and complete the registration
process.

    >>> subscribemember_browser.open(reglink)
    >>> subscribemember_browser.getControl('New password').value = 'secret'
    >>> subscribemember_browser.getControl(name="password2").value = 'secret'
    >>> subscribemember_browser.getControl('Set my password').click()
    >>> 'Password set' in subscribemember_browser.contents
    True

Now that we've set our password we can login via the login form.

    >>> subscribemember_browser.open(portal_url+'/login_form')
    >>> subscribemember_browser.getControl(name="__ac_name").value = username
    >>> subscribemember_browser.getControl(name="__ac_password").value = 'secret'
    >>> subscribemember_browser.getControl(name="submit").click()

Click on the proceed to payment button.

    >>> subscribemember_browser.getControl('Proceed to Payment').click()
    >>> subscribemember_browser.getControl('Continue').click()

The member enters their credit card details.

    >>> subscribemember_browser.getControl('Card Holder Name').value = 'Bob Smith'
    >>> subscribemember_browser.getControl('Phone Number').value = '1234456'
    >>> subscribemember_browser.getControl(name='form.cc_expiration_month').value = ['12']
    >>> subscribemember_browser.getControl(name='form.cc_expiration_year').value = ['2014']
    >>> subscribemember_browser.getControl('Credit Card Number').value = '4111111111111111'
    >>> subscribemember_browser.getControl(name='form.cc_cvc').value = '133'
    >>> subscribemember_browser.getControl('Make Payment').click()
    >>> print subscribemember_browser.contents
    <BLANKLINE>                                                                                                                                                             
    ...
                    Your finance state is                                                                                                                                   
                </span>                                                                                                                                                     
                CHARGED                                                                                                                                                     
    ...

Today is now 1 day before the member's subscription expires.

    >>> self.setToday(2010,5,24)

Lets clear out the mail queue again.

    >>> mailhost = self.dummyMailHost
    >>> mailhost.sent = []
    
The clockserver opens up the expire subscribemembers view as
per the daily schedule.

    >>> manager_browser.open(portal_url+'/@@expire_subscribemembers')
    Sent renewal reminder email to: Bob Smith

Check that the remindersent attribute was set.

    >>> member = self.portal.portal_memberdata['bsmith']
    >>> hasattr(member, 'remindersent')
    True
    
Check the reminder email that was sent:

    >>> print mailhost.sent[0]
    Bob Smith,
    <BLANKLINE>
    Your membership to the Plone site site will expire on 2010/05/25.
    <BLANKLINE>
    To renew your membership, please go to http://nohost/plone/portal_memberdata/bsmith
    <BLANKLINE>
    Kind regards,
    Site Administrator
    <BLANKLINE>
    
Reset the email check.

    >>> mailhost.sent = []

Ensure it doesn't send the reminder email twice.
    >>> manager_browser.open(portal_url+'/@@expire_subscribemembers')
    >>> len(mailhost.sent) == 0
    True

Today is now a year since the member subscribed.
The clockserver opens up the expire subscribemembers view as
per the daily schedule.

    >>> self.setToday(2010,5,25)
    >>> manager_browser.open(portal_url+'/@@expire_subscribemembers')
    Disabled: Bob Smith
    
Check the notification email that was sent:

    >>> print mailhost.sent[0]
    Bob Smith,
    <BLANKLINE>
    Your membership has expired and your access to the Plone site site has been disabled.
    <BLANKLINE>
    In order to renew your membership online, you must click on the
    following link to gain access to the site:  http://nohost/plone/@@renew_expired_view?member=bsmith.
    <BLANKLINE>
    Kind regards,
    Site Administrator
    <BLANKLINE>
    
    >>> mailhost.sent = []
    
Lets confirm it doesn't run the member expiry code on the day before/after.

    >>> self.setToday(2010,5,26)
    >>> manager_browser.open(portal_url+'/@@expire_subscribemembers')
    >>> len(mailhost.sent) == 0
    True
    
    >>> self.setToday(2010,5,24)
    >>> manager_browser.open(portal_url+'/@@expire_subscribemembers')
    >>> len(mailhost.sent) == 0
    True

    >>> self.setToday(2010,5,25)

Member renews their subscription.

    >>> anon_browser.open(portal_url+'/@@renew_expired_view?member=bsmith')

Lets enter an incorrect username and password and see what happens.

    >>> anon_browser.getControl(name='member_types').displayValue = ['Student Members - $30/Year']
    >>> anon_browser.getControl(name="memberid").value
    'bsmith'
    >>> anon_browser.getControl(name="memberpassword").value = 'wrongpassword'
    >>> anon_browser.getControl('Renew Membership').click()
    >>> print anon_browser.contents
    <BLANKLINE>
    ...
            <dl class="portalMessage error">                                                                                                                                   
                <dt>Error</dt>                                                                                                                                                 
                <dd>You have entered an incorrect username and/or password</dd>                                                                                                
            </dl>
    ...

    >>> anon_browser.getControl(name="memberid").value = 'bsmith1'
    >>> anon_browser.getControl(name="memberpassword").value = 'secret'
    >>> anon_browser.getControl('Renew Membership').click()
    >>> print anon_browser.contents
    <BLANKLINE>
    ...
            <dl class="portalMessage error">                                                                                                                                   
                <dt>Error</dt>                                                                                                                                                 
                <dd>No user exists with that userid</dd>                                                                                                
            </dl>
    ...

    >>> anon_browser.getControl(name="memberid").value = ''
    >>> anon_browser.getControl(name="memberpassword").value = 'secret'
    >>> anon_browser.getControl('Renew Membership').click()
    >>> print anon_browser.contents
    <BLANKLINE>
    ...
            <dl class="portalMessage info">                                                                                                                                    
                <dt>Info</dt>                                                                                                                                                  
                <dd>You must enter a user name</dd>                                                                                                                            
            </dl>                                                                                                                                                              
    ...

    >>> anon_browser.getControl(name="memberid").value = 'bsmith'
    >>> anon_browser.getControl(name="memberpassword").value = ''
    >>> anon_browser.getControl('Renew Membership').click()
    >>> print anon_browser.contents
    <BLANKLINE>
    ...
            <dl class="portalMessage info">                                                                                                                                    
                <dt>Info</dt>                                                                                                                                                  
                <dd>You must enter a password</dd>                                                                                                                             
            </dl>                                                                                                                                                              
    ...

Now lets enter the correct details.

    >>> anon_browser.getControl(name="memberid").value = 'bsmith'
    >>> anon_browser.getControl(name="memberpassword").value = 'secret'
    >>> anon_browser.getControl('Renew Membership').click()

Confirm that the proceed to payment button displays.

    >>> paymentbutton = anon_browser.getControl('Proceed to Payment')
    >>> paymentbutton
    <SubmitControl name='submit' type='submit'>
    
Also, confirm that the renewal date was set.

    >>> from DateTime import DateTime
    >>> today = DateTime().Date()
    >>> member = self.portal.portal_memberdata['bsmith']
    >>> reneweddate = member.Schema()['memberRenewedDate'].get(member).Date()
    >>> reneweddate == today
    True

Click on the proceed to payment button.

    >>> paymentbutton.click()
    >>> anon_browser.getControl('Continue').click()

The member enters their credit card details.

    >>> anon_browser.getControl('Card Holder Name').value = 'Bob Smith'
    >>> anon_browser.getControl('Phone Number').value = '1234456'
    >>> anon_browser.getControl(name='form.cc_expiration_month').value = ['12']
    >>> anon_browser.getControl(name='form.cc_expiration_year').value = ['2014']
    >>> anon_browser.getControl('Credit Card Number').value = '4111111111111111'
    >>> anon_browser.getControl(name='form.cc_cvc').value = '133'
    >>> anon_browser.getControl('Make Payment').click()
    >>> print anon_browser.contents
    <BLANKLINE>                                                                                                                                                             
    ...
                    Your finance state is                                                                                                                                   
                </span>                                                                                                                                                     
                CHARGED                                                                                                                                                     
    ...

Lets confirm that the getpaid portlet and tab no longer display.

    >>> anon_browser.getLink('Preferences').click()
    >>> anon_browser.getLink('Personal Preferences').click()
    >>> not '@@edit-payable' in anon_browser.contents
    True
    
    >>> not 'portlet-cart' in anon_browser.contents
    True
    
And that the specified member type was saved.



Cancel out, otherwise the object gets locked.
    
    >>> anon_browser.getControl('Cancel').click()

Now lets see if we can still find the member in the search results.

    >>> anon_browser.getLink('Log out').click()
    >>> anon_browser.open(portal_url)
    >>> anon_browser.getControl(name="SearchableText").value = 'bob smith'
    >>> anon_browser.getControl('Search', index=1).click()
    >>> '1 items matching your search terms' in anon_browser.contents
    True
    
Lets confirm that if a user renews their membership when their membership
has not yet expired they are notified of this.

    >>> anon_browser.open(portal_url+'/@@renew_expired_view?member=bsmith')
    >>> anon_browser.getControl(name='member_types').displayValue = ['Student Members - $30/Year']
    >>> anon_browser.getControl(name="memberid").value = 'bsmith'
    >>> anon_browser.getControl(name="memberpassword").value = 'secret'
    >>> anon_browser.getControl('Renew Membership').click()
    >>> print anon_browser.contents
    <BLANKLINE>
    ...
            <dl class="portalMessage error">                                                                                                                                   
                <dt>Error</dt>                                                                                                                                                 
                <dd>The membership for bsmith hasn't expired</dd>                                                                                                
            </dl>
    ...
    
Lets now check to see if the member has been assigned the applicable
roles.

    >>> member.getRoles()
    ('Member', 'Reviewer')
    
Lets also confirm that managers can edit the member expiry date.

    >>> manager_browser.open(portal_url+'/portal_memberdata/bsmith/edit')
    >>> manager_browser.getControl(name='memberExpiryDate_year').value = ['2011']
    >>> manager_browser.getControl(name='memberExpiryDate_month').value = ['05']
    >>> manager_browser.getControl(name='memberExpiryDate_day').value = ['25']
    >>> manager_browser.getControl(name='memberExpiryDate_hour').value = ['09']
    >>> manager_browser.getControl(name='memberExpiryDate_minute').value = ['30']
    >>> manager_browser.getControl(name='memberExpiryDate_ampm').value = ['PM']
    >>> manager_browser.getControl('Save').click()
    >>> 'Changes saved.' in manager_browser.contents
    True

And normal users shouldn't be able to access it.
TODO:: Can't test this as it throws an Unauthorized error.

    <<< anon_browser.open(portal_url+'/portal_memberdata/bsmith/edit')
    Traceback (most recent call last):
    ...
    Unauthorized:...