|
45 | 45 | from st2common.util import crypto as crypto_utils
|
46 | 46 | from st2common.util import date as date_utils
|
47 | 47 | from st2common.util import isotime
|
| 48 | +from st2common.util.jsonify import json_encode |
48 | 49 | from st2api.controllers.v1.actionexecutions import ActionExecutionsController
|
49 | 50 | import st2common.validators.api.action as action_validator
|
50 | 51 | from st2tests.api import BaseActionExecutionControllerTestCase
|
@@ -351,6 +352,103 @@ def test_get_one(self):
|
351 | 352 | self.assertEqual(get_resp.status_int, 200)
|
352 | 353 | self.assertEqual(self._get_actionexecution_id(get_resp), actionexecution_id)
|
353 | 354 |
|
| 355 | + def test_get_one_max_result_size_query_parameter(self): |
| 356 | + data = copy.deepcopy(LIVE_ACTION_1) |
| 357 | + post_resp = self._do_post(LIVE_ACTION_1) |
| 358 | + |
| 359 | + actionexecution_id = self._get_actionexecution_id(post_resp) |
| 360 | + |
| 361 | + # Update it with the result (this populates result and result size attributes) |
| 362 | + data = { |
| 363 | + "result": {"fooo": "a" * 1000}, |
| 364 | + "status": "succeeded", |
| 365 | + } |
| 366 | + actual_result_size = len(json_encode(data["result"])) |
| 367 | + |
| 368 | + # NOTE: In real-life result_size is populdated in update_execution() method which is |
| 369 | + # called in the end with the actual result |
| 370 | + put_resp = self._do_put(actionexecution_id, data) |
| 371 | + self.assertEqual(put_resp.json["result_size"], actual_result_size) |
| 372 | + self.assertEqual(put_resp.json["result"], data["result"]) |
| 373 | + |
| 374 | + # 1. ?max_result_size query filter not provided |
| 375 | + get_resp = self._do_get_one(actionexecution_id) |
| 376 | + self.assertEqual(get_resp.status_int, 200) |
| 377 | + self.assertEqual(get_resp.json["result"], data["result"]) |
| 378 | + self.assertEqual(get_resp.json["result_size"], actual_result_size) |
| 379 | + self.assertEqual(self._get_actionexecution_id(get_resp), actionexecution_id) |
| 380 | + |
| 381 | + # 2. ?max_result_size > actual result size |
| 382 | + get_resp = self._do_get_one( |
| 383 | + actionexecution_id + "?max_result_size=%s" % (actual_result_size + 1) |
| 384 | + ) |
| 385 | + self.assertEqual(get_resp.status_int, 200) |
| 386 | + self.assertEqual(get_resp.json["result_size"], actual_result_size) |
| 387 | + self.assertEqual(get_resp.json["result"], data["result"]) |
| 388 | + self.assertEqual(self._get_actionexecution_id(get_resp), actionexecution_id) |
| 389 | + |
| 390 | + # 3. ?max_result_size < actual result size - result field should not be returned |
| 391 | + get_resp = self._do_get_one( |
| 392 | + actionexecution_id + "?max_result_size=%s" % (actual_result_size - 1) |
| 393 | + ) |
| 394 | + self.assertEqual(get_resp.status_int, 200) |
| 395 | + self.assertEqual(get_resp.json["result_size"], actual_result_size) |
| 396 | + self.assertTrue("result" not in get_resp.json) |
| 397 | + self.assertEqual(self._get_actionexecution_id(get_resp), actionexecution_id) |
| 398 | + |
| 399 | + # 4. ?max_result_size < actual result size and ?include_attributes=result - result field |
| 400 | + # should not be returned |
| 401 | + get_resp = self._do_get_one( |
| 402 | + actionexecution_id |
| 403 | + + "?include_attributes=result,result_size&max_result_size=%s" |
| 404 | + % (actual_result_size - 1) |
| 405 | + ) |
| 406 | + self.assertEqual(get_resp.status_int, 200) |
| 407 | + self.assertEqual(get_resp.json["result_size"], actual_result_size) |
| 408 | + self.assertTrue("result" not in get_resp.json) |
| 409 | + self.assertEqual(self._get_actionexecution_id(get_resp), actionexecution_id) |
| 410 | + |
| 411 | + # 5. ?max_result_size > actual result size and ?exclude_attributes=result - result field |
| 412 | + # should not be returned |
| 413 | + get_resp = self._do_get_one( |
| 414 | + actionexecution_id |
| 415 | + + "?include_attributes=result_size&exclude_attriubtes=result&max_result_size=%s" |
| 416 | + % (actual_result_size - 1) |
| 417 | + ) |
| 418 | + self.assertEqual(get_resp.status_int, 200) |
| 419 | + self.assertEqual(get_resp.json["result_size"], actual_result_size) |
| 420 | + self.assertTrue("result" not in get_resp.json) |
| 421 | + self.assertEqual(self._get_actionexecution_id(get_resp), actionexecution_id) |
| 422 | + |
| 423 | + # 6. max_result_size is not a positive number |
| 424 | + get_resp = self._do_get_one( |
| 425 | + actionexecution_id + "?max_result_size=-100", expect_errors=True |
| 426 | + ) |
| 427 | + self.assertEqual(get_resp.status_int, 400) |
| 428 | + self.assertEqual( |
| 429 | + get_resp.json["faultstring"], "max_result_size must be a positive number" |
| 430 | + ) |
| 431 | + |
| 432 | + # 7. max_result_size is > max possible value |
| 433 | + get_resp = self._do_get_one( |
| 434 | + actionexecution_id + "?max_result_size=%s" % ((14 * 1024 * 1024) + 1), |
| 435 | + expect_errors=True, |
| 436 | + ) |
| 437 | + self.assertEqual(get_resp.status_int, 400) |
| 438 | + self.assertEqual( |
| 439 | + get_resp.json["faultstring"], |
| 440 | + "max_result_size query parameter must be smaller than 14 MB", |
| 441 | + ) |
| 442 | + |
| 443 | + # 8. ?max_result_size == actual result size - result should be returned |
| 444 | + get_resp = self._do_get_one( |
| 445 | + actionexecution_id + "?max_result_size=%s" % (actual_result_size) |
| 446 | + ) |
| 447 | + self.assertEqual(get_resp.status_int, 200) |
| 448 | + self.assertEqual(get_resp.json["result_size"], actual_result_size) |
| 449 | + self.assertEqual(get_resp.json["result"], data["result"]) |
| 450 | + self.assertEqual(self._get_actionexecution_id(get_resp), actionexecution_id) |
| 451 | + |
354 | 452 | def test_get_all_id_query_param_filtering_success(self):
|
355 | 453 | post_resp = self._do_post(LIVE_ACTION_1)
|
356 | 454 | actionexecution_id = self._get_actionexecution_id(post_resp)
|
|
0 commit comments