Blame test/verify/check-custom

Packit Service eebd6f
#!/usr/bin/python3
Packit Service eebd6f
Packit Service eebd6f
# checkpoint:
Packit Service eebd6f
# 1. export blueprint package list (copy)
Packit Service eebd6f
# 2. blueprint description edit/update
Packit Service eebd6f
# 3. hostname setting
Packit Service eebd6f
# 4. user setting
Packit Service eebd6f
Packit Service eebd6f
import crypt
Packit Service eebd6f
import re
Packit Service eebd6f
Packit Service eebd6f
import composerlib
Packit Service eebd6f
import testlib
Packit Service eebd6f
Packit Service eebd6f
Packit Service eebd6f
@testlib.nondestructive
Packit Service eebd6f
class TestCustom(composerlib.ComposerCase):
Packit Service eebd6f
Packit Service eebd6f
    def testExport(self):
Packit Service eebd6f
        b = self.browser
Packit Service eebd6f
        m = self.machine
Packit Service eebd6f
Packit Service 0c2606
        self.login_and_go("/composer", superuser=True)
Packit Service eebd6f
        b.wait_present("#main")
Packit Service eebd6f
Packit Service eebd6f
        # go to blueprint openssh-server
Packit Service eebd6f
        b.click("#openssh-server-name")
Packit Service eebd6f
Packit Service eebd6f
        # export package list
Packit Service eebd6f
        actions_drop_down_sel = ".cmpsr-header__actions #dropdownKebab"
Packit Service eebd6f
        with b.wait_timeout(300):
Packit Service eebd6f
            b.click(actions_drop_down_sel)
Packit Service eebd6f
        b.wait_attr(actions_drop_down_sel, "aria-expanded", "true")
Packit Service eebd6f
        b.click("a:contains('Export')")
Packit Service eebd6f
        b.wait_present("#cmpsr-modal-export")
Packit Service eebd6f
        with b.wait_timeout(300):
Packit Service eebd6f
            b.wait_in_text("#textInput2-modal-markup", "openssh-server")
Packit Service eebd6f
        packages_list = b.text("#textInput2-modal-markup")
Packit Service eebd6f
        b.click("#cmpsr-modal-export button[data-btn=copy-export]")
Packit Service eebd6f
        b.click("#cmpsr-modal-export button[data-btn=close-export]")
Packit Service eebd6f
        b.wait_not_present("#cmpsr-modal-export")
Packit Service eebd6f
Packit Service eebd6f
        list_from_backend = m.execute("""
Packit Service eebd6f
            composer-cli blueprints depsolve openssh-server | tail -n +2
Packit Service eebd6f
            """).split()
Packit Service eebd6f
        # remove tailing ".x86_64" or ".noarch"(6 chars) or ".aarch64"(7 chars)
Packit Service eebd6f
        # and "*:" in libpcap-14:1.9.1-2.fc31.x86_64
Packit Service eebd6f
        regex = re.compile("-[0-9]*:")
Packit Service eebd6f
Packit Service eebd6f
        def remove(x):
Packit Service eebd6f
            if x.endswith("aarch64"):
Packit Service eebd6f
                return regex.sub("-", x[:-8])
Packit Service eebd6f
            else:
Packit Service eebd6f
                return regex.sub("-", x[:-7])
Packit Service eebd6f
        format_list = map(remove, list_from_backend)
Packit Service eebd6f
Packit Service eebd6f
        self.assertEqual(packages_list, "\n".join(format_list))
Packit Service eebd6f
Packit Service eebd6f
        # collect code coverage result
Packit Service eebd6f
        self.check_coverage()
Packit Service eebd6f
Packit Service eebd6f
    def testDescription(self):
Packit Service eebd6f
        b = self.browser
Packit Service eebd6f
        m = self.machine
Packit Service eebd6f
Packit Service 0c2606
        self.login_and_go("/composer", superuser=True)
Packit Service eebd6f
        b.wait_present("#main")
Packit Service eebd6f
Packit Service eebd6f
        # go to blueprint openssh-server
Packit Service eebd6f
        b.click("#openssh-server-name")
Packit Service eebd6f
Packit Service eebd6f
        # update description (cancel first)
Packit Service eebd6f
        updated_description = "edit ssh server image description"
Packit Service eebd6f
        with b.wait_timeout(300):
Packit Service eebd6f
            b.click("a:contains('ssh server image')")
Packit Service eebd6f
        b.wait_present("#cmpsr-modal-edit-description")
Packit Service eebd6f
        b.set_input_text("#textInput-modal-markup", updated_description)
Packit Service eebd6f
        b.click("#cmpsr-modal-edit-description button:contains('Cancel')")
