import unittest
from unittest import mock

from bithustler_client.client.client import BithustlerClient
from bithustler_client.generated_protobuf import bithustler_pb2
from cards_client.client.client import CardsClient
from cards_client.generated_protobuf import base_pb2
from vault_client.client.auth_client import VaultAuthClient
from vault_client.client.client_definition import VaultClient
from vault_client.client.conio_user import ConioUser
from vault_client.generated_protobuf import vault_pb2

from conio_sdk.services.conio.user.user_service import ExternalUserReference
from conio_sdk.services.conio.user.vault_service import VaultService
from etc.settings import VaultAuthCredentials


class TestUserServiceGetUser(unittest.TestCase):
    def _change_user_info(self, user_info: dict):
        self.user_info = user_info
        self.pb2_user = vault_pb2.User(**self.user_info)
        self.user = ConioUser(data=self.user_info)

    def setUp(self):
        self.external_reference = 'an_external_reference'
        self._change_user_info({
            'reference_key_id': 'a reference key id',
            'external_references': [self.external_reference],
            'status': vault_pb2.LOCKED
        })
        self.vault_auth_credentials = \
            VaultAuthCredentials(
                'http://test.vault.com',
                'vault_auth_username',
                'vault_auth_password'
            )
        self.cards_client = mock.create_autospec(CardsClient)
        self.payer = base_pb2.MsgCreatePayerResponse()
        self.payer.data.payer_id = 'a payer id'
        self.cards_client.create_payer.return_value = self.payer
        self.bithustler_client = mock.create_autospec(BithustlerClient)
        self.seller = bithustler_pb2.Seller(id='a seller id')
        self.bithustler_client.create_seller.return_value = self.seller
        self.vault_client = mock.create_autospec(VaultClient)
        self.vault_auth_client = mock.create_autospec(VaultAuthClient)
        self.sut = VaultService(
            self.vault_client,
            self.vault_auth_client,
            self.vault_auth_credentials,
            self.cards_client,
            self.bithustler_client
        )

    def test_get_user(self):
        self.vault_client.get_user_info_by_attributes.return_value = self.pb2_user
        user = self.sut.get_user(ExternalUserReference(self.external_reference))
        self.assertEqual(user.reference_key_id, self.user.reference_key_id)
        self.vault_client.get_user_info_by_attributes.assert_called_once_with(
            external_reference=self.external_reference
        )

    def test_get_user_not_exists(self):
        self.vault_client.get_user_info_by_attributes.return_value = None
        user = self.sut.get_user(ExternalUserReference(self.external_reference))
        self.assertIsNone(user)
        self.vault_client.get_user_info_by_attributes.assert_called_once_with(
            external_reference=self.external_reference
        )
