# -*- coding: utf-8 -*-

import time

from odoorpc.env import Environment
from odoorpc.models import Model
from odoorpc.tests import LoginTestCase


class TestEnvironment(LoginTestCase):
    def test_env_init(self):
        self.assertIsInstance(self.odoo.env, Environment)

    def test_env_context(self):
        self.assertIn('lang', self.odoo.env.context)
        self.assertIn('tz', self.odoo.env.context)
        self.assertIn('uid', self.odoo.env.context)

    def test_env_lang(self):
        self.assertEqual(self.odoo.env.lang, self.odoo.env.context.get('lang'))

    def test_env_db(self):
        self.assertEqual(self.odoo.env.db, self.env['db'])

    def test_env_user(self):
        self.assertEqual(self.odoo.env.user.login, self.env['user'])

    def test_env_dirty(self):
        self.odoo.config['auto_commit'] = False

        def test_record_garbarge_collected():
            user_ids = self.odoo.env['res.users'].search([('id', '!=', 1)])
            user = self.user_obj.browse(user_ids[0])
            self.assertNotIn(user, self.odoo.env.dirty)
            self.assertNotIn(user, user.env.dirty)
            user.name = "Joe"
            self.assertIn(user, self.odoo.env.dirty)
            self.assertIn(user, user.env.dirty)

        test_record_garbarge_collected()
        # Ensure the record has been garbage collected for the next test
        import gc

        gc.collect()
        self.assertEqual(list(self.odoo.env.dirty), [])

    def test_env_registry(self):
        self.odoo.env['res.partner']
        self.assertIn('res.partner', self.odoo.env.registry)
        del self.odoo.env.registry['res.partner']
        self.assertNotIn('res.partner', self.odoo.env.registry)
        self.user.partner_id
        self.assertIn('res.partner', self.odoo.env.registry)

    def test_env_commit(self):
        # We test with 'auto_commit' deactivated since the commit is implicit
        # by default and sufficiently tested in the 'test_field_*' modules.
        self.odoo.config['auto_commit'] = False
        user_id = self.user_obj.create(
            {'name': "TestCommit", 'login': "test_commit_%s" % time.time()}
        )
        user = self.user_obj.browse(user_id)
        self.assertNotIn(user, self.odoo.env.dirty)
        user.name = "Bob"
        self.assertIn(user, self.odoo.env.dirty)
        self.odoo.env.commit()
        data = user.read(['name'])[0]
        self.assertEqual(data['name'], "Bob")
        self.assertEqual(user.name, "Bob")
        self.assertNotIn(user, self.odoo.env.dirty)

    def test_env_ref(self):
        record = self.odoo.env.ref('base.lang_en')
        self.assertIsInstance(record, Model)
        self.assertEqual(record._name, 'res.lang')
        self.assertEqual(record.code, 'en_US')

    def test_env_contains(self):
        self.assertIn('res.partner', self.odoo.env)
        self.assertNotIn('does.not.exist', self.odoo.env)