Packit Service eebd6f
        b.wait_not_present("#cmpsr-modal-edit-description")
Packit Service eebd6f
        b.wait_present("a:contains('ssh server image')")
Packit Service eebd6f
Packit Service eebd6f
        # update description
Packit Service eebd6f
        actions_drop_down_sel = ".cmpsr-header__actions #dropdownKebab"
Packit Service eebd6f
        b.click(actions_drop_down_sel)
Packit Service eebd6f
        b.wait_attr(actions_drop_down_sel, "aria-expanded", "true")
Packit Service eebd6f
        b.click("a:contains('Edit description')")
Packit Service eebd6f
        b.wait_present("#cmpsr-modal-edit-description")
Packit Service eebd6f
        b.set_input_text("#textInput-modal-markup", updated_description)
Packit Service eebd6f
        b.click("#cmpsr-modal-edit-description button:contains('Save')")
Packit Service eebd6f
        b.wait_not_present("#cmpsr-modal-edit-description")
Packit Service eebd6f
        b.wait_present("a:contains('{}')".format(updated_description))
Packit Service eebd6f
        # backend got updated as well
Packit Service eebd6f
        desc = m.execute("""
Packit Service eebd6f
            composer-cli blueprints show openssh-server | grep description | \
Packit Service eebd6f
            awk -F '"' '{print $2}'
Packit Service eebd6f
            """).rstrip()
Packit Service eebd6f
        self.assertEqual(desc, updated_description)
Packit Service eebd6f
Packit Service eebd6f
        # collect code coverage result
Packit Service eebd6f
        self.check_coverage()
Packit Service eebd6f
Packit Service eebd6f
    def testHostname(self):
Packit Service eebd6f
        b = self.browser
Packit Service eebd6f
        m = self.machine
Packit Service eebd6f
Packit Service 0c2606
        self.login_and_go("/composer", superuser=True)
Packit Service eebd6f
        b.wait_present("#main")
Packit Service eebd6f
Packit Service eebd6f
        b.click("#openssh-server-name")
Packit Service eebd6f
        with b.wait_timeout(300):
Packit Service eebd6f
            b.click("#blueprint-tabs-tab-customizations")
Packit Service eebd6f
        # set hostname to "openssh-server"
Packit Service eebd6f
        b.click("button[aria-describedby=Hostname-help2]")
Packit Service eebd6f
        b.set_input_text("input[aria-label=Hostname]", "hostname-openssh-server")
Packit Service eebd6f
        b.click(".form-control-pf-save")
Packit Service eebd6f
        b.wait_present("span:contains(hostname-openssh-server)")
Packit Service eebd6f
        hostname = m.execute("""
Packit Service eebd6f
            composer-cli blueprints show openssh-server | grep hostname | awk -F '"' '{print $2}'
Packit Service eebd6f
            """).rstrip()
Packit Service eebd6f
        b.wait_present("span:contains({})".format(hostname))
Packit Service eebd6f
Packit Service eebd6f
        # update hostname
Packit Service eebd6f
        b.click(".form-control-pf-value")
Packit Service eebd6f
        b.set_input_text("input[aria-label=Hostname]", "update-openssh-server")
Packit Service eebd6f
        b.key_press("\r")
Packit Service eebd6f
        b.wait_present("span:contains(update-openssh-server)")
Packit Service eebd6f
        hostname = m.execute("""
Packit Service eebd6f
            composer-cli blueprints show openssh-server | grep hostname | awk -F '"' '{print $2}'
Packit Service eebd6f
            """).rstrip()
Packit Service eebd6f
        b.wait_present("span:contains({})".format(hostname))
Packit Service eebd6f
Packit Service eebd6f
        # clicking x button will not update
Packit Service eebd6f
        b.click(".form-control-pf-value")
Packit Service eebd6f
        b.set_input_text("input[aria-label=Hostname]", "no-update-openssh-server")
Packit Service eebd6f
        b.click(".form-control-pf-cancel")
Packit Service eebd6f
        b.wait_present("span:contains(update-openssh-server)")
Packit Service eebd6f
        hostname = m.execute("""
Packit Service eebd6f
            composer-cli blueprints show openssh-server | grep hostname | awk -F '"' '{print $2}'
Packit Service eebd6f
            """).rstrip()
Packit Service eebd6f
        b.wait_present("span:contains({})".format(hostname))
Packit Service eebd6f
Packit Service eebd6f
        # invalid character, save button is disabled
Packit Service eebd6f
        b.click(".form-control-pf-value")
Packit Service eebd6f
        b.set_input_text("input[aria-label=Hostname]", "?")
