Пример #1
0
    def test_create_task(self, mock_hook):
        mock_hook.return_value.create_task.return_value = TEST_TASK
        operator = CloudTasksTaskCreateOperator(location=LOCATION,
                                                queue_name=QUEUE_ID,
                                                task=Task(),
                                                task_id="id")

        result = operator.execute(context=None)

        self.assertEqual({'appEngineHttpRequest': {}}, result)
        mock_hook.assert_called_once_with(
            gcp_conn_id=GCP_CONN_ID,
            impersonation_chain=None,
        )
        mock_hook.return_value.create_task.assert_called_once_with(
            location=LOCATION,
            queue_name=QUEUE_ID,
            task=Task(),
            project_id=None,
            task_name=None,
            response_view=None,
            retry=None,
            timeout=None,
            metadata=None,
        )
Пример #2
0
 def test_create_task(self, mock_hook):
     mock_hook.return_value.create_task.return_value = {}
     operator = CloudTasksTaskCreateOperator(
         location=LOCATION, queue_name=QUEUE_ID, task=Task(), task_id="id"
     )
     operator.execute(context=None)
     mock_hook.assert_called_once_with(gcp_conn_id=GCP_CONN_ID)
     mock_hook.return_value.create_task.assert_called_once_with(
         location=LOCATION,
         queue_name=QUEUE_ID,
         task=Task(),
         project_id=None,
         task_name=None,
         response_view=None,
         retry=None,
         timeout=None,
         metadata=None,
     )
Пример #3
0
    def test_create_task(self, get_conn):
        result = self.hook.create_task(
            location=LOCATION,
            queue_name=QUEUE_ID,
            task=Task(),
            project_id=PROJECT_ID,
            task_name=TASK_NAME,
        )

        self.assertEqual(result, API_RESPONSE)

        get_conn.return_value.create_task.assert_called_once_with(
            parent=FULL_QUEUE_PATH,
            task=Task(name=FULL_TASK_PATH),
            response_view=None,
            retry=None,
            timeout=None,
            metadata=None,
        )
Пример #4
0
    def test_create_task(self, mock_hook):
        mock_hook.return_value.create_task.return_value = TEST_TASK
        operator = CloudTasksTaskCreateOperator(location=LOCATION,
                                                queue_name=QUEUE_ID,
                                                task=Task(),
                                                task_id="id")

        result = operator.execute(context=None)

        self.assertEqual(
            {
                'app_engine_http_request': {
                    'body': '',
                    'headers': {},
                    'http_method': 0,
                    'relative_uri': ''
                },
                'dispatch_count': 0,
                'name': '',
                'response_count': 0,
                'view': 0,
            },
            result,
        )
        mock_hook.assert_called_once_with(
            gcp_conn_id=GCP_CONN_ID,
            impersonation_chain=None,
        )
        mock_hook.return_value.create_task.assert_called_once_with(
            location=LOCATION,
            queue_name=QUEUE_ID,
            task=Task(),
            project_id=None,
            task_name=None,
            response_view=None,
            retry=None,
            timeout=None,
            metadata=None,
        )
Пример #5
0
    def test_list_tasks(self, get_conn):
        result = self.hook.list_tasks(location=LOCATION,
                                      queue_name=QUEUE_ID,
                                      project_id=PROJECT_ID)

        self.assertEqual(result, [Task(name=FULL_TASK_PATH)])

        get_conn.return_value.list_tasks.assert_called_once_with(
            request=dict(parent=FULL_QUEUE_PATH,
                         response_view=None,
                         page_size=None),
            retry=None,
            timeout=None,
            metadata=(),
        )
Пример #6
0
 def execute(self, context: 'Context'):
     hook = CloudTasksHook(
         gcp_conn_id=self.gcp_conn_id,
         impersonation_chain=self.impersonation_chain,
     )
     task = hook.get_task(
         location=self.location,
         queue_name=self.queue_name,
         task_name=self.task_name,
         project_id=self.project_id,
         response_view=self.response_view,
         retry=self.retry,
         timeout=self.timeout,
         metadata=self.metadata,
     )
     return Task.to_dict(task)
