Skip to content

Commit

Permalink
Refactor WebElement mocks in unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
rgonalo committed Apr 15, 2016
1 parent fda8f87 commit b64cfce
Show file tree
Hide file tree
Showing 11 changed files with 80 additions and 106 deletions.
4 changes: 2 additions & 2 deletions docs/conf.py
Expand Up @@ -77,12 +77,12 @@
# built documents.
#
# The short X.Y version.
version = file('../VERSION').read().strip()
version = open('../VERSION').read().strip()
# The full version, including alpha/beta/rc tags.
import subprocess

git_log = subprocess.check_output(["git", "log", "--pretty=oneline"])
commits = git_log.split('\n')
commits = git_log.split(b'\n')
release = '{}-{}'.format(version, len(commits) - 1)

# The language for content autogenerated by Sphinx. Refer to documentation
Expand Down
35 changes: 14 additions & 21 deletions toolium/test/pageelements/test_derived_page_element.py
Expand Up @@ -21,6 +21,7 @@
import mock
from nose.tools import assert_equal
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement

from toolium.driver_wrapper import DriverWrapper
from toolium.driver_wrappers_pool import DriverWrappersPool
Expand All @@ -29,16 +30,6 @@
from toolium.pageobjects.page_object import PageObject

child_element = 'child_element'
mock_element = None


@mock.patch('selenium.webdriver.remote.webelement.WebElement', spec=True)
def get_mock_element(WebElement):
web_element = WebElement.return_value
web_element.find_element.return_value = child_element
web_element.text = 'text value'
web_element.get_attribute.return_value = 'input text value'
return web_element


def get_mock_select():
Expand Down Expand Up @@ -71,8 +62,11 @@ class LoginPageObject(PageObject):
class TestDerivedPageElement(unittest.TestCase):
def setUp(self):
"""Create a new mock element and a new driver before each test"""
global mock_element
mock_element = get_mock_element()
# Create a mock element
self.mock_element = mock.MagicMock(spec=WebElement)
self.mock_element.find_element.return_value = child_element
self.mock_element.text = 'text value'
self.mock_element.get_attribute.return_value = 'input text value'

# Reset wrappers pool values
DriverWrappersPool._empty_pool()
Expand All @@ -97,27 +91,27 @@ def test_locator(self):
assert_equal(page_object.menu.logo.parent, page_object.menu)

def test_get_text(self):
self.driver_wrapper.driver.find_element.return_value = mock_element
self.driver_wrapper.driver.find_element.return_value = self.mock_element

title_value = LoginPageObject().title.text

assert_equal(title_value, 'text value')

def test_get_input_text(self):
self.driver_wrapper.driver.find_element.return_value = mock_element
self.driver_wrapper.driver.find_element.return_value = self.mock_element

username_value = LoginPageObject().username.text

assert_equal(username_value, 'input text value')

def test_set_input_text(self):
# Configure driver mock
self.driver_wrapper.driver.find_element.return_value = mock_element
self.driver_wrapper.driver.find_element.return_value = self.mock_element
self.driver_wrapper.is_ios_test = mock.MagicMock(return_value=False)

LoginPageObject().username.text = 'new input value'

assert_equal(mock_element.send_keys.mock_calls, [mock.call('new input value')])
self.mock_element.send_keys.assert_called_with('new input value')

def test_get_selected_option(self):
select_page_element.SeleniumSelect = get_mock_select()
Expand All @@ -131,12 +125,11 @@ def test_set_option(self):

LoginPageObject().language.option = 'new option value'

assert_equal(len(select_page_element.SeleniumSelect.mock_calls), 1)
assert_equal(select_page_element.SeleniumSelect().mock_calls,
[mock.call.select_by_visible_text('new option value')])
select_page_element.SeleniumSelect.assert_called()
select_page_element.SeleniumSelect().select_by_visible_text.assert_called_with('new option value')

def test_click_button(self):
self.driver_wrapper.driver.find_element.return_value = mock_element
self.driver_wrapper.driver.find_element.return_value = self.mock_element
LoginPageObject().login.click()

assert_equal(mock_element.click.mock_calls, [mock.call()])
self.mock_element.click.assert_called()
45 changes: 17 additions & 28 deletions toolium/test/pageelements/test_page_element.py
Expand Up @@ -19,9 +19,9 @@
import unittest

