diff --git a/fuelweb_ui_test/tests/.noseids b/fuelweb_ui_test/tests/.noseids new file mode 100644 index 000000000..2f30a8428 --- /dev/null +++ b/fuelweb_ui_test/tests/.noseids @@ -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. \ No newline at end of file diff --git a/fuelweb_ui_test/tests/base.py b/fuelweb_ui_test/tests/base.py index 4ac950b8c..3aa06cd14 100644 --- a/fuelweb_ui_test/tests/base.py +++ b/fuelweb_ui_test/tests/base.py @@ -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( '') '''.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') diff --git a/fuelweb_ui_test/tests/preconditions.py b/fuelweb_ui_test/tests/preconditions.py index 90795a4df..0cd0836b4 100644 --- a/fuelweb_ui_test/tests/preconditions.py +++ b/fuelweb_ui_test/tests/preconditions.py @@ -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): diff --git a/fuelweb_ui_test/tests/test_adding_nodes.py b/fuelweb_ui_test/tests/test_adding_nodes.py index dab6ca410..70c8f0c80 100644 --- a/fuelweb_ui_test/tests/test_adding_nodes.py +++ b/fuelweb_ui_test/tests/test_adding_nodes.py @@ -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]) diff --git a/fuelweb_ui_test/tests/test_configure_disks.py b/fuelweb_ui_test/tests/test_configure_disks.py index 3ff95f539..9b00e0921 100644 --- a/fuelweb_ui_test/tests/test_configure_disks.py +++ b/fuelweb_ui_test/tests/test_configure_disks.py @@ -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)) diff --git a/fuelweb_ui_test/tests/test_configure_networks.py b/fuelweb_ui_test/tests/test_configure_networks.py index 616e0340b..1e9c51a6d 100644 --- a/fuelweb_ui_test/tests/test_configure_networks.py +++ b/fuelweb_ui_test/tests/test_configure_networks.py @@ -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') diff --git a/fuelweb_ui_test/tests/test_deploy.py b/fuelweb_ui_test/tests/test_deploy.py index adaa58554..86971b0d5 100644 --- a/fuelweb_ui_test/tests/test_deploy.py +++ b/fuelweb_ui_test/tests/test_deploy.py @@ -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() diff --git a/fuelweb_ui_test/tests/test_discard_changes.py b/fuelweb_ui_test/tests/test_discard_changes.py index 54ff5ec0a..4d304e8d7 100644 --- a/fuelweb_ui_test/tests/test_discard_changes.py +++ b/fuelweb_ui_test/tests/test_discard_changes.py @@ -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() diff --git a/fuelweb_ui_test/tests/test_env_settings.py b/fuelweb_ui_test/tests/test_env_settings.py index 0e8b6cfef..d64522270 100644 --- a/fuelweb_ui_test/tests/test_env_settings.py +++ b/fuelweb_ui_test/tests/test_env_settings.py @@ -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') diff --git a/fuelweb_ui_test/tests/test_env_wizard.py b/fuelweb_ui_test/tests/test_env_wizard.py index b74a9ea9a..3d4398da3 100644 --- a/fuelweb_ui_test/tests/test_env_wizard.py +++ b/fuelweb_ui_test/tests/test_env_wizard.py @@ -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) diff --git a/fuelweb_ui_test/tests/test_environment.py b/fuelweb_ui_test/tests/test_environment.py index a32907ce3..b606e8cae 100644 --- a/fuelweb_ui_test/tests/test_environment.py +++ b/fuelweb_ui_test/tests/test_environment.py @@ -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()) diff --git a/fuelweb_ui_test/tests/test_environment_actions.py b/fuelweb_ui_test/tests/test_environment_actions.py index 0ee54710b..fd2cbcdc3 100644 --- a/fuelweb_ui_test/tests/test_environment_actions.py +++ b/fuelweb_ui_test/tests/test_environment_actions.py @@ -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() diff --git a/fuelweb_ui_test/tests/test_networks.py b/fuelweb_ui_test/tests/test_networks.py index 44d115849..6703729c0 100644 --- a/fuelweb_ui_test/tests/test_networks.py +++ b/fuelweb_ui_test/tests/test_networks.py @@ -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') diff --git a/fuelweb_ui_test/tests/test_releases.py b/fuelweb_ui_test/tests/test_releases.py index e0dcd474f..f5c041995 100644 --- a/fuelweb_ui_test/tests/test_releases.py +++ b/fuelweb_ui_test/tests/test_releases.py @@ -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: diff --git a/fuelweb_ui_test/tests/test_roles.py b/fuelweb_ui_test/tests/test_roles.py index e8eea5c27..607465f4a 100644 --- a/fuelweb_ui_test/tests/test_roles.py +++ b/fuelweb_ui_test/tests/test_roles.py @@ -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: diff --git a/fuelweb_ui_test/tests/test_support.py b/fuelweb_ui_test/tests/test_support.py index 028d80c42..fb756312e 100644 --- a/fuelweb_ui_test/tests/test_support.py +++ b/fuelweb_ui_test/tests/test_support.py @@ -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(