Exemplo n.º 1
0
def rename_element():
    if request.method == 'POST':
        project = request.form['project']
        elem_type = request.form['elemType']
        full_filename = request.form['fullFilename']
        new_full_filename = request.form['newFullFilename']

        error = ''

        old_filename, old_parents = utils.separate_file_from_parents(
            full_filename)
        new_filename, new_parents = utils.separate_file_from_parents(
            new_full_filename)

        if len(new_filename) == 0:
            error = 'File name cannot be empty'
        else:
            for c in new_full_filename.replace('.', ''):
                if not c.isalnum() and not c in ['-', '_']:
                    error = 'Only letters, numbers, \'-\' and \'_\' are allowed'
                    break

        dir_type_name = ''
        if not error:
            if elem_type == 'test':
                dir_type_name = 'tests'
            elif elem_type == 'page':
                dir_type_name = 'pages'
            elif elem_type == 'suite':
                dir_type_name = 'suites'

            old_path = os.path.join(root_path, 'projects', project,
                                    dir_type_name, os.sep.join(old_parents))
            new_path = os.path.join(root_path, 'projects', project,
                                    dir_type_name, os.sep.join(new_parents))
            error = file_manager.rename_file(old_path, old_filename + '.py',
                                             new_path, new_filename + '.py')
        if not error and elem_type == 'test':
            # try to rename data file in /data/ folder
            # TODO, data files in /data/ will be deprecated
            old_path = os.path.join(root_path, 'projects', project, 'data',
                                    os.sep.join(old_parents))
            new_path = os.path.join(root_path, 'projects', project, 'data',
                                    os.sep.join(new_parents))
            if os.path.isfile(os.path.join(old_path, old_filename + '.csv')):
                error = file_manager.rename_file(old_path,
                                                 old_filename + '.csv',
                                                 new_path,
                                                 new_filename + '.csv')
            # try to rename data file in /tests/ folder
            old_path = os.path.join(root_path, 'projects', project, 'tests',
                                    os.sep.join(old_parents))
            new_path = os.path.join(root_path, 'projects', project, 'tests',
                                    os.sep.join(new_parents))
            if os.path.isfile(os.path.join(old_path, old_filename + '.csv')):
                error = file_manager.rename_file(old_path,
                                                 old_filename + '.csv',
                                                 new_path,
                                                 new_filename + '.csv')
    return json.dumps(error)
Exemplo n.º 2
0
def rename_element():
    if request.method == 'POST':
        project = request.form['project']
        elem_type = request.form['elemType']
        full_filename = request.form['fullFilename']
        new_full_filename = request.form['newFullFilename']

        error = ''

        old_filename, old_parents = utils.separate_file_from_parents(full_filename)
        new_filename, new_parents = utils.separate_file_from_parents(new_full_filename)

        if len(new_filename) == 0:
            error = 'File name cannot be empty'
        else:
            for c in new_full_filename.replace('.',''):
                if not c.isalnum() and not c in ['-', '_']:
                    error = 'Only letters, numbers, \'-\' and \'_\' are allowed'
                    break

        dir_type_name = ''
        if not error:
            if elem_type == 'test':
                dir_type_name = 'tests'
            elif elem_type == 'page':
                dir_type_name = 'pages'
            elif elem_type == 'suite':
                dir_type_name = 'suites'
            
            old_path = os.path.join(root_path, 'projects', project, dir_type_name,
                                    os.sep.join(old_parents))
            new_path = os.path.join(root_path, 'projects', project, dir_type_name,
                                    os.sep.join(new_parents))
            error = io_manager.rename_file(old_path, old_filename+'.py',
                                           new_path, new_filename+'.py')
        if not error and elem_type == 'test':
            # try to rename data file in /data/ folder
            # TODO, data files in /data/ will be deprecated
            old_path = os.path.join(root_path, 'projects', project, 'data',
                                    os.sep.join(old_parents))
            new_path = os.path.join(root_path, 'projects', project, 'data',
                                    os.sep.join(new_parents))
            if os.path.isfile(os.path.join(old_path, old_filename+'.csv')):
                error = io_manager.rename_file(old_path, old_filename+'.csv',
                                               new_path, new_filename+'.csv')
            # try to rename data file in /tests/ folder
            old_path = os.path.join(root_path, 'projects', project, 'tests',
                                    os.sep.join(old_parents))
            new_path = os.path.join(root_path, 'projects', project, 'tests',
                                    os.sep.join(new_parents))
            if os.path.isfile(os.path.join(old_path, old_filename+'.csv')):
                error = io_manager.rename_file(old_path, old_filename+'.csv',
                                               new_path, new_filename+'.csv')
    return json.dumps(error)
Exemplo n.º 3
0
def get_internal_test_data(project, full_test_case_name, repr_strings=False):
    """Get test data defined inside the test itself."""
    # check if test has data variable defined
    data_list = []
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
    path = os.path.join(session.testdir, 'projects', project, 'tests',
                        os.sep.join(parents), '{}.py'.format(tc_name))
    test_module, _ = utils.import_module(path)

    if hasattr(test_module, 'data'):
        msg_not_list_not_dict = ('Warning: infile test data must be a dictionary '
                                 'or a list of dictionaries\nCurrent value is:\n{}\n')
        data_variable = getattr(test_module, 'data')
        if type(data_variable) == dict:
            data_list.append(data_variable)
        elif type(data_variable) == list:
            if all(isinstance(item, dict) for item in data_variable):
                data_list = data_variable
            else:
                print(msg_not_list_not_dict.format(data_variable))
        else:
            print(msg_not_list_not_dict.format(data_variable))
    if repr_strings:
        # replace string values for their repr values
        data_list_clean = []
        for data_dict in data_list:
            d = {}
            for k, v in data_dict.items():
                if type(v) == str:
                    d[k] = repr(v)
                else:
                    d[k] = v
            data_list_clean.append(d)
        data_list = data_list_clean
    return data_list
