diff --git a/frappe/commands/utils.py b/frappe/commands/utils.py index fdebc17e76..7c18bdbc78 100644 --- a/frappe/commands/utils.py +++ b/frappe/commands/utils.py @@ -344,6 +344,26 @@ def run_ui_tests(context, app=None, test=False, profile=False): if os.environ.get('CI'): sys.exit(ret) +@click.command('run-setup-wizard-ui-test') +@click.option('--app', help="App to run tests on, leave blank for all apps") +@click.option('--profile', is_flag=True, default=False) +@pass_context +def run_setup_wizard_ui_test(context, app=None, profile=False): + "Run setup wizard UI test" + import frappe.test_runner + + site = get_site(context) + frappe.init(site=site) + frappe.connect() + + ret = frappe.test_runner.run_setup_wizard_ui_test(app=app, verbose=context.verbose, + profile=profile) + if len(ret.failures) == 0 and len(ret.errors) == 0: + ret = 0 + + if os.environ.get('CI'): + sys.exit(ret) + @click.command('serve') @click.option('--port', default=8000) @click.option('--profile', is_flag=True, default=False) @@ -485,6 +505,7 @@ commands = [ reset_perms, run_tests, run_ui_tests, + run_setup_wizard_ui_test, serve, set_config, watch, diff --git a/frappe/desk/page/setup_wizard/setup_wizard.js b/frappe/desk/page/setup_wizard/setup_wizard.js index 18fc2c5a37..7d1235b11b 100644 --- a/frappe/desk/page/setup_wizard/setup_wizard.js +++ b/frappe/desk/page/setup_wizard/setup_wizard.js @@ -263,7 +263,6 @@ frappe.setup.SetupWizardSlide = class SetupWizardSlide extends frappe.ui.Slide { // } }; -// ====================================================== // Frappe slides settings // ====================================================== diff --git a/frappe/public/js/frappe/form/user_progress_dialog.js b/frappe/public/js/frappe/form/user_progress_dialog.js index 58bc9df056..b7b89223a4 100644 --- a/frappe/public/js/frappe/form/user_progress_dialog.js +++ b/frappe/public/js/frappe/form/user_progress_dialog.js @@ -22,7 +22,7 @@ frappe.ui.Slide = class Slide { this.$body = $(`
-

${this.title}

+

${this.title}

@@ -36,7 +36,7 @@ frappe.ui.Slide = class Slide { this.$form = this.$body.find(".form"); this.$primary_btn = this.slides_footer.find('.btn-primary').addClass('primary'); - if(this.help) this.$content.append($(`

${this.help}

`)); + if(this.help) this.$content.append($(`

${this.help}

`)); if(this.image_src) this.$content.append( $(``)); diff --git a/frappe/test_runner.py b/frappe/test_runner.py index 9e2610e5d0..4d0b650c37 100644 --- a/frappe/test_runner.py +++ b/frappe/test_runner.py @@ -139,6 +139,11 @@ def run_tests_for_module(module, verbose=False, tests=(), profile=False): return _run_unittest(module=module, verbose=verbose, tests=tests, profile=profile) +def run_setup_wizard_ui_test(app=None, verbose=False, profile=False): + '''Run setup wizard UI test using test_test_runner''' + frappe.flags.run_setup_wizard_ui_test = 1 + return run_ui_tests(app, None, verbose, profile) + def run_ui_tests(app=None, test=None, verbose=False, profile=False): '''Run a single unit test for UI using test_test_runner''' module = importlib.import_module('frappe.tests.ui.test_test_runner') diff --git a/frappe/tests/ui/test_test_runner.py b/frappe/tests/ui/test_test_runner.py index 3c54731fb1..47a6a568e9 100644 --- a/frappe/tests/ui/test_test_runner.py +++ b/frappe/tests/ui/test_test_runner.py @@ -4,9 +4,15 @@ import unittest, os, frappe, time class TestTestRunner(unittest.TestCase): def test_test_runner(self): + if frappe.flags.run_setup_wizard_ui_test: + for setup_wizard_test in frappe.get_hooks("setup_wizard_test"): + passed = frappe.get_attr(setup_wizard_test)() + self.assertTrue(passed) + return + driver = TestDriver() - driver.login() frappe.db.set_default('in_selenium', '1') + driver.login() for test in get_tests(): if test.startswith('#'): continue @@ -26,6 +32,7 @@ class TestTestRunner(unittest.TestCase): driver.set_route('Form', 'Test Runner') driver.click_primary_action() driver.wait_for('#frappe-qunit-done', timeout=timeout) + console = driver.get_console() passed = 'Tests Passed' in console if frappe.flags.tests_verbose or not passed: @@ -62,4 +69,3 @@ def get_tests_for(app): with open(tests_path, 'r') as fileobj: tests = fileobj.read().strip().splitlines() return tests - diff --git a/frappe/utils/selenium_testdriver.py b/frappe/utils/selenium_testdriver.py index 0f054077bf..809e398f92 100644 --- a/frappe/utils/selenium_testdriver.py +++ b/frappe/utils/selenium_testdriver.py @@ -69,7 +69,7 @@ class TestDriver(object): self.get('login') self.wait_for("#login_email") self.set_input("#login_email", "Administrator") - self.set_input("#login_password", "admin") + self.set_input("#login_password", "abcd1234") self.click('.btn-login') self.wait_for(wait_for_id) self.logged_in = True @@ -87,6 +87,10 @@ class TestDriver(object): elem = self.find(xpath='//input[@data-fieldname="{0}"]'.format(fieldname)) elem[0].send_keys(text) + def set_select(self, fieldname, text): + elem = self.find(xpath='//select[@data-fieldname="{0}"]'.format(fieldname)) + elem[0].send_keys(text) + def set_text_editor(self, fieldname, text): elem = self.find(xpath='//div[@data-fieldname="{0}"]//div[@contenteditable="true"]'.format(fieldname)) elem[0].send_keys(text) @@ -99,7 +103,7 @@ class TestDriver(object): selector = self.cur_route + " " + selector return self.driver.find_elements_by_css_selector(selector) - def wait_for(self, selector=None, everywhere=False, timeout=20, xpath=None): + def wait_for(self, selector=None, everywhere=False, timeout=20, xpath=None, for_invisible=False): if self.cur_route and not everywhere: selector = self.cur_route + " " + selector @@ -112,8 +116,12 @@ class TestDriver(object): selector = xpath try: - elem = self.get_wait(timeout).until( - EC.presence_of_element_located((_by, selector))) + if not for_invisible: + elem = self.get_wait(timeout).until( + EC.presence_of_element_located((_by, selector))) + else: + elem = self.get_wait(timeout).until( + EC.invisibility_of_element_located((_by, selector))) return elem except Exception as e: # body = self.driver.find_element_by_id('body_div') @@ -121,6 +129,9 @@ class TestDriver(object): self.print_console() raise e + def wait_for_invisible(self, selector=None, everywhere=False, timeout=20, xpath=None): + self.wait_for(selector, everywhere, timeout, xpath, True) + def get_console(self): out = [] for entry in self.driver.get_log('browser'): @@ -193,8 +204,11 @@ class TestDriver(object): def execute_script(self, js): self.driver.execute_script(js) - def wait_for_ajax(self): + def wait_for_ajax(self, freeze = False): self.wait_for('body[data-ajax-state="complete"]', True) + if freeze: + self.wait_for_invisible(".freeze-message-container") + # def go_to_module(module_name, item=None): # global cur_route