test_task_runs.py 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import pytest
  2. from datetime import datetime, timedelta, timezone
  3. from flask import url_for
  4. import isodate
  5. from flexmeasures.api.tests.utils import get_auth_token, get_task_run, post_task_run
  6. from flexmeasures.auth.error_handling import (
  7. FORBIDDEN_ERROR_STATUS,
  8. FORBIDDEN_STATUS_CODE,
  9. UNAUTH_STATUS_CODE,
  10. )
  11. @pytest.mark.parametrize(
  12. "requesting_user", ["test_prosumer_user@seita.nl"], indirect=True
  13. )
  14. def test_api_task_run_post_unauthorized_wrong_role(client, requesting_user):
  15. url = url_for("flexmeasures_api_ops.post_task_run")
  16. auth_token = get_auth_token(client, "test_prosumer_user@seita.nl", "testtest")
  17. post_req_params = dict(
  18. query_string={"name": "my-task"}, headers={"Authorization": auth_token}
  19. )
  20. task_run = client.post(url, **post_req_params)
  21. assert task_run.status_code == FORBIDDEN_STATUS_CODE
  22. assert b"cannot be authorized" in task_run.data
  23. # While we are on it, test if the unauth handler correctly returns json even if we don't explicitly set the content-type
  24. assert task_run.json["status"] == FORBIDDEN_ERROR_STATUS
  25. def test_api_task_run_get_no_token(client):
  26. task_run = get_task_run(client, "task-B", "NOAUTH")
  27. assert task_run.status_code == UNAUTH_STATUS_CODE
  28. assert task_run.json["status"] == "ERROR"
  29. assert "Not authenticated" in task_run.json["reason"]
  30. def test_api_task_run_get_bad_token(client):
  31. task_run = get_task_run(client, "task-B", "bad-token")
  32. assert task_run.status_code == FORBIDDEN_STATUS_CODE
  33. assert task_run.json["status"] == "ERROR"
  34. assert "Not authorized" in task_run.json["reason"]
  35. def test_api_task_run_get_no_name(client):
  36. task_run = get_task_run(client, "")
  37. assert task_run.status_code == 400
  38. assert task_run.json["status"] == "ERROR"
  39. assert task_run.json["reason"] == "No task name given."
  40. def test_api_task_run_get_nonexistent_task(client):
  41. task_run = get_task_run(client, "task-Z")
  42. assert task_run.status_code == 404
  43. assert task_run.json["status"] == "ERROR"
  44. assert "has no last run time" in task_run.json["reason"]
  45. @pytest.mark.parametrize("requesting_user", ["task_runner@seita.nl"], indirect=True)
  46. def test_api_task_run_post_no_name(client, requesting_user):
  47. task_run = post_task_run(client, "")
  48. assert task_run.status_code == 400
  49. assert task_run.json["status"] == "ERROR"
  50. assert task_run.json["reason"] == "No task name given."
  51. def test_api_task_run_get_recent_entry(client):
  52. task_run = get_task_run(client, "task-B")
  53. assert task_run.status_code == 200
  54. assert task_run.json["frequency"] == 10
  55. assert task_run.json["process"] == "FlexMeasures"
  56. assert task_run.json["server"] == "test"
  57. task_time = isodate.parse_datetime(task_run.json.get("lastrun"))
  58. utcnow = datetime.now(timezone.utc)
  59. assert task_time <= utcnow
  60. assert task_time >= utcnow - timedelta(minutes=2)
  61. assert task_run.json.get("status") == "ERROR"
  62. @pytest.mark.parametrize("requesting_user", ["task_runner@seita.nl"], indirect=True)
  63. def test_api_task_run_get_older_entry_then_update(client, requesting_user):
  64. task_run = get_task_run(client, "task-A")
  65. assert task_run.status_code == 200
  66. task_time = isodate.parse_datetime(task_run.json.get("lastrun"))
  67. utcnow = datetime.now(timezone.utc)
  68. assert task_time <= utcnow - timedelta(days=1)
  69. assert task_time >= utcnow - timedelta(days=1, minutes=1)
  70. assert task_run.json.get("status") == "OK"
  71. # update the latest run of this task (also report that it failed)
  72. task_update = post_task_run(client, "task-A", False)
  73. assert task_update.status_code == 200
  74. task_run = get_task_run(client, "task-A")
  75. task_time = isodate.parse_datetime(task_run.json.get("lastrun"))
  76. utcnow = datetime.now(timezone.utc)
  77. assert task_time <= utcnow
  78. assert task_time >= utcnow - timedelta(minutes=1)
  79. assert task_run.json.get("status") == "ERROR"