Exemplo n.º 4
0
def get_external_test_data(project, full_test_case_name):
    """Get data from file (csv)."""
    data_list = []
    test, parents = utils.separate_file_from_parents(full_test_case_name)
    data_file_path_data_folder = os.path.join(session.testdir, 'projects',
                                              project, 'data',
                                              os.sep.join(parents),
                                              '{}.csv'.format(test))
    data_file_path_test_folder = os.path.join(session.testdir, 'projects',
                                              project, 'tests',
                                              os.sep.join(parents),
                                              '{}.csv'.format(test))
    # check if csv file exists in /data/ folder
    if os.path.isfile(data_file_path_data_folder):
        with open(data_file_path_data_folder, 'r') as csv_file:
            dict_reader = csv.DictReader(csv_file)
            for data_set in dict_reader:
                data_list.append(dict(data_set))
        # TODO deprecate /data/ folder
        print((
            'Warning: data files defined in the /data/ folder will soon '
            'be deprecated. Test data files should be placed in the same folder '
            'as the test file.'))
    # check if csv file exists in /tests/ folder
    elif os.path.isfile(data_file_path_test_folder):
        with open(data_file_path_test_folder, 'r',
                  encoding='utf8') as csv_file:
            dict_reader = csv.DictReader(csv_file)
            for data_set in dict_reader:
                data_list.append(dict(data_set))
    return data_list
Exemplo n.º 5
0
def test_case_view(project, test_name):
    test = Test(project, test_name)
    if not test.exists:
        abort(404, 'The test {} does not exist'.format(test_name))
    tc_name, parents = utils.separate_file_from_parents(test_name)
    _, error = utils.import_module(test.path)
    if error:
        url = url_for('webapp.test_case_code_view',
                      project=project,
                      test_name=test_name)
        content = ('<h4>There are errors in the test</h4>'
                   '<p>There are errors and the test cannot be displayed, '
                   'open the test code editor to solve them.</p>'
                   '<a class="btn btn-default" href="{}">Open Test Code</a>'.
                   format(url))
        return render_template('common_element_error.html',
                               project=project,
                               item_name=test_name,
                               content=content)
    else:
        test_data = test_data_module.get_test_data(project,
                                                   test_name,
                                                   repr_strings=True)
        return render_template('test_builder/test_case.html',
                               project=project,
                               test_components=test.components,
                               test_case_name=tc_name,
                               full_test_case_name=test_name,
                               test_data=test_data)
Exemplo n.º 6
0
def save_page_object(root_path, project, full_page_name, elements, functions,
                     import_lines):
    """Save Page Object contents to file.
    full_page_name must be a dot path starting from /project/pages/
    directory, (i.e.: 'module.sub_module.page_name_01')
    """
    def format_element_string(name, selector, value, display_name):
        formatted = ("\n\n{0} = ('{1}', \'{2}\', '{3}')".format(
            element['name'], element['selector'], element['value'],
            element['display_name']))
        return formatted

    page_name, parents = utils.separate_file_from_parents(full_page_name)
    page_object_path = os.path.join(root_path, 'projects', project, 'pages',
                                    os.sep.join(parents),
                                    '{}.py'.format(page_name))
    with open(page_object_path, 'w', encoding='utf-8') as po_file:
        for line in import_lines:
            po_file.write("{}\n".format(line))
        for element in elements:
            # replace the spaces with underlines of the element name
            if ' ' in element['name']:
                element['name'] = element['name'].replace(' ', '_')
            # escape quote characters
            element['value'] = element['value'].replace('"', '\\"').replace(
                "'", "\\'")
            if not element['display_name']:
                element['display_name'] = element['name']
            formatted = format_element_string(element['name'],
                                              element['selector'],
                                              element['value'],
                                              element['display_name'])
            po_file.write(formatted)
        for func in functions:
            po_file.write('\n\n' + func)
Exemplo n.º 7
0
def save_test_case_code(root_path, project, full_test_case_name, content):
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
    test_case_path = os.path.join(root_path, 'projects', project, 'tests',
                                  os.sep.join(parents),
                                  '{}.py'.format(tc_name))
    with open(test_case_path, 'w', encoding='utf-8') as f:
        f.write(content)
Exemplo n.º 8
0
def test_case_view(project, test_case_name):
    # check if user has permissions for this project
    if not user.has_permissions_to_project(g.user.id, project, root_path,
                                           'gui'):
        return render_template('not_permission.html')

    # check if the file is locked
    # is_locked_by = lock.is_file_locked(root_path, project, test_case_name)
    # print(is_locked_by, g.user.username)
    # if is_locked_by and is_locked_by != g.user.username:
    #     abort(404, 'This file is locked by someone else.')
    # else:
    tc_name, parents = utils.separate_file_from_parents(test_case_name)
    path = test_case.generate_test_case_path(root_path, project,
                                             test_case_name)
    error = utils.validate_python_file_syntax(path)
    if error:
        return render_template('test_builder/test_case_syntax_error.html',
                               project=project,
                               full_test_case_name=test_case_name)
    else:
        test_case_contents = test_case.get_test_case_content(
            root_path, project, test_case_name)
        test_data = test_data_module.get_test_data(root_path, project,
                                                   test_case_name)
        return render_template('test_builder/test_case.html',
                               project=project,
                               test_case_contents=test_case_contents,
                               test_case_name=tc_name,
                               full_test_case_name=test_case_name,
                               test_data=test_data)
