Petr Vobornik
2013-05-24 13:48:53 +02:00
parent e3cddab940
commit 2a9be92855
33 changed files with 4026 additions and 0 deletions

View File

@@ -813,6 +813,7 @@ fi
%dir %{python_sitelib}/ipatests/test_ipaserver %dir %{python_sitelib}/ipatests/test_ipaserver
%dir %{python_sitelib}/ipatests/test_ipaserver/install %dir %{python_sitelib}/ipatests/test_ipaserver/install
%dir %{python_sitelib}/ipatests/test_pkcs10 %dir %{python_sitelib}/ipatests/test_pkcs10
%dir %{python_sitelib}/ipatests/test_webui
%dir %{python_sitelib}/ipatests/test_xmlrpc %dir %{python_sitelib}/ipatests/test_xmlrpc
%{_bindir}/ipa-run-tests %{_bindir}/ipa-run-tests
%{_bindir}/ipa-test-config %{_bindir}/ipa-test-config

View File

@@ -74,6 +74,7 @@ def setup_package():
"ipatests.test_ipaserver", "ipatests.test_ipaserver",
"ipatests.test_ipaserver.install", "ipatests.test_ipaserver.install",
"ipatests.test_pkcs10", "ipatests.test_pkcs10",
"ipatests.test_webui",
"ipatests.test_xmlrpc"], "ipatests.test_xmlrpc"],
scripts=['ipa-run-tests', 'ipa-test-config'], scripts=['ipa-run-tests', 'ipa-test-config'],
package_data = { package_data = {

View File

@@ -0,0 +1 @@
http://www.freeipa.org/page/Web_UI_Integration_Tests

View File

@@ -0,0 +1,22 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Sub-package containing Web UI integration tests
"""

View File

@@ -0,0 +1,70 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
ENTITY = 'group'
DEFAULT_FACET = 'member_user'
PKEY = 'itest-group'
DATA = {
'pkey': PKEY,
'add': [
('textbox', 'cn', PKEY),
('textarea', 'description','test-group desc'),
('radio', 'type','normal'),
],
'mod': [
('textarea', 'description','test-group desc modified'),
],
}
PKEY2 = 'itest-group2'
DATA2 = {
'pkey': PKEY2,
'add': [
('textbox', 'cn', PKEY2),
('textarea', 'description','test-group2 desc'),
]
}
PKEY3 = 'itest-group3'
DATA3= {
'pkey': PKEY3,
'add': [
('textbox', 'cn', PKEY3),
('textarea', 'description','test-group3 desc'),
]
}
PKEY4 = 'itest-group4'
DATA4= {
'pkey': PKEY4,
'add': [
('textbox', 'cn', PKEY4),
('textarea', 'description','test-group4 desc'),
]
}
PKEY5 = 'itest-group5'
DATA5= {
'pkey': PKEY5,
'add': [
('textbox', 'cn', PKEY5),
('textarea', 'description','test-group5 desc'),
]
}

View File

@@ -0,0 +1,57 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
RULE_ENTITY = 'hbacrule'
RULE_PKEY = 'itesthbacrule'
RULE_DATA = {
'pkey': RULE_PKEY,
'add': [
('textbox', 'cn', RULE_PKEY),
],
'mod': [
('textarea', 'description', 'testhbacrulec desc'),
],
}
SVC_ENTITY = 'hbacsvc'
SVC_PKEY = 'itesthbacsvc'
SVC_DATA = {
'pkey': SVC_PKEY,
'add': [
('textbox', 'cn', SVC_PKEY),
('textarea', 'description', 'testhbacsvc desc'),
],
'mod': [
('textarea', 'description', 'testhbacsvc desc mod'),
],
}
SVCGROUP_ENTITY = 'hbacsvcgroup'
SVCGROUP_DEF_FACET = 'member_hbacsvc'
SVCGROUP_PKEY = 'itesthbaccvcgroup'
SVCGROUP_DATA = {
'pkey': SVCGROUP_PKEY,
'add': [
('textbox', 'cn', SVCGROUP_PKEY),
('textarea', 'description', 'testhbaccvcgroup desc'),
],
'mod': [
('textarea', 'description', 'testhbaccvcgroup desc mod'),
],
}

View File

@@ -0,0 +1,81 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
ENTITY = 'hostgroup'
DEFAULT_FACET = 'member_host'
PKEY = 'itest-hostgroup'
DATA = {
'pkey': PKEY,
'add': [
('textbox', 'cn', PKEY),
('textarea', 'description','test-hostgroup desc'),
],
'mod': [
('textarea', 'description','test-hostgroup desc modified'),
],
}
PKEY2 = 'itest-hostgroup2'
DATA2 = {
'pkey': PKEY2,
'add': [
('textbox', 'cn', PKEY2),
('textarea', 'description','test-hostgroup2 desc'),
],
'mod': [
('textarea', 'description','test-hostgroup2 desc modified'),
],
}
PKEY3 = 'itest-hostgroup3'
DATA3 = {
'pkey': PKEY3,
'add': [
('textbox', 'cn', PKEY3),
('textarea', 'description','test-hostgroup3 desc'),
],
'mod': [
('textarea', 'description','test-hostgroup3 desc modified'),
],
}
PKEY4 = 'itest-hostgroup4'
DATA4 = {
'pkey': PKEY4,
'add': [
('textbox', 'cn', PKEY4),
('textarea', 'description','test-hostgroup4 desc'),
],
'mod': [
('textarea', 'description','test-hostgroup4 desc modified'),
],
}
PKEY5 = 'itest-hostgroup5'
DATA5 = {
'pkey': PKEY5,
'add': [
('textbox', 'cn', PKEY5),
('textarea', 'description','test-hostgroup5 desc'),
],
'mod': [
('textarea', 'description','test-hostgroup5 desc modified'),
],
}

View File

@@ -0,0 +1,43 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
ENTITY = 'netgroup'
PKEY = 'itest-netgroup'
DATA = {
'pkey': PKEY,
'add': [
('textbox', 'cn', PKEY),
('textarea', 'description', 'test-netgroup desc'),
],
'mod': [
('textarea', 'description', 'test-netgroup desc modified'),
],
}
PKEY2 = 'itest-netgroup2'
DATA2 = {
'pkey': PKEY2,
'add': [
('textbox', 'cn', PKEY2),
('textarea', 'description', 'test-netgroup2 desc'),
],
'mod': [
('textarea', 'description', 'test-netgroup2 desc modified'),
],
}

View File

@@ -0,0 +1,82 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
RULE_ENTITY = 'sudorule'
CMDENTITY = 'sudocmd'
CMDGROUP_ENTITY = 'sudocmdgroup'
CMDGROUP_DEF_FACET = 'member_sudocmd'
RULE_PKEY = 'itestsudorule'
RULE_DATA = {
'pkey': RULE_PKEY,
'add': [
('textbox', 'cn', RULE_PKEY),
],
'mod': [
('textarea', 'description', 'itestsudorule desc'),
],
}
CMD_PKEY = 'itestsudocmd'
CMD_DATA = {
'pkey': CMD_PKEY,
'add': [
('textbox', 'sudocmd', CMD_PKEY),
('textarea', 'description', 'itestsudocmd desc'),
],
'mod': [
('textarea', 'description', 'itestsudocmd desc mod'),
],
}
CMD_PKEY2 = 'itestsudocmd2'
CMD_DATA2 = {
'pkey': CMD_PKEY2,
'add': [
('textbox', 'sudocmd', CMD_PKEY2),
('textarea', 'description', 'itestsudocmd2 desc'),
],
'mod': [
('textarea', 'description', 'itestsudocmd2 desc mod'),
],
}
CMD_GROUP_PKEY = 'itestsudocmdgroup'
CMDGROUP_DATA = {
'pkey': CMD_GROUP_PKEY,
'add': [
('textbox', 'cn', CMD_GROUP_PKEY),
('textarea', 'description', 'itestsudocmdgroup desc'),
],
'mod': [
('textarea', 'description', 'itestsudocmdgroup desc mod'),
],
}
CMD_GROUP_PKEY2 = 'itestsudocmdgroup2'
CMDGROUP_DATA2 = {
'pkey': CMD_GROUP_PKEY2,
'add': [
('textbox', 'cn', CMD_GROUP_PKEY2),
('textarea', 'description', 'itestsudocmdgroup2 desc'),
],
'mod': [
('textarea', 'description', 'itestsudocmdgroup2 desc mod'),
],
}

View File

@@ -0,0 +1,49 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
ENTITY = 'user'
PKEY = 'itest-user'
DATA = {
'pkey': PKEY,
'add': [
('textbox', 'uid', PKEY),
('textbox', 'givenname', 'Name'),
('textbox', 'sn', 'Surname'),
],
'mod': [
('textbox', 'givenname','OtherName'),
('textbox', 'sn','OtherSurname'),
],
}
PKEY2 = 'itest-user2'
DATA2 = {
'pkey': PKEY2,
'add': [
('textbox', 'uid', PKEY2),
('textbox', 'givenname', 'Name2'),
('textbox', 'sn', 'Surname2'),
],
'mod': [
('textbox', 'givenname','OtherName2'),
('textbox', 'sn','OtherSurname2'),
],
}

View File

@@ -0,0 +1,94 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Automember tests
"""
from ipatests.test_webui.ui_driver import UI_driver
import ipatests.test_webui.data_hostgroup as hostgroup
ENTITY = 'automember'
USER_GROUP_PKEY = 'admins'
USER_GROUP_DATA = {
'pkey': USER_GROUP_PKEY,
'add': [
('combobox', 'cn', USER_GROUP_PKEY),
],
'mod': [
('textarea', 'description', 'user group rule description'),
#(
#'add_table_record',
#'automemberinclusiveregex',
#(
#'table-widget',
#{
#'fields': [
#('textbox', 'automemberinclusiveregex', 'testregex')
#]
#},
#)
#)
],
}
HOST_GROUP_DATA = {
'pkey': hostgroup.PKEY,
'add': [
('combobox', 'cn', hostgroup.PKEY),
],
'mod': [
('textarea', 'description', 'host group rule description'),
],
}
class test_automember(UI_driver):
def test_crud(self):
"""
Basic CRUD: automember
"""
self.init_app()
# user group rule
self.basic_crud(ENTITY, USER_GROUP_DATA,
search_facet='searchgroup',
default_facet='usergrouprule',
details_facet='usergrouprule',
)
# prepare host group
self.basic_crud(hostgroup.ENTITY, hostgroup.DATA,
default_facet=hostgroup.DEFAULT_FACET,
delete=False)
# host group rule
self.navigate_by_menu('policy/automember/amhostgroup')
self.basic_crud(ENTITY, HOST_GROUP_DATA,
search_facet='searchhostgroup',
default_facet='hostgrouprule',
details_facet='hostgrouprule',
navigate=False,
breadcrumb='Host group rules',
)
# cleanup
self.delete(hostgroup.ENTITY, [hostgroup.DATA])

View File

@@ -0,0 +1,104 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Automount tests
"""
from ipatests.test_webui.ui_driver import UI_driver
LOC_ENTITY = 'automountlocation'
MAP_ENTITY = 'automountmap'
KEY_ENTITY = 'automountkey'
LOC_PKEY = 'itestloc'
LOC_DATA = {
'pkey': LOC_PKEY,
'add': [
('textbox', 'cn', LOC_PKEY),
],
}
MAP_PKEY = 'itestmap'
MAP_DATA = {
'pkey': MAP_PKEY,
'add': [
('textbox', 'automountmapname', MAP_PKEY),
('textarea', 'description', 'map desc'),
],
'mod': [
('textarea', 'description', 'map desc mod'),
]
}
KEY_PKEY = 'itestkey'
KEY_DATA = {
'pkey': KEY_PKEY,
'add': [
('textbox', 'automountkey', KEY_PKEY),
('textbox', 'automountinformation', '/itest/key'),
],
'mod': [
('textbox', 'automountinformation', '/itest/key2'),
]
}
class test_automount(UI_driver):
def test_crud(self):
"""
Basic CRUD: automount
"""
self.init_app()
# location
self.basic_crud(LOC_ENTITY, LOC_DATA,
default_facet='maps',
delete=False,
breadcrumb='Automount Locations'
)
# map
self.navigate_to_record(LOC_PKEY)
self.basic_crud(MAP_ENTITY, MAP_DATA,
parent_entity=LOC_ENTITY,
search_facet='maps',
default_facet='keys',
delete=False,
navigate=False,
breadcrumb=LOC_PKEY,
)
# key
self.navigate_to_record(MAP_PKEY)
self.basic_crud(KEY_ENTITY, KEY_DATA,
parent_entity=MAP_ENTITY,
search_facet='keys',
navigate=False,
breadcrumb=MAP_PKEY,
)
# delete
self.navigate_by_breadcrumb(LOC_PKEY)
self.delete_record(MAP_PKEY)
self.navigate_by_breadcrumb('Automount Locations')
self.delete_record(LOC_PKEY)

View File

@@ -0,0 +1,47 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Cert tests
"""
from ipatests.test_webui.ui_driver import UI_driver
ENTITY = 'cert'
class test_cert(UI_driver):
def __init__(self, *args, **kwargs):
super(test_cert, self).__init__(args, kwargs)
if not self.has_ca():
self.skip('CA not configured')
def test_read(self):
"""
Basic read: cert
Certs don't have standard mod, add and delete methods.
"""
self.init_app()
self.navigate_to_entity(ENTITY)
rows = self.get_rows()
self.navigate_to_row_record(rows[0])
self.navigate_by_breadcrumb("Certificates")

View File

@@ -0,0 +1,52 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Config tests
"""
from ipatests.test_webui.ui_driver import UI_driver
ENTITY = 'config'
DATA = {
'mod': [
('textbox', 'ipasearchrecordslimit','200'),
('textbox', 'ipasearchtimelimit','3'),
],
}
DATA2 = {
'mod': [
('textbox', 'ipasearchrecordslimit','100'),
('textbox', 'ipasearchtimelimit','2'),
],
}
class test_config(UI_driver):
def test_mod(self):
"""
Config mod tests
"""
self.init_app()
self.navigate_to_entity(ENTITY)
self.mod_record(ENTITY, DATA)
self.mod_record(ENTITY, DATA2)

View File

@@ -0,0 +1,51 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Delegation tests
"""
from ipatests.test_webui.ui_driver import UI_driver
ENTITY = 'delegation'
PKEY = 'itest-delegation-rule'
DATA = {
'pkey': PKEY,
'add': [
('textbox', 'aciname', PKEY),
('combobox', 'group', 'editors'),
('combobox', 'memberof', 'ipausers'),
('table', 'attrs', 'audio'),
('table', 'attrs', 'businesscategory'),
],
'mod': [
('table', 'attrs', 'businesscategory'),
],
}
class test_delegation(UI_driver):
def test_crud(self):
"""
Basic CRUD: delegation
"""
self.init_app()
self.basic_crud(ENTITY, DATA)

View File

@@ -0,0 +1,107 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
DNS tests
"""
from ipatests.test_webui.ui_driver import UI_driver
ZONE_ENTITY = 'dnszone'
RECORD_ENTITY = 'dnsrecord'
CONFIG_ENTITY = 'dnsconfig'
ZONE_DEFAULT_FACET = 'records'
ZONE_PKEY = 'foo.itest'
ZONE_DATA = {
'pkey': ZONE_PKEY,
'add': [
('textbox', 'idnsname', ZONE_PKEY),
('textbox', 'idnssoamname', 'ns'),
('textbox', 'ip_address', '192.168.1.1'),
('checkbox', 'force', ''),
],
'mod': [
('checkbox', 'idnsallowsyncptr',''),
],
}
RECORD_PKEY = 'itest'
RECORD_ADD_DATA = {
'pkey': RECORD_PKEY,
'add': [
('textbox', 'idnsname', RECORD_PKEY),
('textbox', 'a_part_ip_address', '192.168.1.10'),
]
}
RECORD_MOD_DATA = {
'fields': [
('textbox', 'a_part_ip_address', '192.168.1.11'),
]
}
CONFIG_MOD_DATA = {
'mod': [
('checkbox', 'idnsallowsyncptr',''),
],
}
class test_dns(UI_driver):
def __init__(self, *args, **kwargs):
super(test_dns, self).__init__(args, kwargs)
if not self.has_dns():
self.skip('DNS not configured')
def test_zone_record_crud(self):
"""
Basic CRUD: dns
"""
self.init_app()
# add and mod zone
self.basic_crud(ZONE_ENTITY, ZONE_DATA,
default_facet=ZONE_DEFAULT_FACET , delete=False)
# add and mod record
self.navigate_to_record(ZONE_PKEY)
self.add_record(ZONE_ENTITY, RECORD_ADD_DATA,
facet=ZONE_DEFAULT_FACET, navigate=False)
self.navigate_to_record(RECORD_PKEY)
self.add_table_record('arecord', RECORD_MOD_DATA)
# del record, del zone
self.navigate_by_breadcrumb(ZONE_PKEY)
self.delete_record(RECORD_PKEY)
self.navigate_by_breadcrumb("DNS Zones")
self.delete_record(ZONE_PKEY)
def test_config_crud(self):
"""
Basic CRUD: dnsconfig
"""
self.init_app()
self.navigate_by_menu('identity/dns/dnsconfig')
self.mod_record(CONFIG_ENTITY, CONFIG_MOD_DATA)

View File

@@ -0,0 +1,194 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Group tests
"""
from ipatests.test_webui.ui_driver import UI_driver
import ipatests.test_webui.data_group as group
import ipatests.test_webui.data_user as user
import ipatests.test_webui.data_netgroup as netgroup
import ipatests.test_webui.data_hbac as hbac
import ipatests.test_webui.test_rbac as rbac
import ipatests.test_webui.data_sudo as sudo
class test_group(UI_driver):
def test_crud(self):
"""
Basic CRUD: group
"""
self.init_app()
self.basic_crud(group.ENTITY, group.DATA,
default_facet=group.DEFAULT_FACET)
def test_actions(self):
"""
Test group actions
"""
self.init_app()
self.add_record(group.ENTITY, group.DATA)
self.navigate_to_record(group.PKEY)
self.switch_to_facet('details')
self.make_posix_action()
self.delete_action()
self.add_record(group.ENTITY, group.DATA, navigate=False)
self.navigate_to_record(group.PKEY)
self.switch_to_facet('details')
self.facet_button_click('refresh')# workaround for BUG: #3702
self.make_external_action()
self.delete_action()
def make_external_action(self):
self.action_list_action('make_external')
self.wait_for_request(n=2)
self.assert_no_error_dialog()
self.assert_text_field('external', 'External', element='span')
def make_posix_action(self):
self.action_list_action('make_posix')
self.wait_for_request(n=2)
self.assert_no_error_dialog()
self.assert_text_field('external', 'POSIX', element='span')
def delete_action(self, entity=group.ENTITY, pkey=group.PKEY):
self.action_list_action('delete')
self.wait_for_request(n=4)
self.assert_no_error_dialog()
self.assert_facet(entity, 'search')
self.assert_record(pkey, negative=True)
def test_associations(self):
"""
Test group associations
"""
self.init_app()
# prepare
# -------
self.add_record(group.ENTITY, group.DATA)
self.add_record(group.ENTITY, group.DATA2, navigate=False)
self.add_record(group.ENTITY, group.DATA3, navigate=False)
self.add_record(user.ENTITY, user.DATA)
self.add_record(netgroup.ENTITY, netgroup.DATA)
self.add_record(rbac.ROLE_ENTITY, rbac.ROLE_DATA)
self.add_record(hbac.RULE_ENTITY, hbac.RULE_DATA)
self.add_record(sudo.RULE_ENTITY, sudo.RULE_DATA)
# add & remove associations
# -------------------------
self.navigate_to_record(group.PKEY, entity=group.ENTITY)
# members
self.add_associations([group.PKEY2], facet='member_group', delete=True)
self.add_associations([user.PKEY], facet='member_user', delete=True)
# TODO: external
# member of
self.add_associations([group.PKEY3], facet='memberof_group', delete=True)
self.add_associations([netgroup.PKEY], facet='memberof_netgroup', delete=True)
self.add_associations([rbac.ROLE_PKEY], facet='memberof_role', delete=True)
self.add_associations([hbac.RULE_PKEY], facet='memberof_hbacrule', delete=True)
self.navigate_to_record(group.PKEY, entity=group.ENTITY)
self.add_associations([sudo.RULE_PKEY], facet='memberof_sudorule', delete=True)
# cleanup
# -------
self.delete(group.ENTITY, [group.DATA, group.DATA2, group.DATA3])
self.delete(user.ENTITY, [user.DATA])
self.delete(netgroup.ENTITY, [netgroup.DATA])
self.delete(rbac.ROLE_ENTITY, [rbac.ROLE_DATA])
self.delete(hbac.RULE_ENTITY, [hbac.RULE_DATA])
self.delete(sudo.RULE_ENTITY, [sudo.RULE_DATA])
def test_indirect_associations(self):
"""
Group indirect associations
"""
self.init_app()
# add
# ---
self.add_record(group.ENTITY, group.DATA)
self.add_record(group.ENTITY, group.DATA2, navigate=False)
self.add_record(group.ENTITY, group.DATA3, navigate=False)
self.add_record(group.ENTITY, group.DATA4, navigate=False)
self.add_record(group.ENTITY, group.DATA5, navigate=False)
self.add_record(user.ENTITY, user.DATA)
# prepare indirect member
self.navigate_to_entity(group.ENTITY, 'search')
self.navigate_to_record(group.PKEY2)
self.add_associations([user.PKEY])
self.add_associations([group.PKEY3], 'member_group')
self.navigate_to_entity(group.ENTITY, 'search')
self.navigate_to_record(group.PKEY)
self.add_associations([group.PKEY2], 'member_group')
# prepare indirect memberof
self.navigate_to_entity(group.ENTITY, 'search')
self.navigate_to_record(group.PKEY4)
self.add_associations([group.PKEY], 'member_group')
self.add_associations([group.PKEY5], 'memberof_group')
self.add_record(netgroup.ENTITY, netgroup.DATA)
self.navigate_to_record(netgroup.PKEY)
self.add_table_associations('memberuser_group', [group.PKEY4])
self.add_record(rbac.ROLE_ENTITY, rbac.ROLE_DATA)
self.navigate_to_record(rbac.ROLE_PKEY)
self.add_associations([group.PKEY4], facet='member_group')
self.add_record(hbac.RULE_ENTITY, hbac.RULE_DATA)
self.navigate_to_record(hbac.RULE_PKEY)
self.add_table_associations('memberuser_group', [group.PKEY4])
self.add_record(sudo.RULE_ENTITY, sudo.RULE_DATA)
self.navigate_to_record(sudo.RULE_PKEY)
self.add_table_associations('memberuser_group', [group.PKEY4])
# check indirect associations
# ---------------------------
self.navigate_to_entity(group.ENTITY, 'search')
self.navigate_to_record(group.PKEY)
self.assert_indirect_record(user.PKEY, group.ENTITY, 'member_user')
self.assert_indirect_record(group.PKEY3, group.ENTITY, 'member_group')
self.assert_indirect_record(group.PKEY5, group.ENTITY, 'memberof_group')
self.assert_indirect_record(netgroup.PKEY, group.ENTITY, 'memberof_netgroup')
self.assert_indirect_record(rbac.ROLE_PKEY, group.ENTITY, 'memberof_role')
self.assert_indirect_record(hbac.RULE_PKEY, group.ENTITY, 'memberof_hbacrule')
self.assert_indirect_record(sudo.RULE_PKEY, group.ENTITY, 'memberof_sudorule')
## cleanup
## -------
self.delete(group.ENTITY, [group.DATA, group.DATA2, group.DATA3, group.DATA4, group.DATA5])
self.delete(user.ENTITY, [user.DATA])
self.delete(netgroup.ENTITY, [netgroup.DATA])
self.delete(rbac.ROLE_ENTITY, [rbac.ROLE_DATA])
self.delete(hbac.RULE_ENTITY, [hbac.RULE_DATA])
self.delete(sudo.RULE_ENTITY, [sudo.RULE_DATA])

View File

@@ -0,0 +1,159 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
HBAC tests
"""
from ipatests.test_webui.ui_driver import UI_driver
import ipatests.test_webui.data_hbac as hbac
import ipatests.test_webui.data_hostgroup as hostgroup
class test_hbac(UI_driver):
def test_crud(self):
"""
Basic CRUD: hbac
"""
self.init_app()
self.basic_crud(hbac.RULE_ENTITY, hbac.RULE_DATA)
self.basic_crud(hbac.SVC_ENTITY, hbac.SVC_DATA)
self.basic_crud(hbac.SVCGROUP_ENTITY, hbac.SVCGROUP_DATA,
default_facet=hbac.SVCGROUP_DEF_FACET)
def test_mod(self):
"""
Mod: hbac
"""
self.init_app()
host_key = self.config.get('ipa_server').strip()
self.add_record(hostgroup.ENTITY, hostgroup.DATA)
self.add_record(hbac.RULE_ENTITY, hbac.RULE_DATA)
self.navigate_to_record(hbac.RULE_PKEY)
tables = [
['memberuser_user', ['admin'],],
['memberuser_group', ['editors'],],
['memberhost_host', [host_key],],
['memberhost_hostgroup', [hostgroup.PKEY],],
['memberservice_hbacsvc', ['ftp'],],
['memberservice_hbacsvcgroup', ['Sudo'],],
]
categories = [
'usercategory',
'hostcategory',
'servicecategory',
]
self.mod_rule_tables(tables, categories, [])
# cleanup
# -------
self.delete(hbac.RULE_ENTITY, [hbac.RULE_DATA])
self.delete(hostgroup.ENTITY, [hostgroup.DATA])
def test_actions(self):
"""
Test hbac rule actions
"""
self.init_app()
self.add_record(hbac.RULE_ENTITY, hbac.RULE_DATA)
self.navigate_to_record(hbac.RULE_PKEY)
self.disable_action()
self.enable_action()
self.delete_action(hbac.RULE_ENTITY, hbac.RULE_PKEY)
def test_hbac_test(self):
"""
Test HBAC test UI
Test:
* basic functionality
* navigation by next/prev buttons
* navigation by facet tabs
* resetting test
"""
self.init_app()
host_key = self.config.get('ipa_server').strip()
self.navigate_to_entity('hbactest', 'user')
self.assert_facet('hbactest', 'user')
self.select_record('admin')
self.button_click('next')
self.wait_for_request(n=2)
self.assert_facet('hbactest', 'targethost')
self.select_record(host_key)
self.button_click('prev')
self.assert_facet('hbactest', 'user')
self.switch_to_facet('targethost')
self.button_click('next')
self.wait_for_request(n=2)
self.assert_facet('hbactest', 'service')
self.select_record('ftp')
self.button_click('prev')
self.assert_facet('hbactest', 'targethost')
self.switch_to_facet('service')
self.button_click('next')
self.wait_for_request(n=2)
self.assert_facet('hbactest', 'rules')
self.select_record('allow_all')
self.button_click('prev')
self.assert_facet('hbactest', 'service')
self.switch_to_facet('rules')
self.button_click('next')
self.wait_for_request(n=2)
self.assert_facet('hbactest', 'run_test')
self.button_click('run_test')
self.wait_for_request(n=2)
self.assert_text("div.hbac-test-result-panel p", 'Access Granted'.upper())
self.button_click('prev')
self.assert_facet('hbactest', 'rules')
self.switch_to_facet('run_test')
self.button_click('new_test')
self.assert_facet('hbactest', 'user')
# test pre-run validation and navigation to related facet
self.switch_to_facet('run_test')
self.button_click('run_test')
self.assert_dialog('message_dialog')
self.click_on_link('User name')
self.assert_facet('hbactest', 'user')
self.switch_to_facet('run_test')
self.button_click('run_test')
self.assert_dialog('message_dialog')
self.click_on_link('Target host')
self.assert_facet('hbactest', 'targethost')
self.switch_to_facet('run_test')
self.button_click('run_test')
self.assert_dialog('message_dialog')
self.click_on_link('Service')
self.assert_facet('hbactest', 'service')

View File

@@ -0,0 +1,269 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Host tests
"""
from ipatests.test_webui.ui_driver import UI_driver
import ipatests.test_webui.data_hostgroup as hostgroup
import ipatests.test_webui.data_netgroup as netgroup
import ipatests.test_webui.data_hbac as hbac
import ipatests.test_webui.test_rbac as rbac
import ipatests.test_webui.data_sudo as sudo
ENTITY = 'host'
class host_tasks(UI_driver):
def __init__(self, *args, **kwargs):
super(host_tasks, self).__init__(args, kwargs)
self.prep_data()
self.prep_data2()
def prep_data(self):
host = 'itest'
domain = self.config.get('ipa_domain')
ip = self.get_ip()
self.data = self.get_data(host, domain, ip)
self.pkey = self.data['pkey']
return self.data
def prep_data2(self):
host = 'itest2'
domain = self.config.get('ipa_domain')
self.data2 = self.get_data(host, domain)
self.pkey2 = self.data2['pkey']
return self.data2
def get_data(self, host, domain, ip=None):
if self.has_dns():
add_data = [
('textbox', 'hostname', host),
('combobox', 'dnszone', domain),
]
if ip:
add_data.append(('textbox', 'ip_address', ip))
add_data.append(('checkbox', 'force', ''))
del_data = [
('checkbox', 'updatedns', '')
]
else:
add_data = [
('textbox', 'fqdn', '%s.%s' % (host, domain)),
('checkbox', 'force', ''),
]
del_data = None
data = {
'pkey': '%s.%s' % (host, domain),
'add': add_data,
'mod': [
('textarea', 'description','Desc'),
],
'del': del_data,
}
return data
def get_ip(self):
"""
Get next IP
"""
ip = self.config.get('ipa_ip')
if not ip:
self.skip('FreeIPA Server IP address not configured')
ip = ip.split('.')
last = int(ip.pop())
ip.append(str(last+1))
return '.'.join(ip)
def load_csr(self, path):
# ENHANCEMENT: generate csr dynamically
with open(path, 'r') as csr_file:
csr = csr_file.read()
return csr
class test_host(host_tasks):
def test_crud(self):
"""
Basic CRUD: host
"""
self.init_app()
self.basic_crud(ENTITY, self.data)
def test_certificates(self):
"""
Test host certificate actions
Requires to have CA installed and 'host_csr_path' configuration option
set.
"""
if not self.has_ca():
self.skip('CA is not configured')
csr_path = self.config.get('host_csr_path')
if not csr_path:
self.skip('CSR file is not configured')
self.init_app()
csr = self.load_csr(csr_path)
panel = 'cert_actions'
realm = self.config.get('ipa_realm')
self.add_record(ENTITY, self.data)
self.navigate_to_record(self.pkey)
self.assert_visible("div[name='certificate-missing']")
# cert request
self.action_panel_action(panel, 'request_cert')
self.fill_text('textarea.certificate', csr)
self.dialog_button_click('issue')
self.wait_for_request(n=2,d=0.5)
self.assert_visible("div[name='certificate-valid']")
# cert view
self.action_panel_action(panel, 'view_cert')
self.wait()
self.assert_text("tbody tr:nth-child(2) td:nth-child(2)", self.pkey)
self.assert_text("tbody tr:nth-child(3) td:nth-child(2)", realm)
self.dialog_button_click('close')
# cert get
self.action_panel_action(panel, 'get_cert')
self.wait()
# We don't know the cert text, so at least open and close the dialog
self.dialog_button_click('close')
## cert revoke
self.action_panel_action(panel, 'revoke_cert')
self.wait()
self.select('select', '6')
self.dialog_button_click('ok')
self.wait_for_request(n=2)
self.assert_visible("div[name='certificate-revoked']")
## cert restore
self.action_panel_action(panel, 'restore_cert')
self.wait()
self.dialog_button_click('ok')
self.wait_for_request(n=2)
self.assert_visible("div[name='certificate-valid']")
# cleanup
self.navigate_to_entity(ENTITY, 'search')
self.delete_record(self.pkey, self.data.get('del'))
def test_associations(self):
"""
Host direct associations
"""
self.init_app()
# prepare
# -------
self.add_record(ENTITY, self.data)
self.add_record(ENTITY, self.data2, navigate=False)
self.add_record(hostgroup.ENTITY, hostgroup.DATA)
self.add_record(netgroup.ENTITY, netgroup.DATA)
self.add_record(rbac.ROLE_ENTITY, rbac.ROLE_DATA)
self.add_record(hbac.RULE_ENTITY, hbac.RULE_DATA)
self.add_record(sudo.RULE_ENTITY, sudo.RULE_DATA)
# add & remove associations
# -------------------------
self.navigate_to_entity(ENTITY)
self.navigate_to_record(self.pkey)
self.add_associations([hostgroup.PKEY], facet='memberof_hostgroup', delete=True)
self.add_associations([netgroup.PKEY], facet='memberof_netgroup', delete=True)
self.add_associations([rbac.ROLE_PKEY], facet='memberof_role', delete=True)
self.add_associations([hbac.RULE_PKEY], facet='memberof_hbacrule', delete=True)
self.add_associations([sudo.RULE_PKEY], facet='memberof_sudorule', delete=True)
self.add_associations([self.pkey2], facet='managedby_host', delete=True)
# cleanup
# -------
self.delete(ENTITY, [self.data, self.data2])
self.delete(hostgroup.ENTITY, [hostgroup.DATA])
self.delete(netgroup.ENTITY, [netgroup.DATA])
self.delete(rbac.ROLE_ENTITY, [rbac.ROLE_DATA])
self.delete(hbac.RULE_ENTITY, [hbac.RULE_DATA])
self.delete(sudo.RULE_ENTITY, [sudo.RULE_DATA])
def test_indirect_associations(self):
"""
Host indirect associations
"""
self.init_app()
# add
# ---
self.add_record(ENTITY, self.data)
self.add_record(hostgroup.ENTITY, hostgroup.DATA)
self.navigate_to_record(hostgroup.PKEY)
self.add_associations([self.pkey])
self.add_record(hostgroup.ENTITY, hostgroup.DATA2)
self.navigate_to_record(hostgroup.PKEY2)
self.switch_to_facet('member_hostgroup')
self.add_associations([hostgroup.PKEY])
self.add_record(netgroup.ENTITY, netgroup.DATA)
self.navigate_to_record(netgroup.PKEY)
self.add_table_associations('memberhost_hostgroup', [hostgroup.PKEY2])
self.add_record(rbac.ROLE_ENTITY, rbac.ROLE_DATA)
self.navigate_to_record(rbac.ROLE_PKEY)
self.switch_to_facet('member_hostgroup')
self.add_associations([hostgroup.PKEY2])
self.add_record(hbac.RULE_ENTITY, hbac.RULE_DATA)
self.navigate_to_record(hbac.RULE_PKEY)
self.add_table_associations('memberhost_hostgroup', [hostgroup.PKEY2])
self.add_record(sudo.RULE_ENTITY, sudo.RULE_DATA)
self.navigate_to_record(sudo.RULE_PKEY)
self.add_table_associations('memberhost_hostgroup', [hostgroup.PKEY2])
# check indirect associations
# ---------------------------
self.navigate_to_entity(ENTITY, 'search')
self.navigate_to_record(self.pkey)
self.assert_indirect_record(hostgroup.PKEY2, ENTITY, 'memberof_hostgroup')
self.assert_indirect_record(netgroup.PKEY, ENTITY, 'memberof_netgroup')
self.assert_indirect_record(rbac.ROLE_PKEY, ENTITY, 'memberof_role')
self.assert_indirect_record(hbac.RULE_PKEY, ENTITY, 'memberof_hbacrule')
self.assert_indirect_record(sudo.RULE_PKEY, ENTITY, 'memberof_sudorule')
## cleanup
## -------
self.delete(ENTITY, [self.data])
self.delete(hostgroup.ENTITY, [hostgroup.DATA, hostgroup.DATA2])
self.delete(netgroup.ENTITY, [netgroup.DATA])
self.delete(rbac.ROLE_ENTITY, [rbac.ROLE_DATA])
self.delete(hbac.RULE_ENTITY, [hbac.RULE_DATA])
self.delete(sudo.RULE_ENTITY, [sudo.RULE_DATA])

View File

@@ -0,0 +1,141 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Hostgroup tests
"""
from ipatests.test_webui.ui_driver import UI_driver
import ipatests.test_webui.data_hostgroup as hostgroup
from ipatests.test_webui.test_host import host_tasks, ENTITY as HOST_ENTITY
import ipatests.test_webui.data_netgroup as netgroup
import ipatests.test_webui.data_hbac as hbac
import ipatests.test_webui.test_rbac as rbac
import ipatests.test_webui.data_sudo as sudo
class test_hostgroup(UI_driver):
def test_crud(self):
"""
Basic CRUD: hostgroup
"""
self.init_app()
self.basic_crud(hostgroup.ENTITY, hostgroup.DATA,
default_facet=hostgroup.DEFAULT_FACET)
def test_associations(self):
"""
Hostgroup associations
"""
self.init_app()
host = host_tasks(self.driver, self.config)
# prepare
# -------
self.add_record(hostgroup.ENTITY, hostgroup.DATA)
self.add_record(hostgroup.ENTITY, hostgroup.DATA2, navigate=False)
self.add_record(hostgroup.ENTITY, hostgroup.DATA3, navigate=False)
self.add_record(HOST_ENTITY, host.data2)
self.add_record(netgroup.ENTITY, netgroup.DATA)
self.add_record(hbac.RULE_ENTITY, hbac.RULE_DATA)
self.add_record(sudo.RULE_ENTITY, sudo.RULE_DATA)
# add & remove associations
# -------------------------
self.navigate_to_entity(hostgroup.ENTITY)
self.navigate_to_record(hostgroup.PKEY)
# members
self.add_associations([hostgroup.PKEY2], facet='member_hostgroup', delete=True)
self.add_associations([host.pkey2], facet='member_host', delete=True)
# member of
self.add_associations([hostgroup.PKEY3], facet='memberof_hostgroup', delete=True)
self.add_associations([netgroup.PKEY], facet='memberof_netgroup', delete=True)
self.add_associations([hbac.RULE_PKEY], facet='memberof_hbacrule', delete=True)
self.add_associations([sudo.RULE_PKEY], facet='memberof_sudorule', delete=True)
# cleanup
# -------
self.delete(hostgroup.ENTITY, [hostgroup.DATA, hostgroup.DATA2, hostgroup.DATA3])
self.delete(HOST_ENTITY, [host.data2])
self.delete(netgroup.ENTITY, [netgroup.DATA])
self.delete(hbac.RULE_ENTITY, [hbac.RULE_DATA])
self.delete(sudo.RULE_ENTITY, [sudo.RULE_DATA])
def test_indirect_associations(self):
"""
Hostgroup indirect associations
"""
self.init_app()
host = host_tasks(self.driver, self.config)
# add
# ---
self.add_record(hostgroup.ENTITY, hostgroup.DATA)
self.add_record(hostgroup.ENTITY, hostgroup.DATA2, navigate=False)
self.add_record(hostgroup.ENTITY, hostgroup.DATA3, navigate=False)
self.add_record(hostgroup.ENTITY, hostgroup.DATA4, navigate=False)
self.add_record(hostgroup.ENTITY, hostgroup.DATA5, navigate=False)
self.add_record(HOST_ENTITY, host.data2)
# prepare indirect member
self.navigate_to_entity(hostgroup.ENTITY, 'search')
self.navigate_to_record(hostgroup.PKEY2)
self.add_associations([host.pkey2])
self.add_associations([hostgroup.PKEY3], 'member_hostgroup')
self.navigate_to_entity(hostgroup.ENTITY, 'search')
self.navigate_to_record(hostgroup.PKEY)
self.add_associations([hostgroup.PKEY2], 'member_hostgroup')
# prepare indirect memberof
self.navigate_to_entity(hostgroup.ENTITY, 'search')
self.navigate_to_record(hostgroup.PKEY4)
self.add_associations([hostgroup.PKEY], 'member_hostgroup')
self.add_associations([hostgroup.PKEY5], 'memberof_hostgroup')
self.add_record(hbac.RULE_ENTITY, hbac.RULE_DATA)
self.navigate_to_record(hbac.RULE_PKEY)
self.add_table_associations('memberhost_hostgroup', [hostgroup.PKEY4])
self.add_record(sudo.RULE_ENTITY, sudo.RULE_DATA)
self.navigate_to_record(sudo.RULE_PKEY)
self.add_table_associations('memberhost_hostgroup', [hostgroup.PKEY4])
# check indirect associations
# ---------------------------
self.navigate_to_entity(hostgroup.ENTITY, 'search')
self.navigate_to_record(hostgroup.PKEY)
self.assert_indirect_record(hostgroup.PKEY3, hostgroup.ENTITY, 'member_hostgroup')
self.assert_indirect_record(host.pkey2, hostgroup.ENTITY, 'member_host')
self.assert_indirect_record(hostgroup.PKEY5, hostgroup.ENTITY, 'memberof_hostgroup')
self.assert_indirect_record(hbac.RULE_PKEY, hostgroup.ENTITY, 'memberof_hbacrule')
self.assert_indirect_record(sudo.RULE_PKEY, hostgroup.ENTITY, 'memberof_sudorule')
## cleanup
## -------
self.delete(hostgroup.ENTITY, [hostgroup.DATA, hostgroup.DATA2,
hostgroup.DATA3, hostgroup.DATA4, hostgroup.DATA5])
self.delete(HOST_ENTITY, [host.data2])
self.delete(hbac.RULE_ENTITY, [hbac.RULE_DATA])
self.delete(sudo.RULE_ENTITY, [sudo.RULE_DATA])

View File

@@ -0,0 +1,52 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Kerberos policy tests
"""
from ipatests.test_webui.ui_driver import UI_driver
ENTITY = 'krbtpolicy'
DATA = {
'mod': [
('textbox', 'krbmaxrenewableage','599000'),
('textbox', 'krbmaxticketlife','79800'),
],
}
DATA2 = {
'mod': [
('textbox', 'krbmaxrenewableage','604800'),
('textbox', 'krbmaxticketlife','86400'),
],
}
class test_krbtpolicy(UI_driver):
def test_mod(self):
"""
Kerberos policy mod test
"""
self.init_app()
self.navigate_to_entity(ENTITY)
self.mod_record(ENTITY, DATA)
self.mod_record(ENTITY, DATA2)

View File

@@ -0,0 +1,149 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Basic ui tests
"""
from ipatests.test_webui.ui_driver import UI_driver
ENTITIES = [
'group',
'user',
'host',
'hostgroup',
'netgroup',
'service',
'dnszone',
# TODO: dnsrecord
'dnsconfig',
'cert',
'realmdomains',
'hbacrule',
'hbacsvc',
'hbacsvcgroup',
'hbactest',
'sudorule',
'sudocmd',
'sudocmdgroup',
'automountlocation',
# TODO: add nested maps, keys
'pwpolicy',
'krbtpolicy',
'selinuxusermap',
'automember',
# TODO: add different types
'role',
'privilege',
'permission',
'selfservice',
'delegation',
'idrange',
'config',
# TODO: add conditional
]
class test_navigation(UI_driver):
def test_url_navigation(self):
"""
Navigation test: direct url change
"""
self.init_app()
unsupported = []
if not self.has_dns():
unsupported.extend([
'dnszone',
'dnsconfig',
])
if not self.has_ca():
unsupported.append('cert')
entities = [e for e in ENTITIES if e not in unsupported]
for e in entities:
self.wait_for_request()
self.navigate_to_entity(e)
self.assert_facet(e)
url = self.get_url(e)
self.assert_e_url(url, e)
def test_menu_navigation(self):
"""
Navigation test: menu items
"""
self.init_app()
# don't start by users (default)
self.navigate_by_menu('identity/group', False)
self.navigate_by_menu('identity/user', False)
self.navigate_by_menu('identity/host', False)
self.navigate_by_menu('identity/hostgroup', False)
self.navigate_by_menu('identity/netgroup', False)
self.navigate_by_menu('identity/service', False)
if self.has_dns():
self.navigate_by_menu('identity/dns', False)
self.navigate_by_menu('identity/dns/dnsconfig', False)
self.navigate_by_menu('identity/dns/dnszone', False)
if self.has_ca():
self.navigate_by_menu('identity/cert', False)
self.navigate_by_menu('identity/realmdomains', False)
self.navigate_by_menu('policy')
self.navigate_by_menu('policy/hbac', False)
self.navigate_by_menu('policy/hbac/hbacsvc', False)
self.navigate_by_menu('policy/hbac/hbacrule', False)
self.navigate_by_menu('policy/hbac/hbacsvcgroup', False)
self.navigate_by_menu('policy/hbac/hbactest', False)
self.navigate_by_menu('policy/sudo', False)
self.navigate_by_menu('policy/sudo/sudorule', False)
self.navigate_by_menu('policy/sudo/sudocmd', False)
self.navigate_by_menu('policy/sudo/sudocmdgroup', False)
self.navigate_by_menu('policy/automount', False)
self.navigate_by_menu('policy/pwpolicy', False)
self.navigate_by_menu('policy/krbtpolicy', False)
self.navigate_by_menu('policy/selinuxusermap', False)
self.navigate_by_menu('policy/automember', False)
self.navigate_by_menu('policy/automember/amhostgroup', False)
self.navigate_by_menu('policy/automember/amgroup', False)
self.navigate_by_menu('ipaserver')
self.navigate_by_menu('ipaserver/rolebased', False)
self.navigate_by_menu('ipaserver/rolebased/privilege', False)
self.navigate_by_menu('ipaserver/rolebased/role', False)
self.navigate_by_menu('ipaserver/rolebased/permission', False)
self.navigate_by_menu('ipaserver/selfservice', False)
self.navigate_by_menu('ipaserver/delegation', False)
self.navigate_by_menu('ipaserver/idrange', False)
if self.has_trusts():
self.navigate_by_menu('ipaserver/trusts', False)
self.navigate_by_menu('ipaserver/trusts/trust', False)
self.navigate_by_menu('ipaserver/trusts/trustconfig', False)
self.navigate_by_menu('ipaserver/config', False)
def assert_e_url(self, url, e):
"""
Assert correct url for entity
"""
if not self.driver.current_url.startswith(url):
msg = 'Invalid url for: %s' % e
raise AssertionError(msg)

View File

@@ -0,0 +1,81 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Netgroup tests
"""
from ipatests.test_webui.ui_driver import UI_driver
import ipatests.test_webui.data_netgroup as netgroup
import ipatests.test_webui.data_user as user
import ipatests.test_webui.data_group as group
import ipatests.test_webui.data_hostgroup as hostgroup
from ipatests.test_webui.test_host import host_tasks, ENTITY as HOST_ENTITY
class test_netgroup(UI_driver):
def test_crud(self):
"""
Basic CRUD: netgroup
"""
self.init_app()
self.basic_crud(netgroup.ENTITY, netgroup.DATA)
def test_mod(self):
"""
Mod: netgroup
"""
self.init_app()
host = host_tasks(self.driver, self.config)
self.add_record(netgroup.ENTITY, netgroup.DATA2)
self.add_record(user.ENTITY, user.DATA)
self.add_record(user.ENTITY, user.DATA2, navigate=False)
self.add_record(group.ENTITY, group.DATA)
self.add_record(group.ENTITY, group.DATA2, navigate=False)
self.add_record(HOST_ENTITY, host.data)
self.add_record(HOST_ENTITY, host.data2, navigate=False)
self.add_record(hostgroup.ENTITY, hostgroup.DATA)
self.add_record(hostgroup.ENTITY, hostgroup.DATA2, navigate=False)
self.add_record(netgroup.ENTITY, netgroup.DATA)
self.navigate_to_record(netgroup.PKEY, entity=netgroup.ENTITY)
tables = [
['memberuser_user', [user.PKEY, user.PKEY2],],
['memberuser_group', [group.PKEY, group.PKEY2],],
['memberhost_host', [host.pkey, host.pkey2],],
['memberhost_hostgroup', [hostgroup.PKEY, hostgroup.PKEY2],],
]
categories = [
'usercategory',
'hostcategory',
]
self.mod_rule_tables(tables, categories, [])
# cleanup
# -------
self.delete(netgroup.ENTITY, [netgroup.DATA, netgroup.DATA2])
self.delete(user.ENTITY, [user.DATA, user.DATA2])
self.delete(group.ENTITY, [group.DATA, group.DATA2])
self.delete(HOST_ENTITY, [host.data, host.data2])
self.delete(hostgroup.ENTITY, [hostgroup.DATA, hostgroup.DATA2])

View File

@@ -0,0 +1,52 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Password policy tests
"""
from ipatests.test_webui.ui_driver import UI_driver
ENTITY = 'pwpolicy'
DATA = {
'pkey': 'admins',
'add': [
('combobox', 'cn', 'admins'),
('textbox', 'cospriority', '364'),
],
'mod': [
('textbox', 'krbmaxpwdlife','3000'),
('textbox', 'krbminpwdlife','1'),
('textbox', 'krbpwdhistorylength','0'),
('textbox', 'krbpwdmindiffchars','2'),
('textbox', 'krbpwdminlength','2'),
('textbox', 'krbpwdmaxfailure','15'),
('textbox', 'krbpwdfailurecountinterval','5'),
('textbox', 'krbpwdlockoutduration','3600'),
],
}
class test_pwpolicy(UI_driver):
def test_crud(self):
"""
Basic CRUD: pwpolicy
"""
self.init_app()
self.basic_crud(ENTITY, DATA)

View File

@@ -0,0 +1,49 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
User tests
"""
from ipatests.test_webui.ui_driver import UI_driver
ENTITY = 'idrange'
PKEY = 'itest-range'
DATA = {
'pkey': PKEY,
'add': [
('textbox', 'cn', PKEY),
('textbox', 'ipabaseid', '900000'),
('textbox', 'ipaidrangesize', '99999'),
('textbox', 'ipabaserid', '10000'),
('textbox', 'ipasecondarybaserid', '200000'),
],
'mod': [
('textbox', 'ipaidrangesize', '100000'),
],
}
class test_range(UI_driver):
def test_crud(self):
"""
Basic CRUD: range
"""
self.init_app()
self.basic_crud(ENTITY, DATA)

View File

@@ -0,0 +1,83 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
RBAC tests
"""
from ipatests.test_webui.ui_driver import UI_driver
ROLE_ENTITY = 'role'
ROLE_DEF_FACET = 'member_user'
ROLE_PKEY = 'AAtest_role'
ROLE_DATA = {
'pkey': ROLE_PKEY,
'add': [
('textbox', 'cn', ROLE_PKEY),
('textarea', 'description','role desc'),
],
'mod': [
('textarea', 'description','role desc mod'),
],
}
PRIVILEGE_ENTITY = 'privilege'
PRIVILEGE_DEF_FACET = 'memberof_permission'
PRIVILEGE_PKEY = 'AAtest_privilege'
PRIVILEGE_DATA = {
'pkey': PRIVILEGE_PKEY,
'add': [
('textbox', 'cn', PRIVILEGE_PKEY),
('textarea', 'description','privilege desc'),
],
'mod': [
('textarea', 'description','privilege desc mod'),
],
}
PERMISSION_ENTITY = 'permission'
PERMISSION_PKEY = 'AAtest_perm'
PERMISSION_DATA = {
'pkey': PERMISSION_PKEY,
'add': [
('textbox', 'cn', PERMISSION_PKEY),
('checkbox', 'permissions', 'write'),
('textbox', 'filter', 'cn=user'),
],
'mod': [
('textbox', 'filter','cn=user2'),
],
}
class test_rbac(UI_driver):
def test_crud(self):
"""
Basic CRUD: RBAC
"""
self.init_app()
self.basic_crud(ROLE_ENTITY, ROLE_DATA,
default_facet=ROLE_DEF_FACET
)
self.basic_crud(PRIVILEGE_ENTITY, PRIVILEGE_DATA,
default_facet=PRIVILEGE_DEF_FACET
)
self.basic_crud(PERMISSION_ENTITY, PERMISSION_DATA)

View File

@@ -0,0 +1,48 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Realm domains tests
"""
from ipatests.test_webui.ui_driver import UI_driver
ENTITY = 'realmdomains'
class test_realmdomains(UI_driver):
def test_read(self):
"""
Realm domains mod tests
"""
self.init_app()
self.navigate_to_entity(ENTITY)
# add
self.add_multivalued('associateddomain', 'itest.bar')
self.facet_button_click('update')
self.dialog_button_click('force')
self.wait_for_request()
# delete
self.delete_multivalued('associateddomain', 'itest.bar')
self.facet_button_click('update')
self.dialog_button_click('force')
self.wait_for_request()
self.wait_for_request()

View File

@@ -0,0 +1,48 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Selfservice tests
"""
from ipatests.test_webui.ui_driver import UI_driver
ENTITY = 'selfservice'
PKEY = 'itest-selfservice-rule'
DATA = {
'pkey': PKEY,
'add': [
('textbox', 'aciname', PKEY),
('table', 'attrs', 'audio'),
('table', 'attrs', 'businesscategory'),
],
'mod': [
('table', 'attrs', 'businesscategory'),
],
}
class test_selfservice(UI_driver):
def test_crud(self):
"""
Basic CRUD: selfservice entity
"""
self.init_app()
self.basic_crud(ENTITY, DATA)

View File

@@ -0,0 +1,104 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
SELinux user map tests
"""
from ipatests.test_webui.ui_driver import UI_driver
import ipatests.test_webui.data_user as user
import ipatests.test_webui.data_group as group
import ipatests.test_webui.data_hostgroup as hostgroup
from ipatests.test_webui.test_host import host_tasks, ENTITY as HOST_ENTITY
ENTITY = 'selinuxusermap'
PKEY='itest-selinuxusermap'
DATA = {
'pkey': PKEY,
'add': [
('textbox', 'cn', PKEY),
('textbox', 'ipaselinuxuser','user_u:s0'),
],
'mod': [
('textarea', 'description','itest-selinuxusermap desc'),
],
}
class test_selinuxusermap(UI_driver):
def test_crud(self):
"""
Basic CRUD: selinuxusermap
"""
self.init_app()
self.basic_crud(ENTITY, DATA)
def test_mod(self):
"""
Mod: selinuxusermap
"""
self.init_app()
host = host_tasks(self.driver, self.config)
self.add_record(user.ENTITY, user.DATA)
self.add_record(user.ENTITY, user.DATA2, navigate=False)
self.add_record(group.ENTITY, group.DATA)
self.add_record(group.ENTITY, group.DATA2, navigate=False)
self.add_record(HOST_ENTITY, host.data)
self.add_record(HOST_ENTITY, host.data2, navigate=False)
self.add_record(hostgroup.ENTITY, hostgroup.DATA)
self.add_record(hostgroup.ENTITY, hostgroup.DATA2, navigate=False)
self.add_record(ENTITY, DATA)
self.navigate_to_record(PKEY)
tables = [
['memberuser_user', [user.PKEY, user.PKEY2],],
['memberuser_group', [group.PKEY, group.PKEY2],],
['memberhost_host', [host.pkey, host.pkey2],],
['memberhost_hostgroup', [hostgroup.PKEY, hostgroup.PKEY2],],
]
categories = [
'usercategory',
'hostcategory',
]
self.mod_rule_tables(tables, categories, [])
# cleanup
# -------
self.delete(ENTITY, [DATA])
self.delete(user.ENTITY, [user.DATA, user.DATA2])
self.delete(group.ENTITY, [group.DATA, group.DATA2])
self.delete(HOST_ENTITY, [host.data, host.data2])
self.delete(hostgroup.ENTITY, [hostgroup.DATA, hostgroup.DATA2])
def test_actions(self):
"""
Test SELinux user map actions
"""
self.init_app()
self.add_record(ENTITY, DATA)
self.navigate_to_record(PKEY)
self.disable_action()
self.enable_action()
self.delete_action(ENTITY, PKEY)

View File

@@ -0,0 +1,129 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Service tests
"""
from ipatests.test_webui.ui_driver import UI_driver
ENTITY = 'service'
class sevice_tasks(UI_driver):
def prep_data(self):
host = self.config.get('ipa_server')
realm = self.config.get('ipa_realm')
pkey = 'itest'
return {
'pkey': '%s/%s@%s' % (pkey, host, realm),
'add': [
('textbox', 'service', pkey),
('combobox', 'host', host)
],
'mod': [
('checkbox', 'ipakrbokasdelegate',''),
],
}
def load_csr(self, path):
# ENHANCEMENT: generate csr dynamically
with open(path, 'r') as csr_file:
csr = csr_file.read()
return csr
class test_service(sevice_tasks):
def test_crud(self):
"""
Basic CRUD: service
"""
self.init_app()
data = self.prep_data()
self.basic_crud(ENTITY, data)
def test_certificates(self):
"""
Test service certificate actions
Requires to have CA installed and 'service_csr_path' configuration option
set.
"""
if not self.has_ca():
self.skip('CA is not configured')
csr_path = self.config.get('service_csr_path')
if not csr_path:
self.skip('CSR file is not configured')
self.init_app()
data = self.prep_data()
pkey = data.get('pkey')
csr = self.load_csr(csr_path)
panel = 'cert_actions'
host = self.config.get('ipa_server')
realm = self.config.get('ipa_realm')
self.add_record(ENTITY, data)
self.navigate_to_record(pkey)
self.assert_visible("div[name='certificate-missing']")
# cert request
self.action_panel_action(panel, 'request_cert')
self.fill_text('textarea.certificate', csr)
self.dialog_button_click('issue')
self.wait_for_request(n=2,d=0.5)
self.assert_visible("div[name='certificate-valid']")
# cert view
self.action_panel_action(panel, 'view_cert')
self.wait()
self.assert_text("tbody tr:nth-child(2) td:nth-child(2)", host)
self.assert_text("tbody tr:nth-child(3) td:nth-child(2)", realm)
self.dialog_button_click('close')
# cert get
self.action_panel_action(panel, 'get_cert')
self.wait()
# We don't know the cert text, so at least open and close the dialog
self.dialog_button_click('close')
## cert revoke
self.action_panel_action(panel, 'revoke_cert')
self.wait()
self.select('select', '6')
self.dialog_button_click('ok')
self.wait_for_request(n=2)
self.assert_visible("div[name='certificate-revoked']")
## cert restore
self.action_panel_action(panel, 'restore_cert')
self.wait()
self.dialog_button_click('ok')
self.wait_for_request(n=2)
self.assert_visible("div[name='certificate-valid']")
# cleanup
self.navigate_to_entity(ENTITY, 'search')
self.delete_record(pkey, data.get('del'))

View File

@@ -0,0 +1,122 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Sudo tests
"""
from ipatests.test_webui.ui_driver import UI_driver
import ipatests.test_webui.data_sudo as sudo
import ipatests.test_webui.data_netgroup as netgroup
import ipatests.test_webui.data_user as user
import ipatests.test_webui.data_group as group
import ipatests.test_webui.data_hostgroup as hostgroup
from ipatests.test_webui.test_host import host_tasks, ENTITY as HOST_ENTITY
class test_sudo(UI_driver):
def test_crud(self):
"""
Basic CRUD: sudo
"""
self.init_app()
self.basic_crud(sudo.RULE_ENTITY, sudo.RULE_DATA)
self.basic_crud(sudo.CMDENTITY, sudo.CMD_DATA)
self.basic_crud(sudo.CMDGROUP_ENTITY, sudo.CMDGROUP_DATA,
default_facet=sudo.CMDGROUP_DEF_FACET)
def test_mod(self):
"""
Mod: sudo
"""
self.init_app()
host = host_tasks(self.driver, self.config)
self.add_record(netgroup.ENTITY, netgroup.DATA2)
self.add_record(user.ENTITY, user.DATA)
self.add_record(user.ENTITY, user.DATA2, navigate=False)
self.add_record(group.ENTITY, group.DATA)
self.add_record(group.ENTITY, group.DATA2, navigate=False)
self.add_record(HOST_ENTITY, host.data)
self.add_record(HOST_ENTITY, host.data2, navigate=False)
self.add_record(hostgroup.ENTITY, hostgroup.DATA)
self.add_record(hostgroup.ENTITY, hostgroup.DATA2, navigate=False)
self.add_record(sudo.CMDENTITY, sudo.CMD_DATA)
self.add_record(sudo.CMDENTITY, sudo.CMD_DATA2, navigate=False)
self.add_record(sudo.CMDGROUP_ENTITY, sudo.CMDGROUP_DATA)
self.add_record(sudo.CMDGROUP_ENTITY, sudo.CMDGROUP_DATA2, navigate=False)
self.add_record(sudo.RULE_ENTITY, sudo.RULE_DATA)
self.navigate_to_record(sudo.RULE_PKEY, entity=sudo.RULE_ENTITY)
tables = [
['memberuser_user', [user.PKEY, user.PKEY2],],
['memberuser_group', [group.PKEY, group.PKEY2],],
['memberhost_host', [host.pkey, host.pkey2],],
['memberhost_hostgroup', [hostgroup.PKEY, hostgroup.PKEY2],],
['memberallowcmd_sudocmd', [sudo.CMD_PKEY, sudo.CMD_PKEY2],],
['memberallowcmd_sudocmdgroup', [sudo.CMD_GROUP_PKEY, sudo.CMD_GROUP_PKEY2],],
['memberdenycmd_sudocmd', [sudo.CMD_PKEY, sudo.CMD_PKEY2],],
['memberdenycmd_sudocmdgroup', [sudo.CMD_GROUP_PKEY, sudo.CMD_GROUP_PKEY2],],
['ipasudorunas_user', ['admin'],],
['ipasudorunas_group', ['editors', 'admins'],],
['ipasudorunasgroup_group', ['editors', 'admins'],],
]
categories = [
'usercategory',
'hostcategory',
'cmdcategory',
'ipasudorunasusercategory',
'ipasudorunasgroupcategory',
]
no_cats = [
'memberdenycmd_sudocmd',
'memberdenycmd_sudocmdgroup',
]
self.mod_rule_tables(tables, categories, no_cats)
# cleanup
# -------
self.delete(sudo.RULE_ENTITY, [sudo.RULE_DATA])
self.delete(user.ENTITY, [user.DATA, user.DATA2])
self.delete(group.ENTITY, [group.DATA, group.DATA2])
self.delete(HOST_ENTITY, [host.data, host.data2])
self.delete(hostgroup.ENTITY, [hostgroup.DATA, hostgroup.DATA2])
def test_actions(self):
"""
Test sudo rule actions
"""
self.init_app()
self.add_record(sudo.RULE_ENTITY, sudo.RULE_DATA)
self.navigate_to_record(sudo.RULE_PKEY)
self.disable_action()
self.enable_action()
self.delete_action(sudo.RULE_ENTITY, sudo.RULE_PKEY)

View File

@@ -0,0 +1,159 @@
# Authors:
# Petr Vobornik <pvoborni@redhat.com>
#
# Copyright (C) 2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
User tests
"""
from ipatests.test_webui.ui_driver import UI_driver
import ipatests.test_webui.data_user as user
import ipatests.test_webui.data_group as group
import ipatests.test_webui.data_netgroup as netgroup
import ipatests.test_webui.data_hbac as hbac
import ipatests.test_webui.test_rbac as rbac
import ipatests.test_webui.data_sudo as sudo
class test_user(UI_driver):
def test_crud(self):
"""
Basic CRUD: user
"""
self.init_app()
self.basic_crud(user.ENTITY, user.DATA)
def test_associations(self):
"""
User direct associations
"""
self.init_app()
# prepare - add user, group, netgroup, role, hbac rule, sudo rule
# ---------------------------------------------------------------
self.add_record(user.ENTITY, user.DATA, navigate=False)
self.add_record(group.ENTITY, group.DATA)
self.add_record(netgroup.ENTITY, netgroup.DATA)
self.add_record(rbac.ROLE_ENTITY, rbac.ROLE_DATA)
self.add_record(hbac.RULE_ENTITY, hbac.RULE_DATA)
self.add_record(sudo.RULE_ENTITY, sudo.RULE_DATA)
# add & remove associations
# -------------------------
self.navigate_to_entity(user.ENTITY)
self.navigate_to_record(user.PKEY)
self.add_associations([group.PKEY, 'editors'], facet='memberof_group', delete=True)
self.add_associations([netgroup.PKEY], facet='memberof_netgroup', delete=True)
self.add_associations([rbac.ROLE_PKEY], facet='memberof_role', delete=True)
self.add_associations([hbac.RULE_PKEY], facet='memberof_hbacrule', delete=True)
self.add_associations([sudo.RULE_PKEY], facet='memberof_sudorule', delete=True)
# cleanup
# -------
self.delete(user.ENTITY, [user.DATA])
self.delete(group.ENTITY, [group.DATA])
self.delete(netgroup.ENTITY, [netgroup.DATA])
self.delete(rbac.ROLE_ENTITY, [rbac.ROLE_DATA])
self.delete(hbac.RULE_ENTITY, [hbac.RULE_DATA])
self.delete(sudo.RULE_ENTITY, [sudo.RULE_DATA])
def test_indirect_associations(self):
"""
User indirect associations
"""
self.init_app()
# add
# ---
self.add_record(user.ENTITY, user.DATA, navigate=False)
self.add_record(group.ENTITY, group.DATA)
self.navigate_to_record(group.PKEY)
self.add_associations([user.PKEY])
self.add_record(group.ENTITY, group.DATA2)
self.navigate_to_record(group.PKEY2)
self.add_associations([group.PKEY],facet='member_group')
self.add_record(netgroup.ENTITY, netgroup.DATA)
self.navigate_to_record(netgroup.PKEY)
self.add_table_associations('memberuser_group', [group.PKEY2])
self.add_record(rbac.ROLE_ENTITY, rbac.ROLE_DATA)
self.navigate_to_record(rbac.ROLE_PKEY)
self.add_associations([group.PKEY2], facet='member_group')
self.add_record(hbac.RULE_ENTITY, hbac.RULE_DATA)
self.navigate_to_record(hbac.RULE_PKEY)
self.add_table_associations('memberuser_group', [group.PKEY2])
self.add_record(sudo.RULE_ENTITY, sudo.RULE_DATA)
self.navigate_to_record(sudo.RULE_PKEY)
self.add_table_associations('memberuser_group', [group.PKEY2])
# check indirect associations
# ---------------------------
self.navigate_to_entity(user.ENTITY, 'search')
self.navigate_to_record(user.PKEY)
self.assert_indirect_record(group.PKEY2, user.ENTITY, 'memberof_group')
self.assert_indirect_record(netgroup.PKEY, user.ENTITY, 'memberof_netgroup')
self.assert_indirect_record(rbac.ROLE_PKEY, user.ENTITY, 'memberof_role')
self.assert_indirect_record(hbac.RULE_PKEY, user.ENTITY, 'memberof_hbacrule')
self.assert_indirect_record(sudo.RULE_PKEY, user.ENTITY, 'memberof_sudorule')
## cleanup
## -------
self.delete(user.ENTITY, [user.DATA])
self.delete(group.ENTITY, [group.DATA, group.DATA2])
self.delete(netgroup.ENTITY, [netgroup.DATA])
self.delete(rbac.ROLE_ENTITY, [rbac.ROLE_DATA])
self.delete(hbac.RULE_ENTITY, [hbac.RULE_DATA])
self.delete(sudo.RULE_ENTITY, [sudo.RULE_DATA])
def test_actions(self):
"""
Test user actions
"""
self.init_app()
self.add_record(user.ENTITY, user.DATA, navigate=False)
self.navigate_to_record(user.PKEY)
self.disable_action()
self.enable_action()
# reset password
pwd = self.config.get('ipa_password')
fields = [
('password' ,'password1', pwd),
('password' ,'password2', pwd),
]
self.action_panel_action('account_actions', 'reset_password')
self.assert_dialog()
self.fill_fields(fields)
self.dialog_button_click('reset_password')
self.wait_for_request(n=2)
self.assert_no_error_dialog()
self.assert_text_field('has_password', '******')
# delete
self.delete_action(user.ENTITY, user.PKEY)

File diff suppressed because it is too large Load Diff