from __future__ import unicode_literals

from django.apps import apps
from django.db import models
from django.db.models.signals import post_migrate
from django.test import TestCase, override_settings


class TestAdminViewPermissionConfig(TestCase):

    def setUp(self):
        class Meta:
            permissions = (
                ("copy_apptestmodel3", "Can copy apptestmodel3"),
            )

        attrs_1 = {
            '__module__': 'tests.test_app.models',
        }
        attrs_2 = {
            '__module__': 'tests.test_app.models',
            'Meta': Meta,
        }

        self.appconfig = apps.get_app_config('test_app')
        self.model1 = type(str('AppTestModel1'), (models.Model, ),
                           attrs_1.copy())
        self.model2 = type(str('AppTestModel2'), (models.Model, ),
                           attrs_1.copy())
        self.model3 = type(str('AppTestModel3'), (models.Model, ),
                           attrs_2.copy())

    def _trigger_signal(self):
        post_migrate.send(
            sender=self.appconfig,
            app_config=self.appconfig,
            verbosity=1,
            interactive=True,
            using='default')

    @override_settings(
        ADMIN_VIEW_PERMISSION_MODELS=['test_app.AppTestModel1', ]
    )
    def test_ready__with_one_model(self):
        self._trigger_signal()
        self.assertEqual(self.model1._meta.permissions,
                         [('view_apptestmodel1', 'Can view apptestmodel1'), ])
        self.assertEqual(self.model2._meta.permissions, [])

    @override_settings(
        ADMIN_VIEW_PERMISSION_MODELS=[]
    )
    def test_ready__without_model_list(self):
        self._trigger_signal()
        self.assertEqual(self.model1._meta.permissions, [])
        self.assertEqual(self.model2._meta.permissions, [])

    @override_settings(
        ADMIN_VIEW_PERMISSION_MODELS=()
    )
    def test_ready__without_model_tuple(self):
        self._trigger_signal()
        self.assertEqual(self.model1._meta.permissions, [])
        self.assertEqual(self.model2._meta.permissions, [])

    @override_settings(
        ADMIN_VIEW_PERMISSION_MODELS=None
    )
    def test_ready__with_none(self):
        self._trigger_signal()
        self.assertEqual(self.model1._meta.permissions,
                         [('view_apptestmodel1', 'Can view apptestmodel1'), ])
        self.assertEqual(self.model2._meta.permissions,
                         [('view_apptestmodel2', 'Can view apptestmodel2'), ])

    @override_settings(
        ADMIN_VIEW_PERMISSION_MODELS=['test_app.AppTestModel3', ]
    )
    def test_ready__with_other_permissions(self):
        self._trigger_signal()
        self.assertEqual(self.model3._meta.permissions,
                         ((u'copy_apptestmodel3', u'Can copy apptestmodel3'),
                          (u'view_apptestmodel3', u'Can view apptestmodel3')))

    @override_settings(
        ADMIN_VIEW_PERMISSION_MODELS=[]
    )
    def test_ready__with_other_permissions_and_with_none(self):
        self._trigger_signal()
        self.assertEqual(
            self.model3._meta.permissions,
            ((u'copy_apptestmodel3', u'Can copy apptestmodel3'), )
        )