Exemplo n.º 9
0
def save_test_case(root_path, project, full_test_case_name, description,
                   page_objects, test_steps, test_data):
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
    test_case_path = os.path.join(root_path, 'projects', project, 'tests',
                                  os.sep.join(parents), '{}.py'.format(tc_name))
    formatted_description = format_description(description)
    
    with open(test_case_path, 'w', encoding='utf-8') as f:
        
        # write description
        f.write('\n')
        f.write(formatted_description)
        f.write('\n')
        # write the list of pages
        f.write('pages = {}\n'.format(format_page_object_string(page_objects)))
        f.write('\n')

        # write test data if required or save test data to external file
        if test_execution.settings['test_data'] == 'infile':
            if test_data:
                pretty = pprint.PrettyPrinter(indent=4, width=1)
                #f.write('data = ' + pretty.pformat(test_data) + '\n\n')
                f.write('data = {}'.format(format_data(test_data)))
                test_data_module.remove_csv_if_exists(root_path, project, full_test_case_name)
        else:
            test_data_module.save_external_test_data_file(root_path, project,
                                                          full_test_case_name,
                                                          test_data)

        # write the setup function
        f.write('def setup(data):\n')
        if test_steps['setup']:
            for step in test_steps['setup']:
                step_action = step['action'].replace(' ', '_')
                param_str = ', '.join(step['parameters'])
                f.write('    {0}({1})\n'.format(step_action, param_str))
        else:
            f.write('    pass\n')
        f.write('\n')
        
        # write the test function
        f.write('def test(data):\n')
        if test_steps['test']:
            for step in test_steps['test']:
                step_action = step['action'].replace(' ', '_')
                param_str = ', '.join(step['parameters'])
                f.write('    {0}({1})\n'.format(step_action, param_str))
        else:
            f.write('    pass\n')
        f.write('\n\n')
        
        # write the teardown function
        f.write('def teardown(data):\n')
        if test_steps['teardown']:
            for step in test_steps['teardown']:
                step_action = step['action'].replace(' ', '_')
                param_str = ', '.join(step['parameters'])
                f.write('    {0}({1})\n'.format(step_action, param_str))
        else:
            f.write('    pass\n')
Exemplo n.º 10
0
def get_suite_module(workspace, project, suite_name):
    """Get the module of a suite"""
    suite_name, parents = utils.separate_file_from_parents(suite_name)
    path = os.path.join(workspace, 'projects', project, 'suites',
                        os.sep.join(parents), suite_name + '.py')
    suite_module, _ = utils.import_module(path)
    return suite_module
Exemplo n.º 11
0
def test_case_view(project, test_case_name):
    # check if the file is locked
    # is_locked_by = lock.is_file_locked(root_path, project, test_case_name)
    # print(is_locked_by, g.user.username)
    # if is_locked_by and is_locked_by != g.user.username:
    #     abort(404, 'This file is locked by someone else.')
    # else:
    test_exists = test_case.test_case_exists(test_execution.root_path, project,
                                             test_case_name)
    if not test_exists:
        abort(404, 'The test {} does not exist'.format(test_case_name))
    tc_name, parents = utils.separate_file_from_parents(test_case_name)
    path = test_case.generate_test_case_path(root_path, project, test_case_name)
    _, error = utils.import_module(path)
    if error:
        url = url_for('test_case_code_view', project=project, test_case_name=test_case_name)
        content = ('<h4>There are errors in the test</h4>'
                   '<p>There are errors and the test cannot be displayed, '
                   'open the test code editor to solve them.</p>'
                   '<a class="btn btn-default" href="{}">Open Test Code</a>'
                   .format(url))
        return render_template('common_element_error.html', project=project,
                               item_name=test_case_name, content=content)
    else:
        test_case_contents = test_case.get_test_case_content(root_path, project,
                                                             test_case_name)
        test_data = test_data_module.get_test_data(root_path, project, test_case_name,
                                                   repr_strings=True)
        return render_template('test_builder/test_case.html', project=project,
                               test_case_contents=test_case_contents,
                               test_case_name=tc_name,
                               full_test_case_name=test_case_name,
                               test_data=test_data)
Exemplo n.º 12
0
def test_case_view(project, test_case_name):
    # check if user has permissions for this project
    if not user.has_permissions_to_project(g.user.id, project, root_path, 'gui'):
        return render_template('not_permission.html')

    # check if the file is locked
    # is_locked_by = lock.is_file_locked(root_path, project, test_case_name)
    # print(is_locked_by, g.user.username)
    # if is_locked_by and is_locked_by != g.user.username:
    #     abort(404, 'This file is locked by someone else.')
    # else:
    tc_name, parents = utils.separate_file_from_parents(test_case_name)
    path = test_case.generate_test_case_path(root_path, project, test_case_name)
    error = utils.validate_python_file_syntax(path)
    if error:
        return render_template('test_builder/test_case_syntax_error.html',
                               project=project,
                               full_test_case_name=test_case_name)
    else:
        test_case_contents = test_case.get_test_case_content(root_path, project,
                                                             test_case_name)
        test_data = test_data_module.get_test_data(root_path, project, test_case_name)
        return render_template('test_builder/test_case.html', project=project,
                               test_case_contents=test_case_contents,
                               test_case_name=tc_name,
                               full_test_case_name=test_case_name,
                               test_data=test_data)
