from twisted.internet import defer
from twisted.trial import unittest

from leap.bitmask.core.mail_services import KeymanagerService


class KeymanagerServiceTestCase(unittest.TestCase):

    @defer.inlineCallbacks
    def test_keymanager_service_list_call(self):
        kms = keymanagerServiceFactory()
        yield kms.do_list_keys('user')
        assert kms._keymanager.loopback == ['get_all_keys']

    @defer.inlineCallbacks
    def test_keymanager_service_export_call(self):
        kms = keymanagerServiceFactory()
        yield kms.do_export('user', 'foo@bar')
        assert kms._keymanager.loopback == ['get_key']

    @defer.inlineCallbacks
    def test_keymanager_service_insert_call(self):
        kms = keymanagerServiceFactory()
        yield kms.do_insert('user', 'foo@bar', 'aaaa')
        assert kms._keymanager.loopback == ['put_raw_key', 'get_key']

    @defer.inlineCallbacks
    def test_keymanager_service_delete_call(self):
        kms = keymanagerServiceFactory()
        yield kms.do_delete('user', 'foo@bar')
        assert kms._keymanager.loopback == ['get_key', 'delete_key']


class _container(object):

    class _keymanager(object):
        """
        This implements the basic public contract of the Keymanager object,
        just to mock the calls made from the KemanagerService.
        """
        def __init__(self):
            self.loopback = []

        def get_all_keys(self, private=False):
            self.loopback.append('get_all_keys')
            return defer.succeed([])

        def get_key(self, address, private=False, fetch_remote=False):
            self.loopback.append('get_key')

            class _key(dict):
                fingerprint = 'deadbeef'
            return defer.succeed(_key())

        def put_raw_key(self, rawkey, address, validation=""):
            self.loopback.append('put_raw_key')
            return defer.succeed('')

        def delete_key(self, key):
            self.loopback.append('delete_key')
            return defer.succeed('')

    def __init__(self):
        self._instances = {'user': self._keymanager()}

    def get_instance(self, userid):
        return self._instances.get(userid)


def keymanagerServiceFactory():
    kms = KeymanagerService()
    kms._container = _container()
    kms._keymanager = kms._container.get_instance('user')
    return kms