jaseci 1.4.2.5__py3-none-any.whl → 2.0.0__py3-none-any.whl
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.
Potentially problematic release.
This version of jaseci might be problematic. Click here for more details.
- jaseci/__init__.py +3 -37
- jaseci-2.0.0.dist-info/METADATA +65 -0
- jaseci-2.0.0.dist-info/RECORD +4 -0
- {jaseci-1.4.2.5.dist-info → jaseci-2.0.0.dist-info}/WHEEL +1 -2
- jaseci/VERSION +0 -1
- jaseci/cli_tools/__init__.py +0 -0
- jaseci/cli_tools/book_tools.py +0 -457
- jaseci/cli_tools/jsctl.py +0 -500
- jaseci/cli_tools/tests/__init__.py +0 -0
- jaseci/cli_tools/tests/test_jsctl.py +0 -556
- jaseci/extens/__init__.py +0 -0
- jaseci/extens/act_lib/__init__.py +0 -0
- jaseci/extens/act_lib/date.py +0 -117
- jaseci/extens/act_lib/elastic.py +0 -87
- jaseci/extens/act_lib/file.py +0 -76
- jaseci/extens/act_lib/file_handler.py +0 -189
- jaseci/extens/act_lib/internal.py +0 -18
- jaseci/extens/act_lib/jaseci.py +0 -61
- jaseci/extens/act_lib/mail.py +0 -10
- jaseci/extens/act_lib/maths.py +0 -168
- jaseci/extens/act_lib/net.py +0 -191
- jaseci/extens/act_lib/rand.py +0 -82
- jaseci/extens/act_lib/regex.py +0 -85
- jaseci/extens/act_lib/request.py +0 -169
- jaseci/extens/act_lib/std.py +0 -235
- jaseci/extens/act_lib/storage.py +0 -53
- jaseci/extens/act_lib/stripe.py +0 -337
- jaseci/extens/act_lib/task.py +0 -13
- jaseci/extens/act_lib/tests/__init__.py +0 -0
- jaseci/extens/act_lib/tests/std_test_code.py +0 -37
- jaseci/extens/act_lib/tests/test_date.py +0 -26
- jaseci/extens/act_lib/tests/test_elastic.py +0 -159
- jaseci/extens/act_lib/tests/test_file.py +0 -116
- jaseci/extens/act_lib/tests/test_file_lib.py +0 -40
- jaseci/extens/act_lib/tests/test_mail_lib.py +0 -33
- jaseci/extens/act_lib/tests/test_maths.py +0 -147
- jaseci/extens/act_lib/tests/test_net_lib.py +0 -62
- jaseci/extens/act_lib/tests/test_regex.py +0 -61
- jaseci/extens/act_lib/tests/test_std.py +0 -51
- jaseci/extens/act_lib/tests/test_std_lib.py +0 -36
- jaseci/extens/act_lib/tests/test_url.py +0 -32
- jaseci/extens/act_lib/tests/test_vector.py +0 -36
- jaseci/extens/act_lib/tests/test_webtool.py +0 -44
- jaseci/extens/act_lib/tests/test_zlib.py +0 -24
- jaseci/extens/act_lib/url.py +0 -79
- jaseci/extens/act_lib/vector.py +0 -157
- jaseci/extens/act_lib/webtool.py +0 -28
- jaseci/extens/act_lib/zip.py +0 -33
- jaseci/extens/api/__init__.py +0 -0
- jaseci/extens/api/actions_api.py +0 -170
- jaseci/extens/api/alias_api.py +0 -139
- jaseci/extens/api/architype_api.py +0 -196
- jaseci/extens/api/config_api.py +0 -129
- jaseci/extens/api/global_api.py +0 -84
- jaseci/extens/api/graph_api.py +0 -167
- jaseci/extens/api/health_api.py +0 -20
- jaseci/extens/api/interface.py +0 -268
- jaseci/extens/api/jac_api.py +0 -171
- jaseci/extens/api/jsorc_api.py +0 -316
- jaseci/extens/api/logger_api.py +0 -89
- jaseci/extens/api/master_api.py +0 -133
- jaseci/extens/api/object_api.py +0 -101
- jaseci/extens/api/prometheus_api.py +0 -74
- jaseci/extens/api/queue_api.py +0 -140
- jaseci/extens/api/sentinel_api.py +0 -270
- jaseci/extens/api/super_api.py +0 -64
- jaseci/extens/api/tests/__init__.py +0 -0
- jaseci/extens/api/tests/test_architype_api.py +0 -66
- jaseci/extens/api/tests/test_global_api.py +0 -179
- jaseci/extens/api/tests/test_graph_api.py +0 -64
- jaseci/extens/api/tests/test_logger_api.py +0 -43
- jaseci/extens/api/tests/test_object_api.py +0 -20
- jaseci/extens/api/tests/test_sentinel_api.py +0 -66
- jaseci/extens/api/tests/test_uncommon.py +0 -107
- jaseci/extens/api/tests/test_user_api.py +0 -32
- jaseci/extens/api/tests/test_walker_api.py +0 -316
- jaseci/extens/api/user_api.py +0 -144
- jaseci/extens/api/walker_api.py +0 -298
- jaseci/extens/api/webhook_api.py +0 -74
- jaseci/extens/svc/__init__.py +0 -0
- jaseci/extens/svc/elastic_svc.py +0 -366
- jaseci/extens/svc/kube_svc.py +0 -432
- jaseci/extens/svc/mail_svc.py +0 -156
- jaseci/extens/svc/prome_svc.py +0 -378
- jaseci/extens/svc/redis_svc.py +0 -63
- jaseci/extens/svc/storage_svc.py +0 -193
- jaseci/extens/svc/stripe_svc.py +0 -51
- jaseci/extens/svc/task_svc.py +0 -155
- jaseci/extens/svc/tasks.py +0 -302
- jaseci/jac/__init__.py +0 -0
- jaseci/jac/interpreter/__init__.py +0 -0
- jaseci/jac/interpreter/architype_interp.py +0 -214
- jaseci/jac/interpreter/interp.py +0 -1783
- jaseci/jac/interpreter/sentinel_interp.py +0 -257
- jaseci/jac/interpreter/tests/__init__.py +0 -0
- jaseci/jac/interpreter/tests/test_interp.py +0 -42
- jaseci/jac/interpreter/walker_interp.py +0 -248
- jaseci/jac/ir/__init__.py +0 -0
- jaseci/jac/ir/ast.py +0 -73
- jaseci/jac/ir/ast_builder.py +0 -249
- jaseci/jac/ir/jac_code.py +0 -152
- jaseci/jac/ir/passes/__init__.py +0 -6
- jaseci/jac/ir/passes/ast_prune_pass.py +0 -9
- jaseci/jac/ir/passes/codegen_pass.py +0 -244
- jaseci/jac/ir/passes/ir_pass.py +0 -29
- jaseci/jac/ir/passes/printer_pass.py +0 -23
- jaseci/jac/ir/passes/pt_prune_pass.py +0 -29
- jaseci/jac/ir/passes/schedule.py +0 -23
- jaseci/jac/ir/passes/stats_pass.py +0 -16
- jaseci/jac/jac.g4 +0 -450
- jaseci/jac/jac_parse/__init__.py +0 -0
- jaseci/jac/jac_parse/jacLexer.py +0 -809
- jaseci/jac/jac_parse/jacListener.py +0 -853
- jaseci/jac/jac_parse/jacParser.py +0 -9192
- jaseci/jac/jac_set.py +0 -119
- jaseci/jac/jsci_vm/__init__.py +0 -0
- jaseci/jac/jsci_vm/disasm.py +0 -94
- jaseci/jac/jsci_vm/inst_ptr.py +0 -31
- jaseci/jac/jsci_vm/machine.py +0 -188
- jaseci/jac/jsci_vm/op_codes.py +0 -82
- jaseci/jac/jsci_vm/tests/__init__.py +0 -0
- jaseci/jac/jsci_vm/tests/test_codegen.py +0 -31
- jaseci/jac/machine/__init__.py +0 -0
- jaseci/jac/machine/jac_scope.py +0 -85
- jaseci/jac/machine/jac_value.py +0 -226
- jaseci/jac/machine/machine_state.py +0 -383
- jaseci/jac/tests/__init__.py +0 -0
- jaseci/jac/tests/book_code.py +0 -624
- jaseci/jac/tests/test_book.py +0 -380
- jaseci/jac/tests/test_lang_14.py +0 -49
- jaseci/jsorc/__init__.py +0 -7
- jaseci/jsorc/jsorc.py +0 -642
- jaseci/jsorc/jsorc_settings.py +0 -211
- jaseci/jsorc/jsorc_utils.py +0 -298
- jaseci/jsorc/live_actions.py +0 -364
- jaseci/jsorc/manifests/__init__.py +0 -0
- jaseci/jsorc/manifests/database.yaml +0 -109
- jaseci/jsorc/manifests/elastic.yaml +0 -6024
- jaseci/jsorc/manifests/prometheus.yaml +0 -1383
- jaseci/jsorc/manifests/redis.yaml +0 -64
- jaseci/jsorc/memory.py +0 -258
- jaseci/jsorc/redis.py +0 -139
- jaseci/jsorc/remote_actions.py +0 -157
- jaseci/jsorc/tests/__init__.py +0 -0
- jaseci/jsorc/tests/test_actions.py +0 -542
- jaseci/jsorc/tests/test_jsorc.py +0 -112
- jaseci/prim/__init__.py +0 -0
- jaseci/prim/ability.py +0 -93
- jaseci/prim/architype.py +0 -89
- jaseci/prim/edge.py +0 -172
- jaseci/prim/element.py +0 -233
- jaseci/prim/graph.py +0 -26
- jaseci/prim/master.py +0 -64
- jaseci/prim/node.py +0 -532
- jaseci/prim/obj_mixins.py +0 -235
- jaseci/prim/sentinel.py +0 -281
- jaseci/prim/super_master.py +0 -31
- jaseci/prim/walker.py +0 -261
- jaseci/svc/__init__.py +0 -0
- jaseci/tests/__init__.py +0 -0
- jaseci/tests/infer.py +0 -39
- jaseci/tests/jac_test_code.py +0 -1293
- jaseci/tests/jac_test_progs.py +0 -774
- jaseci/tests/test_core.py +0 -153
- jaseci/tests/test_jac.py +0 -824
- jaseci/tests/test_node.py +0 -89
- jaseci/tests/test_progs.py +0 -702
- jaseci/tests/test_stack.py +0 -220
- jaseci/tests/test_stripe.py +0 -225
- jaseci/utils/__init__.py +0 -0
- jaseci/utils/actions/__init__.py +0 -0
- jaseci/utils/actions/actions_manager.py +0 -254
- jaseci/utils/actions/actions_optimizer.py +0 -516
- jaseci/utils/actions/actions_state.py +0 -95
- jaseci/utils/file_handler.py +0 -171
- jaseci/utils/gprof2dot.py +0 -3786
- jaseci/utils/id_list.py +0 -168
- jaseci/utils/json_handler.py +0 -70
- jaseci/utils/log_utils.py +0 -57
- jaseci/utils/test_core.py +0 -62
- jaseci/utils/utils.py +0 -387
- jaseci-1.4.2.5.dist-info/LICENSE +0 -21
- jaseci-1.4.2.5.dist-info/METADATA +0 -39
- jaseci-1.4.2.5.dist-info/RECORD +0 -184
- jaseci-1.4.2.5.dist-info/entry_points.txt +0 -3
- jaseci-1.4.2.5.dist-info/top_level.txt +0 -1
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
from jaseci.jsorc.jsorc import JsOrc
|
|
2
|
-
from jaseci.extens.svc.elastic_svc import ElasticService
|
|
3
|
-
from jaseci.utils.test_core import CoreTest
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class ElasticTest(CoreTest):
|
|
7
|
-
"""Unit tests for Jac Walker APIs"""
|
|
8
|
-
|
|
9
|
-
fixture_src = __file__
|
|
10
|
-
|
|
11
|
-
def setUp(self):
|
|
12
|
-
super().setUp()
|
|
13
|
-
|
|
14
|
-
@JsOrc.inject(services=["elastic"])
|
|
15
|
-
def test_elastic(self, elastic: ElasticService):
|
|
16
|
-
if not elastic.is_running():
|
|
17
|
-
self.skipTest("Elastic is not available!")
|
|
18
|
-
|
|
19
|
-
res = self.call(
|
|
20
|
-
self.mast,
|
|
21
|
-
["sentinel_register", {"code": self.load_jac("elastic.jac")}],
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
res = self.call(
|
|
25
|
-
self.mast,
|
|
26
|
-
[
|
|
27
|
-
"walker_run",
|
|
28
|
-
{"name": "test_activity", "ctx": {"a": 1, "b": 2, "c": 3}},
|
|
29
|
-
],
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
# report std.log_activity({"other_field": 1}, action = "CUSTOM_ACTION_NAME");
|
|
33
|
-
self.assertEqual("created", res["report"][0]["result"])
|
|
34
|
-
|
|
35
|
-
# report std.log_activity({"other_field": 2}, action = "CUSTOM_ACTION_NAME", suffix="-sample-id");
|
|
36
|
-
self.assertEqual("created", res["report"][1]["result"])
|
|
37
|
-
|
|
38
|
-
# report elastic.doc_activity({"testing": "doc_activity"});
|
|
39
|
-
self.assertEqual("created", res["report"][2]["result"])
|
|
40
|
-
|
|
41
|
-
# report elastic.search_activity({});
|
|
42
|
-
hits = res["report"][3]["hits"]
|
|
43
|
-
|
|
44
|
-
self.assertEqual(2, hits["total"]["value"])
|
|
45
|
-
self.assertEqual({"a": 1, "b": 2, "c": 3}, hits["hits"][0]["_source"]["data"])
|
|
46
|
-
self.assertEqual(1, hits["hits"][0]["_source"].get("other_field"))
|
|
47
|
-
self.assertEqual({"testing": "doc_activity"}, hits["hits"][1]["_source"])
|
|
48
|
-
|
|
49
|
-
# report elastic.search_activity({}, suffix="-sample-id");
|
|
50
|
-
hits = res["report"][4]["hits"]
|
|
51
|
-
|
|
52
|
-
self.assertEqual(1, hits["total"]["value"])
|
|
53
|
-
self.assertEqual({"a": 1, "b": 2, "c": 3}, hits["hits"][0]["_source"]["data"])
|
|
54
|
-
self.assertEqual(2, hits["hits"][0]["_source"].get("other_field"))
|
|
55
|
-
|
|
56
|
-
# report elastic.mapping_activity();
|
|
57
|
-
mapping: dict = res["report"][5]
|
|
58
|
-
for key, value in mapping.items():
|
|
59
|
-
self.assertTrue(key.endswith("-activity"))
|
|
60
|
-
self.assertTrue(key.startswith("jaseci-"))
|
|
61
|
-
self.assertTrue(value["mappings"])
|
|
62
|
-
|
|
63
|
-
# report elastic.mapping_activity(suffix="-sample-id");
|
|
64
|
-
mapping: dict = res["report"][6]
|
|
65
|
-
for key, value in mapping.items():
|
|
66
|
-
self.assertTrue(key.endswith("-activity-sample-id"))
|
|
67
|
-
self.assertTrue(key.startswith("jaseci-"))
|
|
68
|
-
self.assertTrue(value["mappings"])
|
|
69
|
-
|
|
70
|
-
res = self.call(
|
|
71
|
-
self.mast,
|
|
72
|
-
[
|
|
73
|
-
"walker_run",
|
|
74
|
-
{"name": "test_common", "ctx": {"d": 1, "e": 2, "f": 3}},
|
|
75
|
-
],
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
# report elastic.doc({"testing": "doc"});
|
|
79
|
-
self.assertEqual("created", res["report"][0]["result"])
|
|
80
|
-
|
|
81
|
-
# elastic.doc({"testing": "doc-other-index"}, index="other-index");
|
|
82
|
-
self.assertEqual("created", res["report"][1]["result"])
|
|
83
|
-
|
|
84
|
-
# elastic.doc({"testing": "doc-other-index"}, index="other-index", suffix="-user-id");
|
|
85
|
-
self.assertEqual("created", res["report"][2]["result"])
|
|
86
|
-
|
|
87
|
-
# report elastic.search({});
|
|
88
|
-
hits = res["report"][3]["hits"]
|
|
89
|
-
|
|
90
|
-
self.assertEqual(1, hits["total"]["value"])
|
|
91
|
-
self.assertEqual({"testing": "doc"}, hits["hits"][0]["_source"])
|
|
92
|
-
|
|
93
|
-
# elastic.search({}, index="other-index");
|
|
94
|
-
hits = res["report"][4]["hits"]
|
|
95
|
-
|
|
96
|
-
self.assertEqual(1, hits["total"]["value"])
|
|
97
|
-
self.assertEqual({"testing": "doc-other-index"}, hits["hits"][0]["_source"])
|
|
98
|
-
|
|
99
|
-
# elastic.search({}, index="other-index", suffix="-user-id");
|
|
100
|
-
hits = res["report"][5]["hits"]
|
|
101
|
-
|
|
102
|
-
self.assertEqual(1, hits["total"]["value"])
|
|
103
|
-
self.assertEqual(
|
|
104
|
-
{"testing": "doc-other-index-suffix"}, hits["hits"][0]["_source"]
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
# report elastic.mapping();
|
|
108
|
-
mapping: dict = res["report"][6]
|
|
109
|
-
for key, value in mapping.items():
|
|
110
|
-
self.assertTrue(key.endswith("-common"))
|
|
111
|
-
self.assertTrue(key.startswith("jaseci-"))
|
|
112
|
-
self.assertTrue(value["mappings"])
|
|
113
|
-
|
|
114
|
-
# report elastic.mapping(index="other-index");
|
|
115
|
-
mapping: dict = res["report"][7]
|
|
116
|
-
for key, value in mapping.items():
|
|
117
|
-
self.assertEqual(key, "other-index")
|
|
118
|
-
self.assertTrue(value["mappings"])
|
|
119
|
-
|
|
120
|
-
# report elastic.mapping(index="other-index", suffix="-user-id");
|
|
121
|
-
mapping: dict = res["report"][8]
|
|
122
|
-
for key, value in mapping.items():
|
|
123
|
-
self.assertEqual(key, "other-index-user-id")
|
|
124
|
-
self.assertTrue(value["mappings"])
|
|
125
|
-
|
|
126
|
-
res = self.call(
|
|
127
|
-
self.mast,
|
|
128
|
-
[
|
|
129
|
-
"walker_run",
|
|
130
|
-
{"name": "test_other", "ctx": {}},
|
|
131
|
-
],
|
|
132
|
-
)
|
|
133
|
-
|
|
134
|
-
# report elastic.reindex
|
|
135
|
-
self.assertEqual(1, res["report"][0]["created"])
|
|
136
|
-
|
|
137
|
-
# report elastic.aliases();
|
|
138
|
-
aliases: dict = res["report"][1]
|
|
139
|
-
self.assertEqual(6, len(aliases.keys()))
|
|
140
|
-
self.assertTrue(aliases.pop("other-index"))
|
|
141
|
-
self.assertTrue(aliases.pop("other-index-user-id"))
|
|
142
|
-
self.assertTrue(aliases.pop("new-index"))
|
|
143
|
-
for key in list(aliases.keys()):
|
|
144
|
-
if key.startswith("jaseci-"):
|
|
145
|
-
if (
|
|
146
|
-
key.endswith("-activity")
|
|
147
|
-
or key.endswith("-common")
|
|
148
|
-
or key.endswith("-activity-sample-id")
|
|
149
|
-
):
|
|
150
|
-
self.assertTrue(aliases.pop(key))
|
|
151
|
-
self.assertFalse(aliases)
|
|
152
|
-
|
|
153
|
-
# report elastic.search({}, index="new-index");
|
|
154
|
-
hits = res["report"][2]["hits"]
|
|
155
|
-
|
|
156
|
-
self.assertEqual(1, hits["total"]["value"])
|
|
157
|
-
self.assertEqual(
|
|
158
|
-
{"testing": "doc-other-index-suffix"}, hits["hits"][0]["_source"]
|
|
159
|
-
)
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
from jaseci.utils.test_core import CoreTest
|
|
2
|
-
from unittest.mock import patch
|
|
3
|
-
from io import BufferedReader
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class FileTest(CoreTest):
|
|
7
|
-
"""Unit tests for Jac Walker APIs"""
|
|
8
|
-
|
|
9
|
-
fixture_src = __file__
|
|
10
|
-
|
|
11
|
-
def setUp(self):
|
|
12
|
-
super().setUp()
|
|
13
|
-
|
|
14
|
-
def tearDown(self):
|
|
15
|
-
self.mast._h.clean_file_handler()
|
|
16
|
-
super().tearDown()
|
|
17
|
-
|
|
18
|
-
def call_walker(self, name, report=True):
|
|
19
|
-
res = self.call(
|
|
20
|
-
self.mast,
|
|
21
|
-
[
|
|
22
|
-
"walker_run",
|
|
23
|
-
{"name": name, "ctx": {}},
|
|
24
|
-
],
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
self.assertTrue(res["success"])
|
|
28
|
-
return res["report"] if report else res
|
|
29
|
-
|
|
30
|
-
def test_file_syntax(self):
|
|
31
|
-
self.call(
|
|
32
|
-
self.mast,
|
|
33
|
-
["sentinel_register", {"code": self.load_jac("file.jac")}],
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
reps = self.call_walker("new_file")
|
|
37
|
-
self.assertEqual("", reps[1])
|
|
38
|
-
self.assertEqual("", reps[2])
|
|
39
|
-
self.assertEqual("0", reps[3])
|
|
40
|
-
self.assertEqual("00", reps[4])
|
|
41
|
-
self.assertEqual("MDA=", reps[5])
|
|
42
|
-
self.assertTrue(reps[6])
|
|
43
|
-
self.assertFalse(reps[7])
|
|
44
|
-
|
|
45
|
-
reps = self.call_walker("json_file")
|
|
46
|
-
self.assertEqual({"testing": 1}, reps[0])
|
|
47
|
-
self.assertTrue(reps[1])
|
|
48
|
-
self.assertFalse(reps[2])
|
|
49
|
-
|
|
50
|
-
reps = self.call_walker("download_file")
|
|
51
|
-
uuid = reps[0]
|
|
52
|
-
self.assertEqual(
|
|
53
|
-
{
|
|
54
|
-
"id": f"{uuid}",
|
|
55
|
-
"name": "jaseci_bible.pdf",
|
|
56
|
-
"content_type": "application/pdf",
|
|
57
|
-
"field": None,
|
|
58
|
-
"absolute_name": f"{uuid}-jaseci_bible.pdf",
|
|
59
|
-
"absolute_path": f"/tmp/{uuid}-jaseci_bible.pdf",
|
|
60
|
-
"persist": False,
|
|
61
|
-
},
|
|
62
|
-
reps[1],
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
reps = self.mast._h.get_file_handler(
|
|
66
|
-
self.call_walker("return_any_file", False)["report_file"]
|
|
67
|
-
).attr()
|
|
68
|
-
uuid = reps["id"]
|
|
69
|
-
self.assertEqual(
|
|
70
|
-
{
|
|
71
|
-
"id": f"{uuid}",
|
|
72
|
-
"name": "jaseci_bible.pdf",
|
|
73
|
-
"content_type": "application/pdf",
|
|
74
|
-
"field": None,
|
|
75
|
-
"absolute_name": f"{uuid}-jaseci_bible.pdf",
|
|
76
|
-
"absolute_path": f"/tmp/{uuid}-jaseci_bible.pdf",
|
|
77
|
-
"persist": False,
|
|
78
|
-
},
|
|
79
|
-
reps,
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
reps = self.mast._h.get_file_handler(
|
|
83
|
-
self.call_walker("return_any_file_with_name", False)["report_file"]
|
|
84
|
-
).attr()
|
|
85
|
-
uuid = reps["id"]
|
|
86
|
-
self.assertEqual(
|
|
87
|
-
{
|
|
88
|
-
"id": f"{uuid}",
|
|
89
|
-
"name": "jaseci_bible.pdf",
|
|
90
|
-
"content_type": "application/pdf",
|
|
91
|
-
"field": None,
|
|
92
|
-
"absolute_name": f"{uuid}-jaseci_bible.pdf",
|
|
93
|
-
"absolute_path": f"/tmp/{uuid}-jaseci_bible.pdf",
|
|
94
|
-
"persist": False,
|
|
95
|
-
},
|
|
96
|
-
reps,
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
@patch("requests.post")
|
|
100
|
-
def test_manual_upload_file(self, mock_post):
|
|
101
|
-
self.call(
|
|
102
|
-
self.mast,
|
|
103
|
-
["sentinel_register", {"code": self.load_jac("file.jac")}],
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
self.call_walker("manual_upload_file")
|
|
107
|
-
self.assertTrue(mock_post.called)
|
|
108
|
-
args, kwargs = mock_post.call_args
|
|
109
|
-
self.assertEqual(1, len(args))
|
|
110
|
-
self.assertEqual("https://sample/com", args[0])
|
|
111
|
-
self.assertEqual({"test": 1}, kwargs["data"])
|
|
112
|
-
self.assertEqual({"test": 2}, kwargs["headers"])
|
|
113
|
-
self.assertEqual("file", kwargs["files"][0][0])
|
|
114
|
-
self.assertEqual("jaseci_bible.pdf", kwargs["files"][0][1][0])
|
|
115
|
-
self.assertIsInstance(kwargs["files"][0][1][1], BufferedReader)
|
|
116
|
-
self.assertEqual("application/pdf", kwargs["files"][0][1][2])
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
from jaseci.utils.test_core import CoreTest
|
|
2
|
-
import os
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class FileLibTest(CoreTest):
|
|
6
|
-
fixture_src = __file__
|
|
7
|
-
|
|
8
|
-
def test_json_dump(self):
|
|
9
|
-
ret = self.call(
|
|
10
|
-
self.mast,
|
|
11
|
-
["sentinel_register", {"code": self.load_jac("file_stuff.jac")}],
|
|
12
|
-
)
|
|
13
|
-
ret = self.call(self.mast, ["walker_run", {"name": "pack_it"}])
|
|
14
|
-
self.assertEqual(ret["report"][0], {"hello": 5})
|
|
15
|
-
|
|
16
|
-
def test_bin_load_save(self):
|
|
17
|
-
ret = self.call(
|
|
18
|
-
self.mast,
|
|
19
|
-
["sentinel_register", {"code": self.load_jac("file_stuff.jac")}],
|
|
20
|
-
)
|
|
21
|
-
ret = self.call(self.mast, ["walker_run", {"name": "bin_load_save"}])
|
|
22
|
-
self.assertEqual(
|
|
23
|
-
ret["report"][0],
|
|
24
|
-
"iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX"
|
|
25
|
-
"///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=",
|
|
26
|
-
)
|
|
27
|
-
self.assertFalse(os.path.exists("file.gif"))
|
|
28
|
-
|
|
29
|
-
def test_kwargs_bin_load_save(self):
|
|
30
|
-
ret = self.call(
|
|
31
|
-
self.mast,
|
|
32
|
-
["sentinel_register", {"code": self.load_jac("file_stuff.jac")}],
|
|
33
|
-
)
|
|
34
|
-
ret = self.call(self.mast, ["walker_run", {"name": "kwargs_bin_load_save"}])
|
|
35
|
-
self.assertEqual(
|
|
36
|
-
ret["report"][0],
|
|
37
|
-
"iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX"
|
|
38
|
-
"///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=",
|
|
39
|
-
)
|
|
40
|
-
self.assertFalse(os.path.exists("file.gif"))
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
from unittest.mock import MagicMock, Mock
|
|
2
|
-
|
|
3
|
-
from jaseci.jsorc.jsorc import JsOrc
|
|
4
|
-
from jaseci.extens.svc.mail_svc import MailService
|
|
5
|
-
from jaseci.utils.test_core import CoreTest
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class MailLibTest(CoreTest):
|
|
9
|
-
"""Unit tests for Jac Walker APIs"""
|
|
10
|
-
|
|
11
|
-
fixture_src = __file__
|
|
12
|
-
|
|
13
|
-
def __init__(self, *args, **kwargs):
|
|
14
|
-
JsOrc.settings("MAIL_CONFIG")["enabled"] = True
|
|
15
|
-
MailService.connect = MagicMock(return_value=Mock())
|
|
16
|
-
super(MailLibTest, self).__init__(*args, **kwargs)
|
|
17
|
-
|
|
18
|
-
def setUp(self):
|
|
19
|
-
super().setUp()
|
|
20
|
-
|
|
21
|
-
@JsOrc.inject(services=["mail"])
|
|
22
|
-
def test_send_mail(self, mail: MailService):
|
|
23
|
-
self.call(
|
|
24
|
-
self.mast,
|
|
25
|
-
["sentinel_register", {"code": self.load_jac("mail_test.jac")}],
|
|
26
|
-
)
|
|
27
|
-
ret = self.call(self.mast, ["walker_run", {"name": "send_mail"}])
|
|
28
|
-
self.assertTrue(ret["success"])
|
|
29
|
-
self.assertTrue(mail.connect.called)
|
|
30
|
-
self.assertEqual(
|
|
31
|
-
mail.app.method_calls[0].args,
|
|
32
|
-
(None, ["jaseci.dev@gmail.com"], "Test Subject", ("Test", "<h1>Test</h1>")),
|
|
33
|
-
)
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
from jaseci.utils.test_core import CoreTest, jac_testcase
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class MathsTests(CoreTest):
|
|
5
|
-
"""UnitTest for Regex Module"""
|
|
6
|
-
|
|
7
|
-
fixture_src = __file__
|
|
8
|
-
|
|
9
|
-
@jac_testcase("maths.jac", "ceil_test")
|
|
10
|
-
def test_ceil(self, ret):
|
|
11
|
-
ret = ret["report"][0]
|
|
12
|
-
self.assertEqual(ret, 124)
|
|
13
|
-
|
|
14
|
-
@jac_testcase("maths.jac", "comb_test")
|
|
15
|
-
def test_comb(self, ret):
|
|
16
|
-
ret = ret["report"][0]
|
|
17
|
-
self.assertEqual(ret, 4950)
|
|
18
|
-
|
|
19
|
-
@jac_testcase("maths.jac", "copysign_test")
|
|
20
|
-
def test_copysign(self, ret):
|
|
21
|
-
ret = ret["report"][0]
|
|
22
|
-
self.assertEqual(ret, -100.0)
|
|
23
|
-
|
|
24
|
-
@jac_testcase("maths.jac", "fabs_test")
|
|
25
|
-
def test_fabs(self, ret):
|
|
26
|
-
ret = ret["report"][0]
|
|
27
|
-
self.assertEqual(ret, 10.0)
|
|
28
|
-
|
|
29
|
-
@jac_testcase("maths.jac", "factorial_test")
|
|
30
|
-
def test_factorial(self, ret):
|
|
31
|
-
ret = ret["report"][0]
|
|
32
|
-
self.assertEqual(ret, 3628800)
|
|
33
|
-
|
|
34
|
-
@jac_testcase("maths.jac", "floor_test")
|
|
35
|
-
def test_floor(self, ret):
|
|
36
|
-
ret = ret["report"][0]
|
|
37
|
-
self.assertEqual(ret, 10)
|
|
38
|
-
|
|
39
|
-
@jac_testcase("maths.jac", "fmod_test")
|
|
40
|
-
def test_fmod(self, ret):
|
|
41
|
-
ret = ret["report"][0]
|
|
42
|
-
self.assertEqual(ret, 1.0)
|
|
43
|
-
|
|
44
|
-
@jac_testcase("maths.jac", "frexp_test")
|
|
45
|
-
def test_frexp(self, ret):
|
|
46
|
-
ret = ret["report"][0]
|
|
47
|
-
self.assertEqual(ret, [0.78125, 7])
|
|
48
|
-
|
|
49
|
-
@jac_testcase("maths.jac", "fsum_test")
|
|
50
|
-
def test_fsum(self, ret):
|
|
51
|
-
ret = ret["report"][0]
|
|
52
|
-
self.assertEqual(ret, 18.0)
|
|
53
|
-
|
|
54
|
-
@jac_testcase("maths.jac", "gcd_test")
|
|
55
|
-
def test_gcd(self, ret):
|
|
56
|
-
ret = ret["report"][0]
|
|
57
|
-
self.assertEqual(ret, 1)
|
|
58
|
-
|
|
59
|
-
@jac_testcase("maths.jac", "isclose_test")
|
|
60
|
-
def test_isclose(self, ret):
|
|
61
|
-
ret = ret["report"][0]
|
|
62
|
-
self.assertEqual(ret, False)
|
|
63
|
-
|
|
64
|
-
@jac_testcase("maths.jac", "isfinite_test")
|
|
65
|
-
def test_isfinite(self, ret):
|
|
66
|
-
ret = ret["report"][0]
|
|
67
|
-
self.assertEqual(ret, True)
|
|
68
|
-
|
|
69
|
-
@jac_testcase("maths.jac", "isinf_test")
|
|
70
|
-
def test_isinf(self, ret):
|
|
71
|
-
ret = ret["report"][0]
|
|
72
|
-
self.assertEqual(ret, False)
|
|
73
|
-
|
|
74
|
-
@jac_testcase("maths.jac", "isnan_test")
|
|
75
|
-
def test_isnan(self, ret):
|
|
76
|
-
ret = ret["report"][0]
|
|
77
|
-
self.assertEqual(ret, False)
|
|
78
|
-
|
|
79
|
-
@jac_testcase("maths.jac", "isqrt_test")
|
|
80
|
-
def test_isqrt(self, ret):
|
|
81
|
-
ret = ret["report"][0]
|
|
82
|
-
self.assertEqual(ret, 3)
|
|
83
|
-
|
|
84
|
-
@jac_testcase("maths.jac", "lcm_test")
|
|
85
|
-
def test_lcm(self, ret):
|
|
86
|
-
ret = ret["report"][0]
|
|
87
|
-
self.assertEqual(ret, 420)
|
|
88
|
-
|
|
89
|
-
@jac_testcase("maths.jac", "ldexp_test")
|
|
90
|
-
def test_isqrt(self, ret):
|
|
91
|
-
ret = ret["report"][0]
|
|
92
|
-
self.assertEqual(ret, 36.0)
|
|
93
|
-
|
|
94
|
-
@jac_testcase("maths.jac", "modf_test")
|
|
95
|
-
def test_modf(self, ret):
|
|
96
|
-
ret = ret["report"][0]
|
|
97
|
-
self.assertEqual(ret, [0.0, 9.0])
|
|
98
|
-
|
|
99
|
-
@jac_testcase("maths.jac", "nextafter_test")
|
|
100
|
-
def test_nextafter(self, ret):
|
|
101
|
-
ret = ret["report"][0]
|
|
102
|
-
self.assertEqual(ret, 8.999999999999998)
|
|
103
|
-
|
|
104
|
-
@jac_testcase("maths.jac", "perm_test")
|
|
105
|
-
def test_perm(self, ret):
|
|
106
|
-
ret = ret["report"][0]
|
|
107
|
-
self.assertEqual(ret, 25852016738884976640000)
|
|
108
|
-
|
|
109
|
-
@jac_testcase("maths.jac", "prod_test")
|
|
110
|
-
def test_prod(self, ret):
|
|
111
|
-
ret = ret["report"][0]
|
|
112
|
-
self.assertEqual(ret, 120)
|
|
113
|
-
|
|
114
|
-
@jac_testcase("maths.jac", "remainder_test")
|
|
115
|
-
def test_remainder(self, ret):
|
|
116
|
-
ret = ret["report"][0]
|
|
117
|
-
self.assertEqual(ret, 3.0)
|
|
118
|
-
|
|
119
|
-
@jac_testcase("maths.jac", "trunc_test")
|
|
120
|
-
def test_trunc(self, ret):
|
|
121
|
-
ret = ret["report"][0]
|
|
122
|
-
self.assertEqual(ret, 23)
|
|
123
|
-
|
|
124
|
-
@jac_testcase("maths.jac", "trunc_test")
|
|
125
|
-
def test_trunc(self, ret):
|
|
126
|
-
ret = ret["report"][0]
|
|
127
|
-
self.assertEqual(ret, 23)
|
|
128
|
-
|
|
129
|
-
@jac_testcase("maths.jac", "ulp_test")
|
|
130
|
-
def test_ulp(self, ret):
|
|
131
|
-
ret = ret["report"][0]
|
|
132
|
-
self.assertEqual(ret, 3.552713678800501e-15)
|
|
133
|
-
|
|
134
|
-
@jac_testcase("maths.jac", "cubert_test")
|
|
135
|
-
def test_cubert(self, ret):
|
|
136
|
-
ret = ret["report"][0]
|
|
137
|
-
self.assertEqual(ret, 3.0)
|
|
138
|
-
|
|
139
|
-
@jac_testcase("maths.jac", "exp_test")
|
|
140
|
-
def test_exp(self, ret):
|
|
141
|
-
ret = ret["report"][0]
|
|
142
|
-
self.assertEqual(ret, 532048240601.79865)
|
|
143
|
-
|
|
144
|
-
@jac_testcase("maths.jac", "log_test")
|
|
145
|
-
def test_log(self, ret):
|
|
146
|
-
ret = ret["report"][0]
|
|
147
|
-
self.assertEqual(ret, 1.4313637641589871)
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
from jaseci.utils.test_core import CoreTest
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class NetLibTest(CoreTest):
|
|
5
|
-
"""Unit tests for Jac Walker APIs"""
|
|
6
|
-
|
|
7
|
-
fixture_src = __file__
|
|
8
|
-
|
|
9
|
-
def test_pack(self):
|
|
10
|
-
ret = self.call(
|
|
11
|
-
self.mast,
|
|
12
|
-
["sentinel_register", {"code": self.load_jac("net_pack.jac")}],
|
|
13
|
-
)
|
|
14
|
-
ret = self.call(self.mast, ["walker_run", {"name": "pack_it"}])
|
|
15
|
-
self.assertEqual(len(ret["report"][0]["nodes"]), 11)
|
|
16
|
-
self.assertEqual(len(ret["report"][0]["edges"]), 10)
|
|
17
|
-
|
|
18
|
-
def test_pack_subgraph(self):
|
|
19
|
-
self.call(
|
|
20
|
-
self.mast,
|
|
21
|
-
["sentinel_register", {"code": self.load_jac("net_pack.jac")}],
|
|
22
|
-
)
|
|
23
|
-
ret = self.call(self.mast, ["walker_run", {"name": "pack_it_subgraph"}])
|
|
24
|
-
self.assertEqual(len(ret["report"][0]["nodes"]), 5)
|
|
25
|
-
self.assertEqual(len(ret["report"][0]["edges"]), 4)
|
|
26
|
-
|
|
27
|
-
def test_pack_unpack(self):
|
|
28
|
-
ret = self.call(
|
|
29
|
-
self.mast,
|
|
30
|
-
["sentinel_register", {"code": self.load_jac("net_pack.jac")}],
|
|
31
|
-
)
|
|
32
|
-
ret = self.call(self.mast, ["walker_run", {"name": "pack_unpack"}])
|
|
33
|
-
|
|
34
|
-
self.assertEqual(ret["report"][0], 16)
|
|
35
|
-
|
|
36
|
-
def test_pack_unpack_terse(self):
|
|
37
|
-
self.call(
|
|
38
|
-
self.mast,
|
|
39
|
-
["sentinel_register", {"code": self.load_jac("net_pack.jac")}],
|
|
40
|
-
)
|
|
41
|
-
ret = self.call(self.mast, ["walker_run", {"name": "pack_unpack_terse"}])
|
|
42
|
-
self.assertEqual(ret["report"][0], 16)
|
|
43
|
-
|
|
44
|
-
def test_pack_and_destroy(self):
|
|
45
|
-
self.call(
|
|
46
|
-
self.mast,
|
|
47
|
-
["sentinel_register", {"code": self.load_jac("net_pack.jac")}],
|
|
48
|
-
)
|
|
49
|
-
before = len(self.smast._h.mem)
|
|
50
|
-
ret = self.call(self.mast, ["walker_run", {"name": "pack_it_destroy"}])
|
|
51
|
-
self.assertEqual(len(ret["report"]), 1)
|
|
52
|
-
after = len(self.smast._h.mem)
|
|
53
|
-
self.assertEqual(before, after)
|
|
54
|
-
|
|
55
|
-
def test_pack_anc_priv(self):
|
|
56
|
-
self.call(
|
|
57
|
-
self.mast,
|
|
58
|
-
["sentinel_register", {"code": self.load_jac("net_pack.jac")}],
|
|
59
|
-
)
|
|
60
|
-
ret = self.call(self.mast, ["walker_run", {"name": "pack_it_anc_priv"}])
|
|
61
|
-
self.assertEqual(len(ret["report"]), 6)
|
|
62
|
-
self.assertNotIn("priv", ret["report"][2]["context"])
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
from jaseci.utils.test_core import CoreTest, jac_testcase
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class RegexTest(CoreTest):
|
|
5
|
-
"""UnitTest for Regex Module"""
|
|
6
|
-
|
|
7
|
-
fixture_src = __file__
|
|
8
|
-
|
|
9
|
-
@jac_testcase("regex.jac", "findall_test")
|
|
10
|
-
def test_findall(self, ret):
|
|
11
|
-
ret1 = [ret["report"][0][0]]
|
|
12
|
-
ret2 = [ret["report"][0][1]]
|
|
13
|
-
self.assertEqual(ret1, [("width", "20")])
|
|
14
|
-
self.assertEqual(ret2, [("height", "10")])
|
|
15
|
-
|
|
16
|
-
@jac_testcase("regex.jac", "search_test")
|
|
17
|
-
def test_search(self, ret):
|
|
18
|
-
ret = ret["report"]
|
|
19
|
-
self.assertEqual(ret, [{"span": (5, 7), "match": "ai"}])
|
|
20
|
-
|
|
21
|
-
@jac_testcase("regex.jac", "match_test")
|
|
22
|
-
def test_match(self, ret):
|
|
23
|
-
ret = ret["report"]
|
|
24
|
-
self.assertEqual(ret, [{"span": (0, 1), "match": "T"}])
|
|
25
|
-
|
|
26
|
-
@jac_testcase("regex.jac", "fullmatch_test")
|
|
27
|
-
def test_fullmatch(self, ret):
|
|
28
|
-
ret = ret["report"]
|
|
29
|
-
self.assertEqual(ret, [{"span": (0, 16), "match": "THEQUICKBROWNFOX"}])
|
|
30
|
-
|
|
31
|
-
@jac_testcase("regex.jac", "split_test")
|
|
32
|
-
def test_split(self, ret):
|
|
33
|
-
ret = ret["report"]
|
|
34
|
-
self.assertEqual(ret, [["Words", "words", "words", ""]])
|
|
35
|
-
|
|
36
|
-
@jac_testcase("regex.jac", "finditer_test")
|
|
37
|
-
def test_finditer(self, ret):
|
|
38
|
-
ret = ret["report"]
|
|
39
|
-
self.assertEqual(
|
|
40
|
-
ret,
|
|
41
|
-
[[{"span": (0, 4), "match": "Blue"}, {"span": (13, 17), "match": "Blue"}]],
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
@jac_testcase("regex.jac", "sub_test")
|
|
45
|
-
def test_sub(self, ret):
|
|
46
|
-
ret = ret["report"]
|
|
47
|
-
self.assertEqual(ret, ["Account Number - NN, Amount - NN.NN"])
|
|
48
|
-
|
|
49
|
-
@jac_testcase("regex.jac", "subn_test")
|
|
50
|
-
def test_subn(self, ret):
|
|
51
|
-
ret = ret["report"]
|
|
52
|
-
self.assertEqual(ret, [["Account Number - NN, Amount - NN.NN", 3]])
|
|
53
|
-
|
|
54
|
-
@jac_testcase("regex.jac", "escape_test")
|
|
55
|
-
def test_escape(self, ret):
|
|
56
|
-
ret = ret["report"]
|
|
57
|
-
self.assertEqual(ret, ["https://www\\.jaseci\\.org"])
|
|
58
|
-
|
|
59
|
-
@jac_testcase("regex.jac", "purge_test")
|
|
60
|
-
def test_purge(self, ret):
|
|
61
|
-
self.assertEqual(ret["success"], True)
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
from unittest import TestCase
|
|
2
|
-
|
|
3
|
-
import jaseci.extens.act_lib.tests.std_test_code as stc
|
|
4
|
-
from jaseci.prim.sentinel import Sentinel
|
|
5
|
-
from jaseci.prim.graph import Graph
|
|
6
|
-
from jaseci.jsorc.jsorc import JsOrc
|
|
7
|
-
from jaseci.utils.utils import TestCaseHelper
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class JacTests(TestCaseHelper, TestCase):
|
|
11
|
-
"""Unit tests for STD library language"""
|
|
12
|
-
|
|
13
|
-
def setUp(self):
|
|
14
|
-
super().setUp()
|
|
15
|
-
|
|
16
|
-
def tearDown(self):
|
|
17
|
-
super().tearDown()
|
|
18
|
-
|
|
19
|
-
def test_rand_std(self):
|
|
20
|
-
sent = Sentinel(m_id=0, h=JsOrc.hook())
|
|
21
|
-
gph = Graph(m_id=0, h=sent._h)
|
|
22
|
-
sent.register_code(stc.rand_std)
|
|
23
|
-
test_walker = sent.run_architype("init")
|
|
24
|
-
test_walker.prime(gph)
|
|
25
|
-
test_walker.run()
|
|
26
|
-
report = test_walker.report
|
|
27
|
-
self.assertEqual(len(report), 4)
|
|
28
|
-
self.assertGreater(len(report[1]), len(report[0]))
|
|
29
|
-
self.assertGreater(len(report[2]), len(report[1]))
|
|
30
|
-
self.assertGreater(len(report[3]), len(report[2]))
|
|
31
|
-
|
|
32
|
-
def test_file_io(self):
|
|
33
|
-
sent = Sentinel(m_id=0, h=JsOrc.hook())
|
|
34
|
-
gph = Graph(m_id=0, h=sent._h)
|
|
35
|
-
sent.register_code(stc.file_io)
|
|
36
|
-
test_walker = sent.run_architype("init")
|
|
37
|
-
test_walker.prime(gph)
|
|
38
|
-
test_walker.run()
|
|
39
|
-
report = test_walker.report
|
|
40
|
-
self.assertEqual(report, ['{"a": 10}{"a": 10}'])
|
|
41
|
-
|
|
42
|
-
def test_std_used_in_node_has_var(self):
|
|
43
|
-
sent = Sentinel(m_id=0, h=JsOrc.hook())
|
|
44
|
-
gph = Graph(m_id=0, h=sent._h)
|
|
45
|
-
sent.register_code(stc.std_used_in_node_has_var)
|
|
46
|
-
test_walker = sent.run_architype("init")
|
|
47
|
-
test_walker.prime(gph)
|
|
48
|
-
test_walker.run()
|
|
49
|
-
report = test_walker.report
|
|
50
|
-
self.assertGreater(len(report[0]), 10)
|
|
51
|
-
self.assertEqual(type(report[0]), str)
|