Exemplo n.º 13
0
def get_page_object_content(root_path, project, full_po_name):
    po, parents = utils.separate_file_from_parents(full_po_name)

    modulex = importlib.import_module('projects.{0}.pages.{1}'.format(
        project, full_po_name))
    variable_list = [
        item for item in dir(modulex) if not item.startswith("__")
    ]
    element_list = []
    function_list = []
    import_lines = []
    code_line_list = []
    source_code = ''
    # get all the import lines in a list
    try:
        source_code = inspect.getsource(modulex)
    except:
        pass
    code_line_list = source_code.split('\n')
    for line in code_line_list:
        if 'import' in line:
            import_lines.append(line)
    for var_name in variable_list:
        variable = getattr(modulex, var_name)
        if isinstance(variable, types.FunctionType):
            # this is a function
            new_function = {
                'function_name': var_name,
                'full_function_name': ''.join([full_po_name, '.', var_name]),
                'description': inspect.getdoc(variable),
                'arguments': inspect.getargspec(variable).args,
                'code': inspect.getsource(variable)
            }
            function_list.append(new_function)
        elif isinstance(variable, tuple):
            # this is a web element tuple
            element_display_name = ''
            if len(variable) >= 3:
                element_display_name = variable[2]
            new_element = {
                'element_name': var_name,
                'element_selector': variable[0],
                'element_value': variable[1],
                'element_display_name': element_display_name,
                'element_full_name': ''.join([full_po_name, '.', var_name])
            }
            element_list.append(new_element)
        elif isinstance(variable, types.ModuleType):
            pass
        else:
            print('ERROR', variable)
    page_object_data = {
        'function_list': function_list,
        'element_list': element_list,
        'import_lines': import_lines,
        'code_line_list': code_line_list,
        'source_code': source_code
    }
    return page_object_data
Exemplo n.º 14
0
def remove_csv_if_exists(project, full_test_case_name):
    """Remove csv data file from tests/ folder"""
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
    data_file_path_tests_folder = os.path.join(session.testdir, 'projects', project,
                                               'tests', os.sep.join(parents),
                                               '{}.csv'.format(tc_name))
    if os.path.isfile(data_file_path_tests_folder):
        os.remove(data_file_path_tests_folder)
Exemplo n.º 15
0
def suite_exists(workspace, project, full_suite_name):
    """suite exists.
    full_suite_name must be a relative dot path
    """
    suite, parents = utils.separate_file_from_parents(full_suite_name)
    path = os.path.join(workspace, 'projects', project, 'suites',
                        os.sep.join(parents), '{}.py'.format(suite))
    return os.path.isfile(path)
Exemplo n.º 16
0
def test_case_exists(workspace, project, full_test_case_name):
    """Test case exists.

    full_test_case_name is a relative dot path to the test.
    """
    test, parents = utils.separate_file_from_parents(full_test_case_name)
    path = os.path.join(workspace, 'projects', project, 'tests',
                        os.sep.join(parents), '{}.py'.format(test))
    return os.path.isfile(path)
Exemplo n.º 17
0
def save_external_test_data_file(project, full_test_case_name, test_data):
    """Save data to external file (csv).

    full_test_case_name must be a relative dot path
    test_data must be a list of dictionaries

    Temporarily this will save to /data/<test_name>.csv if this already
    exists. Otherwise, the file will be stored in the same folder
    as the test
    # TODO 
    """
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)

    data_file_path_data_folder = os.path.join(session.testdir, 'projects',
                                              project, 'data',
                                              os.sep.join(parents),
                                              '{}.csv'.format(tc_name))
    data_path_tests_folder = os.path.join(session.testdir, 'projects', project,
                                          'tests', os.sep.join(parents))
    data_file_path_tests_folder = os.path.join(data_path_tests_folder,
                                               '{}.csv'.format(tc_name))
    # if csv file exists in /data/ use this file
    # remove csv file from /tests/ folder if it exists
    if os.path.isfile(data_file_path_data_folder):
        with open(data_file_path_data_folder, 'w') as data_file:
            if test_data:
                writer = csv.DictWriter(data_file,
                                        fieldnames=test_data[0].keys(),
                                        lineterminator='\n')
                writer.writeheader()
                for row in test_data:
                    writer.writerow(row)
            else:
                data_file.write('')
        # remove csv from /tests/ folder if it exists
        if os.path.isfile(data_file_path_tests_folder):
            os.remove(data_file_path_tests_folder)
        # TODO deprecate /data/ folder
        print((
            'Warning: data files defined in the /data/ folder will soon '
            'be deprecated. Test data files should be placed in the same folder '
            'as the test file.'))
    else:
        # else, update or create a csv file in /tests/ folder
        if os.path.isfile(data_file_path_tests_folder) or test_data:
            # update data file only if it already exists or there's data
            os.makedirs(data_path_tests_folder, exist_ok=True)
            with open(data_file_path_tests_folder, 'w') as data_file:
                if test_data:
                    writer = csv.DictWriter(data_file,
                                            fieldnames=test_data[0].keys(),
                                            lineterminator='\n')
                    writer.writeheader()
                    for row in test_data:
                        writer.writerow(row)
                else:
                    data_file.write('')
