Added test descriptions
Change-Id: I91b4d1b070a9e41f02c2c30b8b644398a074733c
This commit is contained in:
parent
67b4f643aa
commit
e5b88fbd44
17
fuelweb_ui_test/tests/.noseids
Normal file
17
fuelweb_ui_test/tests/.noseids
Normal file
@ -0,0 +1,17 @@
|
||||
(dp1
|
||||
S'failed'
|
||||
p2
|
||||
(lp3
|
||||
S'1'
|
||||
asS'source_names'
|
||||
p4
|
||||
(lp5
|
||||
S'tests'
|
||||
p6
|
||||
asS'ids'
|
||||
p7
|
||||
(dp8
|
||||
I1
|
||||
(Ng6
|
||||
Ntp9
|
||||
ss.
|
@ -4,14 +4,14 @@ from unittest import TestCase
|
||||
from PIL import Image
|
||||
import operator
|
||||
import math
|
||||
import time
|
||||
from selenium.common.exceptions import NoSuchElementException
|
||||
import time
|
||||
import browser
|
||||
from pageobjects.header import Header
|
||||
from fuelweb_ui_test.settings import FOLDER_SCREEN_CURRENT
|
||||
from fuelweb_ui_test.settings import FOLDER_SCREEN_EXPECTED
|
||||
from fuelweb_ui_test.settings import NAILGUN_FIXTURES
|
||||
from fuelweb_ui_test.settings import URL_HOME
|
||||
from settings import FOLDER_SCREEN_CURRENT
|
||||
from settings import FOLDER_SCREEN_EXPECTED
|
||||
from settings import NAILGUN_FIXTURES
|
||||
from settings import URL_HOME
|
||||
|
||||
|
||||
class BaseTestCase(TestCase):
|
||||
@ -39,10 +39,9 @@ class BaseTestCase(TestCase):
|
||||
$('head').append(
|
||||
'<style type="text/css">
|
||||
* {
|
||||
-webkit-transition-duration: 0.00000001s !
|
||||
important;
|
||||
-moz-transition: 0.00000001s !important;
|
||||
transition-duration: 0.00000001s !important;
|
||||
-webkit-transition-duration: 0.00000001s !important;
|
||||
-moz-transition: 0.00000001s !important;
|
||||
transition-duration: 0.00000001s !important;
|
||||
}
|
||||
</style>')
|
||||
'''.replace('\n', ''))
|
||||
@ -84,8 +83,7 @@ class BaseTestCase(TestCase):
|
||||
|
||||
h1 = img_exp.histogram()
|
||||
h2 = img_cur.histogram()
|
||||
rms = math.sqrt(
|
||||
reduce(operator.add,
|
||||
map(lambda a, b: (a - b) ** 2, h1, h2)) / len(h1))
|
||||
rms = math.sqrt(reduce(operator.add, map(lambda a, b: (a - b) ** 2,
|
||||
h1, h2)) / len(h1))
|
||||
|
||||
self.assertNotEqual(rms == 0, 'Screen valid')
|
||||
|
@ -1,15 +1,13 @@
|
||||
import time
|
||||
from pageobjects.environments import Environments
|
||||
from pageobjects.environments import Wizard
|
||||
from pageobjects.environments import DeployChangesPopup
|
||||
from pageobjects.environments import Environments, Wizard, DeployChangesPopup
|
||||
from pageobjects.header import TaskResultAlert
|
||||
from pageobjects.nodes import Nodes, RolesPanel
|
||||
from settings import OPENSTACK_CENTOS, OPENSTACK_RELEASE_CENTOS
|
||||
from tests.base import BaseTestCase
|
||||
from fuelweb_ui_test.settings import OPENSTACK_CENTOS
|
||||
from fuelweb_ui_test.settings import OPENSTACK_RELEASE_CENTOS
|
||||
|
||||
|
||||
class Environment:
|
||||
|
||||
@staticmethod
|
||||
def simple_flat(name=OPENSTACK_CENTOS,
|
||||
release=OPENSTACK_RELEASE_CENTOS):
|
||||
|
@ -12,41 +12,82 @@ from tests.test_roles import ROLE_CONTROLLER, ROLE_CEPH, ROLE_CINDER
|
||||
|
||||
class TestNodesAddPage(BaseTestCase):
|
||||
|
||||
"""Global precondition
|
||||
|
||||
Steps:
|
||||
1. Simple environment with default values is created
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
preconditions.Environment.simple_flat()
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Click on created simple environment
|
||||
2. Click 'Add nodes'
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.setUp(self)
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
time.sleep(1)
|
||||
Nodes().add_nodes.click()
|
||||
time.sleep(1)
|
||||
|
||||
"""Check that discovered nodes checkboxes are enabled
|
||||
|
||||
Scenario:
|
||||
1. Verify discovered nodes checkboxes are active
|
||||
"""
|
||||
|
||||
def test_discovered_nodes_enabled(self):
|
||||
with Nodes()as n:
|
||||
for node in n.nodes_discovered:
|
||||
self.assertTrue(
|
||||
node.checkbox.
|
||||
find_element_by_tag_name('input').is_enabled(),
|
||||
node.checkbox.find_element_by_tag_name('input').
|
||||
is_enabled(),
|
||||
'Node enabled')
|
||||
|
||||
"""Check that offline nodes checkboxes are disabled
|
||||
|
||||
Scenario:
|
||||
1. Verify offline nodes checkboxes are inactive
|
||||
"""
|
||||
|
||||
def test_offline_nodes_disabled(self):
|
||||
with Nodes()as n:
|
||||
for node in n.nodes_offline:
|
||||
self.assertFalse(
|
||||
node.checkbox.
|
||||
find_element_by_tag_name('input').is_enabled(),
|
||||
node.checkbox.find_element_by_tag_name('input').
|
||||
is_enabled(),
|
||||
'Node disabled')
|
||||
|
||||
"""Check that error nodes checkboxes are disabled
|
||||
|
||||
Scenario:
|
||||
1. Verify error nodes checkboxes are inactive
|
||||
"""
|
||||
|
||||
def test_error_nodes_disabled(self):
|
||||
with Nodes()as n:
|
||||
for node in n.nodes_error:
|
||||
self.assertFalse(
|
||||
node.checkbox.
|
||||
find_element_by_tag_name('input').is_enabled(),
|
||||
node.checkbox.find_element_by_tag_name('input').
|
||||
is_enabled(),
|
||||
'Node disabled')
|
||||
|
||||
"""Check Select All checkbox
|
||||
|
||||
Scenario:
|
||||
1. Click Select All checkbox
|
||||
2. Verify that group Select All checkboxes are selected
|
||||
3. Verify that discovered nodes checkboxes are selected
|
||||
4. Verify that offline and error nodes checkboxes aren't selected
|
||||
"""
|
||||
|
||||
def test_select_all(self):
|
||||
with Nodes()as n:
|
||||
n.select_all.click()
|
||||
@ -55,20 +96,27 @@ class TestNodesAddPage(BaseTestCase):
|
||||
'Select all in group is selected')
|
||||
for node in n.nodes_discovered:
|
||||
self.assertTrue(
|
||||
node.checkbox.
|
||||
find_element_by_tag_name('input').is_selected(),
|
||||
node.checkbox.find_element_by_tag_name('input').
|
||||
is_selected(),
|
||||
'Discovered node is selected')
|
||||
for node in n.nodes_offline:
|
||||
self.assertFalse(
|
||||
node.checkbox.
|
||||
find_element_by_tag_name('input').is_selected(),
|
||||
node.checkbox.find_element_by_tag_name('input').
|
||||
is_selected(),
|
||||
'Offline node is not selected')
|
||||
for node in n.nodes_error:
|
||||
self.assertFalse(
|
||||
node.checkbox.
|
||||
find_element_by_tag_name('input').is_selected(),
|
||||
node.checkbox.find_element_by_tag_name('input').
|
||||
is_selected(),
|
||||
'Error node is not selected')
|
||||
|
||||
"""Check Select All in group
|
||||
|
||||
Scenario:
|
||||
1. Click Select All in each group of nodes
|
||||
2. Verify that nodes checkboxes are selected
|
||||
"""
|
||||
|
||||
def test_select_all_in_group(self):
|
||||
with Nodes()as n:
|
||||
for i, group in enumerate(n.node_groups):
|
||||
@ -81,6 +129,16 @@ class TestNodesAddPage(BaseTestCase):
|
||||
self.assertTrue(
|
||||
n.select_all.is_selected(), '"Select all" is checked')
|
||||
|
||||
"""Check selecting elements one by one
|
||||
|
||||
Scenario:
|
||||
1. Select nodes one by one
|
||||
2. Verify that Select all checkbox for group is selected
|
||||
when all discovered nodes in group are selected
|
||||
3. Verify that Select all checkbox is selected when
|
||||
all nodes are selected
|
||||
"""
|
||||
|
||||
def test_select_all_selecting_nodes_one_by_one(self):
|
||||
with Nodes()as n:
|
||||
for i, group in enumerate(n.node_groups):
|
||||
@ -92,33 +150,62 @@ class TestNodesAddPage(BaseTestCase):
|
||||
self.assertTrue(
|
||||
n.select_all.is_selected(), '"Select all" is checked')
|
||||
|
||||
"""Check selecting discovered elements by clicking on node area
|
||||
|
||||
Scenario:
|
||||
1. Select all discovered nodes by clicking on node area
|
||||
2. Verify that all discovered nodes are selected
|
||||
"""
|
||||
|
||||
def test_selecting_nodes_clicking_them_discovered(self):
|
||||
with Nodes()as n:
|
||||
for node in n.nodes_discovered:
|
||||
node.parent.click()
|
||||
self.assertTrue(
|
||||
node.checkbox.
|
||||
find_element_by_tag_name('input').is_selected(),
|
||||
node.checkbox.find_element_by_tag_name('input').
|
||||
is_selected(),
|
||||
'Discovered node is selected')
|
||||
|
||||
"""Check offline nodes can't be selected by clicking on node area
|
||||
|
||||
Scenario:
|
||||
1. Select all offline nodes by clicking on node area
|
||||
2. Verify that all offline nodes aren't selected
|
||||
"""
|
||||
|
||||
def test_selecting_nodes_clicking_them_offline(self):
|
||||
with Nodes()as n:
|
||||
for node in n.nodes_offline:
|
||||
node.parent.click()
|
||||
self.assertFalse(
|
||||
node.checkbox.
|
||||
find_element_by_tag_name('input').is_selected(),
|
||||
node.checkbox.find_element_by_tag_name('input').
|
||||
is_selected(),
|
||||
'Offline node is not selected')
|
||||
|
||||
"""Check error nodes can't be selected by clicking on node area
|
||||
|
||||
Scenario:
|
||||
1. Select all error nodes by clicking on node area
|
||||
2. Verify that all error nodes aren't selected
|
||||
"""
|
||||
|
||||
def test_selecting_nodes_clicking_them_error(self):
|
||||
with Nodes()as n:
|
||||
for node in n.nodes_error:
|
||||
node.parent.click()
|
||||
self.assertFalse(
|
||||
node.checkbox.
|
||||
find_element_by_tag_name('input').is_selected(),
|
||||
node.checkbox.find_element_by_tag_name('input').
|
||||
is_selected(),
|
||||
'Error node is not selected')
|
||||
|
||||
"""Check node info in pop-up
|
||||
|
||||
Scenario:
|
||||
1. Click edit node
|
||||
2. Verify that name in header is the same as on nodes list page
|
||||
3. Do this check for discovered, offline, error node
|
||||
"""
|
||||
|
||||
def test_node_info_popup(self):
|
||||
def test_popup(node):
|
||||
node.details.click()
|
||||
@ -134,6 +221,16 @@ class TestNodesAddPage(BaseTestCase):
|
||||
test_popup(n.nodes_offline[0])
|
||||
test_popup(n.nodes_error[0])
|
||||
|
||||
"""Rename node name
|
||||
|
||||
Scenario:
|
||||
1. Click on node name
|
||||
2. Change name and click on node area - name isn't changed
|
||||
3. Click on node name again
|
||||
4. Change name and hit enter
|
||||
5. Verify that name is correctly changed
|
||||
"""
|
||||
|
||||
def test_renaming_node(self):
|
||||
name = 'new node name'
|
||||
with Nodes()as n:
|
||||
@ -165,14 +262,34 @@ class TestAddingNodes(BaseTestCase):
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Create simple environment with default values
|
||||
2. Click on created simple environment
|
||||
2. Click 'Add nodes'
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.clear_nailgun_database()
|
||||
preconditions.Environment.simple_flat()
|
||||
BaseTestCase.setUp(self)
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
time.sleep(1)
|
||||
Nodes().add_nodes.click()
|
||||
time.sleep(1)
|
||||
|
||||
"""Add one controller node
|
||||
|
||||
Scenario:
|
||||
1. Select Controller role and select node
|
||||
2. Click Apply Changes
|
||||
3. Verify that Nodes page is open
|
||||
4. Amount of nodes is 1
|
||||
5. Node is the same that was selected
|
||||
6. Role of node is Controller
|
||||
"""
|
||||
|
||||
def test_adding_node_single_role(self):
|
||||
name = Nodes().nodes_discovered[0].name.text
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
@ -185,6 +302,15 @@ class TestAddingNodes(BaseTestCase):
|
||||
self.assertEqual(n.nodes[0].name.text, name, 'Node name')
|
||||
self.assertIn(ROLE_CONTROLLER, n.nodes[0].roles.text, 'Node role')
|
||||
|
||||
"""Add node with controller, cinder, ceph roles
|
||||
|
||||
Scenario:
|
||||
1. Select Controller, Cinder, Ceph roles and select node
|
||||
2. Click Apply Changes
|
||||
3. Verify that Nodes page is open
|
||||
4. Role of node is Controller, Cinder, Ceph
|
||||
"""
|
||||
|
||||
def test_adding_node_multiple_roles(self):
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
with RolesPanel() as r:
|
||||
@ -202,6 +328,16 @@ class TestAddingNodes(BaseTestCase):
|
||||
self.assertIn(ROLE_CEPH, n.nodes[0].roles.text,
|
||||
'Node third role')
|
||||
|
||||
"""Edit node by adding new role to it
|
||||
|
||||
Scenario:
|
||||
1. Select Controller role and select node
|
||||
2. Click Apply Changes
|
||||
3. Select added node and click Edit Roles
|
||||
4. Select Cinder Role and click Apply Changes
|
||||
5. Verify that roles of node are Controller, Cinder
|
||||
"""
|
||||
|
||||
def test_edit_role_add_new_role(self):
|
||||
# Add node with controller role
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
@ -221,6 +357,17 @@ class TestAddingNodes(BaseTestCase):
|
||||
self.assertIn(ROLE_CINDER, n.nodes[0].roles.text,
|
||||
'Cinder role')
|
||||
|
||||
"""Edit node by removing old role and adding two new roles to it
|
||||
|
||||
Scenario:
|
||||
1. Select Controller role and select node
|
||||
2. Click Apply Changes
|
||||
3. Select added node and click Edit Roles
|
||||
4. Unselect Controller and select Cinder and Ceph Role
|
||||
5. Click Apply Changes
|
||||
6. Verify that roles of node are Cinder and Ceph
|
||||
"""
|
||||
|
||||
def test_edit_role_change_role(self):
|
||||
# Add node with controller role
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
@ -245,13 +392,22 @@ class TestAddingNodes(BaseTestCase):
|
||||
self.assertIn(ROLE_CEPH, n.nodes[0].roles.text,
|
||||
'Ceph-osd role')
|
||||
|
||||
"""Unallocated nodes counter
|
||||
|
||||
Scenario:
|
||||
1. Add new node with compute role
|
||||
2. Verify that number of unallocated nodes was reduced on 1
|
||||
"""
|
||||
|
||||
def test_unallocated_nodes_counter(self):
|
||||
initial = int(Header().unallocated_nodes.text)
|
||||
discovered = len(Nodes().nodes_discovered)
|
||||
|
||||
Tabs().nodes.click()
|
||||
for i in range(discovered):
|
||||
time.sleep(1)
|
||||
Nodes().add_nodes.click()
|
||||
time.sleep(1)
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
RolesPanel().compute.click()
|
||||
Nodes().apply_changes.click()
|
||||
@ -264,12 +420,21 @@ class TestAddingNodes(BaseTestCase):
|
||||
|
||||
class TestGroupBy(BaseTestCase):
|
||||
|
||||
"""Global precondition
|
||||
|
||||
Steps:
|
||||
1. Create simple environment with default values
|
||||
2. Add one controller node
|
||||
3. Add other nodes as compute
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
BaseTestCase.get_home()
|
||||
preconditions.Environment().simple_flat()
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
time.sleep(1)
|
||||
|
||||
# Add controller
|
||||
Nodes().add_nodes.click()
|
||||
@ -287,26 +452,57 @@ class TestGroupBy(BaseTestCase):
|
||||
RolesPanel().compute.click()
|
||||
Nodes().apply_changes.click()
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Click on created environment
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.setUp(self)
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
|
||||
def _test_group_by(self, group_by, nodes_in_groups):
|
||||
with Nodes() as n:
|
||||
time.sleep(1)
|
||||
n.group_by.select_by_visible_text(group_by)
|
||||
time.sleep(1)
|
||||
self.assertEqual(
|
||||
len(nodes_in_groups), len(n.node_groups), 'Groups amount')
|
||||
self.assertEqual(len(nodes_in_groups),
|
||||
len(n.node_groups), 'Groups amount')
|
||||
for i, group in enumerate(n.node_groups):
|
||||
self.assertEqual(
|
||||
nodes_in_groups[i], len(group.nodes),
|
||||
'Group #{0} has {1} nodes'.format(i, nodes_in_groups[i]))
|
||||
|
||||
"""Group nodes by role
|
||||
|
||||
Scenario:
|
||||
1. Select Roles value in Group By list
|
||||
2. Verify that there are 2 groups with
|
||||
correct number of nodes in each group
|
||||
"""
|
||||
|
||||
def test_group_by_roles(self):
|
||||
self._test_group_by('Roles', [1, 5])
|
||||
|
||||
"""Group nodes by hardware
|
||||
|
||||
Scenario:
|
||||
1. Select Hardware Info value in Group By list
|
||||
2. Verify that there are 5 groups with
|
||||
correct number of nodes in each group
|
||||
"""
|
||||
|
||||
def test_group_by_hardware_info(self):
|
||||
self._test_group_by('Hardware Info', [1, 1, 2, 1, 1])
|
||||
|
||||
"""Group nodes by role and hardware info
|
||||
|
||||
Scenario:
|
||||
1. Select Roles and hardware info value in Group By list
|
||||
2. Verify that there are 6 groups with
|
||||
correct number of nodes in each group
|
||||
"""
|
||||
|
||||
def test_group_by_roles_and_hardware_info(self):
|
||||
self._test_group_by('Roles and hardware info', [1, 2, 1, 1, 1])
|
||||
|
@ -3,9 +3,7 @@ import time
|
||||
from pageobjects.base import ConfirmPopup
|
||||
from pageobjects.environments import Environments
|
||||
from pageobjects.node_disks_settings import DisksSettings
|
||||
from pageobjects.nodes import Nodes
|
||||
from pageobjects.nodes import RolesPanel
|
||||
from pageobjects.nodes import NodeInfo
|
||||
from pageobjects.nodes import Nodes, RolesPanel, NodeInfo
|
||||
from pageobjects.tabs import Tabs
|
||||
from tests import preconditions
|
||||
from tests.base import BaseTestCase
|
||||
@ -13,17 +11,33 @@ from tests.base import BaseTestCase
|
||||
|
||||
class TestConfigureDisks(BaseTestCase):
|
||||
|
||||
"""Global precondition
|
||||
|
||||
Steps:
|
||||
1. Create simple environment with default values
|
||||
2. Add one controller node
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
preconditions.Environment.simple_flat()
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
time.sleep(1)
|
||||
Nodes().add_nodes.click()
|
||||
time.sleep(1)
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
RolesPanel().controller.click()
|
||||
Nodes().apply_changes.click()
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Click on created environment
|
||||
2. Select controller node
|
||||
3. Click Configure Disks
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.setUp(self)
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
@ -31,6 +45,16 @@ class TestConfigureDisks(BaseTestCase):
|
||||
NodeInfo().edit_disks.click()
|
||||
time.sleep(1)
|
||||
|
||||
"""Expand and collapse blocks with disk information
|
||||
|
||||
Scenario:
|
||||
1. Click on disk area
|
||||
2. Verify that area is expanded and disk information is available
|
||||
3. Click disk area again
|
||||
4. Verify that area is collapsed and
|
||||
disk information is unavailable
|
||||
"""
|
||||
|
||||
def test_volume_animation(self):
|
||||
with DisksSettings() as s:
|
||||
s.disks[0].volume_os.parent.click()
|
||||
@ -45,6 +69,14 @@ class TestConfigureDisks(BaseTestCase):
|
||||
s.disks[0].details_panel.is_displayed(),
|
||||
'details panel is expanded')
|
||||
|
||||
"""Remove disk volume by clicking on X button
|
||||
|
||||
Scenario:
|
||||
1. Click on disk area
|
||||
2. Click on X button for some volume group
|
||||
3. Verify that image size is 0 and there is Unallocated space
|
||||
"""
|
||||
|
||||
def test_remove_volume_cross(self):
|
||||
with DisksSettings() as s:
|
||||
s.disks[0].volume_image.parent.click()
|
||||
@ -58,6 +90,18 @@ class TestConfigureDisks(BaseTestCase):
|
||||
s.disks[0].volume_group_image.input.get_attribute('value'),
|
||||
'image volume size is 0')
|
||||
|
||||
"""Use all allowed space
|
||||
|
||||
Scenario:
|
||||
1. Click on disk area
|
||||
2. Click on X button for all volumes group
|
||||
3. Click Use all allowed space for Base system
|
||||
4. Verify that all space is allocated for Base system
|
||||
5. Remove all volumes group and click
|
||||
Use all allowed space for Image Storage
|
||||
6. Verify that all space is allocated for Image Storage
|
||||
"""
|
||||
|
||||
def test_use_all_allowed(self):
|
||||
with DisksSettings() as s:
|
||||
s.disks[1].volume_image.parent.click()
|
||||
@ -78,6 +122,14 @@ class TestConfigureDisks(BaseTestCase):
|
||||
'Image storage uses all allowed space'
|
||||
)
|
||||
|
||||
"""Allocate space for volume groups
|
||||
|
||||
Scenario:
|
||||
1. Click on disk area
|
||||
2. Allocate space for Image Storage
|
||||
3. Verify that allocated size is correct in the header of disk area
|
||||
"""
|
||||
|
||||
def test_type_volume_size(self):
|
||||
values = [random.randint(100000, 200000) for i in range(3)]
|
||||
with DisksSettings() as s:
|
||||
@ -93,14 +145,24 @@ class TestConfigureDisks(BaseTestCase):
|
||||
exp, cur,
|
||||
'Volume size. exp: {0} ({1}), cur {2}'.format(exp, v, cur))
|
||||
|
||||
"""Load default values
|
||||
|
||||
Scenario:
|
||||
1. Click on disk area
|
||||
2. Allocate space for Image Storage
|
||||
3. Apply changes
|
||||
4. Click Load Defaults
|
||||
5. Verify that Image size is default value
|
||||
"""
|
||||
|
||||
def test_save_load_defaults(self):
|
||||
default = None
|
||||
value = random.randint(60000, 80000)
|
||||
with DisksSettings() as s:
|
||||
s.disks[0].volume_image.parent.click()
|
||||
time.sleep(1)
|
||||
default = s.disks[0].\
|
||||
volume_group_image.input.get_attribute('value')
|
||||
default = s.disks[0].volume_group_image.input.\
|
||||
get_attribute('value')
|
||||
s.disks[0].volume_group_image.input.\
|
||||
clear()
|
||||
s.disks[0].volume_group_image.input.\
|
||||
@ -123,12 +185,21 @@ class TestConfigureDisks(BaseTestCase):
|
||||
'default value has been restored'
|
||||
)
|
||||
|
||||
"""Cancel changes to disk configuring
|
||||
|
||||
Scenario:
|
||||
1. Click on disk area
|
||||
2. Allocate space for Image Storage
|
||||
3. Click Cancel Changes
|
||||
4. Verify that default value is restored
|
||||
"""
|
||||
|
||||
def test_cancel_changes(self):
|
||||
with DisksSettings() as s:
|
||||
s.disks[0].volume_image.parent.click()
|
||||
time.sleep(1)
|
||||
default = s.disks[0].\
|
||||
volume_group_image.input.get_attribute('value')
|
||||
default = s.disks[0].volume_group_image.input.\
|
||||
get_attribute('value')
|
||||
s.disks[0].volume_group_image.input.\
|
||||
clear()
|
||||
s.disks[0].volume_group_image.input.\
|
||||
@ -141,6 +212,19 @@ class TestConfigureDisks(BaseTestCase):
|
||||
'default value has been restored'
|
||||
)
|
||||
|
||||
"""Back to node list form disk configuring
|
||||
|
||||
Scenario:
|
||||
1. Click on disk area
|
||||
2. Allocate space for Image Storage
|
||||
3. Click Back to node list
|
||||
4. Click Stay on page
|
||||
5. Verify that changes aren't discarded
|
||||
6. Click Back to node list
|
||||
7. Click Leave page
|
||||
8. Verify that Nodes page is present and changes are discarded
|
||||
"""
|
||||
|
||||
def test_confirm_if_back_to_list(self):
|
||||
with DisksSettings() as s:
|
||||
s.disks[0].volume_image.parent.click()
|
||||
@ -156,7 +240,8 @@ class TestConfigureDisks(BaseTestCase):
|
||||
p.wait_until_exists()
|
||||
self.assertEqual(
|
||||
'0', s.disks[0].volume_group_image.
|
||||
input.get_attribute('value'), 'Value is not changed')
|
||||
input.get_attribute('value'),
|
||||
'Value is not changed')
|
||||
|
||||
s.back_to_node_list.click()
|
||||
with ConfirmPopup() as p:
|
||||
@ -168,6 +253,16 @@ class TestConfigureDisks(BaseTestCase):
|
||||
Nodes().add_nodes.is_displayed(),
|
||||
'Backed to nodes page. Add Nodes button is displayed')
|
||||
|
||||
"""Configure disks for several nodes
|
||||
|
||||
Scenario:
|
||||
1. Add two compute nodes
|
||||
2. Select this two nodes and click configure disks
|
||||
3. Allocate size for Base system volume
|
||||
4. Click apply changes
|
||||
5. Verify that changes are correctly applied
|
||||
"""
|
||||
|
||||
def test_configure_disks_of_several_nodes(self):
|
||||
values = [random.randint(100000, 500000) for i in range(4)]
|
||||
|
||||
@ -210,7 +305,7 @@ class TestConfigureDisks(BaseTestCase):
|
||||
for j, v in enumerate(values):
|
||||
self.assertEqual(
|
||||
"{:,}".format(v),
|
||||
s.disks[j].
|
||||
volume_group_storage.input.get_attribute('value'),
|
||||
s.disks[j].volume_group_storage.input.
|
||||
get_attribute('value'),
|
||||
'Image volume size of disk {0} of node {0} is correct'.
|
||||
format(j, i))
|
||||
|
@ -5,9 +5,7 @@ import browser
|
||||
from pageobjects.environments import Environments
|
||||
from pageobjects.networks import Networks
|
||||
from pageobjects.node_interfaces_settings import InterfacesSettings
|
||||
from pageobjects.nodes import Nodes
|
||||
from pageobjects.nodes import RolesPanel
|
||||
from pageobjects.nodes import NodeInfo
|
||||
from pageobjects.nodes import Nodes, RolesPanel, NodeInfo
|
||||
from pageobjects.tabs import Tabs
|
||||
from tests import preconditions
|
||||
from tests.base import BaseTestCase
|
||||
@ -15,23 +13,49 @@ from tests.base import BaseTestCase
|
||||
|
||||
class TestConfigureNetworksPage(BaseTestCase):
|
||||
|
||||
"""Global precondition
|
||||
|
||||
Steps:
|
||||
1. Create simple environment with default values
|
||||
2. Add one controller node
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
preconditions.Environment.simple_flat()
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
time.sleep(1)
|
||||
Nodes().add_nodes.click()
|
||||
time.sleep(1)
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
RolesPanel().controller.click()
|
||||
Nodes().apply_changes.click()
|
||||
time.sleep(1)
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Click on created environment
|
||||
2. Select controller node
|
||||
3. Click Configure Interfaces
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.setUp(self)
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
Nodes().nodes[0].details.click()
|
||||
NodeInfo().edit_networks.click()
|
||||
|
||||
"""Drag and drop networks between interfaces
|
||||
|
||||
Scenario:
|
||||
1. Drag and drop Storage network from eth0 to eth1
|
||||
2. Drag and drop Management network from eth0 to eth2
|
||||
3. Drag and drop VM network from eth0 to eth2
|
||||
4. Verify that networks are on correct interfaces
|
||||
"""
|
||||
|
||||
def test_drag_and_drop(self):
|
||||
with InterfacesSettings() as s:
|
||||
ActionChains(browser.driver).drag_and_drop(
|
||||
@ -54,6 +78,15 @@ class TestConfigureNetworksPage(BaseTestCase):
|
||||
'vm (fixed)', s.interfaces[2].networks,
|
||||
'vm (fixed) at eht2')
|
||||
|
||||
"""Drag and drop public and floating networks
|
||||
|
||||
Scenario:
|
||||
1. Drag and drop Public network from eth0 to eth1
|
||||
2. Verify that Floating network is moved to eth1 too
|
||||
3. Drag and drop Floating network from eth1 to eth2
|
||||
4. Verify that Public network is moved to eth2 too
|
||||
"""
|
||||
|
||||
def test_public_floating_grouped(self):
|
||||
with InterfacesSettings() as s:
|
||||
ActionChains(browser.driver).drag_and_drop(
|
||||
@ -69,15 +102,33 @@ class TestConfigureNetworksPage(BaseTestCase):
|
||||
'public', s.interfaces[2].networks,
|
||||
'Public has been moved')
|
||||
|
||||
"""Drag and drop Admin(PXE) network
|
||||
|
||||
Scenario:
|
||||
1. Drag and drop Admin(PXE) network from eth2 to eth0
|
||||
2. Verify that network isn't draggable
|
||||
"""
|
||||
|
||||
def test_admin_pxe_is_not_dragable(self):
|
||||
with InterfacesSettings() as s:
|
||||
ActionChains(browser.driver).drag_and_drop(
|
||||
s.interfaces[2].networks['admin (pxe)'],
|
||||
s.interfaces[0].networks_box).perform()
|
||||
self.assertNotIn(
|
||||
'admin (pxe)', s.interfaces[1].networks,
|
||||
'admin (pxe)', s.interfaces[0].networks,
|
||||
'admin (pxe) has not been moved')
|
||||
|
||||
"""Assign two untagged networks to one interface
|
||||
|
||||
Scenario:
|
||||
1. Drag and drop Public network from eth0 to eth2
|
||||
2. Verify that eth2 is highlighted with red colour,
|
||||
there is error message and Apply button is inactive
|
||||
3. Drag and drop Public network from eth2 to eth1
|
||||
4. Verify that eth2 isn't highlighted, error message
|
||||
has disappeared and Apply button is active
|
||||
"""
|
||||
|
||||
def test_two_untagged_on_interface(self):
|
||||
error = 'Untagged networks can not be assigned to one interface'
|
||||
with InterfacesSettings() as s:
|
||||
@ -88,8 +139,8 @@ class TestConfigureNetworksPage(BaseTestCase):
|
||||
'nodrag', s.interfaces[2].parent.get_attribute('class'),
|
||||
'Red border')
|
||||
self.assertIn(
|
||||
error, s.interfaces[2].
|
||||
parent.find_element_by_xpath('./..').text,
|
||||
error,
|
||||
s.interfaces[2].parent.find_element_by_xpath('./..').text,
|
||||
'Error message is displayed'
|
||||
)
|
||||
self.assertFalse(s.apply.is_enabled(), 'Apply disabled')
|
||||
@ -100,12 +151,22 @@ class TestConfigureNetworksPage(BaseTestCase):
|
||||
'nodrag', s.interfaces[2].parent.get_attribute('class'),
|
||||
'Red border')
|
||||
self.assertNotIn(
|
||||
error, s.interfaces[2].
|
||||
parent.find_element_by_xpath('./..').text,
|
||||
error,
|
||||
s.interfaces[2].parent.find_element_by_xpath('./..').text,
|
||||
'Error message is displayed'
|
||||
)
|
||||
self.assertTrue(s.apply.is_enabled(), 'Apply enabled')
|
||||
|
||||
"""Assign two untagged networks to one interface
|
||||
|
||||
Scenario:
|
||||
1. Drag and drop Public network from eth0 to eth1
|
||||
2. Drag and drop Storage network from eth0 to eth2
|
||||
3. Click Cancel Changes
|
||||
4. Verify that Public, Storage, Floating network
|
||||
are on eth0 interface
|
||||
"""
|
||||
|
||||
def test_cancel_changes(self):
|
||||
with InterfacesSettings() as s:
|
||||
ActionChains(browser.driver).drag_and_drop(
|
||||
@ -134,13 +195,25 @@ class TestConfigureNetworks(BaseTestCase):
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Create simple environment with default values
|
||||
2. Click on created environment
|
||||
3. Create controller node
|
||||
4. Select controller node
|
||||
5. Click Configure Interfaces
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.clear_nailgun_database()
|
||||
BaseTestCase.setUp(self)
|
||||
|
||||
preconditions.Environment.simple_flat()
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
time.sleep(1)
|
||||
Nodes().add_nodes.click()
|
||||
time.sleep(1)
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
RolesPanel().controller.click()
|
||||
Nodes().apply_changes.click()
|
||||
@ -148,6 +221,17 @@ class TestConfigureNetworks(BaseTestCase):
|
||||
Nodes().nodes[0].details.click()
|
||||
NodeInfo().edit_networks.click()
|
||||
|
||||
"""Load default network settings
|
||||
|
||||
Scenario:
|
||||
1. Drag and drop Public network from eth0 to eth1
|
||||
2. Drag and drop Storage network from eth0 to eth2
|
||||
3. Click Apply
|
||||
4. Click Load Defaults
|
||||
5. Verify that Public, Storage, Floating network
|
||||
are on eth0 interface
|
||||
"""
|
||||
|
||||
def test_save_load_defaults(self):
|
||||
with InterfacesSettings() as s:
|
||||
ActionChains(browser.driver).drag_and_drop(
|
||||
@ -181,10 +265,25 @@ class TestConfigureNetworks(BaseTestCase):
|
||||
'floating', s.interfaces[0].networks,
|
||||
'floating at eht0')
|
||||
|
||||
"""Configure interfaces on several nodes
|
||||
|
||||
Scenario:
|
||||
1. Add compute node
|
||||
2. Select compute and controller node
|
||||
and click Configure interfaces
|
||||
3. Drag and drop Public network from eth0 to eth1
|
||||
4. Drag and drop Storage network from eth0 to eth2
|
||||
5. Drag and drop Management network from eth0 to eth1
|
||||
6. Click Apply
|
||||
7. Verify that Public and Management networks
|
||||
are on eth1 interface, Storage is on eth2
|
||||
"""
|
||||
|
||||
def test_configure_interfaces_of_several_nodes(self):
|
||||
# Go back to nodes page
|
||||
Tabs().nodes.click()
|
||||
# Add second node
|
||||
time.sleep(1)
|
||||
Nodes().add_nodes.click()
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
RolesPanel().compute.click()
|
||||
@ -223,6 +322,18 @@ class TestConfigureNetworks(BaseTestCase):
|
||||
'storage', s.interfaces[2].networks,
|
||||
'storage at eht2. Node #{0}'.format(i))
|
||||
|
||||
"""Checking vlan id label when vlan tagging is disabled
|
||||
|
||||
Scenario:
|
||||
1. Open Networks tab
|
||||
2. Disable vlan tagging for Management, Storage, VM(Fixed)
|
||||
3. Open Nodes tab
|
||||
4. Select controller node
|
||||
5. Click configure interfaces
|
||||
6. Verify that 'Vlan Id' isn't visible on Storage,
|
||||
Management, VM(Fixed) network boxes
|
||||
"""
|
||||
|
||||
def test_vlan_id_labels_visibility(self):
|
||||
label = 'VLAN ID'
|
||||
Tabs().networks.click()
|
||||
@ -246,6 +357,19 @@ class TestConfigureNetworks(BaseTestCase):
|
||||
label, s.interfaces[0].networks['vm (fixed)'].text,
|
||||
'vlan id is visible. VM (Fixed) network')
|
||||
|
||||
"""Checking correctness of vlan id on Networks tab
|
||||
|
||||
Scenario:
|
||||
1. Open Networks tab
|
||||
2. Enable vlan tagging for Management, Storage, VM(Fixed)
|
||||
and enter values in range from 110 to 200
|
||||
3. Open Nodes tab
|
||||
4. Select controller node
|
||||
5. Click configure interfaces
|
||||
6. Verify that 'Vlan Id' values are correct on Storage,
|
||||
Management, VM(Fixed) network boxes
|
||||
"""
|
||||
|
||||
def test_vlan_id_values(self):
|
||||
label = 'VLAN ID: {0}'
|
||||
vlans = [random.randint(110, 200) for i in range(3)]
|
||||
@ -268,14 +392,14 @@ class TestConfigureNetworks(BaseTestCase):
|
||||
NodeInfo().edit_networks.click()
|
||||
with InterfacesSettings() as s:
|
||||
self.assertIn(
|
||||
label.format(vlans[0]),
|
||||
s.interfaces[0].networks['management'].text,
|
||||
label.format(vlans[0]), s.interfaces[0].
|
||||
networks['management'].text,
|
||||
'vlan id is correct. Management network')
|
||||
self.assertIn(
|
||||
label.format(vlans[1]),
|
||||
s.interfaces[0].networks['storage'].text,
|
||||
label.format(vlans[1]), s.interfaces[0].
|
||||
networks['storage'].text,
|
||||
'vlan id is correct. Storage network')
|
||||
self.assertIn(
|
||||
label.format(vlans[2]),
|
||||
s.interfaces[0].networks['vm (fixed)'].text,
|
||||
label.format(vlans[2]), s.interfaces[0].
|
||||
networks['vm (fixed)'].text,
|
||||
'vlan id is correct. VM (Fixed) network')
|
||||
|
@ -16,6 +16,13 @@ class TestDeploy(BaseTestCase):
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Create simple environment with default values
|
||||
2. Click on created environment
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.clear_nailgun_database()
|
||||
BaseTestCase.setUp(self)
|
||||
@ -23,6 +30,14 @@ class TestDeploy(BaseTestCase):
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
time.sleep(1)
|
||||
|
||||
"""Deploy environment with controller and compute nodes
|
||||
|
||||
Scenario:
|
||||
1. Add controller and compute node
|
||||
2. Deploy changes
|
||||
3. Verify that nodes statuses are ready
|
||||
"""
|
||||
|
||||
def test_add_nodes(self):
|
||||
Nodes().add_nodes.click()
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
@ -51,6 +66,16 @@ class TestDeploy(BaseTestCase):
|
||||
self.assertEqual('ready', node.status.text.lower(),
|
||||
'Node status is READY')
|
||||
|
||||
"""Delete one node and deploy changes
|
||||
|
||||
Scenario:
|
||||
1. Add controller and compute node
|
||||
2. Deploy changes
|
||||
3. Delete one node
|
||||
4. Deploy changes
|
||||
5. Verify that only one node is present
|
||||
"""
|
||||
|
||||
def test_delete_node(self):
|
||||
self.test_add_nodes()
|
||||
|
||||
@ -76,6 +101,17 @@ class TestDeploy(BaseTestCase):
|
||||
self.assertEqual('ready', node.status.text.lower(),
|
||||
'Node status is READY')
|
||||
|
||||
"""Configure network interfaces after deploy
|
||||
|
||||
Scenario:
|
||||
1. Add controller node
|
||||
2. Deploy changes
|
||||
3. Select controller node and click configure interfaces
|
||||
4. Drag and drop Storage network to eth1
|
||||
5. Verify that Storage network can't be dragged and dropped
|
||||
6. Apply, Load defaults, Cancel Changes buttons are not active
|
||||
"""
|
||||
|
||||
def test_node_configure_networks_is_readonly(self):
|
||||
Nodes().add_nodes.click()
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
@ -104,6 +140,16 @@ class TestDeploy(BaseTestCase):
|
||||
self.assertFalse(s.cancel_changes.is_enabled(),
|
||||
'Cancel changes is disabled')
|
||||
|
||||
"""Configure disks after deploy
|
||||
|
||||
Scenario:
|
||||
1. Add controller node
|
||||
2. Deploy changes
|
||||
3. Select controller node and click configure disks
|
||||
4. Verify that volume inputs are disabled
|
||||
6. Apply, Load defaults, Cancel Changes buttons are not active
|
||||
"""
|
||||
|
||||
def test_node_configure_disks_is_readonly(self):
|
||||
Nodes().add_nodes.click()
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
|
@ -11,6 +11,14 @@ class TestDiscardEnvironmentChanges(BaseTestCase):
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Create simple environment with default values
|
||||
2. Click on created environment
|
||||
3. Deploy environment with 1 controller and 2 compute nodes
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.clear_nailgun_database()
|
||||
BaseTestCase.setUp(self)
|
||||
@ -31,6 +39,14 @@ class TestDiscardEnvironmentChanges(BaseTestCase):
|
||||
self.assertEqual('ready', node.status.text.lower(),
|
||||
'Node status is READY')
|
||||
|
||||
"""Discard changes after adding new node
|
||||
|
||||
Scenario:
|
||||
1. Add compute node
|
||||
2. Discard changes
|
||||
3. Verify that there are 3 nodes and their statuses are ready
|
||||
"""
|
||||
|
||||
def test_discard_adding_node(self):
|
||||
Nodes().add_nodes.click()
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
@ -39,6 +55,14 @@ class TestDiscardEnvironmentChanges(BaseTestCase):
|
||||
time.sleep(1)
|
||||
self._discard_changes()
|
||||
|
||||
"""Discard changes after deleting node
|
||||
|
||||
Scenario:
|
||||
1. Delete one compute node
|
||||
2. Discard changes
|
||||
3. Verify that there are 3 nodes and their statuses are ready
|
||||
"""
|
||||
|
||||
def test_discard_deleting_node(self):
|
||||
with Nodes() as n:
|
||||
n.nodes[1].checkbox.click()
|
||||
|
@ -1,15 +1,20 @@
|
||||
import time
|
||||
import random
|
||||
from pageobjects.environments import Environments
|
||||
from pageobjects.environments import Wizard
|
||||
from pageobjects.environments import Environments, Wizard
|
||||
from pageobjects.settings import Settings
|
||||
from pageobjects.tabs import Tabs
|
||||
from settings import OPENSTACK_CENTOS, OPENSTACK_RELEASE_CENTOS
|
||||
from tests.base import BaseTestCase
|
||||
from fuelweb_ui_test.settings import OPENSTACK_CENTOS
|
||||
from fuelweb_ui_test.settings import OPENSTACK_RELEASE_CENTOS
|
||||
|
||||
|
||||
class BaseClass(BaseTestCase):
|
||||
|
||||
"""Global precondition
|
||||
|
||||
Steps:
|
||||
1. Create simple environment with Neutron with GRE segmentation
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
@ -26,6 +31,13 @@ class BaseClass(BaseTestCase):
|
||||
w.create.click()
|
||||
w.wait_until_exists()
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Click on created environment
|
||||
2. Open Settings tab
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.setUp(self)
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
@ -94,12 +106,41 @@ class BaseClass(BaseTestCase):
|
||||
|
||||
class TestAccess(BaseClass):
|
||||
|
||||
"""Change username
|
||||
|
||||
Scenario:
|
||||
1. Enter new username
|
||||
2. Save settings
|
||||
3. Verify that username is correctly saved
|
||||
4. Click Load defaults
|
||||
5. Verify that previous username is displayed
|
||||
"""
|
||||
|
||||
def test_username(self):
|
||||
self._test_text_field('username', 'newname')
|
||||
|
||||
"""Change password
|
||||
|
||||
Scenario:
|
||||
1. Enter new password
|
||||
2. Save settings
|
||||
3. Verify that password is correctly saved
|
||||
4. Click Load defaults
|
||||
5. Verify that previous password is activated
|
||||
"""
|
||||
|
||||
def test_password(self):
|
||||
self._test_text_field('password', 'newpassword')
|
||||
|
||||
"""Show password feature
|
||||
|
||||
Scenario:
|
||||
1. Click show password button
|
||||
2. Verify that text of the password is displayed
|
||||
3. Click on show password button again
|
||||
4. Verify that password text isn't displayed
|
||||
"""
|
||||
|
||||
def test_password_show(self):
|
||||
with Settings() as s:
|
||||
s.show_password.click()
|
||||
@ -107,83 +148,303 @@ class TestAccess(BaseClass):
|
||||
s.show_password.click()
|
||||
self.assertEqual(s.password.get_attribute('type'), 'password')
|
||||
|
||||
"""Change tenant
|
||||
|
||||
Scenario:
|
||||
1. Enter new tenant
|
||||
2. Save settings
|
||||
3. Verify that tenant is correctly saved
|
||||
4. Click Load defaults
|
||||
5. Verify that previous tenant name is displayed
|
||||
"""
|
||||
|
||||
def test_tenant(self):
|
||||
self._test_text_field('tenant', 'newtenant')
|
||||
|
||||
"""Change email
|
||||
|
||||
Scenario:
|
||||
1. Enter new email
|
||||
2. Save settings
|
||||
3. Verify that email is correctly saved
|
||||
4. Click Load defaults
|
||||
5. Verify that previous email is displayed
|
||||
"""
|
||||
|
||||
def test_email(self):
|
||||
self._test_text_field('email', 'newemail@example.org')
|
||||
|
||||
|
||||
class TestAdditionalComponents(BaseClass):
|
||||
|
||||
"""Install Savanna component
|
||||
|
||||
Scenario:
|
||||
1. Click on Install Savanna checkbox
|
||||
2. Save settings
|
||||
3. Verify that Install Savanna checkbox is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that Install Savanna checkbox is not selected
|
||||
"""
|
||||
|
||||
def test_savanna(self):
|
||||
self._test_tumbler_field('install_savanna')
|
||||
|
||||
"""Install Murano component
|
||||
|
||||
Scenario:
|
||||
1. Click on Install Murano checkbox
|
||||
2. Save settings
|
||||
3. Verify that Install Murano checkbox is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that Install Murano checkbox is not selected
|
||||
"""
|
||||
|
||||
def test_murano(self):
|
||||
self._test_tumbler_field('install_murano')
|
||||
|
||||
"""Install Ceilometer component
|
||||
|
||||
Scenario:
|
||||
1. Click on Install Ceilometer checkbox
|
||||
2. Save settings
|
||||
3. Verify that Install Ceilometer checkbox is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that Install Ceilometer checkbox is not selected
|
||||
"""
|
||||
|
||||
def test_ceilometer(self):
|
||||
self._test_tumbler_field('install_ceilometer')
|
||||
|
||||
|
||||
class TestCommon(BaseClass):
|
||||
|
||||
"""Enable OpenStack debug logging
|
||||
|
||||
Scenario:
|
||||
1. Click on OpenStack debug logging checkbox
|
||||
2. Save settings
|
||||
3. Verify that OpenStack debug logging checkbox is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that OpenStack debug logging checkbox is not selected
|
||||
"""
|
||||
|
||||
def test_debug(self):
|
||||
self._test_tumbler_field('debug')
|
||||
|
||||
"""Change hypervisor type
|
||||
|
||||
Scenario:
|
||||
1. Select hypervisor type 'KVM'
|
||||
2. Save settings
|
||||
3. Verify that KVM hypervisor type is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that QEMU hypervisor is selected
|
||||
"""
|
||||
|
||||
def test_hypervisor_type(self):
|
||||
self._test_radio_group(['hypervisor_qemu', 'hypervisor_kvm'])
|
||||
|
||||
"""Enable Auto assign floating IP
|
||||
|
||||
Scenario:
|
||||
1. Click on Auto assign floating IP checkbox
|
||||
2. Save settings
|
||||
3. Verify that Auto assign floating IP checkbox is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that Auto assign floating IP checkbox is not selected
|
||||
"""
|
||||
|
||||
def test_assign_ip(self):
|
||||
self._test_tumbler_field('assign_ip')
|
||||
|
||||
"""Change scheduler driver
|
||||
|
||||
Scenario:
|
||||
1. Select 'Simple scheduler' radio button
|
||||
2. Save settings
|
||||
3. Verify that 'Simple scheduler' is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that 'Filter scheduler' is selected
|
||||
"""
|
||||
|
||||
def test_scheduler_driver(self):
|
||||
self._test_radio_group(['filter_scheduler', 'simple_scheduler'])
|
||||
|
||||
"""Enable VSwitch VLAN splinters
|
||||
|
||||
Scenario:
|
||||
1. Select 'OVS VLAN splinters soft trunks' radio button
|
||||
2. Save settings
|
||||
3. Verify that 'OVS VLAN splinters soft trunks' is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that 'Disabled' is selected
|
||||
"""
|
||||
|
||||
def test_vlan_splinters(self):
|
||||
self._test_radio_group(
|
||||
['vlan_splinters_disabled',
|
||||
'vlan_splinters_soft',
|
||||
['vlan_splinters_disabled', 'vlan_splinters_soft',
|
||||
'vlan_splinters_hard'])
|
||||
|
||||
"""Enable 'Use qcow format for images'
|
||||
|
||||
Scenario:
|
||||
1. Click on 'Use qcow format for images' checkbox
|
||||
2. Save settings
|
||||
3. Verify that 'Use qcow format for images' checkbox is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that 'Use qcow format for images'
|
||||
checkbox is not selected
|
||||
"""
|
||||
|
||||
def test_use_cow_images(self):
|
||||
self._test_tumbler_field('use_cow_images')
|
||||
|
||||
"""Enable 'Start guests on host boot'
|
||||
|
||||
Scenario:
|
||||
1. Click on 'Start guests on host boot' checkbox
|
||||
2. Save settings
|
||||
3. Verify that 'Start guests on host boot' checkbox is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that 'Start guests on host boot' checkbox is not selected
|
||||
"""
|
||||
|
||||
def test_start_guests(self):
|
||||
self._test_tumbler_field('start_guests')
|
||||
|
||||
"""Change authorization key
|
||||
|
||||
Scenario:
|
||||
1. Enter new authorization key
|
||||
2. Save settings
|
||||
3. Verify that authorization key is correctly saved
|
||||
4. Click Load defaults
|
||||
5. Verify that default authorization key is active
|
||||
"""
|
||||
|
||||
def test_auth_key(self):
|
||||
self._test_text_field('auth_key', 'newauthkey')
|
||||
|
||||
|
||||
class TestSyslog(BaseClass):
|
||||
|
||||
"""Change hostname
|
||||
|
||||
Scenario:
|
||||
1. Enter new hostname
|
||||
2. Save settings
|
||||
3. Verify that hostname is correctly saved
|
||||
4. Click Load defaults
|
||||
5. Verify that default hostname is displayed
|
||||
"""
|
||||
|
||||
def test_hostname(self):
|
||||
self._test_text_field('syslog_server', 'newsyslog_server')
|
||||
|
||||
"""Change port
|
||||
|
||||
Scenario:
|
||||
1. Enter new port value
|
||||
2. Save settings
|
||||
3. Verify that port value is correctly saved
|
||||
4. Click Load defaults
|
||||
5. Verify that default port value is displayed
|
||||
"""
|
||||
|
||||
def test_port(self):
|
||||
self._test_text_field('syslog_port', '8000')
|
||||
|
||||
"""Change syslog transport protocol
|
||||
|
||||
Scenario:
|
||||
1. Select 'TCP' radio button
|
||||
2. Save settings
|
||||
3. Verify that 'TCP' is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that 'UDP' is selected
|
||||
"""
|
||||
|
||||
def test_syslog_protocol(self):
|
||||
self._test_radio_group(['syslog_udp', 'syslog_tcp'])
|
||||
|
||||
|
||||
class TestStorage(BaseClass):
|
||||
|
||||
"""Enable 'Cinder LVM'
|
||||
|
||||
Scenario:
|
||||
1. Click on 'Cinder LVM' checkbox
|
||||
2. Save settings
|
||||
3. Verify that 'Cinder LVM' checkbox is not selected
|
||||
4. Click Load defaults
|
||||
5. Verify that 'Cinder LVM' checkbox is selected
|
||||
"""
|
||||
|
||||
def test_cinder_for_volumes(self):
|
||||
self._test_tumbler_field('cinder_for_volumes')
|
||||
|
||||
"""Enable 'Ceph for volumes'
|
||||
|
||||
Scenario:
|
||||
1. Click on 'Ceph for volumes' checkbox
|
||||
2. Save settings
|
||||
3. Verify that 'Ceph for volumes' checkbox is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that 'Ceph for volumes' checkbox is not selected
|
||||
"""
|
||||
|
||||
def test_ceph_for_volumes(self):
|
||||
self._test_tumbler_field('ceph_for_volumes')
|
||||
|
||||
"""Enable 'Ceph for images'
|
||||
|
||||
Scenario:
|
||||
1. Click on 'Ceph for images' checkbox
|
||||
2. Save settings
|
||||
3. Verify that 'Ceph for images' checkbox is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that 'Ceph for images' checkbox is not selected
|
||||
"""
|
||||
|
||||
def test_ceph_for_images(self):
|
||||
self._test_tumbler_field('ceph_for_images')
|
||||
|
||||
"""Enable 'Ceph for ephemeral'
|
||||
|
||||
Scenario:
|
||||
1. Click on 'Ceph for ephemeral' checkbox
|
||||
2. Save settings
|
||||
3. Verify that 'Ceph for ephemeral' checkbox is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that 'Ceph for ephemeral' checkbox is not selected
|
||||
"""
|
||||
|
||||
def test_ceph_ephemeral(self):
|
||||
self._test_tumbler_field('ceph_ephemeral')
|
||||
|
||||
"""Enable 'Ceph RadosGW for objects'
|
||||
|
||||
Scenario:
|
||||
1. Click on 'Ceph RadosGW for objects' checkbox
|
||||
2. Save settings
|
||||
3. Verify that 'Ceph RadosGW for objects' checkbox is selected
|
||||
4. Click Load defaults
|
||||
5. Verify that 'Ceph RadosGW for objects' checkbox is not selected
|
||||
"""
|
||||
|
||||
def test_ceph_rados_gw(self):
|
||||
self._test_tumbler_field('ceph_rados_gw')
|
||||
|
||||
"""Change ceph factor
|
||||
|
||||
Scenario:
|
||||
1. Enter new ceph factor
|
||||
2. Save settings
|
||||
3. Verify that ceph factor value is correctly saved
|
||||
4. Click Load defaults
|
||||
5. Verify that default ceph factor value is displayed
|
||||
"""
|
||||
|
||||
def test_ceph_factor(self):
|
||||
self._test_text_field('ceph_factor', '10')
|
||||
|
@ -3,23 +3,35 @@ from pageobjects.base import PageObject
|
||||
from pageobjects.environments import Environments, Wizard
|
||||
from pageobjects.header import Header
|
||||
from pageobjects.releases import Releases
|
||||
from settings import OPENSTACK_RELEASE_CENTOS
|
||||
from settings import OPENSTACK_RELEASE_UBUNTU, OPENSTACK_RELEASE_REDHAT
|
||||
from settings import OPENSTACK_REDHAT, REDHAT_USERNAME, REDHAT_PASSWORD
|
||||
from settings import REDHAT_SATELLITE, REDHAT_ACTIVATION_KEY
|
||||
from tests.base import BaseTestCase
|
||||
from fuelweb_ui_test.settings import OPENSTACK_RELEASE_CENTOS
|
||||
from fuelweb_ui_test.settings import OPENSTACK_RELEASE_UBUNTU
|
||||
from fuelweb_ui_test.settings import OPENSTACK_RELEASE_REDHAT
|
||||
from fuelweb_ui_test.settings import REDHAT_USERNAME
|
||||
from fuelweb_ui_test.settings import REDHAT_PASSWORD
|
||||
from fuelweb_ui_test.settings import OPENSTACK_REDHAT
|
||||
from fuelweb_ui_test.settings import REDHAT_SATELLITE
|
||||
from fuelweb_ui_test.settings import REDHAT_ACTIVATION_KEY
|
||||
|
||||
|
||||
class TestEnvWizard(BaseTestCase):
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Click on create environment
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.setUp(self)
|
||||
Environments().create_cluster_box.click()
|
||||
|
||||
"""Test environment name
|
||||
|
||||
Scenario:
|
||||
1. Enter Environment name
|
||||
2. Click next and then previous button
|
||||
3. Verify that correct name is displayed
|
||||
4. Clear environment name and click next
|
||||
5. Verify that message 'Environment name cannot be empty' appears
|
||||
"""
|
||||
|
||||
def test_name_field(self):
|
||||
with Wizard() as w:
|
||||
w.name.send_keys(OPENSTACK_RELEASE_CENTOS)
|
||||
@ -33,6 +45,17 @@ class TestEnvWizard(BaseTestCase):
|
||||
'Environment name cannot be empty',
|
||||
w.name.find_element_by_xpath('..').text)
|
||||
|
||||
"""Test existing environment name
|
||||
|
||||
Scenario:
|
||||
1. Create environment with 'test name'
|
||||
2. Click create environment again
|
||||
3. Enter 'test name'
|
||||
4. Click next button
|
||||
5. Verify that message 'Environment with name test name
|
||||
already exists' appears
|
||||
"""
|
||||
|
||||
def test_name_exists(self):
|
||||
name = 'test name'
|
||||
with Wizard() as w:
|
||||
@ -51,6 +74,16 @@ class TestEnvWizard(BaseTestCase):
|
||||
format(name),
|
||||
w.name.find_element_by_xpath('..').text)
|
||||
|
||||
"""Test environment release field
|
||||
|
||||
Scenario:
|
||||
1. Enter environment name
|
||||
2. Select Havana on Ubuntu in release list
|
||||
3. Click next button
|
||||
4. Click previous button
|
||||
5. Verify that correct release is selected
|
||||
"""
|
||||
|
||||
def test_release_field(self):
|
||||
with Wizard() as w:
|
||||
w.name.send_keys(OPENSTACK_RELEASE_UBUNTU)
|
||||
@ -60,6 +93,18 @@ class TestEnvWizard(BaseTestCase):
|
||||
self.assertEqual(w.release.first_selected_option.text,
|
||||
OPENSTACK_RELEASE_UBUNTU)
|
||||
|
||||
"""Test validation of empty RHEL form
|
||||
|
||||
Scenario:
|
||||
1. Enter environment name
|
||||
2. Select RHOS for RHEL in release list
|
||||
3. Click next button
|
||||
4. Verify that 'Invalid username' and 'Invalid password'
|
||||
messages appear
|
||||
5. Select RHN Satellite license and click next
|
||||
6. Verify that error messages appear
|
||||
"""
|
||||
|
||||
def test_rhel_empty_form(self):
|
||||
with Wizard() as w:
|
||||
w.name.send_keys(OPENSTACK_RELEASE_REDHAT)
|
||||
@ -84,6 +129,18 @@ class TestEnvWizard(BaseTestCase):
|
||||
'Invalid activation key',
|
||||
w.redhat_activation_key.find_element_by_xpath('..').text)
|
||||
|
||||
"""Test RHEL form on presence of necessary fields
|
||||
|
||||
Scenario:
|
||||
1. Enter environment name
|
||||
2. Select RHOS for RHEL in release list
|
||||
3. Verify all necessary fields exist
|
||||
4. Select RHN Satellite license
|
||||
5. Verify satellite and activation key fields appear
|
||||
6. Select RHSM radio button
|
||||
7. Verify satellite and activation key fields disappear
|
||||
"""
|
||||
|
||||
def test_rhel_form(self):
|
||||
with Wizard() as w:
|
||||
w.name.send_keys(OPENSTACK_RELEASE_REDHAT)
|
||||
@ -101,6 +158,16 @@ class TestEnvWizard(BaseTestCase):
|
||||
self.assertFalse(w.redhat_satellite.is_displayed())
|
||||
self.assertFalse(w.redhat_activation_key.is_displayed())
|
||||
|
||||
"""Test development mode
|
||||
|
||||
Scenario:
|
||||
1. Enter environment name
|
||||
2. Select Havana on Ubuntu in release list and click next
|
||||
3. Select HA mode and click next
|
||||
4. Click previous
|
||||
5. Verify HA mode is selected
|
||||
"""
|
||||
|
||||
def test_mode_radios(self):
|
||||
with Wizard() as w:
|
||||
w.name.send_keys(OPENSTACK_RELEASE_UBUNTU)
|
||||
@ -109,12 +176,21 @@ class TestEnvWizard(BaseTestCase):
|
||||
w.mode_ha_compact.click()
|
||||
w.next.click()
|
||||
w.prev.click()
|
||||
self.assertTrue(
|
||||
w.mode_ha_compact.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertFalse(
|
||||
w.mode_multinode.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(w.mode_ha_compact.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertFalse(w.mode_multinode.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
|
||||
"""Select environment hypervisor
|
||||
|
||||
Scenario:
|
||||
1. Enter environment name
|
||||
2. Select Havana on Ubuntu in release list and click next
|
||||
3. Click next again
|
||||
4. Select KVM hypervisor and click next
|
||||
5. Click previous
|
||||
6. Verify KVM is selected
|
||||
"""
|
||||
|
||||
def test_hypervisor_radios(self):
|
||||
with Wizard() as w:
|
||||
@ -125,12 +201,21 @@ class TestEnvWizard(BaseTestCase):
|
||||
w.hypervisor_qemu.click()
|
||||
w.next.click()
|
||||
w.prev.click()
|
||||
self.assertTrue(
|
||||
w.hypervisor_qemu.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertFalse(
|
||||
w.hypervisor_kvm.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(w.hypervisor_qemu.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertFalse(w.hypervisor_kvm.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
|
||||
"""Select environment network
|
||||
|
||||
Scenario:
|
||||
1. Enter environment name
|
||||
2. Select Havana on Ubuntu in release list
|
||||
and click next three times
|
||||
3. Select Neutron with GRE segmentation
|
||||
4. Click next and click previous button
|
||||
5. Verify Neutron with GRE network is selected
|
||||
"""
|
||||
|
||||
def test_network_radios(self):
|
||||
with Wizard() as w:
|
||||
@ -142,24 +227,30 @@ class TestEnvWizard(BaseTestCase):
|
||||
w.network_neutron_gre.click()
|
||||
w.next.click()
|
||||
w.prev.click()
|
||||
self.assertFalse(
|
||||
w.network_nova.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(
|
||||
w.network_neutron_gre.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertFalse(
|
||||
w.network_neutron_vlan.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertFalse(w.network_nova.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(w.network_neutron_gre.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertFalse(w.network_neutron_vlan.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
w.network_neutron_vlan.click()
|
||||
self.assertFalse(
|
||||
w.network_nova.find_element_by_tag_name('input').is_selected())
|
||||
self.assertFalse(
|
||||
w.network_neutron_gre.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(
|
||||
w.network_neutron_vlan.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertFalse(w.network_nova.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertFalse(w.network_neutron_gre.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(w.network_neutron_vlan.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
|
||||
"""Select environment storage
|
||||
|
||||
Scenario:
|
||||
1. Enter environment name
|
||||
2. Select Havana on Ubuntu in release list
|
||||
and click next four times
|
||||
3. Select Ceph for Cinder and Glance
|
||||
4. Click next and click previous button
|
||||
5. Verify Ceph options are selected
|
||||
"""
|
||||
|
||||
def test_storage_radios(self):
|
||||
with Wizard() as w:
|
||||
@ -173,18 +264,27 @@ class TestEnvWizard(BaseTestCase):
|
||||
w.storage_glance_ceph.click()
|
||||
w.next.click()
|
||||
w.prev.click()
|
||||
self.assertFalse(
|
||||
w.storage_cinder_default.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(
|
||||
w.storage_cinder_ceph.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertFalse(
|
||||
w.storage_glance_default.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(
|
||||
w.storage_glance_ceph.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertFalse(w.storage_cinder_default.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(w.storage_cinder_ceph.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertFalse(w.storage_glance_default.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(w.storage_glance_ceph.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
|
||||
"""Select environment additional services
|
||||
|
||||
Scenario:
|
||||
1. Enter environment name
|
||||
2. Select Havana on Ubuntu in release list and
|
||||
click next three times
|
||||
3. Select Neutron with GRE network
|
||||
4. Click next two times
|
||||
5. Select install Savanna, Murano, Ceilometer
|
||||
6. Click next and previous button
|
||||
7. Verify checkboxes are selected
|
||||
"""
|
||||
|
||||
def test_services_checkboxes(self):
|
||||
with Wizard() as w:
|
||||
@ -201,15 +301,27 @@ class TestEnvWizard(BaseTestCase):
|
||||
w.install_ceilometer.click()
|
||||
w.next.click()
|
||||
w.prev.click()
|
||||
self.assertTrue(
|
||||
w.install_savanna.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(
|
||||
w.install_murano.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(
|
||||
w.install_ceilometer.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(w.install_savanna.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(w.install_murano.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(w.install_ceilometer.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
|
||||
"""Cancel environment wizard
|
||||
|
||||
Scenario:
|
||||
1. Enter environment name
|
||||
2. Select Havana on Ubuntu in release list and click next
|
||||
3. Select HA mode and click next
|
||||
4. Select KVM hypervisor and click next
|
||||
5. Select Neutron with GRE and click next
|
||||
6. Select Ceph options for Cinder and Glance and click next
|
||||
7. Select install Savanna, Murano and click next
|
||||
8. Click cancel button
|
||||
9. Click create environment again and check that
|
||||
all default values are selected
|
||||
"""
|
||||
|
||||
def test_cancel_button(self):
|
||||
with Wizard() as w:
|
||||
@ -238,40 +350,50 @@ class TestEnvWizard(BaseTestCase):
|
||||
OPENSTACK_RELEASE_CENTOS)
|
||||
w.name.send_keys(OPENSTACK_RELEASE_UBUNTU)
|
||||
w.next.click()
|
||||
self.assertTrue(
|
||||
w.mode_multinode.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(w.mode_multinode.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
w.next.click()
|
||||
self.assertTrue(
|
||||
w.hypervisor_qemu.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(w.hypervisor_qemu.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
w.next.click()
|
||||
self.assertTrue(
|
||||
w.network_nova.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(w.network_nova.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
w.next.click()
|
||||
self.assertTrue(
|
||||
w.storage_cinder_default.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(
|
||||
w.storage_glance_default.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(w.storage_cinder_default.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(w.storage_glance_default.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
w.next.click()
|
||||
self.assertFalse(
|
||||
w.install_savanna.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertFalse(
|
||||
w.install_murano.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertFalse(w.install_savanna.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertFalse(w.install_murano.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
|
||||
|
||||
class TestEnvWizardRedHat(BaseTestCase):
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Click on create environment
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.clear_nailgun_database()
|
||||
BaseTestCase.setUp(self)
|
||||
Environments().create_cluster_box.click()
|
||||
|
||||
"""Download RHEL and RHOS by RHSM
|
||||
|
||||
Scenario:
|
||||
1. Enter environment name
|
||||
2. Select RHOS in release list
|
||||
3. Enter Redhat username and password
|
||||
4. Click next till the end and click create
|
||||
5. Open releases tab
|
||||
6. Verify that RHOS status is active
|
||||
"""
|
||||
|
||||
def test_rhsm(self):
|
||||
with Wizard() as w:
|
||||
w.name.send_keys(OPENSTACK_RELEASE_REDHAT)
|
||||
@ -291,6 +413,19 @@ class TestEnvWizardRedHat(BaseTestCase):
|
||||
'Active', r.dict[OPENSTACK_REDHAT].status.text,
|
||||
'RHOS status is active')
|
||||
|
||||
"""Download RHEL and RHOS by RHN satellite
|
||||
|
||||
Scenario:
|
||||
1. Enter environment name
|
||||
2. Select RHOS in release list
|
||||
3. Select RHN option
|
||||
4. Enter Redhat username and password, satellite
|
||||
hostname and activation key
|
||||
5. Click next till the end and click create
|
||||
6. Open releases tab
|
||||
7. Verify that RHOS status is active
|
||||
"""
|
||||
|
||||
def test_rhn_satellite(self):
|
||||
with Wizard() as w:
|
||||
w.name.send_keys(OPENSTACK_RELEASE_REDHAT)
|
||||
|
@ -1,20 +1,37 @@
|
||||
import time
|
||||
from pageobjects.environments import Environments, Wizard
|
||||
from pageobjects.networks import Networks, NeutronParameters
|
||||
from pageobjects.nodes import Nodes
|
||||
from pageobjects.settings import Settings
|
||||
from pageobjects.tabs import Tabs
|
||||
from settings import OPENSTACK_CENTOS, OPENSTACK_RELEASE_CENTOS
|
||||
from tests.base import BaseTestCase
|
||||
from fuelweb_ui_test.settings import OPENSTACK_CENTOS
|
||||
from fuelweb_ui_test.settings import OPENSTACK_RELEASE_CENTOS
|
||||
|
||||
|
||||
class TestEnvironment(BaseTestCase):
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Click on create environment
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
self.clear_nailgun_database()
|
||||
BaseTestCase.setUp(self)
|
||||
Environments().create_cluster_box.click()
|
||||
|
||||
"""Create default environment
|
||||
|
||||
Scenario:
|
||||
1. Create environment with default values
|
||||
2. Click on created environment
|
||||
3. Verify that correct environment name is displayed
|
||||
4. Click on information icon and verify all
|
||||
information is displayed correctly
|
||||
5. Verify all info on Networks and Settings tab
|
||||
"""
|
||||
|
||||
def test_default_settings(self):
|
||||
with Wizard() as w:
|
||||
w.name.send_keys(OPENSTACK_CENTOS)
|
||||
@ -29,6 +46,7 @@ class TestEnvironment(BaseTestCase):
|
||||
cb.click()
|
||||
|
||||
with Nodes() as n:
|
||||
time.sleep(1)
|
||||
self.assertEqual(n.env_name.text, OPENSTACK_CENTOS)
|
||||
n.info_icon.click()
|
||||
self.assertIn('display: block;',
|
||||
@ -42,25 +60,30 @@ class TestEnvironment(BaseTestCase):
|
||||
n.env_details.get_attribute('style'))
|
||||
Tabs().networks.click()
|
||||
with Networks() as n:
|
||||
self.assertTrue(
|
||||
n.flatdhcp_manager.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(n.flatdhcp_manager.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
Tabs().settings.click()
|
||||
with Settings() as s:
|
||||
self.assertFalse(
|
||||
s.install_savanna.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertFalse(
|
||||
s.install_murano.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertFalse(
|
||||
s.install_ceilometer.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(
|
||||
s.hypervisor_qemu.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertFalse(s.install_savanna.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertFalse(s.install_murano.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertFalse(s.install_ceilometer.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(s.hypervisor_qemu.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
pass
|
||||
|
||||
"""Create environment with HA mode
|
||||
|
||||
Scenario:
|
||||
1. Create environment with HA mode
|
||||
2. Click on created environment
|
||||
3. Verify that correct environment name is displayed
|
||||
4. Click on information icon and verify
|
||||
all information is displayed correctly
|
||||
"""
|
||||
|
||||
def test_ha_mode(self):
|
||||
with Wizard() as w:
|
||||
w.name.send_keys(OPENSTACK_CENTOS)
|
||||
@ -81,6 +104,15 @@ class TestEnvironment(BaseTestCase):
|
||||
self.assertIn(OPENSTACK_CENTOS, n.env_details.text)
|
||||
self.assertIn('Multi-node with HA', n.env_details.text)
|
||||
|
||||
"""Create environment with KVM hypervisor
|
||||
|
||||
Scenario:
|
||||
1. Create environment with KVM hypervisor
|
||||
2. Click on created environment
|
||||
3. Open settings tab
|
||||
4. Verify KVM hypervisor is selected
|
||||
"""
|
||||
|
||||
def test_hypervisor_kvm(self):
|
||||
with Wizard() as w:
|
||||
w.name.send_keys(OPENSTACK_CENTOS)
|
||||
@ -98,9 +130,18 @@ class TestEnvironment(BaseTestCase):
|
||||
Tabs().settings.click()
|
||||
|
||||
with Settings() as s:
|
||||
self.assertTrue(
|
||||
s.hypervisor_kvm.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(s.hypervisor_kvm.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
|
||||
"""Create environment with Neutron GRE network
|
||||
|
||||
Scenario:
|
||||
1. Create environment with Neutron GRE network
|
||||
2. Click on created environment
|
||||
3. Open networks tab
|
||||
4. Verify Neutron parameters are displayed and
|
||||
Neutron with gre segmentation text is displayed
|
||||
"""
|
||||
|
||||
def test_neutron_gre(self):
|
||||
with Wizard() as w:
|
||||
@ -123,6 +164,16 @@ class TestEnvironment(BaseTestCase):
|
||||
'Neutron with gre segmentation')
|
||||
self.assertTrue(NeutronParameters().parent.is_displayed())
|
||||
|
||||
"""Create environment with Neutron VLAN network
|
||||
|
||||
Scenario:
|
||||
1. Create environment with Neutron VLAN network
|
||||
2. Click on created environment
|
||||
3. Open networks tab
|
||||
4. Verify Neutron parameters are displayed and
|
||||
Neutron with vlan segmentation text is displayed
|
||||
"""
|
||||
|
||||
def test_neutron_vlan(self):
|
||||
with Wizard() as w:
|
||||
w.name.send_keys(OPENSTACK_CENTOS)
|
||||
@ -144,6 +195,16 @@ class TestEnvironment(BaseTestCase):
|
||||
'Neutron with vlan segmentation')
|
||||
self.assertTrue(NeutronParameters().parent.is_displayed())
|
||||
|
||||
"""Create environment with Ceph storage
|
||||
|
||||
Scenario:
|
||||
1. Create environment with Ceph storage for Cinder and Glance
|
||||
2. Click on created environment
|
||||
3. Open settings tab
|
||||
4. Verify that Cinder for volumes, Ceph for volumes
|
||||
and images are selected, Ceph for rados isn't selected
|
||||
"""
|
||||
|
||||
def test_storage_ceph(self):
|
||||
with Wizard() as w:
|
||||
w.name.send_keys(OPENSTACK_CENTOS)
|
||||
@ -162,18 +223,25 @@ class TestEnvironment(BaseTestCase):
|
||||
Tabs().settings.click()
|
||||
|
||||
with Settings() as s:
|
||||
self.assertTrue(
|
||||
s.cinder_for_volumes.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(
|
||||
s.ceph_for_volumes.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(
|
||||
s.ceph_for_images.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertFalse(
|
||||
s.ceph_rados_gw.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(s.cinder_for_volumes.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(s.ceph_for_volumes.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(s.ceph_for_images.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertFalse(s.ceph_rados_gw.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
|
||||
"""Create environment with Savanna, Murano, Ceilometer selected
|
||||
|
||||
Scenario:
|
||||
1. Create environment with Install Savanna,
|
||||
Murano, Ceilometer selected
|
||||
2. Click on created environment
|
||||
3. Open settings tab
|
||||
4. Verify that Install Savanna, Murano,
|
||||
Ceilometer checkboxes are selected
|
||||
"""
|
||||
|
||||
def test_services(self):
|
||||
with Wizard() as w:
|
||||
@ -196,12 +264,9 @@ class TestEnvironment(BaseTestCase):
|
||||
Tabs().settings.click()
|
||||
|
||||
with Settings() as s:
|
||||
self.assertTrue(
|
||||
s.install_savanna.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(
|
||||
s.install_murano.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(
|
||||
s.install_ceilometer.find_element_by_tag_name('input').
|
||||
is_selected())
|
||||
self.assertTrue(s.install_savanna.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(s.install_murano.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
self.assertTrue(s.install_ceilometer.
|
||||
find_element_by_tag_name('input').is_selected())
|
||||
|
@ -13,12 +13,29 @@ class TestEnvironmentActions(BaseTestCase):
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Create environment with default values
|
||||
2. Open created environment
|
||||
3. Open actions tab
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.clear_nailgun_database()
|
||||
preconditions.Environment.simple_flat()
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
Tabs().actions.click()
|
||||
|
||||
"""Rename environment
|
||||
|
||||
Scenario:
|
||||
1. Clear environment name
|
||||
2. Enter new name
|
||||
3. Click Rename
|
||||
4. Verify environment name is changed
|
||||
"""
|
||||
|
||||
def test_rename(self):
|
||||
value = 'Happy environment'
|
||||
with Actions() as a:
|
||||
@ -30,6 +47,14 @@ class TestEnvironmentActions(BaseTestCase):
|
||||
self.assertEqual(value, Nodes().env_name.text,
|
||||
'Environment has been renamed')
|
||||
|
||||
"""Delete environment
|
||||
|
||||
Scenario:
|
||||
1. Click delete environment
|
||||
2. Click delete on confirmation pop-up
|
||||
3. Verify that environment is deleted
|
||||
"""
|
||||
|
||||
def test_delete(self):
|
||||
with Actions() as a:
|
||||
a.delete.click()
|
||||
|
@ -201,41 +201,154 @@ class SimpleFlatNetworks(BaseTestCase):
|
||||
|
||||
class TestNeutronNetworks(SimpleFlatNetworks):
|
||||
|
||||
"""Global precondition
|
||||
|
||||
Steps:
|
||||
1. Create simple environment with Neutron GRE
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
preconditions.Environment.simple_neutron_gre()
|
||||
|
||||
"""Change id start value in Neutron L2 configuration
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in id start field
|
||||
2. Click save settings
|
||||
3. Verify that value is saved
|
||||
4. Leave id start field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_id_start(self):
|
||||
self._test_text_field('neutron', 'id_start', '1500')
|
||||
|
||||
"""Change id end value in Neutron L2 configuration
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in id end field
|
||||
2. Click save settings
|
||||
3. Verify that value is saved
|
||||
4. Leave id end field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_id_end(self):
|
||||
self._test_text_field('neutron', 'id_end', '3500')
|
||||
|
||||
"""Change Base Mac address value in Neutron L2 configuration
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in base mac address field
|
||||
2. Click save settings
|
||||
3. Verify that base mac address value is saved
|
||||
4. Leave base mac address field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_base_mac(self):
|
||||
self._test_text_field('neutron', 'base_mac', 'aa:bb:3e:14:b4:a3')
|
||||
|
||||
"""Change floating ip start value in Neutron L2 configuration
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in floating ip start field
|
||||
2. Click save settings
|
||||
3. Verify that value is saved
|
||||
4. Leave floating ip start field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_floating_start(self):
|
||||
self._test_text_field('neutron', 'floating_start', RANGES[3][0])
|
||||
|
||||
"""Change floating ip end value in Neutron L2 configuration
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in floating ip end field
|
||||
2. Click save settings
|
||||
3. Verify that value is saved
|
||||
4. Leave floating ip end field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_floating_end(self):
|
||||
self._test_text_field('neutron', 'floating_end', RANGES[3][1])
|
||||
|
||||
"""Change CIDR value in Neutron L2 configuration
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in CIDR field
|
||||
2. Click save settings
|
||||
3. Verify that value is saved
|
||||
4. Leave CIDR field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_cidr(self):
|
||||
self._test_text_field('neutron', 'cidr', '192.168.111.0/16')
|
||||
|
||||
"""Change Gateway value in Neutron L2 configuration
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in Gateway field
|
||||
2. Click save settings
|
||||
3. Verify that value is saved
|
||||
4. Leave Gateway field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_gateway(self):
|
||||
self._test_text_field('neutron', 'gateway', '192.168.111.2')
|
||||
|
||||
"""Change first nameserver value in Neutron L2 configuration
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in first nameserver field
|
||||
2. Click save settings
|
||||
3. Verify that value is saved
|
||||
4. Leave nameserver field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_nameserver0(self):
|
||||
self._test_text_field('neutron', 'nameserver0', '5.5.5.5')
|
||||
|
||||
"""Change second nameserver value in Neutron L2 configuration
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in second nameserver field
|
||||
2. Click save settings
|
||||
3. Verify that value is saved
|
||||
4. Leave nameserver field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_nameserver1(self):
|
||||
self._test_text_field('neutron', 'nameserver1', '5.5.5.5')
|
||||
|
||||
|
||||
class TestSimpleVlanNetworks(SimpleFlatNetworks):
|
||||
|
||||
"""Global precondition
|
||||
|
||||
Steps:
|
||||
1. Create simple environment with default values
|
||||
2. Click on created environment and open networks tab
|
||||
3. Select VLAN Manager and save settings
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
@ -247,15 +360,57 @@ class TestSimpleVlanNetworks(SimpleFlatNetworks):
|
||||
n.save_settings.click()
|
||||
time.sleep(1)
|
||||
|
||||
"""Change number of networks in VLAN Manager
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in number of networks field
|
||||
2. Click save settings
|
||||
3. Verify that value is saved
|
||||
4. Leave number of networks field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_fixed_number_of_networks(self):
|
||||
self._test_text_field('fixed', 'number_of_networks', '3')
|
||||
|
||||
"""Change Size of Networks in VLAN Manager
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in Size of Networks field
|
||||
2. Click save settings
|
||||
3. Verify that value is saved
|
||||
4. Leave Size of Networks field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_fixed_size_of_networks(self):
|
||||
self._test_select_field('fixed', 'network_size', '128')
|
||||
|
||||
"""Change VLAN id start in VLAN Manager
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in VLAN id start field
|
||||
2. Click save settings
|
||||
3. Verify that value is saved
|
||||
4. Leave VLAN id start field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_fixed_vlan_range_start(self):
|
||||
self._test_text_field('fixed', 'vlan_id', '120')
|
||||
|
||||
"""Check calculation of VLAN id end
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in VLAN id start field
|
||||
2. Click save settings
|
||||
3. Verify that value in VLAN id end equals to VLAN id start
|
||||
plus number of networks minus 1
|
||||
"""
|
||||
|
||||
def test_fixed_vlan_range_end_calculation(self):
|
||||
start_values = [105, 120]
|
||||
with Networks().fixed as n:
|
||||
@ -267,6 +422,15 @@ class TestSimpleVlanNetworks(SimpleFlatNetworks):
|
||||
n.vlan_end.get_attribute('value'),
|
||||
str(v + number - 1), 'end value')
|
||||
|
||||
"""Check calculation of VLAN id end when number of networks is changed
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in number of networks field
|
||||
2. Click save settings
|
||||
3. Verify that value in VLAN id end equals to VLAN id start
|
||||
plus number of networks minus 1
|
||||
"""
|
||||
|
||||
def test_fixed_vlan_range_end_calculation_2(self):
|
||||
numbers = [5, 20]
|
||||
with Networks().fixed as n:
|
||||
@ -281,39 +445,141 @@ class TestSimpleVlanNetworks(SimpleFlatNetworks):
|
||||
|
||||
class TestRangesControls(SimpleFlatNetworks):
|
||||
|
||||
"""Add new ip ranges for public network
|
||||
|
||||
Scenario:
|
||||
1. Click on '+' to add new ip range
|
||||
2. Enter values in start and end fields
|
||||
3. Click on '+' to add new ip range after first ip range
|
||||
4. Verify that fields are added after first range
|
||||
"""
|
||||
|
||||
def test_public_plus_icon(self):
|
||||
self._test_ranges_plus_icon('public')
|
||||
|
||||
"""Delete ip range for public network
|
||||
|
||||
Scenario:
|
||||
1. Add three new ip ranges
|
||||
2. Enter values in start and end fields of last ip range
|
||||
3. Click on '-' for last but one ip range
|
||||
4. Verify that last ip range values are saved
|
||||
"""
|
||||
|
||||
def test_public_minus_icon(self):
|
||||
self._test_ranges_minus_icon('public')
|
||||
|
||||
"""Add new ip ranges for floating network
|
||||
|
||||
Scenario:
|
||||
1. Click on '+' to add new ip range
|
||||
2. Enter values in start and end fields
|
||||
3. Click on '+' to add new ip range after first ip range
|
||||
4. Verify that fields are added after first range
|
||||
"""
|
||||
|
||||
def test_floating_plus_icon(self):
|
||||
self._test_ranges_plus_icon('floating')
|
||||
|
||||
"""Delete ip range for floating network
|
||||
|
||||
Scenario:
|
||||
1. Add three new ip ranges
|
||||
2. Enter values in start and end fields of last ip range
|
||||
3. Click on '-' for last but one ip range
|
||||
4. Verify that last ip range values are saved
|
||||
"""
|
||||
|
||||
def test_floating_minus_icon(self):
|
||||
self._test_ranges_minus_icon('floating')
|
||||
|
||||
|
||||
class TestPublicNetwork(SimpleFlatNetworks):
|
||||
|
||||
"""Ip range for public network
|
||||
|
||||
Scenario:
|
||||
1. Add one new ip range
|
||||
2. Enter values in start and end field of first and second ip range
|
||||
3. Click save settings
|
||||
4. Verify that values are saved
|
||||
5. Delete values from the first range
|
||||
6. Verify that validation messages are displayed
|
||||
"""
|
||||
|
||||
def test_ranges(self):
|
||||
self._test_ranges('public', RANGES[:2])
|
||||
|
||||
"""Use VLAN tagging for public network
|
||||
|
||||
Scenario:
|
||||
1. Enable VLAN tagging
|
||||
2. Enter value in this field
|
||||
3. Click save settings
|
||||
4. Verify that value is saved
|
||||
5. Clear value from VLAN tagging field
|
||||
6. Verify that validation messages are displayed
|
||||
"""
|
||||
|
||||
def test_use_vlan_tagging(self):
|
||||
self._test_use_vlan_tagging('public', '111', False)
|
||||
|
||||
"""Change netmask for public network
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in netmask field
|
||||
2. Click save settings
|
||||
3. Verify that netmask value is saved
|
||||
4. Leave netmask field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_net_mask(self):
|
||||
self._test_text_field('public', 'netmask', '255.255.0.0')
|
||||
|
||||
"""Change gateway for public network
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in gateway field
|
||||
2. Click save settings
|
||||
3. Verify that gateway value is saved
|
||||
4. Leave gateway field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_gateway(self):
|
||||
self._test_text_field('public', 'gateway', '172.16.0.2')
|
||||
|
||||
|
||||
class TestFloatingNetwork(SimpleFlatNetworks):
|
||||
|
||||
"""Ip range for floating network
|
||||
|
||||
Scenario:
|
||||
1. Add one new ip range
|
||||
2. Enter values in start and end field of first and second ip range
|
||||
3. Click save settings
|
||||
4. Verify that values are saved
|
||||
5. Delete values from the first range
|
||||
6. Verify that validation messages are displayed
|
||||
"""
|
||||
|
||||
def test_ranges(self):
|
||||
self._test_ranges('floating', RANGES[2:4])
|
||||
|
||||
"""Use VLAN tagging for floating network
|
||||
|
||||
Scenario:
|
||||
1. Enable public VLAN tagging
|
||||
2. Enter value in this field
|
||||
3. Verify that floating VLAN tagging is selected
|
||||
and value is the same as for public VLAN
|
||||
4. Click save settings
|
||||
5. Verify that changes are saved
|
||||
"""
|
||||
|
||||
def test_use_vlan_tagging(self):
|
||||
value = '112'
|
||||
with Networks().public as n:
|
||||
@ -334,33 +600,109 @@ class TestFloatingNetwork(SimpleFlatNetworks):
|
||||
|
||||
class TestManagementNetwork(SimpleFlatNetworks):
|
||||
|
||||
"""Change CIDR for management network
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in management CIDR field
|
||||
2. Click save settings
|
||||
3. Verify that CIDR value is saved
|
||||
4. Leave CIDR field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_cidr(self):
|
||||
self._test_text_field('management', 'cidr', '192.169.0.0/16')
|
||||
|
||||
"""Use VLAN tagging for management network
|
||||
|
||||
Scenario:
|
||||
1. Enable VLAN tagging for management network
|
||||
2. Enter value in this field
|
||||
3. Click save settings
|
||||
4. Verify that value is saved
|
||||
5. Clear value from VLAN tagging field
|
||||
6. Verify that validation messages are displayed
|
||||
"""
|
||||
|
||||
def test_use_vlan_tagging(self):
|
||||
self._test_use_vlan_tagging('management', '111', True)
|
||||
|
||||
|
||||
class TestStorageNetwork(SimpleFlatNetworks):
|
||||
|
||||
"""Change CIDR for storage network
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in storage CIDR field
|
||||
2. Click save settings
|
||||
3. Verify that CIDR value is saved
|
||||
4. Leave CIDR field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_cidr(self):
|
||||
self._test_text_field('storage', 'cidr', '192.170.0.0/16')
|
||||
|
||||
"""Use VLAN tagging for storage network
|
||||
|
||||
Scenario:
|
||||
1. Enable VLAN tagging for storage network
|
||||
2. Enter value in this field
|
||||
3. Click save settings
|
||||
4. Verify that value is saved
|
||||
5. Clear value from VLAN tagging field
|
||||
6. Verify that validation messages are displayed
|
||||
"""
|
||||
|
||||
def test_use_vlan_tagging(self):
|
||||
self._test_use_vlan_tagging('storage', '111', True)
|
||||
|
||||
|
||||
class TestFixedNetwork(SimpleFlatNetworks):
|
||||
|
||||
"""Change CIDR for VM(fixed) network
|
||||
|
||||
Scenario:
|
||||
1. Enter new value in VM(fixed) CIDR field
|
||||
2. Click save settings
|
||||
3. Verify that CIDR value is saved
|
||||
4. Leave CIDR field empty
|
||||
5. Verify that Save settings and
|
||||
Verify Networks buttons are disabled
|
||||
"""
|
||||
|
||||
def test_cidr(self):
|
||||
self._test_text_field('fixed', 'cidr', '10.1.0.0/24')
|
||||
|
||||
"""Use VLAN tagging for VM(fixed) network
|
||||
|
||||
Scenario:
|
||||
1. Enable VLAN tagging for VM(fixed) network
|
||||
2. Enter value in this field
|
||||
3. Click save settings
|
||||
4. Verify that value is saved
|
||||
5. Clear value from VLAN tagging field
|
||||
6. Verify that validation messages are displayed
|
||||
"""
|
||||
|
||||
def test_use_vlan_tagging(self):
|
||||
self._test_use_vlan_tagging('fixed', '111', True)
|
||||
|
||||
|
||||
class TestDnsServers(SimpleFlatNetworks):
|
||||
|
||||
"""Change dns servers
|
||||
|
||||
Scenario:
|
||||
1. Change dns servers value
|
||||
2. Click save settings
|
||||
3. Verify that values are saved
|
||||
5. Clear values for dns servers
|
||||
6. Verify that Save settings and Verify networks are disabled
|
||||
"""
|
||||
|
||||
def test_name_servers(self):
|
||||
v1 = '8.7.7.7'
|
||||
v2 = '8.6.6.6'
|
||||
@ -397,6 +739,13 @@ class TestFlatVerifyNetworks(BaseTestCase):
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Create simple environment with default values
|
||||
2. Click on created environment and open Networks tab
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.clear_nailgun_database()
|
||||
BaseTestCase.setUp(self)
|
||||
@ -405,6 +754,13 @@ class TestFlatVerifyNetworks(BaseTestCase):
|
||||
Tabs().networks.click()
|
||||
time.sleep(1)
|
||||
|
||||
"""Verify network without added nodes
|
||||
|
||||
Scenario:
|
||||
1. Click Verify Networks
|
||||
2. Verify that message 'At least two nodes are required' appears
|
||||
"""
|
||||
|
||||
def test_no_nodes(self):
|
||||
with Networks() as n:
|
||||
n.verify_networks.click()
|
||||
@ -413,8 +769,18 @@ class TestFlatVerifyNetworks(BaseTestCase):
|
||||
n.verification_alert.text,
|
||||
'Alert text contains "At least two nodes are required"')
|
||||
|
||||
"""Verify network with one added nodes
|
||||
|
||||
Scenario:
|
||||
1. Add one controller node
|
||||
2. Open Networks tab
|
||||
3. Click Verify Networks
|
||||
4. Verify that message 'At least two nodes are required' appears
|
||||
"""
|
||||
|
||||
def test_one_node(self):
|
||||
Tabs().nodes.click()
|
||||
time.sleep(1)
|
||||
Nodes().add_nodes.click()
|
||||
time.sleep(1)
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
@ -430,8 +796,19 @@ class TestFlatVerifyNetworks(BaseTestCase):
|
||||
n.verification_alert.text,
|
||||
'Alert text contains "At least two nodes are required"')
|
||||
|
||||
"""Verify network with two added nodes
|
||||
|
||||
Scenario:
|
||||
1. Add two compute nodes
|
||||
2. Open Networks tab
|
||||
3. Click Verify Networks
|
||||
4. Verify that message 'Verification succeeded.
|
||||
Your network is configured correctly' appears
|
||||
"""
|
||||
|
||||
def test_two_nodes(self):
|
||||
Tabs().nodes.click()
|
||||
time.sleep(1)
|
||||
Nodes().add_nodes.click()
|
||||
time.sleep(1)
|
||||
Nodes().nodes_discovered[0].checkbox.click()
|
||||
@ -444,6 +821,7 @@ class TestFlatVerifyNetworks(BaseTestCase):
|
||||
with Networks() as n:
|
||||
n.verify_networks.click()
|
||||
self.assertIn(
|
||||
'Verification succeeded. Your network is configured correctly',
|
||||
'Verification succeeded. '
|
||||
'Your network is configured correctly.',
|
||||
n.verification_alert.text,
|
||||
'Verification succeeded')
|
||||
|
@ -2,13 +2,9 @@ from pageobjects.base import PageObject
|
||||
from pageobjects.environments import RedhatAccountPopup
|
||||
from pageobjects.header import Header
|
||||
from pageobjects.releases import Releases
|
||||
from fuelweb_ui_test.settings import OPENSTACK_REDHAT
|
||||
from fuelweb_ui_test.settings import REDHAT_USERNAME
|
||||
from fuelweb_ui_test.settings import REDHAT_PASSWORD
|
||||
from fuelweb_ui_test.settings import REDHAT_SATELLITE
|
||||
from fuelweb_ui_test.settings import REDHAT_ACTIVATION_KEY
|
||||
from fuelweb_ui_test.settings import OPENSTACK_CENTOS
|
||||
from fuelweb_ui_test.settings import OPENSTACK_UBUNTU
|
||||
from settings import OPENSTACK_REDHAT, REDHAT_USERNAME, REDHAT_PASSWORD, \
|
||||
REDHAT_SATELLITE, REDHAT_ACTIVATION_KEY, OPENSTACK_CENTOS, \
|
||||
OPENSTACK_UBUNTU
|
||||
from tests.base import BaseTestCase
|
||||
|
||||
|
||||
@ -23,24 +19,55 @@ class TestReleases(BaseTestCase):
|
||||
BaseTestCase.setUp(self)
|
||||
Header().releases.click()
|
||||
|
||||
"""Check Centos status is active on releases tab
|
||||
|
||||
Scenario:
|
||||
1. Open releases tab
|
||||
2. Check that Centos status is active
|
||||
"""
|
||||
|
||||
def test_centos_is_active(self):
|
||||
with Releases() as r:
|
||||
self.assertEqual(
|
||||
'Active', r.dict[OPENSTACK_CENTOS].status.text,
|
||||
'CentOS status is active')
|
||||
|
||||
"""Check Ubuntu status is active on releases tab
|
||||
|
||||
Scenario:
|
||||
1. Open releases tab
|
||||
2. Check that Ubuntu status is active
|
||||
"""
|
||||
|
||||
def test_ubuntu_is_active(self):
|
||||
with Releases() as r:
|
||||
self.assertEqual(
|
||||
'Active', r.dict[OPENSTACK_UBUNTU].status.text,
|
||||
'Ubuntu status is active')
|
||||
|
||||
"""Check RHOS status is active on releases tab
|
||||
|
||||
Scenario:
|
||||
1. Open releases tab
|
||||
2. Check that RHOS status is Not available
|
||||
"""
|
||||
|
||||
def test_rhos_is_active(self):
|
||||
with Releases() as r:
|
||||
self.assertEqual(
|
||||
'Not available', r.dict[OPENSTACK_REDHAT].status.text,
|
||||
'RHOS status is Not available')
|
||||
|
||||
"""Download RHEL with RHSM option
|
||||
|
||||
Scenario:
|
||||
1. Open releases tab
|
||||
2. Click Configure button in actions column
|
||||
3. Select 'RHSM' radiobutton
|
||||
4. Enter username and password and click apply
|
||||
5. Check that RHOS status is active
|
||||
"""
|
||||
|
||||
def test_rhsm(self):
|
||||
Releases().rhel_setup.click()
|
||||
with RedhatAccountPopup() as p:
|
||||
@ -56,6 +83,17 @@ class TestReleases(BaseTestCase):
|
||||
'Active', r.dict[OPENSTACK_REDHAT].status.text,
|
||||
'RHOS status is active')
|
||||
|
||||
"""Download RHEL with RHN option
|
||||
|
||||
Scenario:
|
||||
1. Open releases tab
|
||||
2. Click Configure button in actions column
|
||||
3. Select 'RHN' radiobutton
|
||||
4. Enter username and password
|
||||
5. Enter satellite hostname, activation key and click apply
|
||||
6. Check that RHOS status is active
|
||||
"""
|
||||
|
||||
def test_rhn_satellite(self):
|
||||
Releases().rhel_setup.click()
|
||||
with RedhatAccountPopup() as p:
|
||||
|
@ -4,8 +4,8 @@ from pageobjects.nodes import Nodes, RolesPanel
|
||||
from tests import preconditions
|
||||
from tests.base import BaseTestCase
|
||||
|
||||
ERROR_ROLE_CANNOT_COMBINE = 'This role cannot be combined ' \
|
||||
'with the other roles already selected.'
|
||||
ERROR_ROLE_CANNOT_COMBINE = 'This role cannot be combined' \
|
||||
' with the other roles already selected.'
|
||||
ROLE_UNALLOCATED = 'UNALLOCATED'
|
||||
ROLE_CONTROLLER = 'CONTROLLER'
|
||||
ROLE_COMPUTE = 'COMPUTE'
|
||||
@ -22,17 +22,34 @@ class BaseClass(BaseTestCase):
|
||||
def setUp(self):
|
||||
BaseTestCase.setUp(self)
|
||||
Environments().create_cluster_boxes[0].click()
|
||||
time.sleep(1)
|
||||
Nodes().add_nodes.click()
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
class TestRolesSimpleFlat(BaseClass):
|
||||
|
||||
"""Global precondition
|
||||
|
||||
steps:
|
||||
1. Create simple environment with default values
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
preconditions.Environment.simple_flat()
|
||||
|
||||
"""Check controller node
|
||||
|
||||
Scenario:
|
||||
1. Select first node and assign controller role
|
||||
2. Verify that role of the node is changed,
|
||||
compute role is disabled
|
||||
3. Deselect node
|
||||
4. Verify that role is unallocated
|
||||
"""
|
||||
|
||||
def test_controller(self):
|
||||
with Nodes()as n:
|
||||
n.nodes_discovered[0].checkbox.click()
|
||||
@ -50,6 +67,13 @@ class TestRolesSimpleFlat(BaseClass):
|
||||
self.assertFalse(n.apply_changes.is_enabled())
|
||||
self.assertNodeInRoles(n.nodes_discovered[0], [ROLE_UNALLOCATED])
|
||||
|
||||
"""Check that only one controller node is possible
|
||||
|
||||
Scenario:
|
||||
1. Select first node and assign controller role
|
||||
2. Verify that checkboxes of other nodes are disabled
|
||||
"""
|
||||
|
||||
def test_one_controller_allowed_nodes_disabled(self):
|
||||
with Nodes()as n:
|
||||
n.nodes_discovered[0].checkbox.click()
|
||||
@ -60,6 +84,13 @@ class TestRolesSimpleFlat(BaseClass):
|
||||
n.checkbox.find_element_by_tag_name('input').is_enabled(),
|
||||
'Checkbox is disabled')
|
||||
|
||||
"""Check controller node is disabled if many nodes are selected
|
||||
|
||||
Scenario:
|
||||
1. Select all nodes
|
||||
2. Verify that controller role is disabled
|
||||
"""
|
||||
|
||||
def test_one_controller_allowed_controller_role_disabled(self):
|
||||
with Nodes()as n:
|
||||
with RolesPanel() as r:
|
||||
@ -69,6 +100,16 @@ class TestRolesSimpleFlat(BaseClass):
|
||||
node.checkbox.click()
|
||||
self.assertFalse(r.controller.is_enabled())
|
||||
|
||||
"""Check compute node
|
||||
|
||||
Scenario:
|
||||
1. Select first node and assign compute role
|
||||
2. Verify that role of the node is changed,
|
||||
controller role is disabled
|
||||
3. Deselect node
|
||||
4. Verify that role is unallocated
|
||||
"""
|
||||
|
||||
def test_compute(self):
|
||||
with Nodes()as n:
|
||||
n.nodes_discovered[0].checkbox.click()
|
||||
@ -86,6 +127,15 @@ class TestRolesSimpleFlat(BaseClass):
|
||||
self.assertFalse(n.apply_changes.is_enabled())
|
||||
self.assertNodeInRoles(n.nodes_discovered[0], [ROLE_UNALLOCATED])
|
||||
|
||||
"""Check cinder node
|
||||
|
||||
Scenario:
|
||||
1. Select first node and assign cinder role
|
||||
2. Verify that role of the node is changed
|
||||
3. Deselect node
|
||||
4. Verify that role is unallocated
|
||||
"""
|
||||
|
||||
def test_cinder(self):
|
||||
with Nodes()as n:
|
||||
n.nodes_discovered[0].checkbox.click()
|
||||
@ -98,6 +148,15 @@ class TestRolesSimpleFlat(BaseClass):
|
||||
self.assertFalse(n.apply_changes.is_enabled())
|
||||
self.assertNodeInRoles(n.nodes_discovered[0], [ROLE_UNALLOCATED])
|
||||
|
||||
"""Check ceph node
|
||||
|
||||
Scenario:
|
||||
1. Select first node and assign ceph role
|
||||
2. Verify that role of the node is changed
|
||||
3. Deselect node
|
||||
4. Verify that role is unallocated
|
||||
"""
|
||||
|
||||
def test_ceph(self):
|
||||
with Nodes()as n:
|
||||
n.nodes_discovered[0].checkbox.click()
|
||||
@ -110,6 +169,15 @@ class TestRolesSimpleFlat(BaseClass):
|
||||
self.assertFalse(n.apply_changes.is_enabled())
|
||||
self.assertNodeInRoles(n.nodes_discovered[0], [ROLE_UNALLOCATED])
|
||||
|
||||
"""Check multiroles node
|
||||
|
||||
Scenario:
|
||||
1. Select first node and assign controller, ceph, cinder roles
|
||||
2. Verify that role of the node is changed
|
||||
3. Deselect node
|
||||
4. Verify that role is unallocated
|
||||
"""
|
||||
|
||||
def test_multiroles(self):
|
||||
with Nodes()as n:
|
||||
n.nodes_discovered[0].checkbox.click()
|
||||
@ -122,6 +190,15 @@ class TestRolesSimpleFlat(BaseClass):
|
||||
n.nodes_discovered[0],
|
||||
[ROLE_CONTROLLER, ROLE_CINDER, ROLE_CEPH])
|
||||
|
||||
"""Check multiroles for many nodes
|
||||
|
||||
Scenario:
|
||||
1. Select three nodes and assign controller, ceph, cinder roles
|
||||
2. Verify that role of the nodes is changed
|
||||
3. Deselect nodes
|
||||
4. Verify that role is unallocated
|
||||
"""
|
||||
|
||||
def test_several_nodes(self):
|
||||
with Nodes()as n:
|
||||
n.nodes_discovered[0].checkbox.click()
|
||||
@ -150,6 +227,14 @@ class TestRolesHAFlat(BaseClass):
|
||||
BaseTestCase.setUpClass()
|
||||
preconditions.Environment.ha_flat()
|
||||
|
||||
"""Check controller node in HA mode
|
||||
|
||||
Scenario:
|
||||
1. Select all nodes
|
||||
2. Assign controller role
|
||||
3. Verify that nodes are with controller role
|
||||
"""
|
||||
|
||||
def test_controller_role_always_enabled(self):
|
||||
with Nodes()as n:
|
||||
for node in n.nodes_discovered:
|
||||
@ -159,6 +244,14 @@ class TestRolesHAFlat(BaseClass):
|
||||
for node in n.nodes_discovered:
|
||||
self.assertNodeInRoles(node, [ROLE_CONTROLLER])
|
||||
|
||||
"""Check all nodes with controller role in HA mode
|
||||
|
||||
Scenario:
|
||||
1. Select all nodes
|
||||
2. Assign controller role
|
||||
3. Verify that nodes are with controller role
|
||||
"""
|
||||
|
||||
def test_all_nodes_could_be_controller(self):
|
||||
RolesPanel().controller.click()
|
||||
with Nodes()as n:
|
||||
|
@ -13,6 +13,12 @@ class TestSupport(BaseTestCase):
|
||||
def setUpClass(cls):
|
||||
BaseTestCase.setUpClass()
|
||||
|
||||
"""Each test precondition
|
||||
|
||||
Steps:
|
||||
1. Open Support page
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
BaseTestCase.clear_nailgun_database()
|
||||
BaseTestCase.setUp(self)
|
||||
@ -20,6 +26,13 @@ class TestSupport(BaseTestCase):
|
||||
Header().support.click()
|
||||
time.sleep(1)
|
||||
|
||||
"""Register Fuel
|
||||
|
||||
Scenario:
|
||||
1. Click Register Fuel
|
||||
2. Verify that register form is present
|
||||
"""
|
||||
|
||||
def test_register_fuel(self):
|
||||
with Support() as s:
|
||||
key = re.search(
|
||||
@ -35,6 +48,13 @@ class TestSupport(BaseTestCase):
|
||||
'[value="Register and Activate subscription"]').is_displayed(),
|
||||
'"Register and Activate subscription" is displayed')
|
||||
|
||||
"""Contact Support
|
||||
|
||||
Scenario:
|
||||
1. Click contact support
|
||||
2. Verify that support page is present
|
||||
"""
|
||||
|
||||
def test_contact_support(self):
|
||||
Support().contact_support.click()
|
||||
time.sleep(4)
|
||||
@ -42,6 +62,13 @@ class TestSupport(BaseTestCase):
|
||||
self.assertIn('http://software.mirantis.com/',
|
||||
browser.driver.current_url)
|
||||
|
||||
"""Generate diagnostic snapshot
|
||||
|
||||
Scenario:
|
||||
1. Click generate diagnostic snapshot
|
||||
2. Verify that snapshot is available to download
|
||||
"""
|
||||
|
||||
def test_diagnostic_snapshot(self):
|
||||
Support().generate_snapshot.click()
|
||||
with Support() as s:
|
||||
@ -50,6 +77,13 @@ class TestSupport(BaseTestCase):
|
||||
s.download_snapshot.is_enabled(),
|
||||
'"Diagnostic Snapshot" is displayed')
|
||||
|
||||
"""View capacity audit
|
||||
|
||||
Scenario:
|
||||
1. Click view capacity audit
|
||||
2. Verify that system information is present
|
||||
"""
|
||||
|
||||
def test_capacity_audit(self):
|
||||
Support().view_capacity_audit.click()
|
||||
self.assertEqual(
|
||||
|
Loading…
Reference in New Issue
Block a user