generated from astronomer/airflow-provider-sample
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
7ad9aac
commit 7e5cc2e
Showing
9 changed files
with
55 additions
and
72 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
[run] | ||
omit = | ||
tests/* |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
ascend |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
pytest \ | ||
-vv \ | ||
--cov=ray_provider \ | ||
--cov-report=term-missing \ | ||
--cov-report=xml \ | ||
--durations=0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
pytest \ | ||
-vv \ | ||
--durations=0 \ | ||
-m "not (integration or perf)" | ||
-m "not (integration or perf)" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,46 +1,39 @@ | ||
import time | ||
from unittest import mock | ||
from unittest.mock import patch | ||
|
||
import pytest | ||
from airflow.triggers.base import TriggerEvent | ||
from ray.dashboard.modules.job.sdk import JobStatus, JobSubmissionClient | ||
from ray.dashboard.modules.job.sdk import JobStatus | ||
|
||
from ray_provider.triggers.ray import RayJobTrigger | ||
|
||
|
||
class TestRayJobTrigger: | ||
|
||
@pytest.mark.asyncio | ||
async def test_run_no_job_id(self): | ||
trigger = RayJobTrigger(job_id="", host="localhost", end_time=time.time() + 60, poll_interval=1) | ||
@patch("ray_provider.triggers.ray.RayJobTrigger._is_terminal_state") | ||
@patch("ray_provider.triggers.ray.RayJobTrigger.hook") | ||
async def test_run_no_job_id(self, mock_hook, mock_is_terminal): | ||
mock_is_terminal.return_value = True | ||
trigger = RayJobTrigger(job_id="", poll_interval=1, conn_id="test", xcom_dashboard_url="test") | ||
|
||
generator = trigger.run() | ||
event = await generator.send(None) | ||
assert event == TriggerEvent( | ||
{"status": "error", "message": "No job_id provided to async trigger", "job_id": ""} | ||
) | ||
event = await generator.asend(None) | ||
assert event == TriggerEvent({"status": "error", "message": "Job run has failed.", "job_id": ""}) | ||
|
||
@pytest.mark.asyncio | ||
async def test_run_job_succeeded(self): | ||
trigger = RayJobTrigger(job_id="test_job_id", host="localhost", end_time=time.time() + 60, poll_interval=1) | ||
|
||
client_mock = mock.MagicMock(spec=JobSubmissionClient) | ||
client_mock.get_job_status.return_value = JobStatus.SUCCEEDED | ||
|
||
async def async_generator(): | ||
yield "log line 1" | ||
yield "log line 2" | ||
|
||
client_mock.tail_job_logs.return_value = async_generator() | ||
|
||
with mock.patch("ray_provider.triggers.kuberay.JobSubmissionClient", return_value=client_mock): | ||
generator = trigger.run() | ||
async for event in generator: | ||
assert event == TriggerEvent( | ||
{ | ||
"status": "success", | ||
"message": "Job run test_job_id has completed successfully.", | ||
"job_id": "test_job_id", | ||
} | ||
) | ||
break # Stop after the first event for testing purposes | ||
@patch("ray_provider.triggers.ray.RayJobTrigger.hook") | ||
async def test_run_job_succeeded(self, mock_hook): | ||
trigger = RayJobTrigger(job_id="test_job_id", poll_interval=1, conn_id="test", xcom_dashboard_url="test") | ||
|
||
mock_hook.get_ray_job_status.return_value = JobStatus.SUCCEEDED | ||
|
||
generator = trigger.run() | ||
async for event in generator: | ||
assert event == TriggerEvent( | ||
{ | ||
"status": "success", | ||
"message": "Job run test_job_id has completed successfully.", | ||
"job_id": "test_job_id", | ||
} | ||
) | ||
break # Stop after the first event for testing purposes |