Пример #7
0
 def execute(self, context: 'Context'):
     hook = CloudTasksHook(
         gcp_conn_id=self.gcp_conn_id,
         impersonation_chain=self.impersonation_chain,
     )
     tasks = hook.list_tasks(
         location=self.location,
         queue_name=self.queue_name,
         project_id=self.project_id,
         response_view=self.response_view,
         page_size=self.page_size,
         retry=self.retry,
         timeout=self.timeout,
         metadata=self.metadata,
     )
     return [Task.to_dict(t) for t in tasks]
Пример #8
0
    def test_run_task(self, get_conn):
        result = self.hook.run_task(
            location=LOCATION,
            queue_name=QUEUE_ID,
            task_name=TASK_NAME,
            project_id=PROJECT_ID,
        )

        self.assertEqual(result, Task(name=FULL_TASK_PATH))

        get_conn.return_value.run_task.assert_called_once_with(
            request=dict(name=FULL_TASK_PATH, response_view=None),
            retry=None,
            timeout=None,
            metadata=(),
        )
Пример #9
0
    def setUp(self):
        super(HandlerTest, self).setUp()
        self.handler = util.Handler(self.request, self.response)
        FakeGrSource.clear()
        util.now_fn = lambda: NOW

        # add FakeSource everywhere necessary
        util.BLACKLIST.add('fa.ke')

        util.webmention_endpoint_cache.clear()
        self.stubbed_create_task = False
        tasks_client.create_task = lambda *args, **kwargs: Task(name='foo')

        # clear datastore
        orig_requests_post('http://%s/reset' % ndb_client.host)
        self.ndb_context = ndb_client.context()
        self.ndb_context.__enter__()
Пример #10
0
    def expect_task(self, queue, eta_seconds=None, **kwargs):
        if not self.stubbed_create_task:
            self.mox.StubOutWithMock(tasks_client, 'create_task')
            self.stubbed_create_task = True

        def check_queue(path):
            if not path.endswith('/' + queue):
                # print("expect_task: %s doesn't end with /%s!" % (path, queue))
                return False
            return True

        def check_params(params):
            req = params['app_engine_http_request']
            if not check_queue(req['relative_uri']):
                return False

            # convert model objects and keys to url-safe key strings for comparison
            for name, val in kwargs.items():
                if isinstance(val, ndb.Model):
                    kwargs[name] = val.key.urlsafe().decode()
                elif isinstance(val, ndb.Key):
                    kwargs[name] = val.urlsafe().decode()

            got = set(urllib.parse.parse_qsl(req['body'].decode()))
            expected = set(kwargs.items())
            if got != expected:
                # print('expect_task: expected %s, got %s' % (expected, got))
                return False

            if eta_seconds is not None:
                got = params['schedule_time'].seconds - util.to_utc_timestamp(
                    util.now_fn())
                delta = eta_seconds * .2 + 10
                if not (got + delta >= eta_seconds >= got - delta):
                    # print('expect_task: expected schedule_time %r, got %r' % (eta_seconds, got))
                    return False

            return True

        return tasks_client.create_task(
            mox.Func(check_queue),
            mox.Func(check_params)).InAnyOrder().AndReturn(
                Task(name='my task'))
Пример #11
0
    def expect_task(self, queue, eta_seconds=None, **kwargs):
        self.stub_create_task()

        def check_task(task):
            if not task.parent.endswith('/' + queue):
                # These can help for debugging, but can also be misleading, since many
                # tests insert multiple tasks, so check_task() runs on all of them (due
                # to InAnyOrder() below) until it finds one that matches.
                # print("expect_task: %s doesn't end with /%s!" % (task.parent, queue))
                return False

            req = task.task.app_engine_http_request
            if not req.relative_uri.endswith('/' + queue):
                # print("expect_task: relative_uri %s doesn't end with /%s!" % (
                #   req.relative_uri, queue))
                return False

            # convert model objects and keys to url-safe key strings for comparison
            for name, val in kwargs.items():
                if isinstance(val, ndb.Model):
                    kwargs[name] = val.key.urlsafe().decode()
                elif isinstance(val, ndb.Key):
                    kwargs[name] = val.urlsafe().decode()

            got = set(urllib.parse.parse_qsl(req.body.decode()))
            expected = set(kwargs.items())
            if got != expected:
                # print('expect_task: expected %s, got %s' % (expected, got))
                return False

            if eta_seconds is not None:
                got = (util.to_utc_timestamp(task.task.schedule_time) -
                       util.to_utc_timestamp(util.now_fn()))
                delta = eta_seconds * .2 + 10
                if not (got + delta >= eta_seconds >= got - delta):
                    # print('expect_task: expected schedule_time %r, got %r' % (eta_seconds, got))
                    return False

            return True

        return tasks_client.create_task(
            mox.Func(check_task)).InAnyOrder().AndReturn(Task(name='my task'))
