def test_move_node_view_redirects_to_login_if_non_staff_user(self): user = factories.UserFactory(is_superuser=False, is_staff=False) self.client.force_login(user) menu_content = factories.MenuContentFactory() 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, } # For POST response = self.client.post(move_url, data=data) redirect_url = reverse("admin:login") + "?next=" + move_url self.assertRedirects(response, redirect_url) # For GET response = self.client.get(move_url) self.assertRedirects(response, redirect_url)
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_valid_if_adding_left_sibling_of_existing_child_node(self): item = factories.ChildMenuItemFactory(parent=self.menu_root) data = { "title": "My new Title", "content_type": self.page_ct.pk, "object_id": self.page_content.page.pk, "_ref_node_id": item.id, "numchild": 1, "link_target": "_self", "_position": "left", } form = MenuItemForm(menu_root=self.menu_root, data=data) is_valid = form.is_valid() self.assertTrue(is_valid)
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_change_view_redirects_if_not_latest_version_get( self, mocked_messages ): menu = factories.MenuFactory() version = factories.MenuVersionFactory(content__menu=menu, state=UNPUBLISHED) factories.MenuVersionFactory(content__menu=menu, state=PUBLISHED) factories.MenuVersionFactory(content__menu=menu, state=DRAFT) item = factories.ChildMenuItemFactory(parent=version.content.root) change_url = reverse( "admin:djangocms_navigation_menuitem_change", kwargs={"menu_content_id": version.content.pk, "object_id": item.pk}, ) response = self.client.get(change_url) # Redirect happened and error message displayed self.assertRedirectsToVersionList(response, version.content) self.assertDjangoErrorMessage("Version is not a draft", mocked_messages)
def test_invalid_object_id(self): item = factories.ChildMenuItemFactory(parent=self.menu_root) data = { "title": "My new Title", "content_type": self.page_ct.pk, "_ref_node_id": item.id, "object_id": 99, "numchild": 1, "link_target": "_self", "_position": "first-child", } form = MenuItemForm(menu_root=self.menu_root, data=data) is_valid = form.is_valid() self.assertFalse(is_valid) self.assertIn("object_id", form.errors) self.assertListEqual(form.errors["object_id"], ["Invalid object"])
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_child_menu_items_are_copied(self): """The implementation of versioning for MenuContent correctly copies child MenuItem objects """ original_root = factories.RootMenuItemFactory() original_version = factories.MenuVersionFactory( content__root=original_root) original_child = factories.ChildMenuItemFactory(parent=original_root) new_version = original_version.copy(self.user) new_root = new_version.content.root # If this throws DoesNotExist then the child clearly wasn't duplicated new_child = MenuItem.objects.exclude( pk__in=[original_root.pk, original_child.pk, new_root.pk]).get() # The fields in the child have been copied over correctly self.assertEqual(new_child.title, original_child.title) self.assertEqual(new_child.content, original_child.content) self.assertEqual(new_child.link_target, original_child.link_target) # The new child is indeed a child node of the new root self.assertTrue(new_child.is_child_of(new_root))