def test_registrants_receive_confirmation_email_on_signup(self):
        # create em event
        # enable 'Include Confirmation Link and Message' in the Thank You EMail
        #   settings section
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl(
            name="form.widgets.maxRegistrations").value = "2"
        self.browser.getControl(
                name="form.widgets.thankYouIncludeConfirmation:list"
            ).value = 'on'
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # add registration
        self.registerNewUser(event, "Test Registration 1", "*****@*****.**")

        # check captured messages in the mailhost to verify an email with
        mailhost = self.portal.MailHost
        self.assertEqual(len(mailhost.messages), 1)
        msg = message_from_string(mailhost.messages[0])

        self.assertEqual(msg['To'], '*****@*****.**')
        self.assertEqual(
            msg['Subject'],
            self.portal['test-event'].thankYouEMailSubject)
    def test_private_event_and_send_invitations_via_email(self):
        # create private event
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl(name='form.widgets.privateEvent:list') \
                    .value = "on"
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # send announcement email through email sender with link
        #   to registration page
        senderurl = "%s/%s/@@emailsenderform" \
                        % (self.portal_url, event.getId())
        self.browser.open(senderurl)
        self.browser.getControl(name='emailtype').value = ['announcement']
        self.browser.getControl(name='emailfromaddress').value = "*****@*****.**"
        self.browser.getControl(name='emailtoaddresses') \
                    .value = "*****@*****.**"
        self.browser.getControl(name='emailbody').value = """This is an example.
The registration link would be:

http://<your domain>/path/to/your/event/registration-form
        """
        self.browser.getControl(name='submit').click()

        # assert an email with a register link has been sent
        mailhost = self.portal.MailHost
        assert len(mailhost.messages) > 0
        assert '/registration-form' in mailhost.messages[-1]
 def test_create_event(self):
     browserLogin(self.portal, self.browser)
     self.browser.open(self.portal_url + \
         '/++add++collective.eventmanager.EMEvent')
     self.browser.getControl('Event Name').value = 'Test Event'
     self.browser.getControl('Description/Notes').value = 'Event desc'
     self.browser.getControl('Save').click()
     self.assertEqual('test-event' in self.portal, True)
     self.assertEqual(self.portal['test-event'] != None, True)
    def test_calendar_includes_name_location_link_etc(self):
        # the values that should be on an item linked to by a calendar
        # (assuming the appropriate options are enabled):
        #   - name
        #   - location
        #   - registration link
        #   - seats remaining
        #   - registration start date
        #   - flyer link
        #   - notes

        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')

        # set name, location, max registrations, flyer, and body/notes element
        # -- the registration link should be auto generated, and the
        #    registration start date should be defaulted to the current day
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl(
            'Description/Notes').value = 'Event Description'
        self.browser.getControl(
            name='form.widgets.location').value = 'POINT(-100.0,100.0)'
        self.browser.getControl(
            name='form.widgets.maxRegistrations').value = '2'
        self.browser.getControl(name='form.widgets.flyer') \
            .add_file(StringIO('test file'),
                      'text/plain',
                      'test.txt')
        self.browser.getControl(
            name='form.widgets.body').value = 'Body Content'

        self.browser.getControl('Save').click()
        newevt = self.getLastEvent('test-event')

        # add a registration
        self.registerNewUser(newevt, "Test Registration", "*****@*****.**")

        # inspect the event page
        self.browser.open(newevt.absolute_url())

        assert '>Test Event</h1>' in self.browser.contents
        assert 'id="map"' in self.browser.contents
        assert '>Register for this event</a>' in self.browser.contents

        assert 'class="num">1</span>' in self.browser.contents \
                and 'of 2' in self.browser.contents
        assert 'Registration opens <span>%s' \
                    % (datetime.now().strftime('%A, %x at ')) \
                in self.browser.contents
        assert 'href="./@@display-file/flyer"' in self.browser.contents
        assert 'Body Content' in self.browser.contents
 def test_searchable_public_training_calendar(self):
     browserLogin(self.portal, self.browser)
     self.browser.open(self.portal_url + \
         '/++add++collective.eventmanager.EMEvent')
     self.browser.getControl('Event Name').value = 'Test Event'
     self.browser.getControl('Description/Notes').value = 'Event desc'
     self.browser.getControl('Save').click()
     self.browser.getLink('Publish').click()
     self.browser.open(self.portal_url + '/logout')
     self.browser.open(self.portal_url + \
         '/@@search?SearchableText=Test Event')
     assert '<dt class="contenttype-collective-eventmanager-emevent">' in \
         self.browser.contents
    def test_registrants_can_cancel(self):
        # setup event
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl(
                name='form.widgets.thankYouIncludeConfirmation:list'
            ).value = 'on'
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # add registration
        self.registerNewUser(
                event,
                "Test Registration Cancel",
                "*****@*****.**")

        # send confirmation email
        self.browser.open("%s/%s/@@emailsenderform"
                                % (self.portal_url, event.getId()))
        self.browser.getControl(name='emailfromaddress').value = '*****@*****.**'
        self.browser.getControl(name='emailtoaddresses') \
                    .value = "*****@*****.**"
        self.browser.getControl(name='submit').click()

        # get cancellation link from email
        mailhost = self.portal.MailHost
        assert len(mailhost.messages) == 1
        msg = message_from_string(mailhost.messages[0])
        assert '*****@*****.**' in msg['To']
        cancelurl = "%s/%s/cancel-registration?h=%s" \
                        % (self.portal_url,
                           event.getId(),
                           generateRegistrationHash(
                                "cancel",
                                event.registrations['test-registration-cancel']
                                ))
        assert cancelurl in mailhost.messages[0]

        # go to cancellation link
        self.browser.open(cancelurl)
        assert "Registration Cancelled" in self.browser.contents

        # assert state of registration is cancelled
        wf = getToolByName(self.portal, "portal_workflow")
        regstatus = wf.getStatusOf(
            'collective.eventmanager.Registration_workflow',
            event.registrations['test-registration-cancel'])
        assert regstatus['review_state'] == 'cancelled'
    def test_waiting_list(self):
        # create event, setting size to 0, forcing all registrations to
        #   waiting list
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl(
            name="form.widgets.maxRegistrations").value = "0"
        self.browser.getControl(
            name="form.widgets.enableWaitingList:list").value = "on"
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # add registration
        self.registerNewUser(
                event,
                "Test Registration Waiting List",
                "*****@*****.**")

        # assert registration is 'submitted'
        wf = getToolByName(self.portal, "portal_workflow")
        status = wf.getStatusOf(
            'collective.eventmanager.Registration_workflow',
            event.registrations['test-registration-waiting-list'])
        assert status['review_state'] == 'submitted'

        # go to registration status page
        self.browser.open("%s/%s/@@registrationstatusform"
                            % (self.portal_url,
                               event.getId()))

        # assert registration is listed under 'On Waiting List'
        assert 'Test Registration Waiting List' in self.browser.contents
        assert 'There are no registrations on the waiting list.' \
                    not in self.browser.contents

        # move registration from waiting list to approved
        self.browser.getControl(
                name='submitted'
            ).value = "on"
        self.browser.getControl('Approve').click()

        # assert registration is 'approved'
        status = wf.getStatusOf(
            'collective.eventmanager.Registration_workflow',
            event.registrations['test-registration-waiting-list'])
        assert status['review_state'] == 'approved'
    def test_add_registrations_manually(self):
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        self.registerNewUser(
                event,
                "Test Registration",
                "*****@*****.**")

        assert 'test-registration' in event.registrations
    def test_send_training_emails(self):
        # create event
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl(
            name="form.widgets.maxRegistrations").value = "0"
        self.browser.getControl(
            name="form.widgets.enableWaitingList:list").value = "on"
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # create registrant
        self.registerNewUser(
                event,
                "Test Registration",
                "*****@*****.**")

        # use email sender form to send 'other' email with attachment
        self.browser.open("%s/%s/@@emailsenderform"
                            % (self.portal_url,
                               event.getId()))
        self.browser.getControl(name='emailtype').value = ['other']
        self.browser.getControl(name='emailfromaddress').value = '*****@*****.**'
        self.browser.getControl(name='emailtoaddresses') \
                    .value = '*****@*****.**'
        self.browser.getControl(name='emailsubject') \
                    .value = 'Training EMail'
        self.browser.getControl(name='emailbody') \
                    .value = 'This is some training material'
        self.browser.getControl(name='attachment1') \
                    .add_file(StringIO('test file'),
                              'text/plain',
                              'test.txt')
        self.browser.getControl(name='submit').click()

        # assert an email was sent with an attachment
        mailhost = self.portal.MailHost
        assert len(mailhost.messages) == 1
        msg = message_from_string(mailhost.messages[0])

        assert msg['To'] == '*****@*****.**'
        assert msg['Subject'] == "Training EMail"
        assert 'This is some training material' in mailhost.messages[0]
        assert 'Content-Disposition: attachment; filename="test.txt"' \
                    in mailhost.messages[0]
 def test_registration_is_closed_when_full_and_no_waitlist(self):
     browserLogin(self.portal, self.browser)
     self.browser.open(self.portal_url + \
         '/++add++collective.eventmanager.EMEvent')
     self.browser.getControl('Event Name').value = 'Test Event'
     self.browser.getControl('Description/Notes').value = 'Event desc'
     self.browser.getControl(
         name="form.widgets.maxRegistrations").value = "2"
     #import pdb; pdb.set_trace()
     self.browser.getControl('Save').click()
     event = self.getLastEvent('test-event')
     self.registerNewUser(event, 'test1', '*****@*****.**')
     self.registerNewUser(event, 'test2', '*****@*****.**')
     self.browser.open(event.absolute_url())
     #import pdb; pdb.set_trace()
     assert "Registration is closed" in self.browser.contents
    def test_ability_to_search_events(self):
        # create event
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # go to search url
        searchurl = self.portal_url + "/@@search?SearchablText=Test+Event"
        self.browser.open(searchurl)

        # assert event in list
        assert 'Test Event' in self.browser.contents
    def test_set_event_dates(self):
        # create an event
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event for copy'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl(name='form.widgets.start-day').value = '26'
        self.browser.getControl(name='form.widgets.start-month').value = ['1']
        self.browser.getControl(name='form.widgets.start-year').value = '2002'
        self.browser.getControl(name='form.widgets.start-hour').value = '6'
        self.browser.getControl(name='form.widgets.start-min').value = '34'
        self.browser.getControl(name='form.widgets.end-day').value = '27'
        self.browser.getControl(name='form.widgets.end-month').value = ['1']
        self.browser.getControl(name='form.widgets.end-year').value = '2002'
        self.browser.getControl(name='form.widgets.end-hour').value = '7'
        self.browser.getControl(name='form.widgets.end-min').value = '35'
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # go to event page and assert that dates are set
        eventurl = "%s/%s" % (self.portal_url, event.getId())
        self.browser.open(eventurl)
        assert '01/26/02 at 06:34' in self.browser.contents
        assert '01/27/02 at 07:35' in self.browser.contents

        # change the dates to make an all day event
        self.browser.open(eventurl + '/edit')
        self.browser.getControl(name='form.widgets.start-day').value = '26'
        self.browser.getControl(name='form.widgets.start-month').value = ['1']
        self.browser.getControl(name='form.widgets.start-year').value = '2002'
        self.browser.getControl(name='form.widgets.start-hour').value = '6'
        self.browser.getControl(name='form.widgets.start-min').value = '34'
        self.browser.getControl(name='form.widgets.end-day').value = '26'
        self.browser.getControl(name='form.widgets.end-month').value = ['1']
        self.browser.getControl(name='form.widgets.end-year').value = '2002'
        self.browser.getControl(name='form.widgets.end-hour').value = '6'
        self.browser.getControl(name='form.widgets.end-min').value = '34'
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # check the event page for all day event
        self.browser.open(eventurl)
        assert 'This is an all day event taking place on' \
                    in self.browser.contents
        assert '01/26/02' in self.browser.contents
 def test_registration_is_open_with_waitlist(self):
     browserLogin(self.portal, self.browser)
     self.browser.open(self.portal_url + \
         '/++add++collective.eventmanager.EMEvent')
     self.browser.getControl('Event Name').value = 'Test Event'
     self.browser.getControl('Description/Notes').value = 'Event desc'
     self.browser.getControl(
         name="form.widgets.maxRegistrations").value = "2"
     self.browser.getControl(
         name="form.widgets.enableWaitingList:list"
     ).controls[0].selected = True
     self.browser.getControl('Save').click()
     event = self.getLastEvent('test-event')
     self.registerNewUser(event, 'test1', '*****@*****.**')
     self.registerNewUser(event, 'test2', '*****@*****.**')
     self.browser.open(event.absolute_url())
     assert "Registration is closed" not in self.browser.contents
    def test_registration_is_closed_on_dates_closed(self):
        browserLogin(self.portal, self.browser)

        def setEventDates(widgetbase, dayadj, houradj):
            self.browser.getControl(name='%s-day' % (widgetbase,)) \
                .value = str(datetime.now().day + dayadj)
            self.browser.getControl(name='%s-month' % (widgetbase,)) \
                .value = [str(datetime.now().month)]
            self.browser.getControl(name='%s-year' % (widgetbase,)) \
                .value = str(datetime.now().year)
            self.browser.getControl(name='%s-hour' % (widgetbase,)) \
                .value = str(datetime.now().hour + houradj)
            self.browser.getControl(name='%s-min' % (widgetbase,)) \
                .value = str(datetime.now().minute)

        def createEvent(houropenadj, hourcloseadj):
            self.browser.open(self.portal_url + \
                '/++add++collective.eventmanager.EMEvent')
            self.browser.getControl('Event Name').value = 'Test Event'
            self.browser.getControl('Description/Notes').value = 'Event desc'

            # set the open date to yesterday and the close date to
            # today -- but one hour in the future
            setEventDates('form.widgets.registrationOpen', -1, houropenadj)
            setEventDates('form.widgets.registrationClosed', 0, hourcloseadj)

            self.browser.getControl('Save').click()
            event = self.getLastEvent('test-event')

            return event

        # get event with a closed time in the future and test to make
        # sure registration is open
        event = createEvent(0, 1)
        self.browser.open(event.absolute_url())
        assert "Registration is closed" not in self.browser.contents

        # get event with a closed time in the past and test to make
        # sure registration is closed
        event = createEvent(0, -1)
        self.browser.open(event.absolute_url())
        assert "Registration is closed" in self.browser.contents
    def test_registration_info_can_be_managed_by_admins(self):
        # add event
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl(
            name="form.widgets.maxRegistrations").value = "0"
        self.browser.getControl(
            name="form.widgets.enableWaitingList:list").value = "on"
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # add registration (admin adds registration)
        self.registerNewUser(
                event,
                "Test Registration",
                "*****@*****.**")

        # assert registration exists
        assert 'test-registration' in event.registrations

        # alter registration name and email (admin doing this)
        self.browser.open("%s/%s/registrations/test-registration/edit"
                            % (self.portal_url,
                               event.getId()))
        self.browser.getControl(name="form.widgets.title") \
                    .value = "New Title Value"
        self.browser.getControl(name="form.widgets.email") \
                    .value = "*****@*****.**"
        self.browser.getControl(name="form.widgets.noshow:list") \
                    .value = "on"
        self.browser.getControl(name="form.widgets.paid_fee:list") \
                    .value = "on"
        self.browser.getControl("Save").click()

        # assert registration information has changed
        assert 'New Title Value' in self.browser.contents
        assert '*****@*****.**' in self.browser.contents
        assert event.registrations['test-registration'].noshow
        assert event.registrations['test-registration'].paid_fee
 def test_customizable_registration_form(self):
     browserLogin(self.portal, self.browser)
     self.browser.open(self.portal_url + \
         '/++add++collective.eventmanager.EMEvent')
     self.browser.getControl('Event Name').value = 'Test Event'
     self.browser.getControl('Description/Notes').value = 'Event desc'
     # XXX not working without js?
     # XXX    -> seems to still function correctly when javascript is
     #           disabled - is it not pulling data from a correct layer?
     self.browser.getControl(
         name='form.widgets.registrationFields.AA.widgets.name'
         ).value = 'Custom Field'
     self.browser.getControl(
         name="form.widgets.registrationFields.AA.widgets.fieldtype:list"
         ).value = ['TextLine']
     self.browser.getControl('Save').click()
     event = self.getLastEvent('test-event')
     self.browser.open(event.absolute_url() + \
         '/registrations/++add++collective.eventmanager.Registration')
     assert "Custom Field" in self.browser.contents
    def test_export_registration(self):
        # create event
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # add registration
        self.registerNewUser(
            event,
            "Checkin Registration",
            "*****@*****.**")

        # export registrations
        self.browser.open(event.absolute_url() + '/@@export-registrations')

        # assert registrations in downloaded file
        assert "\n\"Checkin Registration\",\"[email protected]\",\"Yes\"\n" \
                    in self.browser.contents
    def test_send_certificate_on_completion(self):
        browserLogin(self.portal, self.browser)

        # create em event
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # add a registration
        self.registerNewUser(event, "Reg1", "*****@*****.**")

        # go to email sender and setup the form and submit it
        self.browser.open(self.portal_url + "/test-event/emailsenderform")
        self.browser.getControl(name='emailtype').value = ['confirmation']
        self.browser.getControl(name='certreq').value = 'on'
        self.browser.getControl(
                name='emailfromaddress').value = '*****@*****.**'
        self.browser.getControl(
                name='emailtoaddresses').value = '"Reg1" <*****@*****.**>'
        self.browser.getControl(name='submit').click()

        # check to see if all is well with the sent emails
        mailhost = self.portal.MailHost
        self.assertEqual(len(mailhost.messages) > 0, True)
        msg = message_from_string(mailhost.messages[-1])

        self.assertEqual(msg['from'], '*****@*****.**')
        self.assertEqual(msg['to'], '"Reg1" <*****@*****.**>')
        foundcert = False
        for payload in msg.get_payload():
            if 'attachment; filename="certificate.pdf"' in payload.values():
                foundcert = True
                break

        self.assertEqual(foundcert, True)
    def test_email_roster_to_3rd_party(self):
        browserLogin(self.portal, self.browser)

        # create em event
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # add a couple of registrations
        self.registerNewUser(event, "Reg1", "*****@*****.**")
        self.registerNewUser(event, "Reg2", "*****@*****.**")

        # send roster email
        self.browser.open(self.portal_url + \
            '/test-event/@@eventroster')

        # wrapped in try/except to make sure tear down happens on
        # the mailhost
        self.browser.getControl(
            name='event_roster_email_from').value = '*****@*****.**'
        self.browser.getControl(
            name='event_roster_email_to').value = '*****@*****.**'
        self.browser.getControl(
            name='event_roster_email_text').value = 'test additional text'
        self.browser.getControl(name='event_roster_email_submit').click()

        # check captured messages in the mailhost to verify an email was
        # sent to the to email address
        mailhost = self.portal.MailHost
        self.assertEqual(len(mailhost.messages) > 0, True)
        msg = message_from_string(
                mailhost.messages[-1])

        self.assertEqual(msg['From'], '*****@*****.**')
        self.assertEqual(msg['To'], '*****@*****.**')
    def test_view_waiting_list(self):
        # create event
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl(name='form.widgets.maxRegistrations') \
                    .value = '0'
        self.browser.getControl(name='form.widgets.enableWaitingList:list') \
                    .value = "on"
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # add registration
        self.registerNewUser(
            event,
            "Waiting List Registration",
            "*****@*****.**")

        # assert registration is wait-listed
        wf = getToolByName(event, "portal_workflow")
        status = wf.getStatusOf(
                        "collective.eventmanager.Registration_workflow",
                        event.registrations['waiting-list-registration'])
        self.assertEqual(status['review_state'], 'submitted')

        # assert registration status page is showing the registration on the
        # waiting list
        self.browser.open(event.absolute_url() + '/@@registrationstatusform')
        assert 'Waiting List Registration' in self.browser.contents
        waitlistheadindex = self.browser.contents \
                                        .find('<h2>On Waiting List</h2>')
        approvedheadingindex = self.browser.contents.find('<h2>Approved</h2>')
        testregindex = self.browser.contents.find('Waiting List Registration')
        assert testregindex > waitlistheadindex
        assert testregindex < approvedheadingindex
    def test_clone_event(self):
        # create an event
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event for copy'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # copy the event
        #eventurl = "%s/%s/object_copy" % (self.portal_url, event.getId())
        #import pdb; pdb.set_trace()
        #self.browser.open(eventurl)
        self.browser.open(self.portal_url + '/folder_contents')
        self.browser.getControl('Test Event for copy').selected = True
        self.browser.getControl('Copy').click()
        self.browser.getControl('Paste').click()

        # assert both the old and new event's exist and have the same title
        copyid = 'copy_of_%s' % (event.getId(),)
        assert copyid in self.portal
        eventcopy = self.portal[copyid]
        assert event.title == eventcopy.title
    def test_post_training_data(self):
        oldbody = "some test body text"
        newbody = "a different value"

        # create event
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl(name='form.widgets.body').value = oldbody
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # modify body -- adding files and such is a function of
        #   plone itself, so there's no need to test this, as it
        #   should already be covered in tests.
        self.browser.open(self.portal_url + '/' + event.getId() + '/@@edit')
        self.browser.getControl(name='form.widgets.body').value = newbody
        self.browser.getControl("Save").click()

        # assert that body structure has changed.
        assert oldbody not in self.browser.contents
        assert newbody in self.browser.contents
    def test_checkin_roster(self):
        # create event
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # add registration, make sure it's confirmed and not marked
        #   as a no-show
        self.registerNewUser(
            event,
            "Checkin Registration",
            "*****@*****.**",
            False)

        # goto /@@eventroster and assert that there is at least one
        #   checkbox for the registration (indicating they are not no-shows)
        rosterurl = "%s/%s/@@eventroster" % (self.portal_url,
                                             event.getId())
        self.browser.open(rosterurl)
        assert 'registration="checkin-registration"' in self.browser.contents
    def test_require_payment(self):
        # create event
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl(name='form.widgets.requirePayment:list') \
                    .value = "on"
        self.browser.getControl(name='form.widgets.registrationFee') \
                    .value = "10.0"
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # add registration
        self.browser.open(event.absolute_url() + "/registration-form")
        self.browser.getControl(name="form.widgets.title") \
                    .value = "Test Payer Reg"
        self.browser.getControl(name="form.widgets.email") \
                    .value = "*****@*****.**"
        self.browser.getControl(name="form.buttons.register") \
                    .click()

        # assert the browser location, after creating a registration,
        # is the checkout location
        assert '/test-event/@@getpaid-checkout-wizard' in self.browser.url

        # fill out info
        self.browser.getControl(name="form.name").value = "Test Payer Reg"
        self.browser.getControl(name="form.phone_number").value = "1112223333"
        self.browser.getControl(name="form.email") \
                    .value = "*****@*****.**"
        self.browser.getControl(name="form.bill_name").value = "Test Payer Reg"
        self.browser.getControl(name="form.bill_first_line") \
                    .value = "555 N. NoWhere St"
        self.browser.getControl(name="form.bill_city") \
                    .value = "NoWhere"
        self.browser.getControl(name="form.bill_country").value = ["US"]
        self.browser.getControl(name="form.bill_state").value = ["US-WI"]
        self.browser.getControl(name="form.bill_postal_code").value = "54952"
        self.browser.getControl(name="form.ship_same_billing").value = "on"
        self.browser.getControl(name="form.actions.continue").click()

        # confirm we're on the right page
        assert "Checkout" in self.browser.content

        # fill in card details
        self.browser.getControl(name="form.name_on_card") \
                    .value = "Test Registration"
        self.browser.getControl(name="form.bill_phone_number") \
                    .value = "1112223333"
        self.browser.getControl(name="form.credit_card_type") \
                    .value = ["Visa"]
        self.browser.getControl(name="form.credit_card") \
                    .value = "4024007102901401"
        self.browser.getControl(name="form.cc_expiration_month") \
                    .value = ["01"]
        self.browser.getControl(name="form.cc_expiration_year") \
                    .value = ["2040"]
        self.browser.getControl(name="form.cc_cvc") \
                    .value = "123"
        self.browser.getControl(name="form.actions.make-payment").click()

        # check to see if the payment information was submitted successfully
        assert "Thank you for your order" in self.browser.content
        assert "Your order id is" in self.browser.content
    def test_modify_email_templates(self):
        # create an event and registration
        # enable 'Include Confirmation Link and Message' in the Thank You EMail
        #   settings section
        browserLogin(self.portal, self.browser)
        self.browser.open(self.portal_url + \
            '/++add++collective.eventmanager.EMEvent')
        self.browser.getControl('Event Name').value = 'Test Event'
        self.browser.getControl('Description/Notes').value = 'Event desc'
        self.browser.getControl(
            name="form.widgets.maxRegistrations").value = "1"
        self.browser.getControl(
                name="form.widgets.thankYouIncludeConfirmation:list"
            ).value = 'on'
        self.browser.getControl(name='form.widgets.enableWaitingList:list') \
                    .value = "on"
        self.browser.getControl('Save').click()
        event = self.getLastEvent('test-event')

        # add registration
        self.registerNewUser(event, "Test Registration 1", "*****@*****.**")

        # go to site setup and modify every template
        self.browser.open(self.portal_url + '/@@em-email-templates')

        def setControls(name):
            subjectname = 'form.widgets.%s_subject' % (name,)
            htmlname = 'form.widgets.%s_htmlbody' % (name,)
            textname = 'form.widgets.%s_textbody' % (name,)
            self.browser.getControl(name=subjectname).value = "Test Subject"
            self.browser.getControl(name=htmlname).value = "Test HTML Body"
            self.browser.getControl(name=textname).value = "Test Text Body"

        setControls('announcement')
        setControls('confirmation')
        setControls('onwaitinglist')
        setControls('other')
        setControls('registrationfull')
        setControls('thankyou')
        self.browser.getControl('Save').click()

        emailsenderurl = "%s/%s/@@emailsenderform" \
                            % (self.portal_url, event.getId())

        def checkMailHost():
            mailhost = self.portal.MailHost
            assert len(mailhost.messages) > 0
            msg = message_from_string(mailhost.messages[-1])

            assert msg['Subject'] == 'Test Subject'
            assert 'Test Subject' in mailhost.messages[-1]
            assert 'Test HTML Body' in mailhost.messages[-1]
            assert 'Test Text Body' in mailhost.messages[-1]

        def emailSenderTest(url, emailtype):
            # send the email, since we hard-coded the templates, setting
            # subject and message shouldn't matter here
            self.browser.open(url)
            self.browser.getControl(name='emailtype').value = [emailtype]
            self.browser.getControl(name='emailfromaddress') \
                        .value = '*****@*****.**'
            self.browser.getControl(name='emailtoaddresses') \
                        .value = '*****@*****.**'
            self.browser.getControl(name='submit').click()

            # check to see if the content of the email is correct
            checkMailHost()

        # test announcement
        emailSenderTest(emailsenderurl, 'announcement')

        # test confirmation
        emailSenderTest(emailsenderurl, 'confirmation')

        # test on waiting list
        self.registerNewUser(event, "Test Registration 2", "*****@*****.**")
        checkMailHost()

        # test other
        emailSenderTest(emailsenderurl, 'other')

        # test registration full
        evediturl = "%s/%s/edit" % (self.portal_url, event.getId())
        self.browser.open(evediturl)
        self.browser.getControl(name='form.widgets.enableWaitingList:list') \
                    .value = ""
        self.browser.getControl('Save').click()
        self.registerNewUser(event, "Test Registration 3", "*****@*****.**")
        checkMailHost()

        # test thank you
        evediturl = "%s/%s/edit" % (self.portal_url, event.getId())
        self.browser.open(evediturl)
        self.browser.getControl(name="form.widgets.maxRegistrations") \
                    .value = "20"
        self.browser.getControl('Save').click()
        self.registerNewUser(event, "Test Registration 4", "*****@*****.**")
        checkMailHost()