Пример #12
0
 def execute(self, context: 'Context'):
     hook = CloudTasksHook(
         gcp_conn_id=self.gcp_conn_id,
         impersonation_chain=self.impersonation_chain,
     )
     task = hook.run_task(
         location=self.location,
         queue_name=self.queue_name,
         task_name=self.task_name,
         project_id=self.project_id,
         response_view=self.response_view,
         retry=self.retry,
         timeout=self.timeout,
         metadata=self.metadata,
     )
     CloudTasksQueueLink.persist(
         operator_instance=self,
         context=context,
         queue_name=task.name,
     )
     return Task.to_dict(task)
Пример #13
0
 def execute(self, context: 'Context'):
     hook = CloudTasksHook(
         gcp_conn_id=self.gcp_conn_id,
         impersonation_chain=self.impersonation_chain,
     )
     tasks = hook.list_tasks(
         location=self.location,
         queue_name=self.queue_name,
         project_id=self.project_id,
         response_view=self.response_view,
         page_size=self.page_size,
         retry=self.retry,
         timeout=self.timeout,
         metadata=self.metadata,
     )
     CloudTasksQueueLink.persist(
         operator_instance=self,
         context=context,
         queue_name=f"projects/{self.project_id or hook.project_id}/"
         f"locations/{self.location}/queues/{self.queue_name}",
     )
     return [Task.to_dict(t) for t in tasks]
Пример #14
0
    CloudTasksTaskDeleteOperator,
    CloudTasksTaskGetOperator,
    CloudTasksTaskRunOperator,
    CloudTasksTasksListOperator,
)

GCP_CONN_ID = "google_cloud_default"
PROJECT_ID = "test-project"
LOCATION = "asia-east2"
FULL_LOCATION_PATH = "projects/test-project/locations/asia-east2"
QUEUE_ID = "test-queue"
FULL_QUEUE_PATH = "projects/test-project/locations/asia-east2/queues/test-queue"
TASK_NAME = "test-task"
FULL_TASK_PATH = "projects/test-project/locations/asia-east2/queues/test-queue/tasks/test-task"
TEST_QUEUE = Queue(name=FULL_QUEUE_PATH)
TEST_TASK = Task(app_engine_http_request={})


