Merge "Add UI Tests for Filtering Packages by Name/Type/Keyword."

This commit is contained in:
Jenkins 2017-01-13 03:01:23 +00:00 committed by Gerrit Code Review
commit 17203b8f9e
3 changed files with 168 additions and 15 deletions

View File

@ -23,6 +23,7 @@ from glanceclient import client as gclient
from keystoneauth1.identity import v3
from keystoneauth1 import session as ks_session
from keystoneclient.v3 import client as ks_client
from muranoclient.common import exceptions as muranoclient_exc
from muranoclient.glance import client as glare_client
import muranoclient.v1.client as mclient
from oslo_log import handlers
@ -239,7 +240,12 @@ class UITestCase(testtools.TestCase):
return path.split('__')[-1]
def select_and_click_action_for_app(self, action, app):
self.driver.find_element_by_xpath(
self.check_element_on_page(
by.By.XPATH,
"//*[@href='{0}/app-catalog/catalog/{1}/{2}']".format(
self.url_prefix, action, app))
self.wait_element_is_clickable(
by.By.XPATH,
"//*[@href='{0}/app-catalog/catalog/{1}/{2}']".format(
self.url_prefix, action, app)).click()
@ -274,8 +280,8 @@ class UITestCase(testtools.TestCase):
except exc.TimeoutException:
self.fail("Element {0} is not present on the page".format(value))
def check_element_not_on_page(self, method, value):
self.driver.implicitly_wait(3)
def check_element_not_on_page(self, method, value, sec=3):
self.driver.implicitly_wait(sec)
present = True
try:
self.driver.find_element(method, value)
@ -389,32 +395,39 @@ class PackageBase(UITestCase):
@classmethod
def setUpClass(cls):
super(PackageBase, cls).setUpClass()
cls.mockapp_id = utils.upload_app_package(
cls.murano_client,
cls.packages = []
cls.mockapp_id = cls.upload_package(
"MockApp",
{"categories": ["Web"], "tags": ["tag"]})
cls.postgre_id = utils.upload_app_package(
cls.murano_client,
cls.postgre_id = cls.upload_package(
"PostgreSQL",
{"categories": ["Databases"], "tags": ["tag"]})
cls.hot_app_id = utils.upload_app_package(
cls.murano_client,
cls.hot_app_id = cls.upload_package(
"HotExample",
{"tags": ["hot"]}, hot=True)
cls.deployingapp_id = utils.upload_app_package(
cls.murano_client,
cls.deployingapp_id = cls.upload_package(
"DeployingApp",
{"categories": ["Web"], "tags": ["tag"]},
hot=False,
package_dir=consts.DeployingPackageDir)
@classmethod
def upload_package(cls, name, data, **kwargs):
package = utils.upload_app_package(cls.murano_client, name, data,
**kwargs)
cls.packages.append(package)
return package
@classmethod
def tearDownClass(cls):
super(PackageBase, cls).tearDownClass()
cls.murano_client.packages.delete(cls.mockapp_id)
cls.murano_client.packages.delete(cls.postgre_id)
cls.murano_client.packages.delete(cls.hot_app_id)
cls.murano_client.packages.delete(cls.deployingapp_id)
# In case dynamically created packages are deleted at test level,
# ignore not found errors below.
for package in cls.packages:
try:
cls.murano_client.packages.delete(package)
except muranoclient_exc.HTTPNotFound:
pass
class ImageTestCase(PackageBase):

View File

@ -86,6 +86,11 @@ EnvComponentsTab = "//ul[contains(@id, 'environment_details')]//"\
"a[contains(text(), 'Components')]"
DeploymentHistoryLogs = "div#environment_details__env_logs div.reports.logs "\
"div.report-info"
PackageFilterDropdownBtn = 'div.table_search > div.themable-select.dropdown >'\
' button'
PackageFilterTypeBtn = "a[data-select-value='{0}']"
PackageFilterInput = 'input[name="packages__filter_packages__q"]'
PackageFilterBtn = "packages__action_filter_packages"
# Panels
AppCatalog = "//*[@id='main_content']/nav//a[contains(text(), 'App Catalog')]" # noqa

View File

@ -2257,6 +2257,141 @@ class TestSuitePackages(base.PackageTestCase):
self.log_in()
self.delete_user(new_user['name'])
def test_filter_package_by_name(self):
"""Test filtering by name.
Test checks ability to filter packages by name in Packages page.
Scenario:
1. Navigate to 'Manage' > 'Packages' panel.
2. Set the search type to 'Name'.
3. For each name in ``packages_by_name``:
a. Set search criterion in search field to current name.
b. Click on 'Filter' and verify that expected packages are
shown and unexpected packages are not shown.
"""
self.navigate_to('Manage')
self.go_to_submenu('Packages')
packages_by_name = ['DeployingApp', 'HotExample', 'MockApp',
'PostgreSQL']
if not utils.glare_enabled():
packages_by_name.extend(
['Application Development Library', 'Core library'])
self.wait_element_is_clickable(
by.By.CSS_SELECTOR, c.PackageFilterDropdownBtn).click()
self.wait_element_is_clickable(
by.By.CSS_SELECTOR, c.PackageFilterTypeBtn.format('name')).click()
for package_name in packages_by_name:
self.fill_field(by.By.CSS_SELECTOR, c.PackageFilterInput,
package_name)
with self.wait_for_page_reload():
self.driver.find_element_by_id(c.PackageFilterBtn).click()
self.check_element_on_page(by.By.PARTIAL_LINK_TEXT,
package_name)
for other_package in set(packages_by_name) - set([package_name]):
self.check_element_not_on_page(by.By.PARTIAL_LINK_TEXT,
other_package, sec=0.1)
def test_filter_package_by_type(self):
"""Test filtering by type.
Test checks ability to filter packages by type in Packages page.
Scenario:
1. Navigate to 'Manage' > 'Packages' panel.
2. Set the search type to 'Type'.
3. For each type in ``packages_by_type.keys()``:
a. Set search criterion in search field to current type.
b. Click on 'Filter' and verify that expected packages are
shown and unexpected packages are not shown.
"""
self.navigate_to('Manage')
self.go_to_submenu('Packages')
all_packages = ['Application Development Library', 'Core library',
'DeployingApp', 'HotExample', 'MockApp', 'PostgreSQL']
packages_by_type = {
'Library': ['Application Development Library', 'Core library'],
'Application': ['DeployingApp', 'HotExample', 'MockApp',
'PostgreSQL']
}
self.wait_element_is_clickable(
by.By.CSS_SELECTOR, c.PackageFilterDropdownBtn).click()
self.wait_element_is_clickable(
by.By.CSS_SELECTOR, c.PackageFilterTypeBtn.format('type')).click()
for package_type, package_list in packages_by_type.items():
self.fill_field(by.By.CSS_SELECTOR, c.PackageFilterInput,
package_type)
with self.wait_for_page_reload():
self.driver.find_element_by_id(c.PackageFilterBtn).click()
for package_name in package_list:
self.check_element_on_page(by.By.PARTIAL_LINK_TEXT,
package_name)
for other_package in set(all_packages) - set(package_list):
self.check_element_not_on_page(by.By.PARTIAL_LINK_TEXT,
other_package, sec=0.1)
@unittest.skipIf(utils.glare_enabled(),
"Filtering apps by description doesn't work with GLARE; "
"this test should be fixed with bug #1616856.")
def test_filter_package_by_keyword(self):
"""Test filtering by keyword.
Test checks ability to filter packages by keyword in Packages page.
Scenario:
1. Upload 4 randomly named packages, with random descriptions
and tags, where each tested keyword is
`pkg_description`,`pkg_tag`.
2. Navigate to 'Manage' > 'Packages' panel.
3. Set the search type to 'KeyWord'.
4. For each keyword in ``packages_by_keyword.keys()``:
a. Set search criterion in search field to current keyword.
b. Click on 'Filter' and verify that expected packages are
shown and unexpected packages are not shown.
"""
self.navigate_to('Manage')
self.go_to_submenu('Packages')
package_names = []
package_ids = []
packages_by_keyword = {}
for i in range(4):
pkg_name = self.gen_random_resource_name('package')
pkg_description = self.gen_random_resource_name('description', 8)
pkg_tag = self.gen_random_resource_name('tag', 8)
pkg_data = {
'description': pkg_description,
'tags': [pkg_tag]
}
packages_by_keyword[pkg_description + "," + pkg_tag] = pkg_name
package_names.append(pkg_name)
package_id = self.upload_package(pkg_name, pkg_data)
package_ids.append(package_id)
self.addCleanup(self.murano_client.packages.delete, package_id)
self.wait_element_is_clickable(
by.By.CSS_SELECTOR, c.PackageFilterDropdownBtn).click()
self.wait_element_is_clickable(
by.By.CSS_SELECTOR, c.PackageFilterTypeBtn.format('search'))\
.click()
for keyword, package_name in packages_by_keyword.items():
self.fill_field(by.By.CSS_SELECTOR, c.PackageFilterInput,
keyword)
with self.wait_for_page_reload():
self.driver.find_element_by_id(c.PackageFilterBtn).click()
self.check_element_on_page(by.By.PARTIAL_LINK_TEXT,
package_name)
for other_package in set(package_names) - set([package_name]):
self.check_element_not_on_page(by.By.PARTIAL_LINK_TEXT,
other_package, sec=0.1)
class TestSuiteRepository(base.PackageTestCase):
_apps_to_delete = set()