def create_yaal_context(req, path_values, descriptor): if req.mimetype == "application/json": try: payload = req.get_json() except Exception: payload = None else: payload = None if req.mimetype == "multipart/form-data" or req.mimetype == "application/x-www-form-urlencoded": ke = KeyExpander() for k, v in req.form.items(): ke.set_prop(k, v) payload = ke.get_data() ke = KeyExpander() for k, v in req.args.items(): ke.set_prop(k, v) query = ke.get_data() ke = KeyExpander() for k, v in req.headers.items(): ke.set_prop(k, v) headers = ke.get_data() ke = KeyExpander() for k, v in req.cookies.items(): ke.set_prop(k, v) cookies = ke.get_data() return create_context(descriptor, payload, query, path_values, headers, cookies)
def test_create_context_with_values(self): descriptor = { "path": "" } data = { "number1": 1, "Number2": 2 } context = yaal.create_context(descriptor=descriptor, query=data, path_values=data, header=data, cookie=data, payload=data) self.assertEqual(1, context.get_prop("$query.number1")) self.assertEqual(2, context.get_prop("$query.number2")) self.assertDictEqual(data, context.get_prop("$query").get_data()) self.assertEqual(1, context.get_prop("$path.number1")) self.assertEqual(2, context.get_prop("$path.number2")) self.assertDictEqual(data, context.get_prop("$path").get_data()) self.assertEqual(1, context.get_prop("$header.number1")) self.assertEqual(2, context.get_prop("$header.number2")) self.assertDictEqual(data, context.get_prop("$header").get_data()) self.assertEqual(1, context.get_prop("$cookie.number1")) self.assertEqual(2, context.get_prop("$cookie.number2")) self.assertDictEqual(data, context.get_prop("$cookie").get_data()) self.assertDictEqual(data, context.get_data()) self.assertEqual(Shape, type(context))
def test_trunk_with_error(self): descriptor = { "path": "user", "twigs": [{ "content": "error" }], "input_type": "object", "output_type": "array", "_validators": None } ctx = create_context(descriptor) rs, errors = _execute_twigs(descriptor, {"db": FakeDataProvider()}, ctx, None) self.assertListEqual(errors, [{ "$action": "error", "message": "message1", '$http_status_code': 400 }, { "$action": "error", "message": "message2", '$http_status_code': 400 }]) self.assertEqual(ctx.get_prop("$response.status_code"), 400)
def test_trunk_with_cookie(self): descriptor = { "twigs": [{ "content": "cookie" }], "path": "user", "input_type": "object", "output_type": "array", "_validators": None } ctx = create_context(descriptor) _execute_twigs(descriptor, {"db": FakeDataProvider()}, ctx, None) self.assertDictEqual( ctx.get_prop("$response.$cookie").get_data(), { 'name1': { "$action": 'cookie', 'name': 'name1', 'value': 'value' }, 'name2': { "$action": 'cookie', 'name': 'name2', 'value': 'value' } })
def test_trunk_with_params(self): descriptor = { "twigs": [{ "content": "params" }], "input_type": "object", "output_type": "array", "_validators": None, "path": "path" } ctx = create_context(descriptor) _execute_twigs(descriptor, {"db": FakeDataProvider()}, ctx, None) d = ctx.get_prop("$params").get_data() self.assertDictEqual( d, { "$last_inserted_id": 1, "path": "path", "$action": 'params', 'a': '1', 'b': '2' })
def test_create_context_with_validator(self): model = {} validator = {} descriptor = { "path": "", "model": { "query": model, "path": model, "cookie": model, "header": model }, "_validators": { "query": validator, "path": validator, "cookie": validator, "header": validator } } context = yaal.create_context(descriptor=descriptor) self.assertEqual(model, context.get_prop("$query").get_schema()) self.assertEqual(validator, context.get_prop("$query").get_validator()) self.assertEqual(model, context.get_prop("$path").get_schema()) self.assertEqual(validator, context.get_prop("$path").get_validator()) self.assertEqual(model, context.get_prop("$cookie").get_schema()) self.assertEqual(validator, context.get_prop("$cookie").get_validator()) self.assertEqual(model, context.get_prop("$header").get_schema()) self.assertEqual(validator, context.get_prop("$header").get_validator())
def test_create_context_returns_empty_shape(self): descriptor = { "path": "path" } context = yaal.create_context(descriptor=descriptor) self.assertEqual(Shape, type(context)) self.assertEqual("path", context.get_prop("$params.path"))
def test_create_context_returns_request_id(self): descriptor = { "path": "" } context = yaal.create_context(descriptor=descriptor) self.assertEqual(Shape, type(context)) self.assertIsNotNone(context.get_prop("$request.id"))
def test_execute_branches_deep(self): descriptor = { "name": "$", "method": "$", "path": "path", "input_type": "object", "output_type": "array", "_validators": None, "partition_by": None, "use_parent_rows": None, "model": { "payload": { "type": "object", "properties": { "items": { "type": "array" } } } }, "_validators": { "payload": None }, "branches": [{ "name": "items", "method": "$.items", "input_type": "array", "partition_by": None, "use_parent_rows": None, "branches": None, "twigs": [{ "content": "select" }] }] } ctx = create_context(descriptor, payload={"items": [{}]}) rs, errors = _execute_branch(descriptor, True, {"db": FakeDataProviderDeep()}, ctx, [], None) self.assertListEqual(rs, [{ "items": [{ 'name': 'kiruba' }, { 'name': 'sankar' }] }]) self.assertEqual(errors, None)
def test_simple_get_shape_check(self): descriptor = self._gravity.create_descriptor("get1/get") input_shape = create_context(descriptor) self.assertIsNotNone(input_shape._shapes["data"]) self.assertIsNotNone(input_shape._shapes["paging"]) self.assertIsNotNone(input_shape._shapes["data"]._shapes["items"]) self.assertIsNotNone( input_shape._shapes["data"]._shapes["items"]._shapes["product"])
def test_run(self): descriptor = self._gravity.create_descriptor("post1/post") d = {"Items": [{"A": 1}, {"b": 1}], "name": {"F": 1}} input_shape = create_context(descriptor, payload=d) rs = get_result(descriptor, self.get_data_provider, input_shape) self.assertListEqual(rs, [{"items": [{"a": 1}, {"b": 1}], "name": {"F": 1}}]) self.assertDictEqual(input_shape.get_prop("name"), {"F": 1})
def test_simple_get_trunk_check(self): g = self._g descriptor = g.create_descriptor("name/get", None) self.assertTrue(descriptor["name"] == "$") self.assertTrue(descriptor["method"] == "$") descriptor_ctx = g.get_descriptor_path_by_route("name", "get") ctx = create_context(descriptor, payload={"Name": "First"}) r = g.get_result_json(descriptor, descriptor_ctx, ctx) self.assertListEqual([{"name": "First Last"}], json.loads(r))
def test_create_context_structure(self): descriptor = { "path": "" } context = yaal.create_context(descriptor=descriptor) self.assertEqual(Shape, type(context)) self.assertEqual(Shape, type(context.get_prop("$query"))) self.assertEqual(Shape, type(context.get_prop("$path"))) self.assertEqual(Shape, type(context.get_prop("$header"))) self.assertEqual(Shape, type(context.get_prop("$cookie"))) self.assertEqual(Shape, type(context.get_prop("$request"))) self.assertEqual(Shape, type(context.get_prop("$response"))) self.assertEqual(Shape, type(context.get_prop("$params")))
def test_trunk_with_connection_missing(self): descriptor = { "twigs": [{ "content": "break", "connection": "db1" }], "input_type": "object", "output_type": "array", "_validators": None, "path": "user" } ctx = create_context(descriptor) with self.assertRaises(Exception): _execute_twigs(descriptor, {"db": FakeDataProvider()}, ctx, None)
def test_trunk_with_break(self): descriptor = { "twigs": [{ "content": "break", "connection": "db" }], "input_type": "object", "output_type": "array", "_validators": None, "path": "user" } ctx = create_context(descriptor) rs, errors = _execute_twigs(descriptor, {"db": FakeDataProvider()}, ctx, None) self.assertListEqual(rs, [{'a': '1', 'b': '2'}])
def test_execute_branch_simple(self): descriptor = { "path": "user", "leafs": [], "input_type": "object", "output_type": "array", "_validators": None, "partition_by": None, "use_parent_rows": None, "branches": None } ctx = create_context(descriptor) rs, errors = _execute_branch(descriptor, True, {"db": FakeDataProviderSimple()}, ctx, [], None) self.assertListEqual(rs, []) self.assertEqual(errors, None)
def test_trunk_with_parameters_queries_check(self): gravity = Yaal("/path", FakeContentReader1(), True) descriptor = gravity.create_descriptor("get1/get") parameters = descriptor["parameters"] self.assertIn("id1", parameters) self.assertIn("id2", parameters) self.assertIs(type(parameters), dict) leafs = descriptor["twigs"] self.assertIs(type(leafs), list) self.assertEqual(2, len(leafs)) leaf0 = leafs[0] leaf0_parameters = leaf0["parameters"] self.assertEqual(2, len(leaf0_parameters)) self.assertEqual("integer", leaf0_parameters[0]["type"]) self.assertEqual("bool", leaf0_parameters[1]["type"]) leaf1 = leafs[1] leaf1_parameters = leaf1["parameters"] self.assertEqual(1, len(leaf1_parameters)) self.assertEqual("bool", leaf1_parameters[0]["type"]) s = create_context(descriptor)
from yaal import Yaal, create_context YAAL_DEBUG = False DATA_PROVIDERS = { "db": "sqlite3://./serve/db/app.db", "sqlite3": "sqlite3:///" } CORS_ENABLED = False if __name__ == '__main__': path = "user/1" method = "get" root_path = "serve/api" y = Yaal(root_path, None, True) for name, db_url in DATA_PROVIDERS.items(): y.setup_data_provider(name, db_url) descriptor_ctx = y.get_descriptor_path_by_route(path, method) descriptor = y.get_descriptor(descriptor_ctx) if not descriptor: print("descriptor is not found") exit() context = create_context(descriptor, path_values=descriptor_ctx["path_values"]) print(y.get_result_json(descriptor, descriptor_ctx, context))
def test_simple_get_shape_check(self): descriptor = self._gravity.create_descriptor("post1/post") input_shape = create_context(descriptor) self.assertIsNotNone(input_shape._shapes["items"]) self.assertEqual(len(input_shape._shapes["items"]._shapes), 0)