# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from marionette_driver import expected, By, Wait
from gaiatest.apps.base import Base
from gaiatest.apps.base import PageRegion
from gaiatest.apps.email.regions.setup import SetupEmail
from gaiatest.apps.email.regions.setup import ManualSetupEmail
from gaiatest.apps.email.regions.settings import Settings
from gaiatest.apps.email.regions.google import GoogleLogin
[docs]class Email(Base):
name = 'E-Mail'
_email_locator = (By.CSS_SELECTOR, '#cardContainer .msg-header-item:not([data-index="-1"])')
_syncing_locator = (By.CSS_SELECTOR, '#cardContainer .msg-messages-syncing > .small')
_manual_setup_locator = (By.CSS_SELECTOR, '#cardContainer .sup-manual-config-btn')
_message_list_locator = (By.CSS_SELECTOR, 'cards-message-list')
_setup_account_info = (By.TAG_NAME, 'cards-setup-account-info')
_setup_manual_config = (By.TAG_NAME, 'cards-setup-manual-config')
_folder_picker_locator = (By.TAG_NAME, 'cards-folder-picker')
_settings_main_locator = (By.TAG_NAME, 'cards-settings-main')
_settings_account_locator = (By.TAG_NAME, 'cards-settings-account')
_confirm_dialog_locator = (By.TAG_NAME, 'cards-confirm-dialog')
_refresh_button_locator = (By.CLASS_NAME, 'msg-refresh-btn')
_search_textbox_locator = (By.CSS_SELECTOR, 'form[role="search"]')
_email_subject_locator = (By.XPATH, '//a[@data-index!="-1"]/div/span[text()="%s"]')
_back_button_locator = (By.CLASS_NAME, 'sup-back-btn')
emails_list_header_locator = (By.CSS_SELECTOR, '.msg-list-header')
[docs] def basic_setup_email(self, name, email, password):
setup = SetupEmail(self.marionette)
setup.type_name(name)
setup.type_email(email)
setup.tap_next()
google_login = GoogleLogin(self.marionette)
# check if the google autocomplete on email field works as expected
assert google_login.email == email
# dismiss the keyboard and return to the correct frame
google_login.keyboard.dismiss()
google_login.switch_to_frame()
google_login.tap_next()
google_login.type_password(password)
google_login.tap_sign_in()
# approve access to your account
google_login.wait_for_approve_access()
google_login.tap_approve_access()
self.apps.switch_to_displayed_app()
setup.tap_account_prefs_next()
setup.wait_for_setup_complete()
setup.tap_continue()
self.wait_for_message_list()
[docs] def setup_IMAP_email(self, imap, smtp):
basic_setup = SetupEmail(self.marionette)
basic_setup.type_name('IMAP account')
basic_setup.type_email(imap['email'])
setup = self.tap_manual_setup()
setup.select_account_type('IMAP+SMTP')
setup.type_imap_hostname(imap['hostname'])
setup.type_imap_name(imap['username'])
setup.type_imap_password(imap['password'])
setup.type_imap_port(imap['port'])
setup.type_smtp_hostname(smtp['hostname'])
setup.type_smtp_name(smtp['username'])
setup.type_smtp_password(smtp['password'])
setup.type_smtp_port(smtp['port'])
setup.tap_next()
setup.check_for_emails_interval('20000')
setup.tap_account_prefs_next()
setup.wait_for_setup_complete()
setup.tap_continue()
self.wait_for_message_list()
[docs] def setup_active_sync_email(self, active_sync):
basic_setup = SetupEmail(self.marionette)
basic_setup.type_name('ActiveSync account')
basic_setup.type_email(active_sync['email'])
setup = self.tap_manual_setup()
setup.select_account_type('ActiveSync')
setup.type_password(active_sync['password'])
setup.type_activesync_hostname(active_sync['hostname'])
setup.type_activesync_name(active_sync['username'])
setup.tap_next()
setup.check_for_emails_interval('20000')
setup.tap_account_prefs_next()
setup.wait_for_setup_complete()
setup.tap_continue()
self.wait_for_message_list()
[docs] def delete_email_account(self, index):
toolbar = self.header.tap_menu()
toolbar.tap_settings()
settings = Settings(self.marionette)
account_settings = settings.email_accounts[index].tap()
delete_confirmation = account_settings.tap_delete()
delete_confirmation.tap_delete()
[docs] def tap_manual_setup(self):
manual_setup = Wait(self.marionette).until(
expected.element_present(*self._manual_setup_locator))
Wait(self.marionette).until(expected.element_displayed(manual_setup))
manual_setup.tap()
return ManualSetupEmail(self.marionette)
[docs] def a11y_click_manual_setup(self):
manual_setup = Wait(self.marionette).until(
expected.element_present(*self._manual_setup_locator))
Wait(self.marionette).until(expected.element_displayed(manual_setup))
self.accessibility.click(manual_setup)
return ManualSetupEmail(self.marionette)
[docs] def a11y_navigate_to_manual_setup(self, name, email):
setup = SetupEmail(self.marionette)
setup.type_name(name)
setup.type_email(email)
setup = self.a11y_click_manual_setup()
@property
def header(self):
return Header(self.marionette, self.marionette.find_element(*self.emails_list_header_locator))
@property
def toolbar(self):
return ToolBar(self.marionette)
@property
def mails(self):
return [Message(self.marionette, mail) for mail in self.marionette.find_elements(*self._email_locator)]
[docs] def wait_for_emails_to_sync(self):
element = self.marionette.find_element(*self._refresh_button_locator)
Wait(self.marionette, timeout=60).until(
lambda m: element.get_attribute(
'data-state') == 'synchronized')
[docs] def wait_for_message_list(self):
element = self.marionette.find_element(*self._message_list_locator)
Wait(self.marionette).until(
lambda m: element.is_displayed() and
element.location['x'] == 0)
[docs] def wait_for_search_textbox_displayed(self):
Wait(self.marionette).until(expected.element_displayed(*self._search_textbox_locator))
[docs] def tap_email_subject(self, subject):
subject_locator = (
self._email_subject_locator[0],
self._email_subject_locator[1] % subject
)
self.marionette.find_element(*subject_locator).tap()
from gaiatest.apps.email.regions.read_email import ReadEmail
return ReadEmail(self.marionette)
[docs] def wait_for_email(self, subject, timeout=120):
Wait(self.marionette, timeout, interval=5).until(
self.email_exists(self, subject))
[docs] class email_exists(object):
def __init__(self, app, subject):
self.app = app
self.subject = subject
def __call__(self, marionette):
if self.subject in [mail.subject for mail in self.app.mails]:
return True
else:
self.app.toolbar.tap_refresh()
self.app.wait_for_emails_to_sync()
self.app.mails[0].scroll_to_message()
return False
[docs]class Message(PageRegion):
_subject_locator = (By.CSS_SELECTOR, '.msg-header-subject')
_senders_email_locator = (By.CSS_SELECTOR, '.msg-header-author')
@property
def subject(self):
return self.root_element.find_element(*self._subject_locator).text
@property
def senders_email(self):
return self.root_element.find_element(*self._senders_email_locator).text