from django.contrib import admin
from django.test import TestCase, RequestFactory
from django.utils.encoding import smart_str
from jet.filters import RelatedFieldAjaxListFilter
from jet.tests.models import RelatedToTestModel, TestModel


from django.contrib.admin.utils import get_fields_from_path


class FiltersTestCase(TestCase):
    def setUp(self):
        self.models = []
        self.factory = RequestFactory()
        self.models.append(TestModel.objects.create(field1='first', field2=1))
        self.models.append(TestModel.objects.create(field1='second', field2=2))

    def get_related_field_ajax_list_filter_params(self):
        model = RelatedToTestModel
        field_path = 'field'
        field = get_fields_from_path(model, field_path)[-1]
        lookup_params = {}
        model_admin = admin.site._registry.get(model)

        return field, lookup_params, model, model_admin, field_path

    def get_related_field_ajax_list_filter_params_with_initial(self):
        model = RelatedToTestModel
        field_path = 'field'
        field = get_fields_from_path(model, field_path)[-1]
        lookup_params = {'field__id__exact':2}
        model_admin = admin.site._registry.get(model)

        return field, lookup_params, model, model_admin, field_path

    def test_related_field_ajax_list_filter(self):
        request = self.factory.get('url')
        field, lookup_params, model, model_admin, field_path = self.get_related_field_ajax_list_filter_params()
        list_filter = RelatedFieldAjaxListFilter(field, request, lookup_params, model, model_admin, field_path)

        self.assertTrue(list_filter.has_output())

        choices = list_filter.field_choices(field, request, model_admin)

        self.assertIsInstance(choices, list)
        self.assertEqual(len(choices), 0)

    def test_related_field_ajax_list_filter_with_initial(self):
        initial = self.models[1]
        request = self.factory.get('url', {'field__id__exact': initial.pk})
        field, lookup_params, model, model_admin, field_path = self.get_related_field_ajax_list_filter_params_with_initial()
        list_filter = RelatedFieldAjaxListFilter(field, request, lookup_params, model, model_admin, field_path)

        self.assertTrue(list_filter.has_output())

        choices = list_filter.field_choices(field, request, model_admin)

        self.assertIsInstance(choices, list)
        self.assertEqual(len(choices), 1)
        self.assertEqual(choices[0], (initial.pk, smart_str(initial)))

