示例#1
0
    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,
        }
示例#3
0
    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())
示例#4
0
    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))
示例#5
0
    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())
示例#6
0
    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,)
            )
        )
示例#7
0
    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))
示例#8
0
    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)
示例#9
0
    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())
示例#10
0
    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)
示例#11
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)
示例#12
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",
        )
示例#13
0
    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))
示例#14
0
    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))
示例#15
0
    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())
示例#16
0
    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")
示例#17
0
 def test_root_id(self):
     menu = factories.MenuContentWithVersionFactory(
         menu__identifier='black-cats').menu
     self.assertEqual(menu.root_id, 'root-black-cats')