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

import mock
from psycopg2 import IntegrityError

import openerp.tests.common as common

from openerp.addons.connector.session import (
    ConnectorSession,
)
from openerp.addons.connector.backend import Backend
from openerp.addons.connector.checkpoint import checkpoint


class TestCheckpoint(common.TransactionCase):

    def setUp(self):
        super(TestCheckpoint, self).setUp()
        self.session = ConnectorSession(self.cr, self.uid)
        self.backend = Backend('dummy', version='1.0')
        self.backend_record = mock.Mock()
        self.backend_record._name = 'connector.backend'
        self.backend_record.id = 1
        self.backend_record.get_backend.return_value = self.backend
        self.partner = self.env.ref('base.main_partner')

    def test_add_checkpoint_required_fields(self):
        with self.assertRaises(IntegrityError):
            self.env['connector.checkpoint'].create({
                'backend_id':
                    'connector.backend,' + str(self.backend_record.id),
            })

    def test_add_checkpoint_for_record(self):
        ckpoint = checkpoint.add_checkpoint(
            self.session, 'res.partner', self.partner.id,
            self.backend_record._name, self.backend_record.id)
        self.assertEqual(ckpoint.model_id.model, 'res.partner')
        self.assertEqual(ckpoint.record_id, self.partner.id)
        self.assertEqual(ckpoint.name, self.partner.display_name)
        self.assertEqual(ckpoint.backend_id.id, self.backend_record.id)
        self.assertTrue(ckpoint.message_follower_ids)

        # we can also provide a message
        msg = 'Check this out!'
        ckpoint_with_msg = checkpoint.add_checkpoint(
            self.session, 'res.partner', self.partner.id,
            self.backend_record._name, self.backend_record.id,
            message=msg)
        self.assertEqual(ckpoint_with_msg.message, msg)

    def test_add_checkpoint_for_message(self):
        msg = 'Oops, something went wrong, check this!'
        ckpoint = checkpoint.add_checkpoint_message(
            self.session, self.backend_record._name,
            self.backend_record.id, msg)
        self.assertFalse(ckpoint.model_id)
        self.assertFalse(ckpoint.record_id)
        self.assertEqual(ckpoint.name, msg)
        self.assertEqual(ckpoint.backend_id.id, self.backend_record.id)
        self.assertTrue(ckpoint.message_follower_ids)

    def test_add_checkpoint_from_backend(self):
        backend_record = self.env['connector.backend'].new({'name': 'Test'})
        # fake real id!
        backend_record._ids = [99, ]
        msg = "Yeah!"
        ckpoint = backend_record.add_checkpoint(
            model='res.partner', record_id=self.partner.id)
        self.assertEqual(ckpoint.model_id.model, 'res.partner')
        self.assertEqual(ckpoint.record_id, self.partner.id)
        self.assertEqual(ckpoint.name, self.partner.display_name)
        self.assertEqual(ckpoint.backend_id.id, 99)
        self.assertTrue(ckpoint.message_follower_ids)

        ckpoint = backend_record.add_checkpoint(message=msg)
        self.assertEqual(ckpoint.message, msg)