# -*- coding: utf-8 -*-
# © 2016 Akretion Mourad EL HADJ MIMOUNE
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from odoo.tests.common import TransactionCase
from odoo.tools.config import config

import logging

_logger = logging.getLogger(__name__)

try:
    from cryptography.fernet import Fernet
except ImportError as err:
    _logger.debug(err)


class TestKeychain(TransactionCase):

    def setUp(self):
        super(TestKeychain, self).setUp()

        self.keychain = self.env['keychain.account']
        self.keychain_backend = self.env['keychain.backend']

        def _init_data(self):
            return {
                "c": True,
                "a": "b",
                "d": "",
            }

        def _validate_data(self, data):
            return 'c' in data

        keychain_clss = self.keychain.__class__
        keychain_clss._test_backend_init_data = _init_data
        keychain_clss._test_backend_validate_data = _validate_data

        keychain_backend_clss = self.keychain_backend.__class__
        keychain_backend_clss._backend_name = 'test_backend'

        self.keychain._fields['namespace'].selection.append(
            ('test_backend', 'test backend')
        )

    def test_keychain_bakend(self):
        """It should work with valid data."""
        config['keychain_key_dev'] = Fernet.generate_key()
        config['running_env'] = 'dev'
        vals = {
            'name': 'backend_test',
            'password': 'test',
            'data': '{"a": "o", "c": "b"}'
        }
        # we use new because keychain.backend is an abstract model
        backend = self.keychain_backend.new(vals)
        backend._inverse_keychain()
        account = backend._get_existing_keychain()
        self.assertEqual(
            account.data, '{"a": "o", "c": "b"}',
            'Account data is not correct')
        backend._inverse_password()
        self.assertTrue(account, 'Account was not created')
        self.assertEqual(
            account.clear_password, u'test',
            'Account clear password is not correct')
        self.assertEqual(backend.password, u'test')
        backend._compute_password()
        self.assertEqual(
            backend.password, u'******', 'Backend password was not computed')
        self.assertEqual(
            account.name, u'backend_test dev', 'Account name is not correct')
        self.assertEqual(
            account.namespace, u'test_backend',
            'Account namespace is not correct')
        self.assertEqual(
            account.environment, u'dev', 'Account environment is not correct')
        self.assertEqual(
            account.technical_name, '%s,%s' % (backend._name, backend.id),
            'Account technical_name is not correct')