def test_crud_for_navigation_plugin_when_versioning_enabled(self): # NOTE: This test is based on a similar one from django-cms: # https://github.com/divio/django-cms/blob/2daeb7d63cb5fee49575a834d0f23669ce46144e/cms/tests/test_plugins.py#L160 # Set up a versioned page with one placeholder page_content = factories.PageContentWithVersionFactory( language=self.language, version__created_by=self.get_superuser()) placeholder = factories.PlaceholderFactory(source=page_content) menu_content1 = factories.MenuContentWithVersionFactory( language=self.language) menu_content2 = factories.MenuContentWithVersionFactory( language=self.language) child = factories.ChildMenuItemFactory(parent=menu_content2.root) grandchild = factories.ChildMenuItemFactory(parent=child) # Patch the choices on the template field, so we don't get # form validation errors template_field = [ field for field in NavigationPlugin._meta.fields if field.name == "template" ][0] patched_choices = [ ("menu/menu.html", "Default"), ("menu/menuismo.html", "Menuismo"), ] with patch.object(template_field, "choices", patched_choices): # First add the plugin and assert # The added plugin will have the template menu/menuismo.html # and the menu from menu1 created_plugin = self._add_nav_plugin_and_assert( placeholder, menu_content1.menu, "menu/menuismo.html") # Now edit the plugin and assert # After editing the plugin will have the template menu/menu.html # and the menu from menu2 self._edit_nav_plugin_and_assert(created_plugin, menu_content2.menu, "menu/menu.html") # Now publish the page content containing the plugin, # so the page can be viewed version = page_content.versions.get() version.publish(self.get_superuser()) menu_version = menu_content2.versions.get() menu_version.publish(self.get_superuser()) # And view the page page_url = page_content.page.get_absolute_url() response = self.client.get(page_url) self.assertIn(child.title, str(response.content)) self.assertIn(grandchild.title, str(response.content)) self.assertEqual(response.status_code, 200) # To delete, the version has to be a draft new_version = version.copy(self.get_superuser()) new_placeholder = new_version.content.placeholders.first() new_plugin = new_placeholder.get_plugins()[0] # Now delete the plugin from the page and assert self._delete_nav_plugin_and_assert(new_placeholder, new_plugin)
def setUp(self): self.menu_content = factories.MenuContentWithVersionFactory( version__state=DRAFT) self.item = factories.ChildMenuItemFactory( parent=self.menu_content.root) self.change_url = reverse("admin:djangocms_navigation_menuitem_change", kwargs={ "menu_content_id": self.menu_content.pk, "object_id": self.item.pk }) self.client.force_login(self.get_superuser()) # moving a node menu_content = factories.MenuContentWithVersionFactory() self.child = factories.ChildMenuItemFactory(parent=menu_content.root) self.child_of_child = factories.ChildMenuItemFactory(parent=self.child) self.move_url = reverse( "admin:djangocms_navigation_menuitem_move_node", args=(menu_content.id, )) self.data = { "node_id": self.child_of_child.pk, "sibling_id": menu_content.root.pk, "as_child": 1, }
def test_menuitem_add_view_does_modify_check_on_version( self, mocked_check, mocked_messages ): mocked_check.side_effect = ConditionFailed( "Go look at some cat pictures instead" ) menu_content = factories.MenuContentWithVersionFactory() add_url = reverse( "admin:djangocms_navigation_menuitem_add", args=(menu_content.id,) ) content_type = ContentType.objects.get(app_label="cms", model="page") page = factories.PageContentFactory().page data = { "title": "My new Title", "content_type": content_type.pk, "object_id": page.pk, "_ref_node_id": menu_content.root.id, "numchild": 1, "link_target": "_blank", "_position": "first-child", } response = self.client.post(add_url, data) # Redirect happened, error message displayed and check modify used self.assertRedirectsToVersionList(response, menu_content) self.assertDjangoErrorMessage( "Go look at some cat pictures instead", mocked_messages ) mocked_check.assert_called_once_with(self.get_superuser())
def test_menuitem_add_view(self): menu_content = factories.MenuContentWithVersionFactory() add_url = reverse( "admin:djangocms_navigation_menuitem_add", args=(menu_content.id,) ) content_type = ContentType.objects.get(app_label="cms", model="page") page = factories.PageContentFactory().page data = { "title": "My new Title", "content_type": content_type.pk, "object_id": page.pk, "_ref_node_id": menu_content.root.id, "numchild": 1, "link_target": "_blank", "_position": "first-child", } response = self.client.post(add_url, data) self.assertRedirects( response, reverse( "admin:djangocms_navigation_menuitem_list", args=(menu_content.id,) ), ) # No menu or menu content objects were added self.assertEqual(Menu.objects.exclude(pk=menu_content.menu.pk).count(), 0) self.assertEqual(MenuContent.objects.exclude(pk=menu_content.pk).count(), 0) # A child menu item object was added new_child = MenuItem.objects.exclude(pk=menu_content.root.pk).get() self.assertEqual(new_child.title, "My new Title") self.assertEqual(new_child.content_type, content_type) self.assertEqual(new_child.object_id, page.pk) self.assertEqual(new_child.link_target, "_blank") self.assertTrue(new_child.is_child_of(menu_content.root))
def test_menuitem_move_node_does_modify_check_on_version( self, mocked_check, mocked_messages ): mocked_check.side_effect = ConditionFailed( "Go look at some cat pictures instead" ) menu_content = factories.MenuContentWithVersionFactory(version__created_by=self.user) child = factories.ChildMenuItemFactory(parent=menu_content.root) child_of_child = factories.ChildMenuItemFactory(parent=child) move_url = reverse( "admin:djangocms_navigation_menuitem_move_node", args=(menu_content.id,) ) data = { "node_id": child_of_child.pk, "sibling_id": menu_content.root.pk, "as_child": 1, } response = self.client.post(move_url, data=data) # 400 response with error message that came from version.check_modify self.assertEqual(response.status_code, 400) self.assertEqual(mocked_messages.call_count, 1) self.assertEqual( mocked_messages.call_args[0][1], "Go look at some cat pictures instead" ) self.assertEqual(b"Go look at some cat pictures instead", response.content) mocked_check.assert_called_once_with(self.get_superuser())
def test_menuitem_add_view_redirects_on_save_add_another(self): """ When a MenuIem object is created we check that the correct url is generated and redirected for the save and add another option and a message is shown to the user. """ menu_content = factories.MenuContentWithVersionFactory() add_url = reverse( "admin:djangocms_navigation_menuitem_add", args=(menu_content.id,) ) content_type = ContentType.objects.get(app_label="cms", model="page") page = factories.PageContentFactory().page data = { "title": "My new Title", "content_type": content_type.pk, "object_id": page.pk, "_ref_node_id": menu_content.root.id, "numchild": 1, "link_target": "_blank", "_position": "first-child", '_addanother': ['Save and add another'], } response = self.client.post(add_url, data, follow=True) new_child = MenuItem.objects.exclude(pk=menu_content.root.pk).get() msg = _('Menuitem %(menuitem)s was changed successfully.') % {'menuitem': new_child.id} self.assertContains(response, msg) response = self.client.post(add_url, data) self.assertEqual( response.url, reverse( "admin:djangocms_navigation_menuitem_add", args=(menu_content.id,) ) )
def test_menuitem_changelist_contains_version_list_url(self): menu_content = factories.MenuContentWithVersionFactory() factories.ChildMenuItemFactory.create_batch(5, parent=menu_content.root) list_url = reverse( "admin:djangocms_navigation_menuitem_list", args=(menu_content.id,) ) response = self.client.get(list_url) self.assertContains(response, version_list_url(menu_content))
def test_menuitem_changelist(self): menu_content = factories.MenuContentWithVersionFactory() factories.ChildMenuItemFactory.create_batch(5, parent=menu_content.root) list_url = reverse( "admin:djangocms_navigation_menuitem_list", args=(menu_content.id,) ) response = self.client.get(list_url) # Just a smoke test self.assertEqual(response.status_code, 200)
def test_menuitem_changelist_does_modify_check_on_version( self, mocked_check, mocked_messages): mocked_check.side_effect = ConditionFailed( "Go look at some cat pictures instead") menu_content = factories.MenuContentWithVersionFactory() list_url = reverse("admin:djangocms_navigation_menuitem_list", args=(menu_content.id, )) response = self.client.get(list_url) # Redirect happened, error message displayed and check modify used self.assertRedirectsToVersionList(response, menu_content.menu) self.assertDjangoErrorMessage("Go look at some cat pictures instead", mocked_messages) mocked_check.assert_called_once_with(self.get_superuser())
def test_menu_cache_invalidate_after_menucontent_archive(self): # NOTE: This test is based on a similar one from django-cms: # https://github.com/divio/django-cms/blob/2daeb7d63cb5fee49575a834d0f23669ce46144e/cms/tests/test_plugins.py#L160 menucontent = factories.MenuContentWithVersionFactory( language=self.language, version__state=PUBLISHED) pagecontent = factories.PageContentWithVersionFactory( language=self.language, version__created_by=self.get_superuser()) factories.ChildMenuItemFactory(parent=menucontent.root, content=pagecontent.page) draft_child = factories.ChildMenuItemFactory(parent=menucontent.root, content=pagecontent.page) # Set up a versioned page with one placeholder placeholder = factories.PlaceholderFactory(source=pagecontent) # grandchild factories.ChildMenuItemFactory(parent=draft_child) # TODO: Use a factory instead # Add nav plugin to placeholder self._add_nav_plugin_and_assert(placeholder, menucontent.menu, "menu/menu.html") # Now publish the page content containing the plugin, # so the page can be viewed version = pagecontent.versions.get() version.publish(self.get_superuser()) menu_published_version = menucontent.versions.get() menu_content_draft = menu_published_version.copy(self.get_superuser()) # Making sure there is no cachekey existed before rendering page cache_key = CacheKey.objects.all().count() self.assertEqual(cache_key, 0) # And view the page page_url = pagecontent.page.get_absolute_url() response = self.client.get(page_url) cache_key = CacheKey.objects.all().count() self.assertEqual(response.status_code, 200) # Rendering should generate cachekey object self.assertEqual(cache_key, 1) menu_content_draft.archive(user=self.get_superuser()) # Version archive action should invalidate cache_key object cache_key = CacheKey.objects.all().count() self.assertEqual(cache_key, 0)
def test_menu_cache_invalidate_after_menuitem_edit(self): # NOTE: This test is based on a similar one from django-cms: # https://github.com/divio/django-cms/blob/2daeb7d63cb5fee49575a834d0f23669ce46144e/cms/tests/test_plugins.py#L160 # Set up a versioned page with one placeholder page_content = factories.PageContentWithVersionFactory( language=self.language, version__created_by=self.get_superuser()) placeholder = factories.PlaceholderFactory(source=page_content) menu_content = factories.MenuContentWithVersionFactory( language=self.language) child = factories.ChildMenuItemFactory(parent=menu_content.root) grandchild = factories.ChildMenuItemFactory(parent=child) # TODO: Use a factory instead # Add nav plugin to placeholder self._add_nav_plugin_and_assert(placeholder, menu_content.menu, "menu/menu.html") # Now publish menucontent and the page content containing the plugin, # so the page can be viewed version = page_content.versions.get() version.publish(self.get_superuser()) menu_version = menu_content.versions.get() menu_version.publish(self.get_superuser()) # Making sure there is no cachekey existed before rendering page cache_key = CacheKey.objects.all().count() self.assertEqual(cache_key, 0) # And view the page page_url = page_content.page.get_absolute_url() response = self.client.get(page_url) cache_key = CacheKey.objects.all().count() # Rendering should generate cachekey object self.assertEqual(cache_key, 1) # Check http response is ok self.assertEqual(response.status_code, 200) self.assertIn(child.title, str(response.content)) self.assertIn(grandchild.title, str(response.content)) # Create further menu items factories.ChildMenuItemFactory(parent=menu_content.root) # MenuItem creation should be invalidated cache_key object cache_key = CacheKey.objects.all().count() self.assertEqual(cache_key, 0)
def test_menuitem_move_node_cant_move_outside_of_root(self, mocked_messages): menu_content = factories.MenuContentWithVersionFactory(version__created_by=self.user) child = factories.ChildMenuItemFactory(parent=menu_content.root) move_url = reverse( "admin:djangocms_navigation_menuitem_move_node", args=(menu_content.id,) ) data = {"node_id": child.pk, "parent_id": 0} response = self.client.post(move_url, data=data) self.assertEqual(response.status_code, 400) self.assertEqual(mocked_messages.call_count, 1) self.assertEqual( mocked_messages.call_args[0][1], "Cannot move a node outside of the root menu node", )
def test_menuitem_change_view(self): menu_content = factories.MenuContentWithVersionFactory( version__state=DRAFT) item = factories.ChildMenuItemFactory(parent=menu_content.root) change_url = reverse( "admin:djangocms_navigation_menuitem_change", kwargs={ "menu_content_id": menu_content.pk, "object_id": item.pk }, ) content_type = ContentType.objects.get(app_label="cms", model="page") page = factories.PageContentFactory().page data = { "title": "My new Title", "content_type": content_type.pk, "object_id": page.pk, "_ref_node_id": menu_content.root.id, "numchild": 1, "link_target": "_blank", "_position": "first-child", } response = self.client.post(change_url, data) # Redirect happened redirect_url = reverse("admin:djangocms_navigation_menuitem_list", args=(menu_content.pk, )) self.assertRedirects(response, redirect_url) # No menu, menu content or menu item objects were added self.assertEqual( Menu.objects.exclude(pk=menu_content.menu.pk).count(), 0) self.assertEqual( MenuContent.objects.exclude(pk=menu_content.pk).count(), 0) self.assertEqual( MenuItem.objects.exclude( pk__in=[menu_content.root.pk, item.pk]).count(), 0) # Menu object didn't change menu = Menu.objects.get() self.assertEqual(menu.identifier, menu_content.menu.identifier) # Root menu item was changed as per POST data item.refresh_from_db() self.assertEqual(item.title, "My new Title") self.assertEqual(item.content_type, content_type) self.assertEqual(item.object_id, page.pk) self.assertEqual(item.link_target, "_blank") self.assertTrue(item.is_child_of(menu_content.root))
def test_menuitem_move_node_smoke_test(self): menu_content = factories.MenuContentWithVersionFactory() child = factories.ChildMenuItemFactory(parent=menu_content.root) child_of_child = factories.ChildMenuItemFactory(parent=child) move_url = reverse("admin:djangocms_navigation_menuitem_move_node", args=(menu_content.id, )) data = { "node_id": child_of_child.pk, "sibling_id": menu_content.root.pk, "as_child": 1, } response = self.client.post(move_url, data=data) self.assertEqual(response.status_code, 200) child.refresh_from_db() child_of_child.refresh_from_db() self.assertTrue(child_of_child.is_sibling_of(child))
def test_menuitem_change_view_does_modify_check_on_version( self, mocked_check, mocked_messages): mocked_check.side_effect = ConditionFailed( "Go look at some cat pictures instead") menu_content = factories.MenuContentWithVersionFactory() item = factories.ChildMenuItemFactory(parent=menu_content.root) change_url = reverse( "admin:djangocms_navigation_menuitem_change", kwargs={ "menu_content_id": menu_content.pk, "object_id": item.pk }, ) response = self.client.get(change_url) # Redirect happened, error message displayed and check modify used self.assertRedirectsToVersionList(response, menu_content.menu) self.assertDjangoErrorMessage("Go look at some cat pictures instead", mocked_messages) mocked_check.assert_called_once_with(self.get_superuser())
def test_menucontent_change_view(self): menu_content = factories.MenuContentWithVersionFactory() change_url = reverse( "admin:djangocms_navigation_menucontent_change", args=(menu_content.pk,) ) response = self.client.get(change_url) # Redirect happened redirect_url = reverse( "admin:djangocms_navigation_menuitem_list", args=(menu_content.pk,) ) self.assertRedirects(response, redirect_url) # No menu objects were added self.assertEqual(Menu.objects.exclude(pk=menu_content.menu.pk).count(), 0) self.assertEqual(MenuContent.objects.exclude(pk=menu_content.pk).count(), 0) self.assertEqual(MenuItem.objects.exclude(pk=menu_content.root.pk).count(), 0) # The data sent in POST did not change any values menu = Menu.objects.get() self.assertNotEqual(menu.identifier, "my-title") root = MenuItem.objects.get() self.assertNotEqual(root.title, "My Title")
def test_root_id(self): menu = factories.MenuContentWithVersionFactory( menu__identifier='black-cats').menu self.assertEqual(menu.root_id, 'root-black-cats')