Exemplo n.º 18
0
def change_test_name():
    if request.method == 'POST':
        project = request.form['project']
        test_name = request.form['testName']
        new_test_name = request.form['newTestName']

        test, parents = utils.separate_file_from_parents(test_name)
        current_path = os.path.join(root_path, 'projects', project, 'tests',
                                    os.sep.join(parents), '{}.py'.format(test))

        test, parents = utils.separate_file_from_parents(new_test_name)
        new_path = os.path.join(root_path, 'projects', project, 'tests',
                                os.sep.join(parents), '{}.py'.format(test))

        try:
            os.rename(current_path, new_path)
            return json.dumps('ok')
        except:
            return json.dumps('error')
Exemplo n.º 19
0
def generate_page_path(root_path, project, full_page_name):
    """Generates a path to a page object python file
    Example":
      generate_page_path('user/testdir', 'project1, 'module1.page1')
      -> 'user/testdir/projects/project1/pages/module1/page1.py'
    """
    page_name, parents = utils.separate_file_from_parents(full_page_name)
    page_path = os.path.join(root_path, 'projects', project, 'pages',
                             os.sep.join(parents), '{}.py'.format(page_name))
    return page_path
Exemplo n.º 20
0
def format_page_object_import_string(project, page_object):
    po, parents = utils.separate_file_from_parents(page_object)
    print 'parents', parents
    if parents:
        parents = '.' + '.'.join(parents)
    else:
        parents = ''
    po_import_string = 'from projects.{0}.pages{1} ' \
                       'import {2}\n'.format(project, parents, po)
    return po_import_string
Exemplo n.º 21
0
def save_test_case(root_path, project, full_test_case_name, description,
                   page_objects, test_steps):
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
    test_case_path = os.path.join(root_path, 'projects', project, 'tests',
                                  os.sep.join(parents), '{}.py'.format(tc_name))
    setup_stored_keys = get_stored_keys(test_steps['setup'])
    test_stored_keys = get_stored_keys(test_steps['test'])
    teardown_stored_keys = get_stored_keys(test_steps['teardown'])


    formatted_description = format_description(description)

    with open(test_case_path, 'w', encoding='utf-8') as f:
        # write description
        f.write('\n')
        f.write(formatted_description)
        f.write('\n')
        # write the list of pages
        f.write('pages = {}\n'.format(format_page_object_string(page_objects)))
        f.write('\n')
        # write the setup function
        f.write('def setup(data):\n')
        if test_steps['setup']:
            for step in test_steps['setup']:
                parameters_formatted = format_parameters(step, root_path, project,
                                                         setup_stored_keys)
                f.write('    {0}({1})\n'
                        .format(step['action'].replace(' ', '_'),
                                parameters_formatted))
        else:
            f.write('    pass\n')
        f.write('\n')
        # write the test function
        f.write('def test(data):\n')
        if test_steps['test']:
            for step in test_steps['test']:
                parameters_formatted = format_parameters(step, root_path, project,
                                                         test_stored_keys)
                f.write('    {0}({1})\n'
                        .format(step['action'].replace(' ', '_'),
                                parameters_formatted))
        else:
            f.write('    pass\n')
        f.write('\n\n')
        # write the teardown function
        f.write('def teardown(data):\n')
        if test_steps['teardown']:
            for step in test_steps['teardown']:
                parameters_formatted = format_parameters(step, root_path, project,
                                                         teardown_stored_keys)
                f.write('    {0}({1})\n'
                        .format(step['action'].replace(' ', '_'),
                                parameters_formatted))
        else:
            f.write('    pass\n')
def get_test_tags(project, full_test_case_name):
    result = []
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
    path = os.path.join(session.testdir, 'projects', project, 'tests',
                        os.sep.join(parents), '{}.py'.format(tc_name))
    test_module, _ = utils.import_module(path)

    if hasattr(test_module, 'tags'):
        result = getattr(test_module, 'tags')

    return result
Exemplo n.º 23
0
def save_page_object_code(root_path, project, full_page_name, content):
    """Save a Page Object given it's full code as a string.
    full_page_name must be a dot path starting from /project/pages/
    directory.
    content must be the file content as string
    """
    page_name, parents = utils.separate_file_from_parents(full_page_name)
    page_path = os.path.join(root_path, 'projects', project, 'pages',
                             os.sep.join(parents), '{}.py'.format(page_name))
    with open(page_path, 'w', encoding='utf-8') as po_file:
        po_file.write(content)
Exemplo n.º 24
0
def generate_test_case_excel_path(root_path, project, full_test_case_name):
    """Generate full path to a python file of a test case.

    full_test_case_name must be a dot path starting from /tests/ dir.
    Example:
      generate_test_case_path('/', 'project1', 'module1.test1')
      -> '/projects/project1/testcaseExcel/module1/test1'
    """
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
    test_case_excel_path = os.path.join(root_path, 'projects', project,
                                        'testcaseExcel', os.sep.join(parents))
    return test_case_excel_path, tc_name
Exemplo n.º 25
0
def suite_exists(project, full_suite_name):
    """suite exists.
    full_suite_name must be a relative dot path
    """
    suite_folder = os.path.join(session.testdir, 'projects', project, 'suites')
    suite, parents = utils.separate_file_from_parents(full_suite_name)
    path = os.path.join(suite_folder, os.sep.join(parents),
                        '{}.py'.format(suite))
    if os.path.isfile(path):
        return True
    path = os.path.join(suite_folder, full_suite_name)
    return os.path.isfile(path)
