import pytest
from mock import Mock

import util
from data import model
from endpoints.api.repoemail_models_interface import RepositoryAuthorizedEmail
from endpoints.api.repoemail_models_pre_oci import pre_oci_model


@pytest.fixture
def get_monkeypatch(monkeypatch):
  return monkeypatch


def return_none(name, repo, email):
  return None


def get_return_mock(mock):
  def return_mock(name, repo, email):
    return mock

  return return_mock


def test_get_email_authorized_for_repo(get_monkeypatch):
  mock = Mock()

  get_monkeypatch.setattr(model.repository, 'get_email_authorized_for_repo', mock)

  pre_oci_model.get_email_authorized_for_repo('namespace_name', 'repository_name', 'email')

  mock.assert_called_once_with('namespace_name', 'repository_name', 'email')


def test_get_email_authorized_for_repo_return_none(get_monkeypatch):
  get_monkeypatch.setattr(model.repository, 'get_email_authorized_for_repo', return_none)

  repo = pre_oci_model.get_email_authorized_for_repo('namespace_name', 'repository_name', 'email')

  assert repo is None


def test_get_email_authorized_for_repo_return_repo(get_monkeypatch):
  mock = Mock(confirmed=True, code='code')
  get_monkeypatch.setattr(model.repository, 'get_email_authorized_for_repo', get_return_mock(mock))

  actual = pre_oci_model.get_email_authorized_for_repo('namespace_name', 'repository_name',
                                                       'email')

  assert actual == RepositoryAuthorizedEmail('email', 'repository_name', 'namespace_name', True,
                                             'code')


def test_create_email_authorization_for_repo(get_monkeypatch):
  mock = Mock()
  get_monkeypatch.setattr(model.repository, 'create_email_authorization_for_repo', mock)

  pre_oci_model.create_email_authorization_for_repo('namespace_name', 'repository_name', 'email')

  mock.assert_called_once_with('namespace_name', 'repository_name', 'email')


def test_create_email_authorization_for_repo_return_none(get_monkeypatch):
  get_monkeypatch.setattr(model.repository, 'create_email_authorization_for_repo', return_none)

  assert pre_oci_model.create_email_authorization_for_repo('namespace_name', 'repository_name',
                                                           'email') is None


def test_create_email_authorization_for_repo_return_mock(get_monkeypatch):
  mock = Mock()
  get_monkeypatch.setattr(model.repository, 'create_email_authorization_for_repo',
                          get_return_mock(mock))

  assert pre_oci_model.create_email_authorization_for_repo('namespace_name', 'repository_name',
                                                           'email') is not None


def test_create_email_authorization_for_repo_return_value(get_monkeypatch):
  mock = Mock(confirmed=False, code='code')

  get_monkeypatch.setattr(model.repository, 'create_email_authorization_for_repo',
                          get_return_mock(mock))

  actual = pre_oci_model.create_email_authorization_for_repo('namespace_name', 'repository_name',
                                                             'email')
  assert actual == RepositoryAuthorizedEmail('email', 'repository_name', 'namespace_name', False,
                                             'code')