import mock
import six
from nose.tools import assert_equal, assert_is_not_none, assert_is_none
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement

from toolium.driver_wrapper import DriverWrapper
from toolium.driver_wrappers_pool import DriverWrappersPool
Expand All @@ -32,13 +32,6 @@
mock_element = None


@mock.patch('selenium.webdriver.remote.webelement.WebElement', spec=True)
def get_mock_element(WebElement):
web_element = WebElement.return_value
web_element.find_element.return_value = child_element
return web_element


class RegisterPageObject(PageObject):
username = PageElement(By.XPATH, '//input[0]')
password = PageElement(By.ID, 'password', username)
Expand All @@ -53,7 +46,8 @@ class TestPageElement(unittest.TestCase):
def setUp(self):
"""Create a new mock element and a new driver before each test"""
global mock_element
mock_element = get_mock_element()
mock_element = mock.MagicMock(spec=WebElement)
mock_element.find_element.return_value = child_element

# Reset wrappers pool values
DriverWrappersPool._empty_pool()
Expand All @@ -72,62 +66,57 @@ def test_locator(self):
def test_get_web_element(self):
RegisterPageObject().username.web_element

assert_equal(self.driver_wrapper.driver.find_element.mock_calls, [mock.call(By.XPATH, '//input[0]')])
self.driver_wrapper.driver.find_element.assert_called_with(By.XPATH, '//input[0]')

def test_get_web_element_init_page(self):
RegisterPageObject().language.web_element

assert_equal(self.driver_wrapper.driver.find_element.mock_calls, [mock.call(By.ID, 'language')])
self.driver_wrapper.driver.find_element.assert_called_with(By.ID, 'language')

def test_get_web_element_with_parent(self):
self.driver_wrapper.driver.find_element.return_value = mock_element
web_element = RegisterPageObject().password.web_element

assert_equal(web_element, child_element)
assert_equal(self.driver_wrapper.driver.find_element.mock_calls, [mock.call(By.XPATH, '//input[0]')])
assert_equal(mock_element.find_element.mock_calls, [mock.call(By.ID, 'password')])
self.driver_wrapper.driver.find_element.assert_called_with(By.XPATH, '//input[0]')
mock_element.find_element.assert_called_with(By.ID, 'password')

def test_get_web_element_with_parent_locator(self):
self.driver_wrapper.driver.find_element.return_value = mock_element
web_element = RegisterPageObject().address.web_element

assert_equal(web_element, child_element)
assert_equal(self.driver_wrapper.driver.find_element.mock_calls, [mock.call(By.ID, 'parent')])
assert_equal(mock_element.find_element.mock_calls, [mock.call(By.ID, 'address')])
self.driver_wrapper.driver.find_element.assert_called_with(By.ID, 'parent')
mock_element.find_element.assert_called_with(By.ID, 'address')

def test_get_web_element_with_parent_web_element(self):
web_element = RegisterPageObject().email.web_element

assert_equal(web_element, child_element)
assert_equal(self.driver_wrapper.driver.find_element.mock_calls, [])
assert_equal(mock_element.find_element.mock_calls, [mock.call(By.ID, 'email')])
self.driver_wrapper.driver.find_element.assert_not_called()
mock_element.find_element.assert_called_with(By.ID, 'email')

def test_get_web_element_in_test(self):
PageElement(By.XPATH, '//input[0]').web_element

assert_equal(self.driver_wrapper.driver.find_element.mock_calls, [mock.call(By.XPATH, '//input[0]')])
self.driver_wrapper.driver.find_element.assert_called_with(By.XPATH, '//input[0]')

def test_get_web_element_two_times(self):
login_page = RegisterPageObject()
login_page.username.web_element
login_page.username.web_element

# Check that find_element is not called the second time
if six.PY2:
second_call = mock.call().__nonzero__()
else:
second_call = mock.call().__bool__()
assert_equal(self.driver_wrapper.driver.find_element.mock_calls,
[mock.call(By.XPATH, '//input[0]'), second_call])
self.driver_wrapper.driver.find_element.assert_called_with(By.XPATH, '//input[0]')

