# Copyright 2017 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.

import unittest

from libs import time_util
from libs.gitiles.gitiles_repository import GitilesRepository
from libs.http import retry_http_client


class MockHttpClient(retry_http_client.RetryHttpClient):  # pragma: no cover.

  def __init__(self, response_for_url=None):
    super(MockHttpClient, self).__init__()
    self.response_for_url = response_for_url or {}

  def SetResponseForUrl(self, url, response):
    self.response_for_url[url] = response

  def GetBackoff(self, *_):
    """Override to avoid sleep."""
    return 0

  def _Get(self, url, *_):
    response = self.response_for_url.get(url)
    if response is None:
      return 404, 'Not Found', {}
    else:
      return 200, response, {}

  def _Post(self, *_):
    pass

  def _Put(self, *_):
    pass


class BaseTestCase(unittest.TestCase):  # pragma: no cover.

  def MockUTCNow(self, mocked_utcnow):
    """Mocks utcnow with the given value for testing."""
    self.mock(time_util, 'GetUTCNow', lambda: mocked_utcnow)

  def GetMockHttpClient(self, response_for_url=None):
    """Returns mocked http client class."""
    return MockHttpClient(response_for_url or {})

  def GetMockRepoFactory(self, response_for_url=None):
    """Returns mocked repository factory."""
    return GitilesRepository.Factory(
        self.GetMockHttpClient(response_for_url or {}))
