107 lines
3.8 KiB
Python
107 lines
3.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
from unittest import mock
|
|
|
|
from django.contrib import admin
|
|
from django.http import HttpRequest, QueryDict
|
|
from django.test import TestCase
|
|
|
|
from django_changelist_inline.admin import (
|
|
ChangelistInline,
|
|
ChangelistInlineModelAdmin,
|
|
InlineChangeList,
|
|
)
|
|
from testing.factories import ThingFactory
|
|
from testing.models import RelatedThing, Thing
|
|
|
|
|
|
class RelatedThingChangelistInline(ChangelistInline):
|
|
model = RelatedThing
|
|
|
|
class ChangelistModelAdmin(ChangelistInlineModelAdmin):
|
|
pass
|
|
|
|
|
|
class ChangelistInlineTestCase(TestCase):
|
|
def test_init(self):
|
|
# When
|
|
changelist_inline = RelatedThingChangelistInline(Thing, admin.site)
|
|
|
|
# Then
|
|
self.assertIsNone(changelist_inline.request)
|
|
self.assertIsNone(changelist_inline.changelist_model_admin)
|
|
|
|
def test_bind(self):
|
|
# Given
|
|
fake_request = mock.Mock(spec=HttpRequest)
|
|
fake_request.GET = QueryDict('q=test&data__has_key=test&p=2&o=-1')
|
|
|
|
thing = ThingFactory()
|
|
changelist_inline = RelatedThingChangelistInline(Thing, admin.site)
|
|
|
|
with mock.patch.object(changelist_inline, 'ChangelistModelAdmin') as mock_changelist_model_admin:
|
|
fake_changelist_model_admin = mock.Mock(
|
|
spec=RelatedThingChangelistInline.ChangelistModelAdmin,
|
|
)
|
|
mock_changelist_model_admin.return_value = fake_changelist_model_admin
|
|
|
|
# When
|
|
changelist_inline.bind(fake_request, thing)
|
|
|
|
# Then
|
|
self.assertNotEqual(changelist_inline.request, fake_request)
|
|
self.assertIsInstance(changelist_inline.request, HttpRequest)
|
|
self.assertEqual(len(changelist_inline.request.GET), 0)
|
|
self.assertEqual(len(changelist_inline.request.POST), 0)
|
|
self.assertEqual(
|
|
changelist_inline.changelist_model_admin,
|
|
fake_changelist_model_admin,
|
|
)
|
|
|
|
mock_changelist_model_admin.assert_called_with(
|
|
thing, RelatedThing, admin.site,
|
|
)
|
|
|
|
def test_changelist_cant_view(self):
|
|
# Given
|
|
fake_request = mock.Mock(spec=HttpRequest)
|
|
|
|
thing = ThingFactory()
|
|
|
|
changelist_inline = RelatedThingChangelistInline(Thing, admin.site)
|
|
changelist_inline.bind(fake_request, thing)
|
|
|
|
with mock.patch.object(changelist_inline.changelist_model_admin, 'has_view_or_change_permission') as mock_has_view_or_change_permission: # noqa: E501
|
|
mock_has_view_or_change_permission.return_value = False
|
|
|
|
# Then
|
|
self.assertIsNone(changelist_inline.changelist)
|
|
|
|
mock_has_view_or_change_permission.assert_called_with(
|
|
changelist_inline.request, obj=None,
|
|
)
|
|
|
|
def test_changelist(self):
|
|
# Given
|
|
fake_request = mock.Mock(spec=HttpRequest)
|
|
|
|
thing = ThingFactory()
|
|
|
|
changelist_inline = RelatedThingChangelistInline(Thing, admin.site)
|
|
changelist_inline.bind(fake_request, thing)
|
|
|
|
with mock.patch.object(changelist_inline.changelist_model_admin, 'has_view_or_change_permission') as mock_has_view_or_change_permission: # noqa: E501
|
|
with mock.patch.object(changelist_inline.changelist_model_admin, 'get_changelist_instance') as mock_get_changelist_instance: # noqa: E501
|
|
fake_changelist_instance = mock.Mock(spec=InlineChangeList)
|
|
|
|
mock_has_view_or_change_permission.return_value = True
|
|
mock_get_changelist_instance.return_value = fake_changelist_instance
|
|
|
|
# Then
|
|
self.assertEqual(
|
|
changelist_inline.changelist, fake_changelist_instance,
|
|
)
|
|
|
|
mock_get_changelist_instance.assert_called_with(
|
|
changelist_inline.request,
|
|
)
|