File: test_utils.py

package info (click to toggle)
python-django-object-actions 5.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 296 kB
  • sloc: python: 738; makefile: 64; sh: 6
file content (164 lines) | stat: -rw-r--r-- 5,423 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
from unittest import mock

from django.test import TestCase

from example_project.polls.models import Poll

from ..utils import (
    BaseActionView,
    BaseDjangoObjectActions,
    action,
    takes_instance_or_queryset,
)


class BaseDjangoObjectActionsTest(TestCase):
    def setUp(self):
        self.instance = BaseDjangoObjectActions()
        self.instance.model = mock.Mock(
            **{"_meta.app_label": "app", "_meta.model_name": "model"}
        )

    @mock.patch(
        "django_object_actions.utils.BaseDjangoObjectActions.admin_site", create=True
    )
    def test_get_action_urls_trivial_case(self, mock_site):
        urls = self.instance._get_action_urls()

        self.assertEqual(len(urls), 2)
        self.assertEqual(urls[0].name, "app_model_actions")

    def test_get_change_actions_gets_attribute(self):
        # Set up
        self.instance.change_actions = mock.Mock()

        # Test
        returned_value = self.instance.get_change_actions(
            request=mock.Mock(), object_id=mock.Mock(), form_url=mock.Mock()
        )

        # Assert
        self.assertEqual(id(self.instance.change_actions), id(returned_value))

    def test_get_button_attrs_returns_defaults(self):
        # TODO: use `mock`
        mock_tool = type("mock_tool", (object,), {})
        attrs, __ = self.instance._get_button_attrs(mock_tool)
        self.assertEqual(attrs["class"], "")
        self.assertEqual(attrs["title"], "")

    def test_get_button_attrs_disallows_href(self):
        mock_tool = type("mock_tool", (object,), {"attrs": {"href": "hreeeeef"}})
        attrs, __ = self.instance._get_button_attrs(mock_tool)
        self.assertNotIn("href", attrs)

    def test_get_button_attrs_disallows_title(self):
        mock_tool = type(
            "mock_tool",
            (object,),
            {
                "attrs": {"title": "i wanna be a title"},
                "short_description": "real title",
            },
        )
        attrs, __ = self.instance._get_button_attrs(mock_tool)
        self.assertEqual(attrs["title"], "real title")

    def test_get_button_attrs_gets_set(self):
        mock_tool = type(
            "mock_tool",
            (object,),
            {"attrs": {"class": "class"}, "short_description": "description"},
        )
        attrs, __ = self.instance._get_button_attrs(mock_tool)
        self.assertEqual(attrs["class"], "class")
        self.assertEqual(attrs["title"], "description")

    def test_get_button_attrs_custom_attrs_get_partitioned(self):
        mock_tool = type("mock_tool", (object,), {"attrs": {"nonstandard": "wombat"}})
        attrs, custom = self.instance._get_button_attrs(mock_tool)
        self.assertEqual(custom["nonstandard"], "wombat")


class BaseActionViewTests(TestCase):
    def setUp(self):
        super().setUp()
        self.view = BaseActionView()

    @mock.patch("django_object_actions.utils.messages")
    def test_message_user_proxies_messages(self, mock_messages):
        self.view.message_user("request", "message")
        mock_messages.info.assert_called_once_with("request", "message")


class DecoratorTest(TestCase):
    fixtures = ["sample_data"]

    def setUp(self):
        # WISHLIST don't depend on fixture
        self.obj = Poll.objects.get(pk=1)
        self.queryset = Poll.objects.all()

    def test_trivial(self):
        # setup
        def myfunc(foo, bar, queryset):
            return queryset

        # make sure my test function outputs the third arg
        self.assertEqual(myfunc(None, None, "foo"), "foo")
        # or the `queryset` kwarg
        self.assertEqual(myfunc(None, None, queryset="bar"), "bar")

    def test_decorated(self):
        # setup
        @takes_instance_or_queryset
        def myfunc(foo, bar, queryset):
            return queryset

        # passing in an instance yields a queryset (using positional args)
        queryset = myfunc(None, None, self.obj)
        # the resulting queryset only has one item and it's self.obj
        self.assertEqual(queryset.get(), self.obj)

        # passing in a queryset yields the same queryset
        queryset = myfunc(None, None, self.queryset)
        self.assertEqual(queryset, self.queryset)

        # passing in an instance yields a queryset (using keyword args)
        queryset = myfunc(None, None, queryset=self.obj)
        # the resulting queryset only has one item and it's self.obj
        self.assertEqual(queryset.get(), self.obj)


class DecoratorActionTest(TestCase):
    def test_decorated(self):
        # setup
        @action(description="First action of this admin site.")
        def action_1(modeladmin, request, queryset):
            pass

        @action(permissions=["do_action2"])
        def action_2(modeladmin, request, queryset):
            pass

        @action(label="Third action")
        def action_3(modeladmin, request, queryset):
            pass

        @action(
            attrs={
                "class": "addlink",
            }
        )
        def action_4(modeladmin, request, queryset):
            pass

        self.assertEqual(action_1.short_description, "First action of this admin site.")
        self.assertEqual(action_2.allowed_permissions, ["do_action2"])
        self.assertEqual(action_3.label, "Third action")
        self.assertEqual(
            action_4.attrs,
            {
                "class": "addlink",
            },
        )