Merge "Add UI Tests for Filtering Packages by Name/Type/Keyword."
This commit is contained in:
commit
17203b8f9e
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user