Exemplo n.º 26
0
def get_external_test_data(project, full_test_case_name):
    """Get data from file (csv)."""
    data_list = []
    test, parents = utils.separate_file_from_parents(full_test_case_name)
    data_file_path = os.path.join(session.testdir, 'projects', project, 'tests',
                                  os.sep.join(parents), '{}.csv'.format(test))
    if os.path.isfile(data_file_path):
        with open(data_file_path, 'r', encoding='utf8') as csv_file:
            dict_reader = csv.DictReader(csv_file)
            for data_set in dict_reader:
                data_list.append(dict(data_set))
    return data_list
Exemplo n.º 27
0
def test_case_code_view(project, test_case_name):
    # check if user has permissions for this project
    if not user.has_permissions_to_project(g.user.id, project, root_path, 'gui'):
        return render_template('not_permission.html')

    tc_name, parents = utils.separate_file_from_parents(test_case_name)
    test_case_contents = test_case.get_test_case_content(project, test_case_name)
    test_data = utils.get_test_data_dict_list(root_path, project, test_case_name)

    return render_template('test_case_code.html', project=project, 
                           test_case_contents=test_case_contents, test_case_name=tc_name,
                           full_test_case_name=test_case_name, test_data=test_data)
Exemplo n.º 28
0
def remove_csv_if_exists(root_path, project, full_test_case_name):
    """remove csv data file from /data/ folder and from /tests/ folder"""
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
    data_file_path_data_folder = os.path.join(root_path, 'projects', project,
                                              'data', os.sep.join(parents),
                                              '{}.csv'.format(tc_name))
    data_file_path_tests_folder = os.path.join(root_path, 'projects', project,
                                               'tests', os.sep.join(parents),
                                               '{}.csv'.format(tc_name))
    if os.path.isfile(data_file_path_data_folder):
        os.remove(data_file_path_data_folder)
    if os.path.isfile(data_file_path_tests_folder):
        os.remove(data_file_path_tests_folder)
Exemplo n.º 29
0
def remove_csv_if_exists(root_path, project, full_test_case_name):
    """Remove csv data file from /data/ folder and from /tests/ folder"""
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
    data_file_path_data_folder = os.path.join(root_path, 'projects', project,
                                              'data', os.sep.join(parents),
                                              '{}.csv'.format(tc_name))
    data_file_path_tests_folder = os.path.join(root_path, 'projects', project,
                                               'tests', os.sep.join(parents),
                                               '{}.csv'.format(tc_name))
    if os.path.isfile(data_file_path_data_folder):
        os.remove(data_file_path_data_folder)
    if os.path.isfile(data_file_path_tests_folder):
        os.remove(data_file_path_tests_folder)
Exemplo n.º 30
0
def save_test_data(root_path, project, full_test_case_name, test_data):
    if test_data[0]:
        tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
        data_path = os.path.join(root_path,
                                 'projects',
                                 project,
                                 'data',
                                 os.sep.join(parents),
                                 '{}.csv'.format(tc_name))
        with open(data_path, 'w') as f:
            writer = csv.DictWriter(f, fieldnames=test_data[0].keys(), lineterminator='\n')
            writer.writeheader()
            for row in test_data:
                writer.writerow(row)
Exemplo n.º 31
0
def test_file_path(project, full_test_case_name, testdir=None):
    """Generate full path to a python file of a test case.

    full_test_case_name must be a dot path starting from /tests/ dir.
    Example:
      test_file_path('project1', 'module1.test1')
      -> '/projects/project1/tests/module1/test1.py'
    """
    testdir = testdir or session.testdir
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
    test_case_path = os.path.join(testdir, 'projects', project, 'tests',
                                  os.sep.join(parents),
                                  '{}.py'.format(tc_name))
    return test_case_path
Exemplo n.º 32
0
def test_case_exists(project, full_test_case_name):
    """Test case exists.

    full_test_case_name is a relative dot path to the test.
    """
    # TODO
    test, parents = utils.separate_file_from_parents(full_test_case_name)
    tests_folder = os.path.join(session.testdir, 'projects', project, 'tests')
    path = os.path.join(tests_folder, os.sep.join(parents),
                        '{}.py'.format(test))
    if os.path.isfile(path):
        return True
    else:
        path = os.path.join(tests_folder, full_test_case_name)
        return os.path.isfile(path)
Exemplo n.º 33
0
def test_case_code_view(project, test_case_name):
    test_exists = test_case.test_case_exists(project, test_case_name)
    if not test_exists:
        abort(404, 'The test {} does not exist'.format(test_case_name))
    tc_name, parents = utils.separate_file_from_parents(test_case_name)
    path = os.path.join(session.testdir, 'projects', project,
                        'tests', os.sep.join(parents), tc_name + '.py')
    test_case_contents = test_case.get_test_case_code(path)
    _, error = utils.import_module(path)
    external_data = test_data_module.get_external_test_data(project, test_case_name)
    test_data_setting = session.settings['test_data']
    return render_template('test_builder/test_case_code.html', project=project, 
                           test_case_contents=test_case_contents, test_case_name=tc_name,
                           full_test_case_name=test_case_name, test_data=external_data,
                           test_data_setting=test_data_setting, error=error)
