Skip to content

Commit ddd01fd

Browse files
Refactor asana operator tests free from db access (#52192)
1 parent 11f1aa5 commit ddd01fd

2 files changed

Lines changed: 34 additions & 39 deletions

File tree

.pre-commit-config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,7 @@ repos:
599599
^providers/apache/iceberg/.*\.py$|
600600
^providers/apache/kafka/.*\.py$|
601601
^providers/arangodb/.*\.py$|
602+
^providers/asana/.*\.py$|
602603
^providers/cloudant/.*\.py$|
603604
^providers/cohere/.*\.py$|
604605
^providers/common/compat/.*\.py$|

providers/asana/tests/unit/asana/operators/test_asana_tasks.py

Lines changed: 33 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,17 @@
1616
# under the License.
1717
from __future__ import annotations
1818

19-
from datetime import timedelta
2019
from unittest.mock import MagicMock, patch
2120

2221
import pytest
2322

2423
from airflow.models import Connection
25-
from airflow.models.dag import DAG
2624
from airflow.providers.asana.operators.asana_tasks import (
2725
AsanaCreateTaskOperator,
2826
AsanaDeleteTaskOperator,
2927
AsanaFindTaskOperator,
3028
AsanaUpdateTaskOperator,
3129
)
32-
from airflow.utils import timezone
33-
34-
# The tests do not create dag runs, so db isolation tests are skipped
35-
36-
DEFAULT_DATE = timezone.datetime(2015, 1, 1)
37-
TEST_DAG_ID = "unit_test_dag"
38-
asana_tasks_api_mock = MagicMock(name="asana_tasks_api_for_test")
3930

4031

4132
class TestAsanaTaskOperators:
@@ -45,72 +36,75 @@ class TestAsanaTaskOperators:
4536

4637
@pytest.fixture(autouse=True)
4738
def setup_connections(self, create_connection_without_db):
48-
args = {"owner": "airflow", "start_date": DEFAULT_DATE}
49-
dag = DAG(TEST_DAG_ID, schedule=timedelta(days=1), default_args=args)
50-
self.dag = dag
5139
create_connection_without_db(Connection(conn_id="asana_test", conn_type="asana", password="test"))
5240

53-
@pytest.mark.db_test
54-
@patch("airflow.providers.asana.hooks.asana.TasksApi", autospec=True, return_value=asana_tasks_api_mock)
55-
def test_asana_create_task_operator(self, mock_tasks_api):
41+
@patch("airflow.providers.asana.operators.asana_tasks.AsanaHook")
42+
def test_asana_create_task_operator(self, mock_asana_hook):
5643
"""
5744
Tests that the AsanaCreateTaskOperator makes the expected call to python-asana given valid arguments.
5845
"""
5946

60-
mock_tasks_api.return_value.create_task.return_value = {"gid": "1"}
47+
mock_hook_instance = MagicMock()
48+
mock_asana_hook.return_value = mock_hook_instance
49+
mock_hook_instance.create_task.return_value = {"gid": "1"}
50+
6151
create_task = AsanaCreateTaskOperator(
6252
task_id="create_task",
6353
conn_id="asana_test",
6454
name="test",
6555
task_parameters={"workspace": "1"},
66-
dag=self.dag,
6756
)
68-
create_task.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True)
69-
assert mock_tasks_api.return_value.create_task.called
57+
result = create_task.execute({})
58+
mock_hook_instance.create_task.assert_called_once_with("test", {"workspace": "1"})
59+
assert result == "1"
7060

71-
@pytest.mark.db_test
72-
@patch("airflow.providers.asana.hooks.asana.TasksApi", autospec=True, return_value=asana_tasks_api_mock)
73-
def test_asana_find_task_operator(self, mock_tasks_api):
61+
@patch("airflow.providers.asana.operators.asana_tasks.AsanaHook")
62+
def test_asana_find_task_operator(self, mock_asana_hook):
7463
"""
7564
Tests that the AsanaFindTaskOperator makes the expected call to python-asana given valid arguments.
7665
"""
77-
mock_tasks_api.return_value.tasks.create.return_value = {"gid": "1"}
78-
find_task = AsanaFindTaskOperator(
66+
67+
mock_hook_instance = MagicMock()
68+
mock_asana_hook.return_value = mock_hook_instance
69+
mock_hook_instance.find_task.return_value = {"gid": "1"}
70+
71+
task = AsanaFindTaskOperator(
7972
task_id="find_task",
8073
conn_id="asana_test",
8174
search_parameters={"project": "test"},
82-
dag=self.dag,
8375
)
84-
find_task.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True)
85-
assert mock_tasks_api.return_value.get_tasks.called
76+
result = task.execute({})
77+
mock_hook_instance.find_task.assert_called_once_with({"project": "test"})
78+
assert result == {"gid": "1"}
8679

87-
@pytest.mark.db_test
88-
@patch("airflow.providers.asana.hooks.asana.TasksApi", autospec=True, return_value=asana_tasks_api_mock)
89-
def test_asana_update_task_operator(self, mock_tasks_api):
80+
@patch("airflow.providers.asana.operators.asana_tasks.AsanaHook")
81+
def test_asana_update_task_operator(self, mock_asana_hook):
9082
"""
9183
Tests that the AsanaUpdateTaskOperator makes the expected call to python-asana given valid arguments.
9284
"""
85+
mock_hook_instance = MagicMock()
86+
mock_asana_hook.return_value = mock_hook_instance
9387
update_task = AsanaUpdateTaskOperator(
9488
task_id="update_task",
9589
conn_id="asana_test",
9690
asana_task_gid="test",
9791
task_parameters={"completed": True},
98-
dag=self.dag,
9992
)
100-
update_task.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True)
101-
assert mock_tasks_api.return_value.update_task.called
93+
update_task.execute({})
94+
mock_hook_instance.update_task.assert_called_once_with("test", {"completed": True})
10295

103-
@pytest.mark.db_test
104-
@patch("airflow.providers.asana.hooks.asana.TasksApi", autospec=True, return_value=asana_tasks_api_mock)
105-
def test_asana_delete_task_operator(self, mock_tasks_api):
96+
@patch("airflow.providers.asana.operators.asana_tasks.AsanaHook")
97+
def test_asana_delete_task_operator(self, mock_asana_hook):
10698
"""
10799
Tests that the AsanaDeleteTaskOperator makes the expected call to python-asana given valid arguments.
108100
"""
101+
mock_hook_instance = MagicMock()
102+
mock_asana_hook.return_value = mock_hook_instance
103+
109104
delete_task = AsanaDeleteTaskOperator(
110105
task_id="delete_task",
111106
conn_id="asana_test",
112107
asana_task_gid="test",
113-
dag=self.dag,
114108
)
115-
delete_task.run(start_date=DEFAULT_DATE, end_date=DEFAULT_DATE, ignore_ti_state=True)
116-
assert mock_tasks_api.return_value.delete_task.called
109+
delete_task.execute({})
110+
mock_hook_instance.delete_task.assert_called_once_with("test")

0 commit comments

Comments
 (0)