1
0

Public release

This commit is contained in:
2021-07-30 21:29:14 +02:00
commit 8eddb50cf1
30 changed files with 1233 additions and 0 deletions

0
tests/admin/__init__.py Normal file
View File

View File

@@ -0,0 +1,106 @@
# -*- 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,
)

View File

@@ -0,0 +1,71 @@
# -*- coding: utf-8 -*-
from unittest import mock
from django.contrib import admin
from django.http import HttpRequest
from django.test import TestCase
from django_changelist_inline import (
ChangelistInline,
ChangelistInlineAdminMixin,
ChangelistInlineModelAdmin,
)
from testing.factories import ThingFactory, UserFactory
from testing.models import RelatedThing, Thing
class RelatedThingChangelistInline(ChangelistInline):
model = RelatedThing
class ChangelistModelAdmin(ChangelistInlineModelAdmin):
pass
class ThingAdmin(ChangelistInlineAdminMixin, admin.ModelAdmin):
inlines = [RelatedThingChangelistInline]
class ChangelistInlineAdminMixinTestCase(TestCase):
def setUp(self):
self.fake_user = UserFactory()
self.fake_request = mock.Mock(spec=HttpRequest)
self.fake_request.user = self.fake_user
self.thing = ThingFactory()
def test_get_inline_instances_no_obj(self):
# Given
thing_admin = ThingAdmin(Thing, admin.site)
with mock.patch.object(self.fake_user, 'has_perm') as mock_has_perm:
with mock.patch.object(RelatedThingChangelistInline, 'bind') as mock_bind:
mock_has_perm.return_value = True
# When
result = thing_admin.get_inline_instances(
self.fake_request, obj=None,
)
# Then
self.assertEqual(len(result), 0)
self.assertFalse(mock_bind.called)
def test_get_inline_instances(self):
# Given
thing_admin = ThingAdmin(Thing, admin.site)
with mock.patch.object(self.fake_user, 'has_perm') as mock_has_perm:
with mock.patch.object(RelatedThingChangelistInline, 'bind') as mock_bind:
mock_has_perm.return_value = True
# When
result = thing_admin.get_inline_instances(
self.fake_request, obj=self.thing,
)
# Then
self.assertEqual(len(result), 1)
self.assertIsInstance(result[0], RelatedThingChangelistInline)
mock_bind.assert_called_with(self.fake_request, self.thing)

View File

@@ -0,0 +1,151 @@
# -*- coding: utf-8 -*-
from unittest import mock
from django.contrib import admin
from django.http import HttpRequest
from django.test import TestCase
from django_changelist_inline import ChangelistInlineModelAdmin
from django_changelist_inline.admin import InlineChangeList
from testing.factories import ThingFactory
from testing.models import RelatedThing
class ChangelistInlineModelAdminTestCase(TestCase):
def setUp(self):
self.thing = ThingFactory()
self.fake_request = mock.Mock(spec=HttpRequest)
def test_init(self):
# When
model_admin = ChangelistInlineModelAdmin(
self.thing, RelatedThing, admin.site,
)
# Then
self.assertEqual(model_admin.parent_instance, self.thing)
self.assertEqual(model_admin.list_editable, ())
self.assertEqual(model_admin.list_filter, ())
self.assertEqual(model_admin.search_fields, ())
self.assertIsNone(model_admin.date_hierarchy)
self.assertEqual(model_admin.sortable_by, ())
@mock.patch('django.contrib.admin.ModelAdmin.get_actions')
def test_get_actions(self, mock_get_actions):
# Given
mock_get_actions.return_value = []
model_admin = ChangelistInlineModelAdmin(
self.thing, RelatedThing, admin.site,
)
# When
result = model_admin.get_actions(self.fake_request)
# Then
self.assertEqual(result, [])
self.assertFalse(mock_get_actions.called)
def test_get_changelist(self):
# Given
model_admin = ChangelistInlineModelAdmin(
self.thing, RelatedThing, admin.site,
)
# When
result = model_admin.get_changelist(self.fake_request)
# Then
self.assertEqual(result, InlineChangeList)
def test_title(self):
# Given
model_admin = ChangelistInlineModelAdmin(
self.thing, RelatedThing, admin.site,
)
# Then
self.assertEqual(
model_admin.title, RelatedThing._meta.verbose_name_plural,
)
def test_no_results_message(self):
# Given
model_admin = ChangelistInlineModelAdmin(
self.thing, RelatedThing, admin.site,
)
# Then
self.assertEqual(
model_admin.no_results_message,
f'0 {RelatedThing._meta.verbose_name_plural}',
)
def test_get_add_url_no_add_permission(self):
# Given
model_admin = ChangelistInlineModelAdmin(
self.thing, RelatedThing, admin.site,
)
with mock.patch.object(model_admin, 'has_add_permission') as mock_has_add_permission:
mock_has_add_permission.return_value = False
# Then
self.assertIsNone(model_admin.get_add_url(self.fake_request))
mock_has_add_permission.assert_called_with(self.fake_request)
def test_get_add_url(self):
# Given
model_admin = ChangelistInlineModelAdmin(
self.thing, RelatedThing, admin.site,
)
with mock.patch.object(model_admin, 'has_add_permission') as mock_has_add_permission:
mock_has_add_permission.return_value = True
# Then
self.assertEqual(
model_admin.get_add_url(self.fake_request),
'/admin/testing/relatedthing/add/',
)
def test_get_show_all_url_no_view_permission(self):
# Given
model_admin = ChangelistInlineModelAdmin(
self.thing, RelatedThing, admin.site,
)
with mock.patch.object(model_admin, 'has_view_permission') as mock_has_view_permission:
mock_has_view_permission.return_value = False
# Then
self.assertIsNone(model_admin.get_show_all_url(self.fake_request))
mock_has_view_permission.assert_called_with(
self.fake_request, obj=None,
)
def test_get_show_all_url(self):
# Given
model_admin = ChangelistInlineModelAdmin(
self.thing, RelatedThing, admin.site,
)
with mock.patch.object(model_admin, 'has_view_permission') as mock_has_view_permission:
mock_has_view_permission.return_value = True
# Then
self.assertEqual(
model_admin.get_show_all_url(self.fake_request),
'/admin/testing/relatedthing/',
)
def test_get_toolbar_links(self):
# Given
model_admin = ChangelistInlineModelAdmin(
self.thing, RelatedThing, admin.site,
)
# Then
self.assertIsNone(model_admin.get_toolbar_links(self.fake_request))