Exemplo n.º 34
0
def save_suite(root_path, project, suite_name, test_cases, workers,
               browsers, environments):
    """Save suite content to file."""
    suite_name, parents = utils.separate_file_from_parents(suite_name)

    suite_path = os.path.join(root_path, 'projects', project, 'suites',
                              os.sep.join(parents), '{}.py'.format(suite_name))
    with open(suite_path, 'w', encoding='utf-8') as suite_file:
        suite_file.write('\n\n')
        suite_file.write('browsers = {}\n'.format(_format_list_items(browsers)))
        suite_file.write('\n')
        suite_file.write('environments = {}\n'.format(_format_list_items(environments)))
        suite_file.write('\n')
        suite_file.write('workers = {}'.format(workers))
        suite_file.write('\n\n')
        suite_file.write('tests = {}\n'.format(_format_list_items(test_cases)))
Exemplo n.º 35
0
def save_test_data(root_path, project, full_test_case_name, test_data):
    if test_data[0]:
        tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
        data_directory_path = os.path.join(root_path, 'projects', project, 'data',
                                           os.sep.join(parents))
        data_file_path = os.path.join(data_directory_path, '{}.csv'.format(tc_name))
        # if the data file does not exist, create it
        if not os.path.exists(data_directory_path):
            os.makedirs(data_directory_path)
        if not os.path.isfile(data_file_path):
            open(data_file_path, 'w+').close()
        with open(data_file_path, 'w') as data_file:
            writer = csv.DictWriter(data_file, fieldnames=test_data[0].keys(), lineterminator='\n')
            writer.writeheader()
            for row in test_data:
                writer.writerow(row)
Exemplo n.º 36
0
def save_test_case(root_path, project, full_test_case_name, description, 
                   page_objects, test_steps):
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
    print 'pos', page_objects
    test_case_path = os.path.join(root_path,
                                  'projects',
                                  project,
                                  'test_cases', 
                                  os.sep.join(parents),
                                  '{}.py'.format(tc_name))

    with open(test_case_path, 'w') as f:

        f.write('from golem.core.test import Test\n')
        f.write('from golem.core.actions import *\n')
        f.write('from golem.core import execution_logger as logger\n')
        f.write('\n')
        f.write('# page objects\n')
        for po in page_objects:
            f.write(format_page_object_import_string(project, po))
        f.write('\n')
        f.write('\n')
        f.write('class {}:\n'.format(tc_name))
        f.write('\n')
        f.write('    description = \'\'\'{}\'\'\'\n'.format(description))
        f.write('\n')
        f.write('    def setup(self):\n')
        f.write('        logger.description = self.description\n')
        f.write('        pass\n')
        f.write('\n')
        f.write('    def test(self, data):\n')
        if test_steps:
            for step in test_steps:
                f.write('        {0}({1})\n'.format(
                                                step['action'].replace(' ', '_'),
                                                format_parameters(
                                                    step['parameters'],
                                                    root_path,
                                                    project,
                                                    parents,
                                                    tc_name)))
        else:
            f.write('        pass\n')
        f.write('\n')
        f.write('    def teardown(self):\n')
        f.write('        close()\n')
Exemplo n.º 37
0
def test_case_code_view(project, test_case_name):
    # check if user has permissions for this project
    if not user.has_permissions_to_project(g.user.id, project, root_path, 'gui'):
        return render_template('not_permission.html')

    tc_name, parents = utils.separate_file_from_parents(test_case_name)
    path = os.path.join(root_path, 'projects', project, 'tests',
                          os.sep.join(parents), tc_name + '.py')
    test_case_contents = test_case.get_test_case_code(path)
    error = utils.validate_python_file_syntax(path)
    external_data = test_data_module.get_external_test_data(root_path, project,
                                                            test_case_name)
    test_data_setting = test_execution.settings['test_data']
    return render_template('test_builder/test_case_code.html', project=project, 
                           test_case_contents=test_case_contents, test_case_name=tc_name,
                           full_test_case_name=test_case_name, test_data=external_data,
                           test_data_setting=test_data_setting, error=error)
Exemplo n.º 38
0
def save_page_object(root_path, project, full_page_name, elements, functions, import_lines):
    page_name, parents = utils.separate_file_from_parents(full_page_name)
    page_object_path = os.path.join(root_path, 'projects', project, 'pages',
                                    os.sep.join(parents), '{}.py'.format(page_name))
    with open(page_object_path, 'w', encoding='utf-8') as po_file:
        for line in import_lines:
            po_file.write("{}\n".format(line))
        for element in elements:
            # replace the spaces with underlines of the element name
            if ' ' in element['name']:
                element['name'] = element['name'].replace(' ', '_')
            element['value'] = element['value'].replace('"', '\\"').replace("'", "\\'")
            po_file.write("\n\n{0} = ('{1}', \'{2}\', '{3}')".format(element['name'],
                                                                     element['selector'],
                                                                     element['value'],
                                                                     element['display_name']))
        for func in functions:
            po_file.write('\n\n' + func)
