1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# encoding: utf-8
import os
import types
 
""" validate data format
TODO: refactor with JSON schema validate
"""
 
 
def is_testcase(data_structure):
    """check if data_structure is a testcase.
 
    Args:
        data_structure (dict): testcase should always be in the following data structure:
 
            {
                "config": {
                    "name": "desc1",
                    "variables": [],    # optional
                    "request": {}       # optional
                },
                "teststeps": [
                    teststep1,
                    {   # teststep2
                        'name': 'test step desc2',
                        'variables': [],    # optional
                        'extract': [],      # optional
                        'validate': [],
                        'request': {},
                        'function_meta': {}
                    }
                ]
            }
 
    Returns:
        bool: True if data_structure is valid testcase, otherwise False.
 
    """
    # TODO: replace with JSON schema validation
    if not isinstance(data_structure, dict):
        return False
 
    if "teststeps" not in data_structure:
        return False
 
    if not isinstance(data_structure["teststeps"], list):
        return False
 
    return True
 
 
def is_testcases(data_structure):
    """check if data_structure is testcase or testcases list.
 
    Args:
        data_structure (dict): testcase(s) should always be in the following data structure:
 
            testcase_dict
            or
            [
                testcase_dict_1,
                testcase_dict_2
            ]
    Returns:
        bool: True if data_structure is valid testcase(s), otherwise False.
 
    """
    if not isinstance(data_structure, list):
        return is_testcase(data_structure)
 
    for item in data_structure:
        if not is_testcase(item):
            return False
 
    return True
 
 
def is_testcase_path(path):
    """check if path is testcase path or path list.
 
    Args:
        path (str/list): file path or file path list.
 
    Returns:
        bool: True if path is valid file path or path list, otherwise False.
 
    """
    if not isinstance(path, (str, list)):
        return False
 
    if isinstance(path, list):
        for p in path:
            if not is_testcase_path(p):
                return False
 
    if isinstance(path, str):
        if not os.path.exists(path):
            return False
 
    return True
 
 
###############################################################################
##   validate varibles and functions
###############################################################################
 
 
def is_function(tup):
    """Takes (name, object) tuple, returns True if it is a function."""
    name, item = tup
    return isinstance(item, types.FunctionType)
 
 
def is_variable(tup):
    """Takes (name, object) tuple, returns True if it is a variable."""
    name, item = tup
    if callable(item):
        # function or class
        return False
 
    if isinstance(item, types.ModuleType):
        # imported module
        return False
 
    if name.startswith("_"):
        # private property
        return False
 
    return True