def test_get_web_element_two_elements(self):
login_page = RegisterPageObject()
login_page.username.web_element
login_page.language.web_element

# Check that find_element is called two times
assert_equal(self.driver_wrapper.driver.find_element.mock_calls,
[mock.call(By.XPATH, '//input[0]'), mock.call(By.ID, 'language')])
self.driver_wrapper.driver.find_element.assert_has_calls(
[mock.call(By.XPATH, '//input[0]'), mock.call(By.ID, 'language')])

def test_get_web_element_two_objects(self):
login_page = RegisterPageObject()
Expand All @@ -136,8 +125,8 @@ def test_get_web_element_two_objects(self):
second_login_page.language.web_element

# Check that find_element is called two times
assert_equal(self.driver_wrapper.driver.find_element.mock_calls,
[mock.call(By.ID, 'language'), mock.call(By.ID, 'language')])
self.driver_wrapper.driver.find_element.assert_has_calls(
[mock.call(By.ID, 'language'), mock.call(By.ID, 'language')])

def test_reset_object(self):
login_page = RegisterPageObject()
Expand Down
30 changes: 12 additions & 18 deletions toolium/test/pageelements/test_page_elements.py
Expand Up @@ -21,6 +21,7 @@
import mock
from nose.tools import assert_equal, assert_is_instance, assert_is
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement

from toolium.driver_wrapper import DriverWrapper
from toolium.driver_wrappers_pool import DriverWrappersPool
Expand All @@ -29,14 +30,6 @@

child_elements = ['child_element_1', 'child_element_2']
other_child_elements = ['child_element_3', 'child_element_4']
mock_element = None


@mock.patch('selenium.webdriver.remote.webelement.WebElement', spec=True)
def get_mock_element(WebElement):
web_element = WebElement.return_value
web_element.find_elements.return_value = child_elements
return web_element


class LoginPageObject(PageObject):
Expand All @@ -48,8 +41,9 @@ class LoginPageObject(PageObject):
class TestPageElements(unittest.TestCase):
def setUp(self):
"""Create a new mock element and a new driver before each test"""
global mock_element
mock_element = get_mock_element()
# Create a mock element
self.mock_element = mock.MagicMock(spec=WebElement)
self.mock_element.find_elements.return_value = child_elements

# Reset wrappers pool values
DriverWrappersPool._empty_pool()
Expand All @@ -62,23 +56,23 @@ def setUp(self):
def test_get_web_elements(self):
LoginPageObject().inputs.web_elements

assert_equal(self.driver_wrapper.driver.find_elements.mock_calls, [mock.call(By.XPATH, '//input')])
self.driver_wrapper.driver.find_elements.assert_called_with(By.XPATH, '//input')

def test_get_web_elements_with_parent_locator(self):
self.driver_wrapper.driver.find_element.return_value = mock_element
self.driver_wrapper.driver.find_element.return_value = self.mock_element
web_elements = LoginPageObject().inputs_parent.web_elements

assert_equal(web_elements, child_elements)
assert_equal(self.driver_wrapper.driver.find_element.mock_calls, [mock.call(By.ID, 'parent')])
assert_equal(mock_element.find_elements.mock_calls, [mock.call(By.XPATH, '//input')])
self.driver_wrapper.driver.find_element.assert_called_with(By.ID, 'parent')
self.mock_element.find_elements.assert_called_with(By.XPATH, '//input')

def test_get_page_elements(self):
self.driver_wrapper.driver.find_elements.return_value = child_elements
page_elements = LoginPageObject().inputs.page_elements

# Check that find_elements has been called just one time
assert_equal(self.driver_wrapper.driver.find_elements.mock_calls, [mock.call(By.XPATH, '//input')])
assert_equal(self.driver_wrapper.driver.find_element.mock_calls, [])
self.driver_wrapper.driver.find_elements.assert_called_with(By.XPATH, '//input')
self.driver_wrapper.driver.find_element.assert_not_called()

# Check that the response is a list of 2 PageElement with the expected web element
assert_equal(len(page_elements), 2)
Expand All @@ -94,8 +88,8 @@ def test_get_page_elements_and_web_elements(self):
web_elements = inputs.web_elements