Exemplo n.º 39
0
def save_external_test_data_file(root_path, project, full_test_case_name, test_data):
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)

    data_file_path_data_folder = os.path.join(root_path, 'projects', project,
                                              'data', os.sep.join(parents),
                                              '{}.csv'.format(tc_name))
    data_path_tests_folder = os.path.join(root_path, 'projects', project,
                                       'tests', os.sep.join(parents))
    data_file_path_tests_folder = os.path.join(data_path_tests_folder,
                                               '{}.csv'.format(tc_name))
    # if csv file exists in /data/ use this file
    # remove csv file from /tests/ folder if it exists
    if os.path.isfile(data_file_path_data_folder):
        with open(data_file_path_data_folder, 'w') as data_file:
            if test_data:
                writer = csv.DictWriter(data_file, fieldnames=test_data[0].keys(),
                                        lineterminator='\n')
                writer.writeheader()
                for row in test_data:
                    writer.writerow(row)
            else:
                data_file.write('')
        # remove csv from /tests/ folder if it exists
        if os.path.isfile(data_file_path_tests_folder):
            os.remove(data_file_path_tests_folder)
        # TODO deprecate /data/ folder
        print(('Warning: data files defined in the /data/ folder will soon '
               'be deprecated. Test data files should be placed in the same folder '
               'as the test file.'))
    else:
        # else, update or create a csv file in /tests/ folder
        if os.path.isfile(data_file_path_tests_folder) or test_data:
            # update data file only if it already exists or there's data
            os.makedirs(data_path_tests_folder, exist_ok=True)
            with open(data_file_path_tests_folder, 'w') as data_file:
                if test_data:
                    writer = csv.DictWriter(data_file, fieldnames=test_data[0].keys(),
                                            lineterminator='\n')
                    writer.writeheader()
                    for row in test_data:
                        writer.writerow(row)
                else:
                    data_file.write('')
Exemplo n.º 40
0
def get_page_object_elements(root_path, project, full_po_name):
    po, parents = utils.separate_file_from_parents(full_po_name)

    print 'AAA', 'projects.{0}.pages.{1}'.format(project, full_po_name)
    modulex = importlib.import_module('projects.{0}.pages.{1}'
                                      .format(project, full_po_name))
    variable_list = [item for item in dir(modulex) if not item.startswith("__")]
    element_list = []
    for var in variable_list:
        var_values = getattr(modulex, var)
        new_element = {
            'element_name': var,
            'element_selector': var_values[0],
            'element_value': var_values[1],
            'element_display_name': var_values[2],
            'element_full_name': ''.join([full_po_name, '.', var])
        }
        element_list.append(new_element)

    return element_list
Exemplo n.º 41
0
def get_external_test_data(workspace, project, full_test_case_name):
    data_list = []

    test, parents = utils.separate_file_from_parents(full_test_case_name)
    data_file_path_data_folder = os.path.join(workspace, 'projects', project,
                                              'data', os.sep.join(parents),
                                              '{}.csv'.format(test))
    data_file_path_test_folder = os.path.join(workspace, 'projects', project,
                                              'tests', os.sep.join(parents),
                                              '{}.csv'.format(test))
    # check if csv file exists in /data/ folder
    if os.path.isfile(data_file_path_data_folder):
        with open(data_file_path_data_folder, 'r', encoding='utf8') as csv_file:
            dict_reader = csv.DictReader(csv_file)
            for data_set in dict_reader:
                d = {}
                for item in data_set.items():
                    try:
                        d[item[0]] = literal_eval(item[1])
                    except:
                        d[item[0]] = item[1]
                data_list.append(d)
        # TODO deprecate /data/ folder
        print(('Warning: data files defined in the /data/ folder will soon '
               'be deprecated. Test data files should be placed in the same folder '
               'as the test file.'))               
    # check if csv file exists in /tests/ folder
    elif os.path.isfile(data_file_path_test_folder):
        with open(data_file_path_test_folder, 'r', encoding='utf8') as csv_file:
            dict_reader = csv.DictReader(csv_file)
            for data_set in dict_reader:
                d = {}
                for item in data_set.items():
                    try:
                        d[item[0]] = literal_eval(item[1])
                    except:
                        d[item[0]] = item[1]
                data_list.append(d)
    return data_list
Exemplo n.º 42
0
def test_case_view(project, test_case_name):
    # check if user has permissions for this project
    if not user.has_permissions_to_project(g.user.id, project, root_path):
        return render_template('not_permission.html')

    tc_name, parents = utils.separate_file_from_parents(test_case_name)

    test_case_data = test_case.parse_test_case(
                                        root_path,
                                        project,
                                        parents,
                                        tc_name)

    test_data = utils.get_test_data(root_path,
                                   project,
                                   test_case_name)

    return render_template(
                    'test_case.html',
                    project=project,
                    test_case_data=test_case_data,
                    test_case_name=tc_name,
                    full_test_case_name=test_case_name,
                    test_data=test_data)
Exemplo n.º 43
0
def save_page_object_code(root_path, project, full_page_name, content):
    page_name, parents = utils.separate_file_from_parents(full_page_name)
    page_path = os.path.join(root_path, 'projects', project, 'pages',
                             os.sep.join(parents), '{}.py'.format(page_name))
    with open(page_path, 'w', encoding='utf-8') as po_file:
        po_file.write(content)
Exemplo n.º 44
0
def generate_test_case_path(root_path, project, full_test_case_name):
    tc_name, parents = utils.separate_file_from_parents(full_test_case_name)
    test_case_path = os.path.join(root_path, 'projects', project, 'tests',
                                  os.sep.join(parents), '{}.py'.format(tc_name))
    return test_case_path
Exemplo n.º 45
0
def generate_page_path(root_path, project, full_page_name):
    page_name, parents = utils.separate_file_from_parents(full_page_name)
    page_path = os.path.join(root_path, 'projects', project, 'pages',
                             os.sep.join(parents), '{}.py'.format(page_name))
    return page_path