def test_path(self):
        # Test some corner cases.
        def get_path(obj):
            return '/'.join(obj.getPhysicalPath())

        portal = self.layer['portal']
        setRoles(portal, TEST_USER_ID, ('Manager',))
        nav_root = make_test_folder(portal)
        from plone.app.layout.navigation.interfaces import INavigationRoot
        from zope.interface import alsoProvides
        alsoProvides(nav_root, INavigationRoot)

        portal_view = portal.restrictedTraverse('randomcontent')
        nav_root_view = nav_root.restrictedTraverse('randomcontent')
        self.assertEqual(portal_view._get_nav_root_path(),
                         get_path(portal))
        self.assertEqual(nav_root_view._get_nav_root_path(),
                         get_path(nav_root))
        self.assertEqual(portal_view._get_folder_path(),
                         get_path(portal))
        self.assertEqual(nav_root_view._get_folder_path(),
                         get_path(nav_root))

        top_folder = make_test_folder(portal, new_id='top', register=True)
        self.assertEqual(portal_view._get_folder_path(),
                         get_path(top_folder))
        self.assertEqual(nav_root_view._get_folder_path(),
                         get_path(top_folder))
        # The path does not need to be the full path from the zope
        # root.
        register_path('top')
        self.assertEqual(portal_view._get_folder_path(),
                         get_path(top_folder))
        self.assertEqual(nav_root_view._get_folder_path(),
                         get_path(top_folder))

        # Make two folders with the same id
        folder_in_portal = make_test_folder(portal, 'target')
        folder_in_nav_root = make_test_folder(nav_root, 'target')
        register_path('target')
        self.assertEqual(portal_view._get_folder_path(),
                         get_path(folder_in_portal))
        self.assertEqual(nav_root_view._get_folder_path(),
                         get_path(folder_in_nav_root))

        # Try with the top level folder again, calling the view on a
        # folder at a deeper level.
        register_path('top')
        view = folder_in_nav_root.restrictedTraverse('randomcontent')
        self.assertEqual(view._get_folder_path(),
                         get_path(top_folder))

        # If the path cannot be traversed, so be it.
        register_path('non-existing')
        self.assertEqual(portal_view._get_folder_path(),
                         get_path(portal))
        self.assertEqual(nav_root_view._get_folder_path(),
                         get_path(nav_root))
 def testRandomImageWithEmptyFolder(self):
     portal = self.layer['portal']
     setRoles(portal, TEST_USER_ID, ('Manager',))
     make_test_image(portal)
     make_test_folder(portal, register=True)
     view = portal.restrictedTraverse('randomimage')
     result = view()
     # There are no images, so we only get an empty string.
     self.assertFalse(result)
     response = self.layer['request'].response
     self.assertEqual(response.status, 200)
     self.assertEqual(response.headers.get('location'), None)
 def testRandomContent(self):
     portal = self.layer['portal']
     setRoles(portal, TEST_USER_ID, ('Manager',))
     make_test_doc(portal)
     folder = make_test_folder(portal, register=True)
     # Note: the folder itself is an excellent random content item,
     # so we do not need to add another document.
     #folder_doc = make_test_doc(folder)
     view = portal.restrictedTraverse('randomcontent')
     result = view()
     self.assertFalse(result)
     response = self.layer['request'].response
     self.assertEqual(response.status, 302)
     self.assertEqual(response.headers.get('location'),
                      folder.absolute_url())
     # Let's see if that is not a lucky break.
     locations = set()
     for i in range(10):
         result = view()
         self.assertFalse(result)
         response = self.layer['request'].response
         self.assertEqual(response.status, 302)
         location = response.headers.get('location')
         self.assertTrue(location)
         locations.add(location)
     self.assertEqual(len(locations), 1)
 def testRandomSiteImageOtherFolder(self):
     # Check that we can use the views (or one of them anyway) on a
     # regular folder.
     portal = self.layer['portal']
     setRoles(portal, TEST_USER_ID, ('Manager',))
     image = make_test_image(portal)
     folder = make_test_folder(portal)
     view = folder.restrictedTraverse('randomsiteimage')
     result = view()
     self.assertFalse(result)
     response = self.layer['request'].response
     self.assertEqual(response.status, 302)
     self.assertEqual(response.headers.get('location'),
                      image.absolute_url())
 def testRandomImageNoDoc(self):
     # When searching for images, we should never find documents.
     portal = self.layer['portal']
     setRoles(portal, TEST_USER_ID, ('Manager',))
     make_test_image(portal)
     make_test_doc(portal)
     folder = make_test_folder(portal, register=True)
     folder_image = make_test_image(folder)
     make_test_doc(folder)
     view = portal.restrictedTraverse('randomimage')
     locations = set()
     for i in range(10):
         result = view()
         self.assertFalse(result)
         response = self.layer['request'].response
         self.assertEqual(response.status, 302)
         location = response.headers.get('location')
         self.assertTrue(location)
         locations.add(location)
     self.assertEqual(len(locations), 1)
     self.assertEqual(locations.pop(),
                      folder_image.absolute_url())
 def testRandomSiteImageNavigationRoot(self):
     # Searching for an image in the entire site still takes the
     # navigation root into account.
     portal = self.layer['portal']
     setRoles(portal, TEST_USER_ID, ('Manager',))
     make_test_image(portal)
     folder = make_test_folder(portal)
     from plone.app.layout.navigation.interfaces import INavigationRoot
     from zope.interface import alsoProvides
     alsoProvides(folder, INavigationRoot)
     folder_image = make_test_image(folder)
     view = folder.restrictedTraverse('randomsiteimage')
     locations = set()
     for i in range(10):
         result = view()
         self.assertFalse(result)
         response = self.layer['request'].response
         self.assertEqual(response.status, 302)
         location = response.headers.get('location')
         self.assertTrue(location)
         locations.add(location)
     self.assertEqual(len(locations), 1)
     self.assertEqual(locations.pop(),
                      folder_image.absolute_url())
 def testRandomImage(self):
     portal = self.layer['portal']
     setRoles(portal, TEST_USER_ID, ('Manager',))
     make_test_image(portal)
     folder = make_test_folder(portal, register=True)
     folder_image = make_test_image(folder)
     view = portal.restrictedTraverse('randomimage')
     result = view()
     self.assertFalse(result)
     response = self.layer['request'].response
     self.assertEqual(response.status, 302)
     self.assertEqual(response.headers.get('location'),
                      folder_image.absolute_url())
     # Let's see if that is not a lucky break.
     locations = set()
     for i in range(10):
         result = view()
         self.assertFalse(result)
         response = self.layer['request'].response
         self.assertEqual(response.status, 302)
         location = response.headers.get('location')
         self.assertTrue(location)
         locations.add(location)
     self.assertEqual(len(locations), 1)