# Check that find_elements has been called just one time
assert_equal(self.driver_wrapper.driver.find_elements.mock_calls, [mock.call(By.XPATH, '//input')])
assert_equal(self.driver_wrapper.driver.find_element.mock_calls, [])
self.driver_wrapper.driver.find_elements.assert_called_with(By.XPATH, '//input')
self.driver_wrapper.driver.find_element.assert_not_called()

# Check that the response is a list of 2 PageElement with the expected web element
assert_equal(len(page_elements), 2)
Expand Down
11 changes: 3 additions & 8 deletions toolium/test/pageobjects/test_page_object.py
Expand Up @@ -21,6 +21,7 @@
import mock
from nose.tools import assert_equal, assert_is_not_none, assert_is_none
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement

from toolium.driver_wrapper import DriverWrapper
from toolium.driver_wrappers_pool import DriverWrappersPool
Expand All @@ -31,13 +32,6 @@
mock_element = None


@mock.patch('selenium.webdriver.remote.webelement.WebElement', spec=True)
def get_mock_element(WebElement):
web_element = WebElement.return_value
web_element.find_element.return_value = child_element
return web_element


class MenuPageObject(PageObject):
register = PageElement(By.ID, 'register')

Expand Down Expand Up @@ -66,7 +60,8 @@ class TestPageObject(unittest.TestCase):
def setUp(self):
"""Create a new mock element and a new driver before each test"""
global mock_element
mock_element = get_mock_element()
mock_element = mock.MagicMock(spec=WebElement)
mock_element.find_element.return_value = child_element

# Reset wrappers pool values
DriverWrappersPool._empty_pool()
Expand Down
6 changes: 3 additions & 3 deletions toolium/test/test_config_driver.py
Expand Up @@ -189,9 +189,9 @@ def test_create_remote_driver_firefox(self, webdriver_mock):
config_driver = ConfigDriver(self.config)

# Firefox profile mock
profile_mock = lambda: None # Create an empty object
setattr(profile_mock, 'encoded', 'encoded profile')
config_driver._create_firefox_profile = mock.MagicMock(return_value=profile_mock)
class ProfileMock(object):
encoded = 'encoded profile'
config_driver._create_firefox_profile = mock.MagicMock(return_value=ProfileMock())

config_driver._create_remote_driver()
capabilities = DesiredCapabilities.FIREFOX
Expand Down
7 changes: 3 additions & 4 deletions toolium/test/test_driver_wrapper.py
Expand Up @@ -364,12 +364,11 @@ def test_configure_change_configuration_file(self):
# Check that configuration has been initialized
assert_equal('android', self.driver_wrapper.config.get('Driver', 'type'))

@mock.patch('toolium.driver_wrapper.ConfigDriver')
def test_connect(self, ConfigDriver):
@mock.patch('toolium.driver_wrapper.ConfigDriver.create_driver')
def test_connect(self, create_driver):
# Mock data
expected_driver = mock.MagicMock()
instance = ConfigDriver.return_value
instance.create_driver.return_value = expected_driver
create_driver.return_value = expected_driver
self.driver_wrapper.utils = mock.MagicMock()

# Connect and check the returned driver
Expand Down
23 changes: 15 additions & 8 deletions toolium/test/test_utils.py
Expand Up @@ -42,6 +42,21 @@
)


def get_mock_element(x, y, height, width):
"""Create a mock element with custom location and size
:param x: x location
:param y: y location
:param height: element height
:param width: element width
:returns: mock element
"""
mock_element = mock.MagicMock(spec=WebElement)
mock_element.location = {'x': x, 'y': y}
mock_element.size = {'height': height, 'width': width}
return mock_element


@ddt
class UtilsTests(unittest.TestCase):
def setUp(self):
Expand Down Expand Up @@ -328,11 +343,3 @@ def test_get_web_element_from_none(self):
def test_get_web_element_from_unknown(self):
web_element = self.utils.get_web_element(dict())
assert_is_none(web_element)


@mock.patch('selenium.webdriver.remote.webelement.WebElement', spec=True)
def get_mock_element(WebElement, x, y, height, width):
web_element = WebElement.return_value
web_element.location = {'x': x, 'y': y}
web_element.size = {'height': height, 'width': width}
return web_element

0 comments on commit b64cfce

Please sign in to comment.