# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals

from django.core import cache

from celery.utils import gen_unique_id
from celery.task import task as task_dec

from celery.tests.worker.test_request import jail

from djcelery.app import app
from djcelery.tests.utils import unittest


@task_dec()
def mytask(i):
    return i ** i


@task_dec()
def get_db_connection(i):
    from django.db import connection
    return id(connection)


get_db_connection.ignore_result = True


class TestJail(unittest.TestCase):

    def test_django_db_connection_is_closed(self):
        from django.db import connection
        connection._was_closed = False
        old_connection_close = connection.close

        def monkeypatched_connection_close(*args, **kwargs):
            connection._was_closed = True
            return old_connection_close(*args, **kwargs)

        connection.close = monkeypatched_connection_close
        try:
            jail(app, gen_unique_id(), get_db_connection.name, [2], {})
            self.assertTrue(connection._was_closed)
        finally:
            connection.close = old_connection_close

    def test_django_cache_connection_is_closed(self):
        old_cache_close = getattr(cache.cache, 'close', None)
        cache._was_closed = False
        old_cache_parse_backend = getattr(cache, 'parse_backend_uri', None)
        if old_cache_parse_backend:     # checks to make sure attr exists
            delattr(cache, 'parse_backend_uri')

        def monkeypatched_cache_close(*args, **kwargs):
            cache._was_closed = True

        cache.cache.close = monkeypatched_cache_close

        jail(app, gen_unique_id(), mytask.name, [4], {})
        self.assertTrue(cache._was_closed)
        cache.cache.close = old_cache_close
        if old_cache_parse_backend:
            cache.parse_backend_uri = old_cache_parse_backend

    def test_django_cache_connection_is_closed_django_1_1(self):
        old_cache_close = getattr(cache.cache, 'close', None)
        cache._was_closed = False
        old_cache_parse_backend = getattr(cache, 'parse_backend_uri', None)
        cache.parse_backend_uri = lambda uri: ['libmemcached', '1', '2']

        def monkeypatched_cache_close(*args, **kwargs):
            cache._was_closed = True

        cache.cache.close = monkeypatched_cache_close

        jail(app, gen_unique_id(), mytask.name, [4], {})
        self.assertTrue(cache._was_closed)
        cache.cache.close = old_cache_close
        if old_cache_parse_backend:
            cache.parse_backend_uri = old_cache_parse_backend
        else:
            del(cache.parse_backend_uri)