View File

@@ -0,0 +1,116 @@
# -*- coding: utf-8 -*-
from unittest import mock
from django.contrib import admin
from django.contrib.auth.models import User
from django.http import HttpRequest
from django.test import TestCase
from django_changelist_inline.admin import (
ChangelistInlineModelAdmin,
InlineChangeList,
)
from testing.models import RelatedThing, Thing
from testing.factories import ThingFactory
class RelatedThingInlineModelAdmin(ChangelistInlineModelAdmin):
pass
class InlineChangeListTestCase(TestCase):
def setUp(self):
self.fake_user = mock.Mock(spec=User)
self.fake_user.has_perm.return_value = True
self.fake_request = mock.Mock(spec=HttpRequest)
self.fake_request.GET = {}
self.fake_request.resolver_match = None
self.fake_request.user = self.fake_user
thing = ThingFactory()
self.model_admin = RelatedThingInlineModelAdmin(
thing, RelatedThing, admin.site,
)
def test_init(self):
# When
change_list = InlineChangeList(
self.fake_request, Thing, ['pk'], ['pk'], [], None, None, None, 5,
5, None, self.model_admin, None,
)
# Then
self.assertIsNone(change_list.formset)
self.assertEqual(
change_list.add_url, '/admin/testing/relatedthing/add/',
)
self.assertEqual(
change_list.show_all_url, '/admin/testing/relatedthing/',
)
self.assertIsNone(change_list.toolbar_links)
def test_get_filters_params(self):
# Give
change_list = InlineChangeList(
self.fake_request, Thing, ['pk'], ['pk'], [], None, None, None, 5,
5, None, self.model_admin, None,
)
# When
result = change_list.get_filters_params(params={'q': 'spam'})
# Then
self.assertEqual(result, {})
def test_has_toolbar_False(self):
# Given
change_list = InlineChangeList(
self.fake_request, Thing, ['pk'], ['pk'], [], None, None, None, 5,
5, None, self.model_admin, None,
)
change_list.add_url = None
change_list.show_all_url = None
change_list.toolbar_links = None
# Then
self.assertFalse(change_list.has_toolbar)
def test_has_toolbar_True_with_add_url(self):
# Given
change_list = InlineChangeList(
self.fake_request, Thing, ['pk'], ['pk'], [], None, None, None, 5,
5, None, self.model_admin, None,
)
change_list.add_url = 'add_url'
change_list.show_all_url = None
change_list.toolbar_links = None
# Then
self.assertTrue(change_list.has_toolbar)
def test_has_toolbar_True_with_show_all_url(self):
# Given
change_list = InlineChangeList(
self.fake_request, Thing, ['pk'], ['pk'], [], None, None, None, 5,
5, None, self.model_admin, None,
)
change_list.add_url = None
change_list.show_all_url = 'show_all_url'
change_list.toolbar_links = None
# Then
self.assertTrue(change_list.has_toolbar)
def test_has_toolbar_True_with_toolbar_links(self):
# Given
change_list = InlineChangeList(
self.fake_request, Thing, ['pk'], ['pk'], [], None, None, None, 5,
5, None, self.model_admin, None,
)
change_list.add_url = None
change_list.show_all_url = None
change_list.toolbar_links = 'toolbar_links'
# Then
self.assertTrue(change_list.has_toolbar)