def test_internal_breaches_are_dropped(self): folder1 = self.portal.folder1 create(folder1, 'Document', id='doc5', title='Test Page 5') doc1 = self.portal.doc1 doc4 = self.portal.folder1.doc4 doc5 = self.portal.folder1.doc5 self._set_text(doc1, '<a href="folder1">f1</a>') self._set_text(doc4, '<a href="doc5">d5</a><a href="../doc1">d1</a>') self._set_text(doc5, '<a href="../folder1">f1</a>') doc4_breaches = set([r.to_object for r in getOutgoingLinks(doc4)]) # the order of breaches is non-deterministic self.assertEqual(set([doc1, doc5]), doc4_breaches) self.assertEqual( [r.to_object for r in getOutgoingLinks(doc5)], [folder1]) self.assertEqual( [r.to_object for r in getOutgoingLinks(doc1)], [folder1]) view = DeleteConfirmationInfo(self.portal, self.request) self.assertEqual(len(view.get_breaches([doc4])), 0) self.assertEqual(len(view.get_breaches([doc5])), 1) self.assertEqual(len(view.get_breaches([doc4, doc5])), 0) self.assertEqual(len(view.get_breaches([folder1])), 1) self.assertEqual(len(view.get_breaches([doc1])), 1) self.assertEqual(len(view.get_breaches([doc1, folder1])), 0) view = folder1.restrictedTraverse('delete_confirmation') self.assertIn('Potential link breakage', view()) view = folder1.restrictedTraverse('delete_confirmation_info') self.assertIn('Potential link breakage', view()) view = doc4.restrictedTraverse('delete_confirmation') self.assertNotIn('Potential link breakage', view()) view = doc4.restrictedTraverse('delete_confirmation_info') self.assertNotIn('Potential link breakage', view())
def test_internal_breaches_are_dropped(self): folder1 = self.portal.folder1 create(folder1, 'Document', id='doc5', title='Test Page 5') doc1 = self.portal.doc1 doc4 = self.portal.folder1.doc4 doc5 = self.portal.folder1.doc5 self._set_text(doc1, '<a href="folder1">f1</a>') self._set_text(doc4, '<a href="doc5">d5</a><a href="../doc1">d1</a>') self._set_text(doc5, '<a href="../folder1">f1</a>') doc4_breaches = set([r.to_object for r in getOutgoingLinks(doc4)]) # the order of breaches is non-deterministic self.assertEqual(set([doc1, doc5]), doc4_breaches) self.assertEqual([r.to_object for r in getOutgoingLinks(doc5)], [folder1]) self.assertEqual([r.to_object for r in getOutgoingLinks(doc1)], [folder1]) view = DeleteConfirmationInfo(self.portal, self.request) self.assertEqual(len(view.get_breaches([doc4])), 0) self.assertEqual(len(view.get_breaches([doc5])), 1) self.assertEqual(len(view.get_breaches([doc4, doc5])), 0) self.assertEqual(len(view.get_breaches([folder1])), 1) self.assertEqual(len(view.get_breaches([doc1])), 1) self.assertEqual(len(view.get_breaches([doc1, folder1])), 0) view = folder1.restrictedTraverse('delete_confirmation') self.assertIn('Potential link breakage', view()) view = folder1.restrictedTraverse('delete_confirmation_info') self.assertIn('Potential link breakage', view()) view = doc4.restrictedTraverse('delete_confirmation') self.assertNotIn('Potential link breakage', view()) view = doc4.restrictedTraverse('delete_confirmation_info') self.assertNotIn('Potential link breakage', view())
def test_file_reference_linkintegrity_page_is_shown(self): doc1 = self.portal.doc1 file2 = testing.create(self.portal, 'File', id='file2', file=testing.GIF) self.assertFalse(hasOutgoingLinks(doc1)) self._set_text(doc1, '<a href="file2">A File</a>') self.assertTrue(hasOutgoingLinks(doc1)) self.assertIn('file2', self.portal.objectIds()) token = self._get_token(file2) self.request['_authenticator'] = token # Make changes visible to test browser transaction.commit() self.browser.handleErrors = True self.browser.addHeader( 'Authorization', 'Basic {0:s}:{1:s}'.format(TEST_USER_NAME, TEST_USER_PASSWORD)) delete_url = '{0:s}/delete_confirmation?_authenticator={1:s}'.format( file2.absolute_url(), token) # Try to remove but cancel self.browser.open(delete_url) # Validate text self.assertIn('Potential link breakage', self.browser.contents) self.assertIn('<a href="http://nohost/plone/doc1">Test Page 1</a>', self.browser.contents) self.assertIn('Would you like to delete it anyway?', self.browser.contents) # Click cancel button, item should stay in place # FIXME! This fails in Archetypes because the redirect # plone.app.content.browser.actions.DeleteConfirmationForm.handle_cancel # is broken for AT-content. self.browser.getControl(name='form.buttons.Cancel').click() self.assertEqual(self.browser.url, file2.absolute_url() + '/view') self.assertIn('Removal cancelled.', self.browser.contents) self.assertIn('file2', self.portal.objectIds()) # Try to remove and confirm self.browser.open(delete_url) self.browser.getControl(name='form.buttons.Delete').click() self.assertNotIn('file2', self.portal.objectIds())
def test_broken_references(self): # create a temporary document to test with doc1a = testing.create(self.portal, 'Document', id='doc1a') doc1 = self.portal.doc1 self.assertEqual(len(list(getOutgoingLinks(doc1))), 0) self._set_text(doc1, '<a href="doc1a">Doc 1a</a>') self.assertEqual(len(list(getOutgoingLinks(doc1))), 1) self.assertEqual([l.to_object for l in getOutgoingLinks(doc1)], [self.portal.doc1a]) # Now delete the target item, suppress events and test again, # the reference should be gone now. self.portal._delObject(doc1a.id, suppress_events=True) self.assertEqual([l.to_object for l in getOutgoingLinks(doc1)], [None])
def test_file_reference_linkintegrity_page_is_shown(self): doc1 = self.portal.doc1 file2 = testing.create(self.portal, 'File', id='file2', file=testing.GIF) self._set_text(doc1, '<a href="file2">A File</a>') self.assertEqual(IReferenceable(doc1).getReferences(), [file2]) self.assertIn('file2', self.portal.objectIds()) token = self._get_token(file2) self.request['_authenticator'] = token # Make changes visible to test browser transaction.commit() self.browser.handleErrors = True self.browser.addHeader( 'Authorization', 'Basic {0:s}:{1:s}'.format(TEST_USER_NAME, TEST_USER_PASSWORD)) delete_url = '{0:s}/object_delete?_authenticator={1:s}'.format( file2.absolute_url(), token) # Try to remove but cancel self.browser.open(delete_url) # Validate text self.assertIn('Potential link breakage', self.browser.contents) self.assertIn('removeConfirmationAction', self.browser.contents) self.assertIn('<a href="http://nohost/plone/doc1">Test Page 1</a>', self.browser.contents) self.assertIn('Would you like to delete it anyway?', self.browser.contents) # Click cancel button, item should stay in place self.browser.getControl(name='cancel').click() self.assertEqual(self.browser.url, self.portal.absolute_url()) self.assertIn('Removal cancelled.', self.browser.contents) self.assertIn('file2', self.portal.objectIds()) # Try to remove and confirm self.browser.open(delete_url) self.browser.getControl(name='delete').click() self.assertNotIn('file2', self.portal.objectIds())
def test_file_reference_throws_exception(self): """This tests the behaviour when removing a referenced file.""" doc1 = self.portal.doc1 file2 = testing.create(self.portal, 'File', id='file2', file=testing.GIF) self._set_text(doc1, '<a href="file2">A File</a>') self.assertEqual(IReferenceable(doc1).getReferences(), [file2]) self.assertIn('file2', self.portal.objectIds()) token = self._get_token(file2) self.request['_authenticator'] = token # Throws exception which actually should abort transaction view = file2.restrictedTraverse('@@object_delete') self.assertRaises(exceptions.LinkIntegrityNotificationException, view)
def test_broken_references(self): # create a temporary document to test with doc1a = testing.create(self.portal, 'Document', id='doc1a') doc1 = self.portal.doc1 self.assertEqual(len(IReferenceable(doc1).getReferences()), 0) self._set_text(doc1, '<a href="doc1a">Doc 1a</a>') self.assertEqual(len(IReferenceable(doc1).getReferences()), 1) self.assertEqual(IReferenceable(doc1).getReferences()[0].id, self.portal.doc1a.id) # Now delete the target item, suppress events and test again, # the reference should be broken now. self.portal._delObject(doc1a.id, suppress_events=True) self.assertEqual(IReferenceable(doc1).getReferences(), [None]) # If we now try to update the linking document again in order to # remove the link, things used to break raising a # ``ReferenceException``. This should be handled more # gracefully now: self._set_text(doc1, 'foo!') self.assertEqual(IReferenceable(doc1).getReferences(), [])