|
| 1 | +import inspect |
| 2 | + |
1 | 3 | from django.conf import settings |
2 | 4 | from django.test import RequestFactory, TestCase, override_settings |
3 | 5 | from django.utils.encoding import force_str |
@@ -68,6 +70,9 @@ class ActionTestMixin(object): |
68 | 70 |
|
69 | 71 | def _get_view(self): |
70 | 72 | # TODO: Move this to use the default django client. |
| 73 | + TestModel = self.view_attrs["model"] |
| 74 | + TestModel.get_absolute_url = lambda self: "test_model/%d" % self.pk |
| 75 | + |
71 | 76 | instance = TestModel.objects.create(name="Test") |
72 | 77 |
|
73 | 78 | TestViewClass = self.make_crumb_cls( |
@@ -108,6 +113,59 @@ def test_valid_view_url(self): |
108 | 113 | else: |
109 | 114 | self.assertIsNotNone(view_url(view.object)) |
110 | 115 |
|
| 116 | + def test_valid_view_label(self): |
| 117 | + view = self._get_view() |
| 118 | + view_label_name = "{}_view_label".format(self.view_name) |
| 119 | + view_label_func = getattr(view, view_label_name) |
| 120 | + |
| 121 | + kwargs = {} |
| 122 | + |
| 123 | + # check if it's a property and get the actual function |
| 124 | + if isinstance(view_label_func, property): |
| 125 | + view_label_func = view_label_func.fget |
| 126 | + |
| 127 | + # use inspect to get the function signature if callable |
| 128 | + if callable(view_label_func): |
| 129 | + signature = inspect.signature(view_label_func) |
| 130 | + if "instance" in signature.parameters: |
| 131 | + kwargs = {"instance": view.object} |
| 132 | + |
| 133 | + label = ( |
| 134 | + view_label_func(**kwargs) if callable(view_label_func) else view_label_func |
| 135 | + ) |
| 136 | + |
| 137 | + match self.view_name: |
| 138 | + case "list": |
| 139 | + self.assertEqual(label, view.model_name_title_plural) |
| 140 | + case "detail": |
| 141 | + self.assertEqual( |
| 142 | + label, view.detail_format_string % force_str(view.object) |
| 143 | + ) |
| 144 | + case "create": |
| 145 | + self.assertEqual( |
| 146 | + label, view.add_format_string % {"model": view.model_name_title} |
| 147 | + ) |
| 148 | + case "update": |
| 149 | + self.assertEqual( |
| 150 | + label, |
| 151 | + view.update_format_string % {"instance": force_str(view.object)}, |
| 152 | + ) |
| 153 | + case "delete": |
| 154 | + self.assertEqual( |
| 155 | + label, |
| 156 | + view.delete_format_string % {"instance": force_str(view.object)}, |
| 157 | + ) |
| 158 | + |
| 159 | + new_label = "TEST" |
| 160 | + |
| 161 | + @property |
| 162 | + def new_label_method(self, instance=None): |
| 163 | + return new_label |
| 164 | + |
| 165 | + # monkey patch view class method to override |
| 166 | + setattr(type(view), view_label_name, new_label_method) |
| 167 | + self.assertEqual(getattr(view, view_label_name), new_label) |
| 168 | + |
111 | 169 |
|
112 | 170 | class ListViewBreadcrumbTestCase(ActionTestMixin, BaseBreadcrumbTestCase): |
113 | 171 | breadcrumb_mixin_cls = ListBreadcrumbMixin |
|
0 commit comments