class TestCloudTasksQueueCreate(unittest.TestCase):
    @mock.patch("airflow.providers.google.cloud.operators.tasks.CloudTasksHook"
                )
    def test_create_queue(self, mock_hook):
        mock_hook.return_value.create_queue.return_value = TEST_QUEUE
        operator = CloudTasksQueueCreateOperator(location=LOCATION,
                                                 task_queue=TEST_QUEUE,
                                                 task_id="id")

        result = operator.execute(context=None)

        self.assertEqual({'name': FULL_QUEUE_PATH, 'state': 0}, result)
        mock_hook.assert_called_once_with(
Пример #15
0
    def setUp(self):
        super().setUp()
        FakeGrSource.clear()
        util.now_fn = lambda: NOW

        # add FakeSource everywhere necessary
        util.BLOCKLIST.add('fa.ke')

        util.webmention_endpoint_cache.clear()
        self.stubbed_create_task = False
        tasks_client.create_task = lambda *args, **kwargs: Task(name='foo')

        self.client = self.app.test_client()
        self.client.__enter__()

        self.clear_datastore()
        self.ndb_context = ndb_client.context()
        self.ndb_context.__enter__()

        # sources
        self.auth_entities = [
            FakeAuthEntity(key=ndb.Key('FakeAuthEntity', '01122334455'),
                           user_json=json_dumps({
                               'id': '0123456789',
                               'name': 'Fake User',
                               'url': 'http://fakeuser.com/',
                           })),
            FakeAuthEntity(key=ndb.Key('FakeAuthEntity', '0022446688'),
                           user_json=json_dumps({
                               'id':
                               '0022446688',
                               'name':
                               'Another Fake',
                               'url':
                               'http://anotherfake.com/',
                           }))
        ]

        self.sources = [
            FakeSource.new(auth_entity=self.auth_entities[0]),
            FakeSource.new(auth_entity=self.auth_entities[1])
        ]
        for entity in self.sources:
            entity.features = ['listen']

        with self.app.test_request_context():
            self.source_bridgy_url = self.sources[0].bridgy_url()

        self.actor = FakeGrSource.actor = {
            'objectType': 'person',
            'id': 'tag:fa.ke,2013:212038',
            'username': '******',
            'displayName': 'Ryan B',
            'url': 'https://snarfed.org/',
            'image': {
                'url': 'http://pic.ture/url'
            },
        }

        # activities
        self.activities = FakeGrSource.activities = [{
            'id': f'tag:source.com,2013:{id}',
            'url': 'http://fa.ke/post/url',
            'object': {
                'objectType':
                'note',
                'id':
                f'tag:source.com,2013:{id}',
                'url':
                'http://fa.ke/post/url',
                'content':
                'foo http://target1/post/url bar',
                'to': [{
                    'objectType': 'group',
                    'alias': '@public'
                }],
                'replies': {
                    'items': [{
                        'objectType': 'comment',
                        'id': f'tag:source.com,2013:1_2_{id}',
                        'url': 'http://fa.ke/comment/url',
                        'content': 'foo bar',
                    }],
                    'totalItems':
                    1,
                },
                'tags': [{
                    'objectType': 'activity',
                    'verb': 'like',
                    'id': f'tag:source.com,2013:{id}_liked_by_alice',
                    'object': {
                        'url': 'http://example.com/abc'
                    },
                    'author': {
                        'id': 'tag:source.com,2013:alice',
                        'url': 'http://example.com/alice',
                    },
                }, {
                    'id': f'tag:source.com,2013:{id}_reposted_by_bob',
                    'objectType': 'activity',
                    'verb': 'share',
                    'object': {
                        'url': 'http://example.com/def'
                    },
                    'author': {
                        'url': 'http://example.com/bob'
                    },
                }, {
                    'id': f'tag:source.com,2013:{id}_scissors_by_bob',
                    'objectType': 'activity',
                    'verb': 'react',
                    'content': '✁',
                    'object': {
                        'url': 'http://example.com/def'
                    },
                    'author': {
                        'url': 'http://example.com/bob'
                    },
                }],
            },
        } for id in ('a', 'b', 'c')]

        # responses
        self.responses = []
        created = datetime.now(timezone.utc) - timedelta(days=10)

        for activity in self.activities:
            obj = activity['object']
            pruned_activity = {
                'id': activity['id'],
                'url': 'http://fa.ke/post/url',
                'object': {
                    'content': 'foo http://target1/post/url bar',
                }
            }

            comment = obj['replies']['items'][0]
            self.responses.append(
                Response(id=comment['id'],
                         activities_json=[json_dumps(pruned_activity)],
                         response_json=json_dumps(comment),
                         type='comment',
                         source=self.sources[0].key,
                         unsent=['http://target1/post/url'],
                         created=created))

            created += timedelta(hours=1)

            like = obj['tags'][0]
            self.responses.append(
                Response(id=like['id'],
                         activities_json=[json_dumps(pruned_activity)],
                         response_json=json_dumps(like),
                         type='like',
                         source=self.sources[0].key,
                         unsent=['http://target1/post/url'],
                         created=created))

            created += timedelta(hours=1)

            share = obj['tags'][1]
            self.responses.append(
                Response(id=share['id'],
                         activities_json=[json_dumps(pruned_activity)],
                         response_json=json_dumps(share),
                         type='repost',
                         source=self.sources[0].key,
                         unsent=['http://target1/post/url'],
                         created=created))

            created += timedelta(hours=1)

            reaction = obj['tags'][2]
            self.responses.append(
                Response(id=reaction['id'],
                         activities_json=[json_dumps(pruned_activity)],
                         response_json=json_dumps(reaction),
                         type='react',
                         source=self.sources[0].key,
                         unsent=['http://target1/post/url'],
                         created=created))

            created += timedelta(hours=1)

        # publishes
        self.publishes = [
            Publish(
                parent=PublishedPage(id='https://post').key,
                source=self.sources[0].key,
                status='complete',
                published={'url': 'http://fa.ke/syndpost'},
            )
        ]

        # blogposts
        self.blogposts = [
            BlogPost(
                id='https://post',
                source=self.sources[0].key,
                status='complete',
                feed_item={'title': 'a post'},
                sent=['http://a/link'],
            )
        ]
Пример #16
0
class TestCloudTasksHook(unittest.TestCase):
    def setUp(self):
        with mock.patch(
                "airflow.providers.google.common.hooks.base_google.GoogleBaseHook.__init__",
                new=mock_base_gcp_hook_no_default_project_id,
        ):
            self.hook = CloudTasksHook(gcp_conn_id="test")

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.client_info",
        new_callable=mock.PropertyMock,
    )
    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook._get_credentials"
    )
    @mock.patch("airflow.providers.google.cloud.hooks.tasks.CloudTasksClient")
    def test_cloud_tasks_client_creation(self, mock_client, mock_get_creds,
                                         mock_client_info):
        result = self.hook.get_conn()
        mock_client.assert_called_once_with(
            credentials=mock_get_creds.return_value,
            client_info=mock_client_info.return_value)
        self.assertEqual(mock_client.return_value, result)
        self.assertEqual(self.hook._client, result)

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{"return_value.create_queue.return_value":
           API_RESPONSE},  # type: ignore
    )
    def test_create_queue(self, get_conn):
        result = self.hook.create_queue(
            location=LOCATION,
            task_queue=Queue(),
            queue_name=QUEUE_ID,
            project_id=PROJECT_ID,
        )

        self.assertIs(result, API_RESPONSE)

        get_conn.return_value.create_queue.assert_called_once_with(
            request=dict(parent=FULL_LOCATION_PATH,
                         queue=Queue(name=FULL_QUEUE_PATH)),
            retry=None,
            timeout=None,
            metadata=(),
        )

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{"return_value.update_queue.return_value":
           API_RESPONSE},  # type: ignore
    )
    def test_update_queue(self, get_conn):
        result = self.hook.update_queue(
            task_queue=Queue(state=3),
            location=LOCATION,
            queue_name=QUEUE_ID,
            project_id=PROJECT_ID,
        )

        self.assertIs(result, API_RESPONSE)

        get_conn.return_value.update_queue.assert_called_once_with(
            request=dict(queue=Queue(name=FULL_QUEUE_PATH, state=3),
                         update_mask=None),
            retry=None,
            timeout=None,
            metadata=(),
        )

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{"return_value.get_queue.return_value":
           API_RESPONSE},  # type: ignore
    )
    def test_get_queue(self, get_conn):
        result = self.hook.get_queue(location=LOCATION,
                                     queue_name=QUEUE_ID,
                                     project_id=PROJECT_ID)

        self.assertIs(result, API_RESPONSE)

        get_conn.return_value.get_queue.assert_called_once_with(
            request=dict(name=FULL_QUEUE_PATH),
            retry=None,
            timeout=None,
            metadata=())

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{
            "return_value.list_queues.return_value":
            [Queue(name=FULL_QUEUE_PATH)]
        },  # type: ignore
    )
    def test_list_queues(self, get_conn):
        result = self.hook.list_queues(location=LOCATION,
                                       project_id=PROJECT_ID)

        self.assertEqual(result, [Queue(name=FULL_QUEUE_PATH)])

        get_conn.return_value.list_queues.assert_called_once_with(
            request=dict(parent=FULL_LOCATION_PATH,
                         filter=None,
                         page_size=None),
            retry=None,
            timeout=None,
            metadata=(),
        )

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{"return_value.delete_queue.return_value": None},  # type: ignore
    )
    def test_delete_queue(self, get_conn):
        result = self.hook.delete_queue(location=LOCATION,
                                        queue_name=QUEUE_ID,
                                        project_id=PROJECT_ID)

        self.assertEqual(result, None)

        get_conn.return_value.delete_queue.assert_called_once_with(
            request=dict(name=FULL_QUEUE_PATH),
            retry=None,
            timeout=None,
            metadata=())

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{
            "return_value.purge_queue.return_value":
            Queue(name=FULL_QUEUE_PATH)
        },  # type: ignore
    )
    def test_purge_queue(self, get_conn):
        result = self.hook.purge_queue(location=LOCATION,
                                       queue_name=QUEUE_ID,
                                       project_id=PROJECT_ID)

        self.assertEqual(result, Queue(name=FULL_QUEUE_PATH))

        get_conn.return_value.purge_queue.assert_called_once_with(
            request=dict(name=FULL_QUEUE_PATH),
            retry=None,
            timeout=None,
            metadata=())

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{
            "return_value.pause_queue.return_value":
            Queue(name=FULL_QUEUE_PATH)
        },  # type: ignore
    )
    def test_pause_queue(self, get_conn):
        result = self.hook.pause_queue(location=LOCATION,
                                       queue_name=QUEUE_ID,
                                       project_id=PROJECT_ID)

        self.assertEqual(result, Queue(name=FULL_QUEUE_PATH))

        get_conn.return_value.pause_queue.assert_called_once_with(
            request=dict(name=FULL_QUEUE_PATH),
            retry=None,
            timeout=None,
            metadata=())

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{
            "return_value.resume_queue.return_value":
            Queue(name=FULL_QUEUE_PATH)
        },  # type: ignore
    )
    def test_resume_queue(self, get_conn):
        result = self.hook.resume_queue(location=LOCATION,
                                        queue_name=QUEUE_ID,
                                        project_id=PROJECT_ID)

        self.assertEqual(result, Queue(name=FULL_QUEUE_PATH))

        get_conn.return_value.resume_queue.assert_called_once_with(
            request=dict(name=FULL_QUEUE_PATH),
            retry=None,
            timeout=None,
            metadata=())

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{"return_value.create_task.return_value":
           Task(name=FULL_TASK_PATH)},  # type: ignore
    )
    def test_create_task(self, get_conn):
        result = self.hook.create_task(
            location=LOCATION,
            queue_name=QUEUE_ID,
            task=Task(),
            project_id=PROJECT_ID,
            task_name=TASK_NAME,
        )

        self.assertEqual(result, Task(name=FULL_TASK_PATH))

        get_conn.return_value.create_task.assert_called_once_with(
            request=dict(parent=FULL_QUEUE_PATH,
                         task=Task(name=FULL_TASK_PATH),
                         response_view=None),
            retry=None,
            timeout=None,
            metadata=(),
        )

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{"return_value.get_task.return_value":
           Task(name=FULL_TASK_PATH)},  # type: ignore
    )
    def test_get_task(self, get_conn):
        result = self.hook.get_task(
            location=LOCATION,
            queue_name=QUEUE_ID,
            task_name=TASK_NAME,
            project_id=PROJECT_ID,
        )

        self.assertEqual(result, Task(name=FULL_TASK_PATH))

        get_conn.return_value.get_task.assert_called_once_with(
            request=dict(name=FULL_TASK_PATH, response_view=None),
            retry=None,
            timeout=None,
            metadata=(),
        )

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{
            "return_value.list_tasks.return_value":
            [Task(name=FULL_TASK_PATH)]
        },  # type: ignore
    )
    def test_list_tasks(self, get_conn):
        result = self.hook.list_tasks(location=LOCATION,
                                      queue_name=QUEUE_ID,
                                      project_id=PROJECT_ID)

        self.assertEqual(result, [Task(name=FULL_TASK_PATH)])

        get_conn.return_value.list_tasks.assert_called_once_with(
            request=dict(parent=FULL_QUEUE_PATH,
                         response_view=None,
                         page_size=None),
            retry=None,
            timeout=None,
            metadata=(),
        )

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{"return_value.delete_task.return_value": None},  # type: ignore
    )
    def test_delete_task(self, get_conn):
        result = self.hook.delete_task(
            location=LOCATION,
            queue_name=QUEUE_ID,
            task_name=TASK_NAME,
            project_id=PROJECT_ID,
        )

        self.assertEqual(result, None)

        get_conn.return_value.delete_task.assert_called_once_with(
            request=dict(name=FULL_TASK_PATH),
            retry=None,
            timeout=None,
            metadata=())

    @mock.patch(
        "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook.get_conn",
        **{"return_value.run_task.return_value":
           Task(name=FULL_TASK_PATH)},  # type: ignore
    )
    def test_run_task(self, get_conn):
        result = self.hook.run_task(
            location=LOCATION,
            queue_name=QUEUE_ID,
            task_name=TASK_NAME,
            project_id=PROJECT_ID,
        )

        self.assertEqual(result, Task(name=FULL_TASK_PATH))

        get_conn.return_value.run_task.assert_called_once_with(
            request=dict(name=FULL_TASK_PATH, response_view=None),
            retry=None,
            timeout=None,
            metadata=(),
        )