Packit Service eebd6f
        b.wait_attr(".form-control-pf-save", "disabled", "")
Packit Service eebd6f
Packit Service eebd6f
        # collect code coverage result
Packit Service eebd6f
        self.check_coverage()
Packit Service eebd6f
Packit Service eebd6f
    def testUserAccount(self):
Packit Service eebd6f
        b = self.browser
Packit Service eebd6f
        m = self.machine
Packit Service eebd6f
Packit Service eebd6f
        # HACK: cockpit-composer may loose keystrokes, see issue #944
Packit Service eebd6f
        def set_input_value(sel, val):
Packit Service eebd6f
            w = ""
Packit Service eebd6f
            for k in val:
Packit Service eebd6f
                w += k
Packit Service eebd6f
                while b.val(sel) != w:
Packit Service eebd6f
                    b.focus(sel)
Packit Service eebd6f
                    b.key_press(k)
Packit Service eebd6f
Packit Service 0c2606
        self.login_and_go("/composer", superuser=True)
Packit Service eebd6f
        b.wait_present("#main")
Packit Service eebd6f
Packit Service eebd6f
        b.click("#openssh-server-name")
Packit Service eebd6f
        with b.wait_timeout(300):
Packit Service eebd6f
            b.click("#blueprint-tabs-tab-customizations")
Packit Service eebd6f
Packit Service eebd6f
        # add a new user
Packit Service eebd6f
        b.click("button:contains('Create User Account')")
Packit Service eebd6f
        b.wait_present("#cmpsr-modal-user-account")
Packit Service eebd6f
        set_input_value("#textInput2-modal-user", "x y")
Packit Service eebd6f
        b.wait_val("#textInput1-modal-user", "xy")
Packit Service eebd6f
        b.click("input[type=checkbox]")
Packit Service eebd6f
        set_input_value("#textInput1-modal-password", "fooBAR!@#123")
Packit Service eebd6f
        set_input_value("#textInput2-modal-password", "fooBAR!@#123")
Packit Service eebd6f
        ssh_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUOtNJdBEXyKxBB898rdT54ULjMGuO6v4" \
Packit Service eebd6f
                  "jLXmRsdRhR5Id/lKNc9hsdioPWUePgYlqML2iSV72vKQoVhkyYkpcsjr3zvBny9+5xej3+T" \
Packit Service eebd6f
                  "BLoEMAm2hmllKPmxYJDU8jQJ7wJuRrOVOnk0iSNF+FcY/yaQ0owSF02Nphx47j2KWc0IjGG" \
Packit Service eebd6f
                  "lt4fl0fmHJuZBA2afN/4IYIIsEWZziDewVtaEjWV3InMRLllfdqGMllhFR+ed2hQz9PN2Qc" \
Packit Service eebd6f
                  "apmEvUR4UCy/mJXrke5htyFyHi8ECfyMMyYeHwbWLFQIve4CWix9qtksvKjcetnxT+WWrut" \
Packit Service eebd6f
                  "dr3c9cfIj/c0v/Zg/c4zETxtp cockpit-test"
Packit Service eebd6f
        b.set_input_text("#textInput5-modal-user", ssh_key)
Packit Service eebd6f
        b.click("#cmpsr-modal-user-account button:contains('Create')")
Packit Service eebd6f
        b.wait_not_present("#cmpsr-modal-user-account")
Packit Service eebd6f
        b.wait_text("tr td[data-label='Full name']", "x y")
Packit Service eebd6f
        b.wait_text("tr td[data-label='User name']", "xy")
Packit Service eebd6f
        b.wait_present("tr td[data-label='Server administrator'] .fa-check")
Packit Service eebd6f
        b.wait_present("tr td[data-label=Password] .fa-check")
Packit Service eebd6f
        b.wait_in_text("tr td[data-label='SSH key']", "cockpit-test")
Packit Service eebd6f
Packit Service eebd6f
        # check backend to have correct password configured
Packit Service eebd6f
        passwd_str = m.execute("""
Packit Service eebd6f
            composer-cli blueprints show openssh-server | grep password | awk -F '"' '{print $2}'
Packit Service eebd6f
            """).rstrip()
Packit Service eebd6f
        salt = passwd_str[:passwd_str.rfind("$")]
Packit Service eebd6f
        passwd_crypt = crypt.crypt("fooBAR!@#123", salt)
Packit Service eebd6f
        self.assertEqual(passwd_str, passwd_crypt)
Packit Service eebd6f
        # check backend to have correct ssh key configured
Packit Service eebd6f
        ssh_key_backend = m.execute("""
Packit Service eebd6f
            composer-cli blueprints show openssh-server | grep key | awk -F '"' '{print $2}'
Packit Service eebd6f
            """).rstrip()
