@voxgig/sdkgen 0.36.0 → 0.38.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/voxgig-sdkgen +1 -1
- package/dist/cmp/Main.js +0 -12
- package/dist/cmp/Main.js.map +1 -1
- package/package.json +2 -3
- package/project/.sdk/model/feature/log.jsonic +1 -1
- package/project/.sdk/model/target/js.jsonic +1 -1
- package/project/.sdk/model/target/py.jsonic +1 -1
- package/project/.sdk/model/target/ts.jsonic +2 -2
- package/project/.sdk/src/cmp/go/Config_go.ts +6 -2
- package/project/.sdk/src/cmp/js/EntityBase_js.ts +34 -0
- package/project/.sdk/src/cmp/js/Main_js.ts +10 -0
- package/project/.sdk/src/cmp/js/ReadmeExplanation_js.ts +33 -0
- package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +123 -0
- package/project/.sdk/src/cmp/js/ReadmeModel_js.ts +152 -0
- package/project/.sdk/src/cmp/js/ReadmeTopHowto_js.ts +25 -0
- package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +65 -0
- package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +36 -0
- package/project/.sdk/src/cmp/js/TestDirect_js.ts +53 -5
- package/project/.sdk/src/cmp/js/TestEntity_js.ts +114 -20
- package/project/.sdk/src/cmp/js/fragment/Entity.fragment.js +7 -139
- package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +149 -0
- package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +6 -10
- package/project/.sdk/src/cmp/js/fragment/EntityListOp.fragment.js +6 -10
- package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +7 -11
- package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +7 -11
- package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +7 -11
- package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +2 -0
- package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +0 -2
- package/project/.sdk/src/cmp/lua/Config_lua.ts +6 -2
- package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +3 -1
- package/project/.sdk/src/cmp/php/Config_php.ts +6 -2
- package/project/.sdk/src/cmp/php/Package_php.ts +2 -2
- package/project/.sdk/src/cmp/php/TestDirect_php.ts +2 -2
- package/project/.sdk/src/cmp/php/TestEntity_php.ts +10 -15
- package/project/.sdk/src/cmp/py/Config_py.ts +6 -2
- package/project/.sdk/src/cmp/py/Package_py.ts +1 -1
- package/project/.sdk/src/cmp/py/TestEntity_py.ts +3 -1
- package/project/.sdk/src/cmp/rb/Config_rb.ts +6 -2
- package/project/.sdk/src/cmp/ts/Main_ts.ts +7 -0
- package/project/.sdk/tm/go/feature/log_feature.go +1 -1
- package/project/.sdk/tm/go/test/runner_test.go +16 -2
- package/project/.sdk/tm/js/src/Context.js +142 -0
- package/project/.sdk/tm/js/src/Control.js +16 -0
- package/project/.sdk/tm/js/src/Operation.js +19 -0
- package/project/.sdk/tm/js/src/Point.js +24 -0
- package/project/.sdk/tm/js/src/README.md +1 -0
- package/project/.sdk/tm/js/src/Response.js +19 -0
- package/project/.sdk/tm/js/src/Result.js +21 -0
- package/project/.sdk/tm/js/src/Spec.js +26 -0
- package/project/.sdk/tm/js/src/feature/README.md +1 -0
- package/project/.sdk/tm/js/src/feature/base/BaseFeature.js +45 -0
- package/project/.sdk/tm/js/src/feature/log/LogFeature.js +46 -47
- package/project/.sdk/tm/js/src/feature/test/TestFeature.js +207 -0
- package/project/.sdk/tm/js/src/types.js +22 -0
- package/project/.sdk/tm/js/src/utility/CleanUtility.js +31 -0
- package/project/.sdk/tm/js/src/utility/DoneUtility.js +11 -4
- package/project/.sdk/tm/js/src/utility/FeatureAddUtility.js +42 -0
- package/project/.sdk/tm/js/src/utility/FeatureHookUtility.js +25 -0
- package/project/.sdk/tm/js/src/utility/FeatureInitUtility.js +11 -0
- package/project/.sdk/tm/js/src/utility/FetcherUtility.js +28 -0
- package/project/.sdk/tm/js/src/utility/MakeContextUtility.js +11 -0
- package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +55 -0
- package/project/.sdk/tm/js/src/utility/MakeFetchDefUtility.js +44 -0
- package/project/.sdk/tm/js/src/utility/MakeOptionsUtility.js +93 -0
- package/project/.sdk/tm/js/src/utility/MakePointUtility.js +77 -0
- package/project/.sdk/tm/js/src/utility/MakeRequestUtility.js +63 -0
- package/project/.sdk/tm/js/src/utility/MakeResponseUtility.js +55 -0
- package/project/.sdk/tm/js/src/utility/MakeResultUtility.js +54 -0
- package/project/.sdk/tm/js/src/utility/MakeSpecUtility.js +58 -0
- package/project/.sdk/tm/js/src/utility/MakeUrlUtility.js +40 -0
- package/project/.sdk/tm/js/src/utility/ParamUtility.js +61 -0
- package/project/.sdk/tm/js/src/utility/PrepareAuthUtility.js +41 -0
- package/project/.sdk/tm/js/src/utility/PrepareBodyUtility.js +25 -0
- package/project/.sdk/tm/js/src/utility/PrepareHeadersUtility.js +18 -0
- package/project/.sdk/tm/js/src/utility/{MethodUtility.js → PrepareMethodUtility.js} +7 -7
- package/project/.sdk/tm/js/src/utility/PrepareParamsUtility.js +25 -0
- package/project/.sdk/tm/js/src/utility/PreparePathUtility.js +13 -0
- package/project/.sdk/tm/js/src/utility/PrepareQueryUtility.js +26 -0
- package/project/.sdk/tm/js/src/utility/README.md +1 -0
- package/project/.sdk/tm/js/src/utility/ResultBasicUtility.js +34 -0
- package/project/.sdk/tm/js/src/utility/ResultBodyUtility.js +18 -0
- package/project/.sdk/tm/js/src/utility/ResultHeadersUtility.js +22 -0
- package/project/.sdk/tm/js/src/utility/StructUtility.js +2219 -1078
- package/project/.sdk/tm/js/src/utility/TransformRequestUtility.js +28 -0
- package/project/.sdk/tm/js/src/utility/TransformResponseUtility.js +31 -0
- package/project/.sdk/tm/js/src/utility/Utility.js +61 -61
- package/project/.sdk/tm/js/test/README.md +1 -0
- package/project/.sdk/tm/js/test/exists.test.js +16 -0
- package/project/.sdk/tm/js/test/runner.js +323 -107
- package/project/.sdk/tm/js/test/utility/Custom.test.js +41 -63
- package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +390 -116
- package/project/.sdk/tm/js/test/utility/StructUtility.test.js +728 -175
- package/project/.sdk/tm/js/test/utility/index.js +9 -0
- package/project/.sdk/tm/js/test/utility.js +72 -0
- package/project/.sdk/tm/lua/test/primary_utility_test.lua +1213 -0
- package/project/.sdk/tm/lua/test/runner.lua +2 -2
- package/project/.sdk/tm/lua/test/struct_runner.lua +602 -0
- package/project/.sdk/tm/lua/test/struct_utility_test.lua +959 -0
- package/project/.sdk/tm/lua/utility/struct/struct.lua +10 -0
- package/project/.sdk/tm/php/feature/TestFeature.php +59 -96
- package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +1309 -0
- package/project/.sdk/tm/php/test/Runner.php +24 -1
- package/project/.sdk/tm/php/test/StructRunner.php +275 -0
- package/project/.sdk/tm/php/test/StructUtilityTest.php +1336 -0
- package/project/.sdk/tm/php/utility/Fetcher.php +6 -2
- package/project/.sdk/tm/php/utility/MakeOptions.php +5 -1
- package/project/.sdk/tm/php/utility/MakeResult.php +3 -0
- package/project/.sdk/tm/php/utility/Param.php +9 -7
- package/project/.sdk/tm/php/utility/struct/Struct.php +312 -208
- package/project/.sdk/tm/py/test/runner.py +13 -0
- package/project/.sdk/tm/py/test/struct_runner.py +411 -0
- package/project/.sdk/tm/py/test/test_primary_utility.py +1101 -0
- package/project/.sdk/tm/py/test/test_struct_utility.py +751 -0
- package/project/.sdk/tm/rb/test/primary_utility_test.rb +1083 -0
- package/project/.sdk/tm/rb/test/runner.rb +5 -0
- package/project/.sdk/tm/rb/test/struct_runner.rb +309 -0
- package/project/.sdk/tm/rb/test/struct_utility_test.rb +670 -0
- package/src/cmp/Main.ts +1 -16
- package/project/.sdk/src/cmp/js/Quick_js.ts +0 -78
- package/project/.sdk/src/cmp/js/TestAcceptEntity_js.ts +0 -13
- package/project/.sdk/src/cmp/js/TestAccept_js.ts +0 -18
- package/project/.sdk/tm/js/src/utility/AuthUtility.js +0 -21
- package/project/.sdk/tm/js/src/utility/BodyUtility.js +0 -29
- package/project/.sdk/tm/js/src/utility/ErrorUtility.js +0 -33
- package/project/.sdk/tm/js/src/utility/FindparamUtility.js +0 -31
- package/project/.sdk/tm/js/src/utility/FullurlUtility.js +0 -39
- package/project/.sdk/tm/js/src/utility/HeadersUtility.js +0 -13
- package/project/.sdk/tm/js/src/utility/JoinurlUtility.js +0 -14
- package/project/.sdk/tm/js/src/utility/OperatorUtility.js +0 -44
- package/project/.sdk/tm/js/src/utility/OptionsUtility.js +0 -54
- package/project/.sdk/tm/js/src/utility/ParamsUtility.js +0 -21
- package/project/.sdk/tm/js/src/utility/QueryUtility.js +0 -21
- package/project/.sdk/tm/js/src/utility/ReqformUtility.js +0 -32
- package/project/.sdk/tm/js/src/utility/RequestUtility.js +0 -48
- package/project/.sdk/tm/js/src/utility/ResbasicUtility.js +0 -27
- package/project/.sdk/tm/js/src/utility/ResbodyUtility.js +0 -15
- package/project/.sdk/tm/js/src/utility/ResformUtility.js +0 -34
- package/project/.sdk/tm/js/src/utility/ResheadersUtility.js +0 -19
- package/project/.sdk/tm/js/src/utility/ResponseUtility.js +0 -37
- package/project/.sdk/tm/js/src/utility/ResultUtility.js +0 -28
- package/project/.sdk/tm/js/src/utility/SpecUtility.js +0 -35
|
@@ -0,0 +1,1101 @@
|
|
|
1
|
+
# ProjectName SDK primary utility test
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
import re
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
from utility.voxgig_struct import voxgig_struct as vs
|
|
10
|
+
from projectname_sdk import ProjectNameSDK
|
|
11
|
+
from core.spec import ProjectNameSpec
|
|
12
|
+
from core.result import ProjectNameResult
|
|
13
|
+
from core.response import ProjectNameResponse
|
|
14
|
+
from core.operation import ProjectNameOperation
|
|
15
|
+
from core.error import ProjectNameError
|
|
16
|
+
from core import helpers
|
|
17
|
+
from feature.base_feature import ProjectNameBaseFeature
|
|
18
|
+
|
|
19
|
+
_TEST_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _load_test_spec():
|
|
23
|
+
test_json_path = os.path.join(_TEST_DIR, '../../.sdk/test/test.json')
|
|
24
|
+
with open(test_json_path, 'r') as f:
|
|
25
|
+
return json.loads(f.read())
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _get_spec(spec, *keys):
|
|
29
|
+
cur = spec
|
|
30
|
+
for key in keys:
|
|
31
|
+
if isinstance(cur, dict):
|
|
32
|
+
cur = cur.get(key)
|
|
33
|
+
else:
|
|
34
|
+
return None
|
|
35
|
+
if isinstance(cur, dict):
|
|
36
|
+
return cur
|
|
37
|
+
return None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _json_normalize(val):
|
|
41
|
+
if val is None:
|
|
42
|
+
return None
|
|
43
|
+
return json.loads(json.dumps(val, default=str))
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _json_str(val):
|
|
47
|
+
try:
|
|
48
|
+
return json.dumps(val, default=str)
|
|
49
|
+
except Exception:
|
|
50
|
+
return str(val)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _match_string(pattern, val):
|
|
54
|
+
if len(pattern) >= 2 and pattern[0] == '/' and pattern[-1] == '/':
|
|
55
|
+
try:
|
|
56
|
+
return re.search(pattern[1:-1], val) is not None
|
|
57
|
+
except Exception:
|
|
58
|
+
return False
|
|
59
|
+
return pattern.lower() in val.lower()
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _match_deep(errors, check, base, path):
|
|
63
|
+
if check is None:
|
|
64
|
+
return
|
|
65
|
+
|
|
66
|
+
if isinstance(check, dict):
|
|
67
|
+
for key, check_val in check.items():
|
|
68
|
+
child_path = path + "." + key
|
|
69
|
+
base_val = None
|
|
70
|
+
if isinstance(base, dict):
|
|
71
|
+
base_val = base.get(key)
|
|
72
|
+
_match_deep(errors, check_val, base_val, child_path)
|
|
73
|
+
elif isinstance(check, list):
|
|
74
|
+
for i, check_val in enumerate(check):
|
|
75
|
+
child_path = "{}[{}]".format(path, i)
|
|
76
|
+
base_val = None
|
|
77
|
+
if isinstance(base, list) and i < len(base):
|
|
78
|
+
base_val = base[i]
|
|
79
|
+
_match_deep(errors, check_val, base_val, child_path)
|
|
80
|
+
else:
|
|
81
|
+
if isinstance(check, str) and check == "__EXISTS__":
|
|
82
|
+
if base is None:
|
|
83
|
+
errors.append("match {}: expected value to exist but got None".format(path))
|
|
84
|
+
return
|
|
85
|
+
if isinstance(check, str) and check == "__UNDEF__":
|
|
86
|
+
if base is not None:
|
|
87
|
+
errors.append("match {}: expected None but got {}".format(path, base))
|
|
88
|
+
return
|
|
89
|
+
|
|
90
|
+
norm_check = _json_normalize(check)
|
|
91
|
+
norm_base = _json_normalize(base)
|
|
92
|
+
|
|
93
|
+
if norm_check != norm_base:
|
|
94
|
+
if isinstance(check, str) and check != "":
|
|
95
|
+
base_str = vs.stringify(base) if base is not None else ""
|
|
96
|
+
if _match_string(check, base_str):
|
|
97
|
+
return
|
|
98
|
+
errors.append("match {}: got {}, want {}".format(
|
|
99
|
+
path, _json_str(norm_base), _json_str(norm_check)))
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _runset(testspec, subject):
|
|
103
|
+
if testspec is None:
|
|
104
|
+
return
|
|
105
|
+
entries = testspec.get("set")
|
|
106
|
+
if not isinstance(entries, list):
|
|
107
|
+
return
|
|
108
|
+
|
|
109
|
+
for i, entry in enumerate(entries):
|
|
110
|
+
if not isinstance(entry, dict):
|
|
111
|
+
continue
|
|
112
|
+
|
|
113
|
+
mark = ""
|
|
114
|
+
m = entry.get("mark")
|
|
115
|
+
if m is not None:
|
|
116
|
+
mark = " (mark={})".format(m)
|
|
117
|
+
|
|
118
|
+
result = None
|
|
119
|
+
err = None
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
result, err = subject(entry)
|
|
123
|
+
except Exception as e:
|
|
124
|
+
err = e
|
|
125
|
+
|
|
126
|
+
expected_err = entry.get("err")
|
|
127
|
+
|
|
128
|
+
if err is not None:
|
|
129
|
+
if expected_err is not None:
|
|
130
|
+
err_msg = str(err)
|
|
131
|
+
if isinstance(expected_err, str):
|
|
132
|
+
assert _match_string(expected_err, err_msg), \
|
|
133
|
+
"entry {}{}: error mismatch: got {!r}, want contains {!r}".format(
|
|
134
|
+
i, mark, err_msg, expected_err)
|
|
135
|
+
elif isinstance(expected_err, bool) and expected_err:
|
|
136
|
+
pass # any error is acceptable
|
|
137
|
+
|
|
138
|
+
match_spec = entry.get("match")
|
|
139
|
+
if isinstance(match_spec, dict):
|
|
140
|
+
result_map = {
|
|
141
|
+
"in": entry.get("in"),
|
|
142
|
+
"out": _json_normalize(result),
|
|
143
|
+
"err": {"message": str(err)},
|
|
144
|
+
}
|
|
145
|
+
errors = []
|
|
146
|
+
_match_deep(errors, match_spec, result_map, "")
|
|
147
|
+
assert len(errors) == 0, \
|
|
148
|
+
"entry {}{}: {}".format(i, mark, "; ".join(errors))
|
|
149
|
+
continue
|
|
150
|
+
|
|
151
|
+
pytest.fail("entry {}{}: unexpected error: {}".format(i, mark, err))
|
|
152
|
+
continue
|
|
153
|
+
|
|
154
|
+
if expected_err is not None:
|
|
155
|
+
pytest.fail("entry {}{}: expected error containing {!r} but got result: {}".format(
|
|
156
|
+
i, mark, expected_err, _json_str(result)))
|
|
157
|
+
continue
|
|
158
|
+
|
|
159
|
+
matched = False
|
|
160
|
+
match_spec = entry.get("match")
|
|
161
|
+
if isinstance(match_spec, dict):
|
|
162
|
+
result_map = {
|
|
163
|
+
"in": entry.get("in"),
|
|
164
|
+
"out": _json_normalize(result),
|
|
165
|
+
}
|
|
166
|
+
if entry.get("args") is not None:
|
|
167
|
+
result_map["args"] = entry["args"]
|
|
168
|
+
elif entry.get("in") is not None:
|
|
169
|
+
result_map["args"] = [entry["in"]]
|
|
170
|
+
if entry.get("ctx") is not None:
|
|
171
|
+
result_map["ctx"] = entry["ctx"]
|
|
172
|
+
errors = []
|
|
173
|
+
_match_deep(errors, match_spec, result_map, "")
|
|
174
|
+
assert len(errors) == 0, \
|
|
175
|
+
"entry {}{}: {}".format(i, mark, "; ".join(errors))
|
|
176
|
+
matched = True
|
|
177
|
+
|
|
178
|
+
expected_out = entry.get("out")
|
|
179
|
+
if expected_out is None and matched:
|
|
180
|
+
continue
|
|
181
|
+
if expected_out is not None:
|
|
182
|
+
norm_result = _json_normalize(result)
|
|
183
|
+
norm_expected = _json_normalize(expected_out)
|
|
184
|
+
assert norm_result == norm_expected, \
|
|
185
|
+
"entry {}{}: output mismatch: got {} want {}".format(
|
|
186
|
+
i, mark, _json_str(norm_result), _json_str(norm_expected))
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _make_ctx_from_map(ctxmap, client, utility):
|
|
190
|
+
if ctxmap is None:
|
|
191
|
+
ctxmap = {}
|
|
192
|
+
|
|
193
|
+
ctx = utility.make_context(ctxmap, None)
|
|
194
|
+
|
|
195
|
+
if client is not None:
|
|
196
|
+
ctx.client = client
|
|
197
|
+
ctx.utility = utility
|
|
198
|
+
if ctx.options is None and client is not None:
|
|
199
|
+
ctx.options = client.options_map()
|
|
200
|
+
|
|
201
|
+
# Handle spec from JSON map
|
|
202
|
+
spec_map = ctxmap.get("spec")
|
|
203
|
+
if isinstance(spec_map, dict):
|
|
204
|
+
ctx.spec = ProjectNameSpec(spec_map)
|
|
205
|
+
|
|
206
|
+
# Handle result from JSON map
|
|
207
|
+
res_map = ctxmap.get("result")
|
|
208
|
+
if isinstance(res_map, dict):
|
|
209
|
+
ctx.result = ProjectNameResult(res_map)
|
|
210
|
+
err_map = res_map.get("err")
|
|
211
|
+
if isinstance(err_map, dict):
|
|
212
|
+
msg = err_map.get("message", "")
|
|
213
|
+
ctx.result.err = ProjectNameError("", msg)
|
|
214
|
+
|
|
215
|
+
# Handle response from JSON map
|
|
216
|
+
resp_map = ctxmap.get("response")
|
|
217
|
+
if isinstance(resp_map, dict):
|
|
218
|
+
ctx.response = ProjectNameResponse(resp_map)
|
|
219
|
+
body = resp_map.get("body")
|
|
220
|
+
if body is not None:
|
|
221
|
+
body_copy = body
|
|
222
|
+
ctx.response.json_func = lambda: body_copy
|
|
223
|
+
headers = resp_map.get("headers")
|
|
224
|
+
if isinstance(headers, dict):
|
|
225
|
+
lower_headers = {}
|
|
226
|
+
for k, v in headers.items():
|
|
227
|
+
lower_headers[k.lower()] = v
|
|
228
|
+
ctx.response.headers = lower_headers
|
|
229
|
+
|
|
230
|
+
return ctx
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def _fixctx(ctx, client):
|
|
234
|
+
if ctx is not None and ctx.client is not None and ctx.options is None:
|
|
235
|
+
ctx.options = ctx.client.options_map()
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def _err_from_map(m):
|
|
239
|
+
if m is None:
|
|
240
|
+
return None
|
|
241
|
+
msg = m.get("message", "")
|
|
242
|
+
if msg == "":
|
|
243
|
+
return None
|
|
244
|
+
code = m.get("code", "")
|
|
245
|
+
return ProjectNameError(code, msg)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def _make_test_ctx(client, utility, overrides=None):
|
|
249
|
+
ctxmap = {
|
|
250
|
+
"opname": "load",
|
|
251
|
+
"client": client,
|
|
252
|
+
"utility": utility,
|
|
253
|
+
}
|
|
254
|
+
if overrides is not None:
|
|
255
|
+
for k, v in overrides.items():
|
|
256
|
+
ctxmap[k] = v
|
|
257
|
+
return utility.make_context(ctxmap, client.get_root_ctx())
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def _make_test_full_ctx(client, utility):
|
|
261
|
+
ctx = _make_test_ctx(client, utility)
|
|
262
|
+
ctx.point = {
|
|
263
|
+
"parts": ["items", "{id}"],
|
|
264
|
+
"args": {"params": [{"name": "id", "reqd": True}]},
|
|
265
|
+
"params": ["id"],
|
|
266
|
+
"alias": {},
|
|
267
|
+
"select": {},
|
|
268
|
+
"active": True,
|
|
269
|
+
"transform": {},
|
|
270
|
+
}
|
|
271
|
+
ctx.match = {"id": "item01"}
|
|
272
|
+
ctx.reqmatch = {"id": "item01"}
|
|
273
|
+
return ctx
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
class TestPrimaryUtility:
|
|
277
|
+
|
|
278
|
+
def test_exists(self):
|
|
279
|
+
client = ProjectNameSDK.test(None, None)
|
|
280
|
+
utility = client._utility
|
|
281
|
+
|
|
282
|
+
assert utility.clean is not None
|
|
283
|
+
assert utility.done is not None
|
|
284
|
+
assert utility.make_error is not None
|
|
285
|
+
assert utility.feature_add is not None
|
|
286
|
+
assert utility.feature_hook is not None
|
|
287
|
+
assert utility.feature_init is not None
|
|
288
|
+
assert utility.fetcher is not None
|
|
289
|
+
assert utility.make_fetch_def is not None
|
|
290
|
+
assert utility.make_context is not None
|
|
291
|
+
assert utility.make_options is not None
|
|
292
|
+
assert utility.make_request is not None
|
|
293
|
+
assert utility.make_response is not None
|
|
294
|
+
assert utility.make_result is not None
|
|
295
|
+
assert utility.make_point is not None
|
|
296
|
+
assert utility.make_spec is not None
|
|
297
|
+
assert utility.make_url is not None
|
|
298
|
+
assert utility.param is not None
|
|
299
|
+
assert utility.prepare_auth is not None
|
|
300
|
+
assert utility.prepare_body is not None
|
|
301
|
+
assert utility.prepare_headers is not None
|
|
302
|
+
assert utility.prepare_method is not None
|
|
303
|
+
assert utility.prepare_params is not None
|
|
304
|
+
assert utility.prepare_path is not None
|
|
305
|
+
assert utility.prepare_query is not None
|
|
306
|
+
assert utility.result_basic is not None
|
|
307
|
+
assert utility.result_body is not None
|
|
308
|
+
assert utility.result_headers is not None
|
|
309
|
+
assert utility.transform_request is not None
|
|
310
|
+
assert utility.transform_response is not None
|
|
311
|
+
|
|
312
|
+
def test_clean_basic(self):
|
|
313
|
+
client = ProjectNameSDK.test(None, None)
|
|
314
|
+
utility = client._utility
|
|
315
|
+
ctx = _make_test_ctx(client, utility)
|
|
316
|
+
val = {"key": "secret123", "name": "test"}
|
|
317
|
+
cleaned = utility.clean(ctx, val)
|
|
318
|
+
assert cleaned is not None
|
|
319
|
+
|
|
320
|
+
def test_done_basic(self):
|
|
321
|
+
spec = _load_test_spec()
|
|
322
|
+
primary = _get_spec(spec, "primary")
|
|
323
|
+
client = ProjectNameSDK.test(None, None)
|
|
324
|
+
utility = client._utility
|
|
325
|
+
|
|
326
|
+
def subject(entry):
|
|
327
|
+
ctxmap = entry.get("ctx")
|
|
328
|
+
if not isinstance(ctxmap, dict):
|
|
329
|
+
ctxmap = {}
|
|
330
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
331
|
+
_fixctx(ctx, client)
|
|
332
|
+
return utility.done(ctx)
|
|
333
|
+
|
|
334
|
+
_runset(_get_spec(primary, "done", "basic"), subject)
|
|
335
|
+
|
|
336
|
+
def test_make_error_basic(self):
|
|
337
|
+
spec = _load_test_spec()
|
|
338
|
+
primary = _get_spec(spec, "primary")
|
|
339
|
+
client = ProjectNameSDK.test(None, None)
|
|
340
|
+
utility = client._utility
|
|
341
|
+
|
|
342
|
+
def subject(entry):
|
|
343
|
+
args = entry.get("args")
|
|
344
|
+
if not isinstance(args, list) or len(args) == 0:
|
|
345
|
+
args = [{}]
|
|
346
|
+
|
|
347
|
+
ctxmap = args[0]
|
|
348
|
+
if not isinstance(ctxmap, dict):
|
|
349
|
+
ctxmap = {}
|
|
350
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
351
|
+
_fixctx(ctx, client)
|
|
352
|
+
|
|
353
|
+
err = None
|
|
354
|
+
if len(args) > 1:
|
|
355
|
+
err_map = args[1]
|
|
356
|
+
if isinstance(err_map, dict):
|
|
357
|
+
err = _err_from_map(err_map)
|
|
358
|
+
|
|
359
|
+
return utility.make_error(ctx, err)
|
|
360
|
+
|
|
361
|
+
_runset(_get_spec(primary, "makeError", "basic"), subject)
|
|
362
|
+
|
|
363
|
+
def test_make_error_no_throw(self):
|
|
364
|
+
client = ProjectNameSDK.test(None, None)
|
|
365
|
+
utility = client._utility
|
|
366
|
+
ctx = _make_test_full_ctx(client, utility)
|
|
367
|
+
ctx.ctrl.throw_err = False
|
|
368
|
+
ctx.result = ProjectNameResult({
|
|
369
|
+
"ok": False,
|
|
370
|
+
"resdata": {"id": "safe01"},
|
|
371
|
+
})
|
|
372
|
+
|
|
373
|
+
out, err = utility.make_error(ctx, ctx.make_error("test_code", "test message"))
|
|
374
|
+
assert err is None
|
|
375
|
+
assert isinstance(out, dict)
|
|
376
|
+
assert out["id"] == "safe01"
|
|
377
|
+
|
|
378
|
+
def test_feature_add_basic(self):
|
|
379
|
+
client = ProjectNameSDK.test(None, None)
|
|
380
|
+
utility = client._utility
|
|
381
|
+
ctx = _make_test_ctx(client, utility)
|
|
382
|
+
start_len = len(client.features)
|
|
383
|
+
|
|
384
|
+
feature = ProjectNameBaseFeature()
|
|
385
|
+
utility.feature_add(ctx, feature)
|
|
386
|
+
|
|
387
|
+
assert len(client.features) == start_len + 1
|
|
388
|
+
|
|
389
|
+
def test_feature_hook_basic(self):
|
|
390
|
+
hook_client = ProjectNameSDK.test(None, None)
|
|
391
|
+
hook_utility = hook_client._utility
|
|
392
|
+
ctx = _make_test_ctx(hook_client, hook_utility)
|
|
393
|
+
|
|
394
|
+
state = {"called": False}
|
|
395
|
+
|
|
396
|
+
class TestHookFeature(ProjectNameBaseFeature):
|
|
397
|
+
def TestHook(self, ctx):
|
|
398
|
+
state["called"] = True
|
|
399
|
+
|
|
400
|
+
hook_feature = TestHookFeature()
|
|
401
|
+
hook_client.features = [hook_feature]
|
|
402
|
+
|
|
403
|
+
hook_utility.feature_hook(ctx, "TestHook")
|
|
404
|
+
assert state["called"] is True
|
|
405
|
+
|
|
406
|
+
def test_feature_init_basic(self):
|
|
407
|
+
init_client = ProjectNameSDK.test(None, None)
|
|
408
|
+
init_utility = init_client._utility
|
|
409
|
+
ctx = _make_test_ctx(init_client, init_utility)
|
|
410
|
+
ctx.options["feature"] = {
|
|
411
|
+
"initfeat": {"active": True},
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
state = {"called": False}
|
|
415
|
+
|
|
416
|
+
class TestInitFeature(ProjectNameBaseFeature):
|
|
417
|
+
def __init__(self):
|
|
418
|
+
super().__init__()
|
|
419
|
+
self.name = "initfeat"
|
|
420
|
+
self.active = True
|
|
421
|
+
|
|
422
|
+
def init(self, ctx, options):
|
|
423
|
+
state["called"] = True
|
|
424
|
+
|
|
425
|
+
feature = TestInitFeature()
|
|
426
|
+
init_utility.feature_init(ctx, feature)
|
|
427
|
+
assert state["called"] is True
|
|
428
|
+
|
|
429
|
+
def test_feature_init_inactive(self):
|
|
430
|
+
init_client = ProjectNameSDK.test(None, None)
|
|
431
|
+
init_utility = init_client._utility
|
|
432
|
+
ctx = _make_test_ctx(init_client, init_utility)
|
|
433
|
+
ctx.options["feature"] = {
|
|
434
|
+
"nofeat": {"active": False},
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
state = {"called": False}
|
|
438
|
+
|
|
439
|
+
class TestInitFeatureInactive(ProjectNameBaseFeature):
|
|
440
|
+
def __init__(self):
|
|
441
|
+
super().__init__()
|
|
442
|
+
self.name = "nofeat"
|
|
443
|
+
self.active = False
|
|
444
|
+
|
|
445
|
+
def init(self, ctx, options):
|
|
446
|
+
state["called"] = True
|
|
447
|
+
|
|
448
|
+
feature = TestInitFeatureInactive()
|
|
449
|
+
init_utility.feature_init(ctx, feature)
|
|
450
|
+
assert state["called"] is False
|
|
451
|
+
|
|
452
|
+
def test_fetcher_live(self):
|
|
453
|
+
calls = []
|
|
454
|
+
|
|
455
|
+
def mock_fetch(url, fetchdef):
|
|
456
|
+
calls.append({"url": url, "init": fetchdef})
|
|
457
|
+
return {"status": 200, "statusText": "OK"}, None
|
|
458
|
+
|
|
459
|
+
live_client = ProjectNameSDK({
|
|
460
|
+
"system": {
|
|
461
|
+
"fetch": mock_fetch,
|
|
462
|
+
},
|
|
463
|
+
})
|
|
464
|
+
live_utility = live_client._utility
|
|
465
|
+
ctx = live_utility.make_context({
|
|
466
|
+
"opname": "load",
|
|
467
|
+
"client": live_client,
|
|
468
|
+
"utility": live_utility,
|
|
469
|
+
}, None)
|
|
470
|
+
|
|
471
|
+
fetchdef = {"method": "GET", "headers": {}}
|
|
472
|
+
_, err = live_utility.fetcher(ctx, "http://example.com/test", fetchdef)
|
|
473
|
+
assert err is None
|
|
474
|
+
assert len(calls) == 1
|
|
475
|
+
assert calls[0]["url"] == "http://example.com/test"
|
|
476
|
+
|
|
477
|
+
def test_fetcher_blocked_test_mode(self):
|
|
478
|
+
def mock_fetch(url, fetchdef):
|
|
479
|
+
return {}, None
|
|
480
|
+
|
|
481
|
+
blocked_client = ProjectNameSDK({
|
|
482
|
+
"system": {
|
|
483
|
+
"fetch": mock_fetch,
|
|
484
|
+
},
|
|
485
|
+
})
|
|
486
|
+
blocked_client.mode = "test"
|
|
487
|
+
|
|
488
|
+
blocked_utility = blocked_client._utility
|
|
489
|
+
ctx = blocked_utility.make_context({
|
|
490
|
+
"opname": "load",
|
|
491
|
+
"client": blocked_client,
|
|
492
|
+
"utility": blocked_utility,
|
|
493
|
+
}, None)
|
|
494
|
+
|
|
495
|
+
fetchdef = {"method": "GET", "headers": {}}
|
|
496
|
+
_, err = blocked_utility.fetcher(ctx, "http://example.com/test", fetchdef)
|
|
497
|
+
assert err is not None
|
|
498
|
+
assert "blocked" in str(err).lower()
|
|
499
|
+
|
|
500
|
+
def test_make_context_basic(self):
|
|
501
|
+
spec = _load_test_spec()
|
|
502
|
+
primary = _get_spec(spec, "primary")
|
|
503
|
+
client = ProjectNameSDK.test(None, None)
|
|
504
|
+
utility = client._utility
|
|
505
|
+
|
|
506
|
+
def subject(entry):
|
|
507
|
+
in_val = entry.get("in")
|
|
508
|
+
if isinstance(in_val, dict):
|
|
509
|
+
ctx = utility.make_context(in_val, None)
|
|
510
|
+
out = {
|
|
511
|
+
"id": ctx.id,
|
|
512
|
+
}
|
|
513
|
+
if ctx.op is not None:
|
|
514
|
+
out["op"] = {
|
|
515
|
+
"name": ctx.op.name,
|
|
516
|
+
"input": ctx.op.input,
|
|
517
|
+
}
|
|
518
|
+
return out, None
|
|
519
|
+
return None, None
|
|
520
|
+
|
|
521
|
+
_runset(_get_spec(primary, "makeContext", "basic"), subject)
|
|
522
|
+
|
|
523
|
+
def test_make_fetch_def_basic(self):
|
|
524
|
+
client = ProjectNameSDK.test(None, None)
|
|
525
|
+
utility = client._utility
|
|
526
|
+
ctx = _make_test_full_ctx(client, utility)
|
|
527
|
+
ctx.spec = ProjectNameSpec({
|
|
528
|
+
"base": "http://localhost:8080",
|
|
529
|
+
"prefix": "/api",
|
|
530
|
+
"path": "items/{id}",
|
|
531
|
+
"suffix": "",
|
|
532
|
+
"params": {"id": "item01"},
|
|
533
|
+
"query": {},
|
|
534
|
+
"headers": {"content-type": "application/json"},
|
|
535
|
+
"method": "GET",
|
|
536
|
+
"step": "start",
|
|
537
|
+
})
|
|
538
|
+
ctx.result = ProjectNameResult({})
|
|
539
|
+
|
|
540
|
+
fetchdef, err = utility.make_fetch_def(ctx)
|
|
541
|
+
assert err is None
|
|
542
|
+
assert fetchdef["method"] == "GET"
|
|
543
|
+
url = fetchdef.get("url", "")
|
|
544
|
+
assert "/api/items/item01" in url
|
|
545
|
+
assert fetchdef["headers"]["content-type"] == "application/json"
|
|
546
|
+
assert fetchdef.get("body") is None
|
|
547
|
+
|
|
548
|
+
def test_make_fetch_def_with_body(self):
|
|
549
|
+
client = ProjectNameSDK.test(None, None)
|
|
550
|
+
utility = client._utility
|
|
551
|
+
ctx = _make_test_full_ctx(client, utility)
|
|
552
|
+
ctx.spec = ProjectNameSpec({
|
|
553
|
+
"base": "http://localhost:8080",
|
|
554
|
+
"prefix": "",
|
|
555
|
+
"path": "items",
|
|
556
|
+
"suffix": "",
|
|
557
|
+
"params": {},
|
|
558
|
+
"query": {},
|
|
559
|
+
"headers": {},
|
|
560
|
+
"method": "POST",
|
|
561
|
+
"step": "start",
|
|
562
|
+
"body": {"name": "test"},
|
|
563
|
+
})
|
|
564
|
+
ctx.result = ProjectNameResult({})
|
|
565
|
+
|
|
566
|
+
fetchdef, err = utility.make_fetch_def(ctx)
|
|
567
|
+
assert err is None
|
|
568
|
+
assert fetchdef["method"] == "POST"
|
|
569
|
+
body_str = fetchdef.get("body")
|
|
570
|
+
assert isinstance(body_str, str)
|
|
571
|
+
assert '"name"' in body_str
|
|
572
|
+
|
|
573
|
+
def test_make_options_basic(self):
|
|
574
|
+
spec = _load_test_spec()
|
|
575
|
+
primary = _get_spec(spec, "primary")
|
|
576
|
+
client = ProjectNameSDK.test(None, None)
|
|
577
|
+
utility = client._utility
|
|
578
|
+
|
|
579
|
+
def subject(entry):
|
|
580
|
+
in_val = entry.get("in")
|
|
581
|
+
if not isinstance(in_val, dict):
|
|
582
|
+
in_val = {}
|
|
583
|
+
ctx = utility.make_context({
|
|
584
|
+
"options": in_val.get("options"),
|
|
585
|
+
"config": in_val.get("config"),
|
|
586
|
+
}, None)
|
|
587
|
+
ctx.client = client
|
|
588
|
+
ctx.utility = utility
|
|
589
|
+
return utility.make_options(ctx), None
|
|
590
|
+
|
|
591
|
+
_runset(_get_spec(primary, "makeOptions", "basic"), subject)
|
|
592
|
+
|
|
593
|
+
def test_make_request_basic(self):
|
|
594
|
+
spec = _load_test_spec()
|
|
595
|
+
primary = _get_spec(spec, "primary")
|
|
596
|
+
client = ProjectNameSDK.test(None, None)
|
|
597
|
+
utility = client._utility
|
|
598
|
+
|
|
599
|
+
def subject(entry):
|
|
600
|
+
ctxmap = entry.get("ctx")
|
|
601
|
+
if not isinstance(ctxmap, dict):
|
|
602
|
+
ctxmap = {}
|
|
603
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
604
|
+
ctx.options = client.options_map()
|
|
605
|
+
|
|
606
|
+
_, err = utility.make_request(ctx)
|
|
607
|
+
if err is not None:
|
|
608
|
+
return None, err
|
|
609
|
+
|
|
610
|
+
# Update entry ctx for match checking
|
|
611
|
+
entry_ctx = entry.get("ctx")
|
|
612
|
+
if isinstance(entry_ctx, dict):
|
|
613
|
+
if ctx.response is not None:
|
|
614
|
+
entry_ctx["response"] = "exists"
|
|
615
|
+
if ctx.result is not None:
|
|
616
|
+
entry_ctx["result"] = "exists"
|
|
617
|
+
|
|
618
|
+
return None, None
|
|
619
|
+
|
|
620
|
+
_runset(_get_spec(primary, "makeRequest", "basic"), subject)
|
|
621
|
+
|
|
622
|
+
def test_make_response_basic(self):
|
|
623
|
+
spec = _load_test_spec()
|
|
624
|
+
primary = _get_spec(spec, "primary")
|
|
625
|
+
client = ProjectNameSDK.test(None, None)
|
|
626
|
+
utility = client._utility
|
|
627
|
+
|
|
628
|
+
def subject(entry):
|
|
629
|
+
ctxmap = entry.get("ctx")
|
|
630
|
+
if not isinstance(ctxmap, dict):
|
|
631
|
+
ctxmap = {}
|
|
632
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
633
|
+
_fixctx(ctx, client)
|
|
634
|
+
|
|
635
|
+
_, err = utility.make_response(ctx)
|
|
636
|
+
if err is not None:
|
|
637
|
+
return None, err
|
|
638
|
+
|
|
639
|
+
# Update entry ctx for match with result data
|
|
640
|
+
entry_ctx = entry.get("ctx")
|
|
641
|
+
if isinstance(entry_ctx, dict) and ctx.result is not None:
|
|
642
|
+
entry_ctx["result"] = {
|
|
643
|
+
"ok": ctx.result.ok,
|
|
644
|
+
"status": ctx.result.status,
|
|
645
|
+
"statusText": ctx.result.status_text,
|
|
646
|
+
"headers": ctx.result.headers,
|
|
647
|
+
"body": ctx.result.body,
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
return None, None
|
|
651
|
+
|
|
652
|
+
_runset(_get_spec(primary, "makeResponse", "basic"), subject)
|
|
653
|
+
|
|
654
|
+
def test_make_result_basic(self):
|
|
655
|
+
client = ProjectNameSDK.test(None, None)
|
|
656
|
+
utility = client._utility
|
|
657
|
+
ctx = _make_test_full_ctx(client, utility)
|
|
658
|
+
ctx.spec = ProjectNameSpec({
|
|
659
|
+
"base": "http://localhost:8080",
|
|
660
|
+
"prefix": "/api",
|
|
661
|
+
"path": "items/{id}",
|
|
662
|
+
"suffix": "",
|
|
663
|
+
"params": {"id": "item01"},
|
|
664
|
+
"query": {},
|
|
665
|
+
"headers": {},
|
|
666
|
+
"method": "GET",
|
|
667
|
+
"step": "start",
|
|
668
|
+
})
|
|
669
|
+
ctx.result = ProjectNameResult({
|
|
670
|
+
"ok": True,
|
|
671
|
+
"status": 200,
|
|
672
|
+
"statusText": "OK",
|
|
673
|
+
"headers": {},
|
|
674
|
+
"resdata": {"id": "item01", "name": "Test"},
|
|
675
|
+
})
|
|
676
|
+
|
|
677
|
+
result, err = utility.make_result(ctx)
|
|
678
|
+
assert err is None
|
|
679
|
+
assert result.status == 200
|
|
680
|
+
|
|
681
|
+
def test_make_result_no_spec(self):
|
|
682
|
+
client = ProjectNameSDK.test(None, None)
|
|
683
|
+
utility = client._utility
|
|
684
|
+
ctx = _make_test_full_ctx(client, utility)
|
|
685
|
+
ctx.spec = None
|
|
686
|
+
ctx.result = ProjectNameResult({
|
|
687
|
+
"ok": True,
|
|
688
|
+
"status": 200,
|
|
689
|
+
"statusText": "OK",
|
|
690
|
+
"headers": {},
|
|
691
|
+
})
|
|
692
|
+
|
|
693
|
+
_, err = utility.make_result(ctx)
|
|
694
|
+
assert err is not None
|
|
695
|
+
|
|
696
|
+
def test_make_result_no_result(self):
|
|
697
|
+
client = ProjectNameSDK.test(None, None)
|
|
698
|
+
utility = client._utility
|
|
699
|
+
ctx = _make_test_full_ctx(client, utility)
|
|
700
|
+
ctx.spec = ProjectNameSpec({"step": "start"})
|
|
701
|
+
ctx.result = None
|
|
702
|
+
|
|
703
|
+
_, err = utility.make_result(ctx)
|
|
704
|
+
assert err is not None
|
|
705
|
+
|
|
706
|
+
def test_make_spec_basic(self):
|
|
707
|
+
spec = _load_test_spec()
|
|
708
|
+
primary = _get_spec(spec, "primary")
|
|
709
|
+
client = ProjectNameSDK.test(None, None)
|
|
710
|
+
utility = client._utility
|
|
711
|
+
|
|
712
|
+
setup_opts = _get_spec(primary, "makeSpec", "DEF", "setup", "a")
|
|
713
|
+
spec_client = ProjectNameSDK.test(None, setup_opts)
|
|
714
|
+
spec_utility = spec_client._utility
|
|
715
|
+
|
|
716
|
+
def subject(entry):
|
|
717
|
+
ctxmap = entry.get("ctx")
|
|
718
|
+
if not isinstance(ctxmap, dict):
|
|
719
|
+
ctxmap = {}
|
|
720
|
+
ctx = _make_ctx_from_map(ctxmap, spec_client, spec_utility)
|
|
721
|
+
ctx.options = spec_client.options_map()
|
|
722
|
+
|
|
723
|
+
_, err = utility.make_spec(ctx)
|
|
724
|
+
if err is not None:
|
|
725
|
+
return None, err
|
|
726
|
+
|
|
727
|
+
# Update entry ctx for match
|
|
728
|
+
entry_ctx = entry.get("ctx")
|
|
729
|
+
if isinstance(entry_ctx, dict) and ctx.spec is not None:
|
|
730
|
+
entry_ctx["spec"] = {
|
|
731
|
+
"base": ctx.spec.base,
|
|
732
|
+
"prefix": ctx.spec.prefix,
|
|
733
|
+
"suffix": ctx.spec.suffix,
|
|
734
|
+
"method": ctx.spec.method,
|
|
735
|
+
"params": ctx.spec.params,
|
|
736
|
+
"query": ctx.spec.query,
|
|
737
|
+
"headers": ctx.spec.headers,
|
|
738
|
+
"step": ctx.spec.step,
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
return None, None
|
|
742
|
+
|
|
743
|
+
_runset(_get_spec(primary, "makeSpec", "basic"), subject)
|
|
744
|
+
|
|
745
|
+
def test_make_point_basic(self):
|
|
746
|
+
client = ProjectNameSDK.test(None, None)
|
|
747
|
+
utility = client._utility
|
|
748
|
+
ctx = _make_test_ctx(client, utility)
|
|
749
|
+
point = {
|
|
750
|
+
"parts": ["items", "{id}"],
|
|
751
|
+
"args": {"params": []},
|
|
752
|
+
"params": [],
|
|
753
|
+
"alias": {},
|
|
754
|
+
"select": {},
|
|
755
|
+
"active": True,
|
|
756
|
+
"transform": {},
|
|
757
|
+
}
|
|
758
|
+
ctx.op.points = [point]
|
|
759
|
+
|
|
760
|
+
_, err = utility.make_point(ctx)
|
|
761
|
+
assert err is None
|
|
762
|
+
assert ctx.point is not None
|
|
763
|
+
|
|
764
|
+
def test_make_url_basic(self):
|
|
765
|
+
spec = _load_test_spec()
|
|
766
|
+
primary = _get_spec(spec, "primary")
|
|
767
|
+
client = ProjectNameSDK.test(None, None)
|
|
768
|
+
utility = client._utility
|
|
769
|
+
|
|
770
|
+
def subject(entry):
|
|
771
|
+
ctxmap = entry.get("ctx")
|
|
772
|
+
if not isinstance(ctxmap, dict):
|
|
773
|
+
ctxmap = {}
|
|
774
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
775
|
+
if ctx.result is None:
|
|
776
|
+
ctx.result = ProjectNameResult({})
|
|
777
|
+
return utility.make_url(ctx)
|
|
778
|
+
|
|
779
|
+
_runset(_get_spec(primary, "makeUrl", "basic"), subject)
|
|
780
|
+
|
|
781
|
+
def test_operator_basic(self):
|
|
782
|
+
spec = _load_test_spec()
|
|
783
|
+
primary = _get_spec(spec, "primary")
|
|
784
|
+
|
|
785
|
+
def subject(entry):
|
|
786
|
+
in_val = entry.get("in")
|
|
787
|
+
if not isinstance(in_val, dict):
|
|
788
|
+
in_val = {}
|
|
789
|
+
op = ProjectNameOperation(in_val)
|
|
790
|
+
return {
|
|
791
|
+
"entity": op.entity,
|
|
792
|
+
"name": op.name,
|
|
793
|
+
"input": op.input,
|
|
794
|
+
"points": op.points,
|
|
795
|
+
}, None
|
|
796
|
+
|
|
797
|
+
_runset(_get_spec(primary, "operator", "basic"), subject)
|
|
798
|
+
|
|
799
|
+
def test_param_basic(self):
|
|
800
|
+
spec = _load_test_spec()
|
|
801
|
+
primary = _get_spec(spec, "primary")
|
|
802
|
+
client = ProjectNameSDK.test(None, None)
|
|
803
|
+
utility = client._utility
|
|
804
|
+
|
|
805
|
+
def subject(entry):
|
|
806
|
+
args = entry.get("args")
|
|
807
|
+
if not isinstance(args, list) or len(args) < 2:
|
|
808
|
+
return None, None
|
|
809
|
+
|
|
810
|
+
ctxmap = args[0]
|
|
811
|
+
if not isinstance(ctxmap, dict):
|
|
812
|
+
ctxmap = {}
|
|
813
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
814
|
+
paramdef = args[1]
|
|
815
|
+
|
|
816
|
+
result = utility.param(ctx, paramdef)
|
|
817
|
+
|
|
818
|
+
# Update entry ctx for match
|
|
819
|
+
match_spec = entry.get("match")
|
|
820
|
+
if isinstance(match_spec, dict):
|
|
821
|
+
ctx_match = match_spec.get("ctx")
|
|
822
|
+
if isinstance(ctx_match, dict):
|
|
823
|
+
entry_ctx = entry.get("ctx")
|
|
824
|
+
if entry_ctx is None:
|
|
825
|
+
entry_ctx = {}
|
|
826
|
+
entry["ctx"] = entry_ctx
|
|
827
|
+
# Copy spec alias back to entry ctx for matching
|
|
828
|
+
spec_match = ctx_match.get("spec")
|
|
829
|
+
if isinstance(spec_match, dict):
|
|
830
|
+
if ctx.spec is not None:
|
|
831
|
+
if entry_ctx.get("spec") is None:
|
|
832
|
+
entry_ctx["spec"] = {}
|
|
833
|
+
alias_match = spec_match.get("alias")
|
|
834
|
+
if isinstance(alias_match, dict):
|
|
835
|
+
entry_ctx["spec"] = {
|
|
836
|
+
"alias": ctx.spec.alias,
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
return result, None
|
|
840
|
+
|
|
841
|
+
_runset(_get_spec(primary, "param", "basic"), subject)
|
|
842
|
+
|
|
843
|
+
def test_prepare_auth_basic(self):
|
|
844
|
+
spec = _load_test_spec()
|
|
845
|
+
primary = _get_spec(spec, "primary")
|
|
846
|
+
client = ProjectNameSDK.test(None, None)
|
|
847
|
+
utility = client._utility
|
|
848
|
+
|
|
849
|
+
setup_opts = _get_spec(primary, "prepareAuth", "DEF", "setup", "a")
|
|
850
|
+
auth_client = ProjectNameSDK.test(None, setup_opts)
|
|
851
|
+
auth_utility = auth_client._utility
|
|
852
|
+
|
|
853
|
+
def subject(entry):
|
|
854
|
+
ctxmap = entry.get("ctx")
|
|
855
|
+
if not isinstance(ctxmap, dict):
|
|
856
|
+
ctxmap = {}
|
|
857
|
+
ctx = _make_ctx_from_map(ctxmap, auth_client, auth_utility)
|
|
858
|
+
_fixctx(ctx, auth_client)
|
|
859
|
+
|
|
860
|
+
_, err = utility.prepare_auth(ctx)
|
|
861
|
+
if err is not None:
|
|
862
|
+
return None, err
|
|
863
|
+
|
|
864
|
+
# Update entry ctx for match
|
|
865
|
+
entry_ctx = entry.get("ctx")
|
|
866
|
+
if isinstance(entry_ctx, dict) and ctx.spec is not None:
|
|
867
|
+
entry_ctx["spec"] = {
|
|
868
|
+
"headers": ctx.spec.headers,
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
return None, None
|
|
872
|
+
|
|
873
|
+
_runset(_get_spec(primary, "prepareAuth", "basic"), subject)
|
|
874
|
+
|
|
875
|
+
def test_prepare_body_basic(self):
|
|
876
|
+
spec = _load_test_spec()
|
|
877
|
+
primary = _get_spec(spec, "primary")
|
|
878
|
+
client = ProjectNameSDK.test(None, None)
|
|
879
|
+
utility = client._utility
|
|
880
|
+
|
|
881
|
+
def subject(entry):
|
|
882
|
+
ctxmap = entry.get("ctx")
|
|
883
|
+
if not isinstance(ctxmap, dict):
|
|
884
|
+
ctxmap = {}
|
|
885
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
886
|
+
_fixctx(ctx, client)
|
|
887
|
+
return utility.prepare_body(ctx), None
|
|
888
|
+
|
|
889
|
+
_runset(_get_spec(primary, "prepareBody", "basic"), subject)
|
|
890
|
+
|
|
891
|
+
def test_prepare_headers_basic(self):
|
|
892
|
+
spec = _load_test_spec()
|
|
893
|
+
primary = _get_spec(spec, "primary")
|
|
894
|
+
client = ProjectNameSDK.test(None, None)
|
|
895
|
+
utility = client._utility
|
|
896
|
+
|
|
897
|
+
def subject(entry):
|
|
898
|
+
ctxmap = entry.get("ctx")
|
|
899
|
+
if not isinstance(ctxmap, dict):
|
|
900
|
+
ctxmap = {}
|
|
901
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
902
|
+
return utility.prepare_headers(ctx), None
|
|
903
|
+
|
|
904
|
+
_runset(_get_spec(primary, "prepareHeaders", "basic"), subject)
|
|
905
|
+
|
|
906
|
+
def test_prepare_method_basic(self):
|
|
907
|
+
spec = _load_test_spec()
|
|
908
|
+
primary = _get_spec(spec, "primary")
|
|
909
|
+
client = ProjectNameSDK.test(None, None)
|
|
910
|
+
utility = client._utility
|
|
911
|
+
|
|
912
|
+
def subject(entry):
|
|
913
|
+
ctxmap = entry.get("ctx")
|
|
914
|
+
if not isinstance(ctxmap, dict):
|
|
915
|
+
ctxmap = {}
|
|
916
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
917
|
+
return utility.prepare_method(ctx), None
|
|
918
|
+
|
|
919
|
+
_runset(_get_spec(primary, "prepareMethod", "basic"), subject)
|
|
920
|
+
|
|
921
|
+
def test_prepare_params_basic(self):
|
|
922
|
+
spec = _load_test_spec()
|
|
923
|
+
primary = _get_spec(spec, "primary")
|
|
924
|
+
client = ProjectNameSDK.test(None, None)
|
|
925
|
+
utility = client._utility
|
|
926
|
+
|
|
927
|
+
def subject(entry):
|
|
928
|
+
ctxmap = entry.get("ctx")
|
|
929
|
+
if not isinstance(ctxmap, dict):
|
|
930
|
+
ctxmap = {}
|
|
931
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
932
|
+
return utility.prepare_params(ctx), None
|
|
933
|
+
|
|
934
|
+
_runset(_get_spec(primary, "prepareParams", "basic"), subject)
|
|
935
|
+
|
|
936
|
+
def test_prepare_path_basic(self):
|
|
937
|
+
client = ProjectNameSDK.test(None, None)
|
|
938
|
+
utility = client._utility
|
|
939
|
+
ctx = _make_test_full_ctx(client, utility)
|
|
940
|
+
ctx.point = {
|
|
941
|
+
"parts": ["api", "planet", "{id}"],
|
|
942
|
+
"args": {"params": []},
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
path = utility.prepare_path(ctx)
|
|
946
|
+
assert path == "api/planet/{id}"
|
|
947
|
+
|
|
948
|
+
def test_prepare_path_single(self):
|
|
949
|
+
client = ProjectNameSDK.test(None, None)
|
|
950
|
+
utility = client._utility
|
|
951
|
+
ctx = _make_test_full_ctx(client, utility)
|
|
952
|
+
ctx.point = {
|
|
953
|
+
"parts": ["items"],
|
|
954
|
+
"args": {"params": []},
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
path = utility.prepare_path(ctx)
|
|
958
|
+
assert path == "items"
|
|
959
|
+
|
|
960
|
+
def test_prepare_query_basic(self):
|
|
961
|
+
spec = _load_test_spec()
|
|
962
|
+
primary = _get_spec(spec, "primary")
|
|
963
|
+
client = ProjectNameSDK.test(None, None)
|
|
964
|
+
utility = client._utility
|
|
965
|
+
|
|
966
|
+
def subject(entry):
|
|
967
|
+
ctxmap = entry.get("ctx")
|
|
968
|
+
if not isinstance(ctxmap, dict):
|
|
969
|
+
ctxmap = {}
|
|
970
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
971
|
+
return utility.prepare_query(ctx), None
|
|
972
|
+
|
|
973
|
+
_runset(_get_spec(primary, "prepareQuery", "basic"), subject)
|
|
974
|
+
|
|
975
|
+
def test_result_basic_basic(self):
|
|
976
|
+
spec = _load_test_spec()
|
|
977
|
+
primary = _get_spec(spec, "primary")
|
|
978
|
+
client = ProjectNameSDK.test(None, None)
|
|
979
|
+
utility = client._utility
|
|
980
|
+
|
|
981
|
+
def subject(entry):
|
|
982
|
+
ctxmap = entry.get("ctx")
|
|
983
|
+
if not isinstance(ctxmap, dict):
|
|
984
|
+
ctxmap = {}
|
|
985
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
986
|
+
_fixctx(ctx, client)
|
|
987
|
+
|
|
988
|
+
result = utility.result_basic(ctx)
|
|
989
|
+
|
|
990
|
+
out = {
|
|
991
|
+
"status": result.status,
|
|
992
|
+
"statusText": result.status_text,
|
|
993
|
+
}
|
|
994
|
+
if result.err is not None:
|
|
995
|
+
out["err"] = {
|
|
996
|
+
"message": str(result.err),
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
return out, None
|
|
1000
|
+
|
|
1001
|
+
_runset(_get_spec(primary, "resultBasic", "basic"), subject)
|
|
1002
|
+
|
|
1003
|
+
def test_result_body_basic(self):
|
|
1004
|
+
spec = _load_test_spec()
|
|
1005
|
+
primary = _get_spec(spec, "primary")
|
|
1006
|
+
client = ProjectNameSDK.test(None, None)
|
|
1007
|
+
utility = client._utility
|
|
1008
|
+
|
|
1009
|
+
def subject(entry):
|
|
1010
|
+
ctxmap = entry.get("ctx")
|
|
1011
|
+
if not isinstance(ctxmap, dict):
|
|
1012
|
+
ctxmap = {}
|
|
1013
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
1014
|
+
|
|
1015
|
+
utility.result_body(ctx)
|
|
1016
|
+
|
|
1017
|
+
# Update entry ctx for match
|
|
1018
|
+
entry_ctx = entry.get("ctx")
|
|
1019
|
+
if isinstance(entry_ctx, dict) and ctx.result is not None:
|
|
1020
|
+
entry_ctx["result"] = {
|
|
1021
|
+
"body": ctx.result.body,
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
return None, None
|
|
1025
|
+
|
|
1026
|
+
_runset(_get_spec(primary, "resultBody", "basic"), subject)
|
|
1027
|
+
|
|
1028
|
+
def test_result_headers_basic(self):
|
|
1029
|
+
spec = _load_test_spec()
|
|
1030
|
+
primary = _get_spec(spec, "primary")
|
|
1031
|
+
client = ProjectNameSDK.test(None, None)
|
|
1032
|
+
utility = client._utility
|
|
1033
|
+
|
|
1034
|
+
def subject(entry):
|
|
1035
|
+
ctxmap = entry.get("ctx")
|
|
1036
|
+
if not isinstance(ctxmap, dict):
|
|
1037
|
+
ctxmap = {}
|
|
1038
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
1039
|
+
|
|
1040
|
+
utility.result_headers(ctx)
|
|
1041
|
+
|
|
1042
|
+
# Update entry ctx for match
|
|
1043
|
+
entry_ctx = entry.get("ctx")
|
|
1044
|
+
if isinstance(entry_ctx, dict) and ctx.result is not None:
|
|
1045
|
+
entry_ctx["result"] = {
|
|
1046
|
+
"headers": ctx.result.headers,
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
return None, None
|
|
1050
|
+
|
|
1051
|
+
_runset(_get_spec(primary, "resultHeaders", "basic"), subject)
|
|
1052
|
+
|
|
1053
|
+
def test_transform_request_basic(self):
|
|
1054
|
+
spec = _load_test_spec()
|
|
1055
|
+
primary = _get_spec(spec, "primary")
|
|
1056
|
+
client = ProjectNameSDK.test(None, None)
|
|
1057
|
+
utility = client._utility
|
|
1058
|
+
|
|
1059
|
+
def subject(entry):
|
|
1060
|
+
ctxmap = entry.get("ctx")
|
|
1061
|
+
if not isinstance(ctxmap, dict):
|
|
1062
|
+
ctxmap = {}
|
|
1063
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
1064
|
+
|
|
1065
|
+
result = utility.transform_request(ctx)
|
|
1066
|
+
|
|
1067
|
+
# Update entry ctx for match (step changed)
|
|
1068
|
+
entry_ctx = entry.get("ctx")
|
|
1069
|
+
if isinstance(entry_ctx, dict) and ctx.spec is not None:
|
|
1070
|
+
spec_map = entry_ctx.get("spec")
|
|
1071
|
+
if isinstance(spec_map, dict):
|
|
1072
|
+
spec_map["step"] = ctx.spec.step
|
|
1073
|
+
|
|
1074
|
+
return result, None
|
|
1075
|
+
|
|
1076
|
+
_runset(_get_spec(primary, "transformRequest", "basic"), subject)
|
|
1077
|
+
|
|
1078
|
+
def test_transform_response_basic(self):
|
|
1079
|
+
spec = _load_test_spec()
|
|
1080
|
+
primary = _get_spec(spec, "primary")
|
|
1081
|
+
client = ProjectNameSDK.test(None, None)
|
|
1082
|
+
utility = client._utility
|
|
1083
|
+
|
|
1084
|
+
def subject(entry):
|
|
1085
|
+
ctxmap = entry.get("ctx")
|
|
1086
|
+
if not isinstance(ctxmap, dict):
|
|
1087
|
+
ctxmap = {}
|
|
1088
|
+
ctx = _make_ctx_from_map(ctxmap, client, utility)
|
|
1089
|
+
|
|
1090
|
+
result = utility.transform_response(ctx)
|
|
1091
|
+
|
|
1092
|
+
# Update entry ctx for match (step changed)
|
|
1093
|
+
entry_ctx = entry.get("ctx")
|
|
1094
|
+
if isinstance(entry_ctx, dict) and ctx.spec is not None:
|
|
1095
|
+
spec_map = entry_ctx.get("spec")
|
|
1096
|
+
if isinstance(spec_map, dict):
|
|
1097
|
+
spec_map["step"] = ctx.spec.step
|
|
1098
|
+
|
|
1099
|
+
return result, None
|
|
1100
|
+
|
|
1101
|
+
_runset(_get_spec(primary, "transformResponse", "basic"), subject)
|