1616# under the License.
1717from __future__ import annotations
1818
19- from datetime import timedelta
2019from unittest .mock import MagicMock , patch
2120
2221import pytest
2322
2423from airflow .models import Connection
25- from airflow .models .dag import DAG
2624from 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
4132class 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