Packit Service eebd6f
        self.assertEqual(ssh_key_backend, ssh_key)
Packit Service eebd6f
Packit Service eebd6f
        # update password
Packit Service eebd6f
        new_password = "c456rty$%^RTY"
Packit Service eebd6f
        b.click("button[aria-label='Edit User Account xy']")
Packit Service eebd6f
        b.wait_present("#cmpsr-modal-user-account")
Packit Service eebd6f
        b.click("button:contains('Set New Password')")
Packit Service eebd6f
        set_input_value("#textInput1-modal-password", new_password)
Packit Service eebd6f
        set_input_value("#textInput2-modal-password", new_password)
Packit Service eebd6f
        b.click("#cmpsr-modal-user-account button:contains('Update')")
Packit Service eebd6f
        b.wait_not_present("#cmpsr-modal-user-account")
Packit Service eebd6f
        b.wait_present("tr td[data-label=Password] .fa-check")
Packit Service eebd6f
        passwd_str = m.execute("""
Packit Service eebd6f
            composer-cli blueprints show openssh-server | grep password | awk '{print $3}'
Packit Service eebd6f
            """).strip('"\n')
Packit Service eebd6f
        salt = passwd_str[:passwd_str.rfind("$")]
Packit Service eebd6f
        passwd_crypt = crypt.crypt(new_password, salt)
Packit Service eebd6f
        self.assertEqual(passwd_str, passwd_crypt)
Packit Service eebd6f
Packit Service eebd6f
        # remove password
Packit Service eebd6f
        b.click("button[aria-label='Edit User Account xy']")
Packit Service eebd6f
        b.wait_present("#cmpsr-modal-user-account")
Packit Service eebd6f
        b.click("button:contains('Remove Password')")
Packit Service eebd6f
        b.click("#cmpsr-modal-user-account button:contains('Update')")
Packit Service eebd6f
        b.wait_not_present("#cmpsr-modal-user-account")
Packit Service eebd6f
        b.wait_present("tr td[data-label=Password]")
Packit Service eebd6f
        b.wait_not_present("tr td[data-label=Password] .fa-check")
Packit Service eebd6f
Packit Service eebd6f
        # duplicated user
Packit Service eebd6f
        b.click("button:contains('Create User Account')")
Packit Service eebd6f
        b.wait_present("#cmpsr-modal-user-account")
Packit Service eebd6f
        set_input_value("#textInput2-modal-user", "x y")
Packit Service eebd6f
        b.wait_val("#textInput1-modal-user", "xy")
Packit Service eebd6f
        b.wait_in_text("#textInput1-modal-user-help1", "This user name already exists.")
Packit Service eebd6f
        b.click("#cmpsr-modal-user-account button:contains('Cancel')")
Packit Service eebd6f
        b.wait_not_present("#cmpsr-modal-user-account")
Packit Service eebd6f
Packit Service eebd6f
        # password checking error
Packit Service eebd6f
        b.click("button:contains('Create User Account')")
Packit Service eebd6f
        b.wait_present("#cmpsr-modal-user-account")
Packit Service eebd6f
        set_input_value("#textInput2-modal-user", "admin user")
Packit Service eebd6f
        b.wait_val("#textInput1-modal-user", "auser")
Packit Service eebd6f
        b.click("input[type=checkbox]")
Packit Service eebd6f
        set_input_value("#textInput1-modal-password", "aaa")
Packit Service eebd6f
        set_input_value("#textInput2-modal-password", "bbb")
Packit Service eebd6f
        b.wait_in_text("#textInput2-modal-password-help",
Packit Service eebd6f
                       "The values entered for password do not match.")
Packit Service eebd6f
        b.click("#cmpsr-modal-user-account .close")
Packit Service eebd6f
        b.wait_not_present("#cmpsr-modal-user-account")
Packit Service eebd6f
Packit Service eebd6f
        # delete user
Packit Service eebd6f
        delete_drop_down_sel = "button[aria-label='User Account Actions xy']"
Packit Service eebd6f
        b.click(delete_drop_down_sel)
Packit Service eebd6f
        b.wait_attr(delete_drop_down_sel, "aria-expanded", "true")
Packit Service eebd6f
        b.click("a:contains('Delete User Account')")
Packit Service eebd6f
        b.wait_not_present("table")
Packit Service eebd6f
Packit Service eebd6f
        # collect code coverage result
Packit Service eebd6f
        self.check_coverage()
Packit Service eebd6f
Packit Service eebd6f
Packit Service eebd6f
if __name__ == '__main__':
Packit Service eebd6f
    testlib.test_main()