# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for the cloud tasks helper module."""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from google.api_core import exceptions

import mock
import unittest

from framework import cloud_tasks_helpers
import settings


class CloudTasksHelpersTest(unittest.TestCase):

  @mock.patch('framework.cloud_tasks_helpers._get_client')
  def test_create_task(self, get_client_mock):

    queue = 'somequeue'
    task = {
        'app_engine_http_request':
            {
                'http_method': 'GET',
                'relative_uri': '/some_url'
            }
    }
    cloud_tasks_helpers.create_task(task, queue=queue)

    get_client_mock().queue_path.assert_called_with(
        settings.app_id, settings.CLOUD_TASKS_REGION, queue)
    get_client_mock().create_task.assert_called_once()
    ((_parent, called_task), _kwargs) = get_client_mock().create_task.call_args
    self.assertEqual(called_task, task)

  @mock.patch('framework.cloud_tasks_helpers._get_client')
  def test_create_task_raises(self, get_client_mock):
    task = {'app_engine_http_request': {}}

    get_client_mock().create_task.side_effect = exceptions.GoogleAPICallError(
        'oh no!')

    with self.assertRaises(exceptions.GoogleAPICallError):
      cloud_tasks_helpers.create_task(task)

  @mock.patch('framework.cloud_tasks_helpers._get_client')
  def test_create_task_retries(self, get_client_mock):
    task = {'app_engine_http_request': {}}

    cloud_tasks_helpers.create_task(task)

    (_args, kwargs) = get_client_mock().create_task.call_args
    self.assertEqual(kwargs.get('retry'), cloud_tasks_helpers._DEFAULT_RETRY)

  def test_generate_simple_task(self):
    actual = cloud_tasks_helpers.generate_simple_task(
        '/alphabet/letters', {
            'a': 'a',
            'b': 'b'
        })
    expected = {
        'app_engine_http_request':
            {
                'relative_uri': '/alphabet/letters',
                'body': 'a=a&b=b',
                'headers': {
                    'Content-type': 'application/x-www-form-urlencoded'
                }
            }
    }
    self.assertEqual(actual, expected)

    actual = cloud_tasks_helpers.generate_simple_task('/alphabet/letters', {})
    expected = {
        'app_engine_http_request':
            {
                'relative_uri': '/alphabet/letters',
                'body': '',
                'headers': {
                    'Content-type': 'application/x-www-form-urlencoded'
                }
            }
    }
    self.assertEqual(actual, expected)
