def setUp(self): super(TestPublishViews, self).setUp() self.registry = NodeRegistry() self.registry.register_node(Node, view=MyNodeView, child_nodetypes=['*']) self.registry.register_node(TestType, view=MyNodeView, child_nodetypes=['*'], parent_nodetypes=['*']) self.registry.register_view('node', ExpandedNodeView) self.registry.register_view(TestType, ExpandedNodeView) # Make some nodes self.root = Node(name=u'root', title=u'Root Node') if not hasattr(self, 'nodetype'): self.nodetype = Node self.node1 = self.nodetype(name=u'node1', title=u'Node 1', parent=self.root) self.node2 = self.nodetype(name=u'node2', title=u'Node 2', parent=self.root) self.node3 = self.nodetype(name=u'node3', title=u'Node 3', parent=self.node2) self.node4 = self.nodetype(name=u'node4', title=u'Node 4', parent=self.node3) self.node5 = self.nodetype(name=u'node5', title=u'Node 5', parent=self.root) db.session.add_all([self.root, self.node1, self.node2, self.node3, self.node4, self.node5]) db.session.commit() self.rootpub = NodePublisher(self.root, self.registry, u'/') self.nodepub = NodePublisher(self.root, self.registry, u'/node2', u'/') self.nodepub_differenturl = NodePublisher(self.root, self.registry, u'/node2', u'/newnode2') self.nodepub_defaulturl = NodePublisher(self.root, self.registry, u'/node2')
def test_init_root(self): deferpub = NodePublisher(None, self.registry, u'/') self.assertEqual(deferpub.root, None) self.assertEqual(deferpub.root_id, None) deferpub.root = self.node1 self.assertEqual(deferpub.root, self.node1) self.assertEqual(deferpub.root_id, self.node1.id)
class TestPermissionViews(TestDatabaseFixture): def setUp(self): super(TestPermissionViews, self).setUp() self.registry = NodeRegistry() self.registry.register_node(TestType, view=RestrictedView) self.root = Node(name=u'root', title=u'Root Node') self.node = TestType(name=u'node', title=u'Node', parent=self.root) db.session.add_all([self.root, self.node]) db.session.commit() self.publisher = NodePublisher(self.root, self.registry, u'/') def test_view(self): """ Test access to the restricted view. """ # No permission required to access '/' with self.app.test_request_context(method='GET'): response = self.publisher.publish(u'/node') self.assertEqual(response, u'node-index') # 'view' permission is granted to everyone on TestType with self.app.test_request_context(method='GET'): response = self.publisher.publish(u'/node/view') self.assertEqual(response, u'view') # 'admin' permission is granted to no one on TestType with self.app.test_request_context(method='GET'): self.assertRaises(Forbidden, self.publisher.publish, u'/node/admin', user=self.user1, permissions=['siteadmin'])
def setUp(self): super(TestNodeTraversal, self).setUp() # Make some nodes self.root = Node(name=u'root', title=u'Root Node') if not hasattr(self, 'nodetype'): self.nodetype = Node self.node1 = self.nodetype(name=u'node1', title=u'Node 1', parent=self.root) self.node2 = self.nodetype(name=u'node2', title=u'Node 2', parent=self.root) self.node3 = self.nodetype(name=u'node3', title=u'Node 3', parent=self.node2) self.node4 = self.nodetype(name=u'node4', title=u'Node 4', parent=self.node3) self.node5 = self.nodetype(name=u'node5', title=u'Node 5', parent=self.root) db.session.add_all([self.root, self.node1, self.node2, self.node3, self.node4, self.node5]) db.session.commit() self.rootpub = NodePublisher(self.root, None, u'/') self.nodepub = NodePublisher(self.root, None, u'/node2', u'/')
def setUp(self): super(TestPermissionViews, self).setUp() self.registry = NodeRegistry() self.registry.register_node(TestType, view=RestrictedView) self.root = Node(name=u'root', title=u'Root Node') self.node = TestType(name=u'node', title=u'Node', parent=self.root) db.session.add_all([self.root, self.node]) db.session.commit() self.publisher = NodePublisher(self.root, self.registry, u'/')
class TestPublishViews(TestDatabaseFixture): def setUp(self): super(TestPublishViews, self).setUp() self.registry = NodeRegistry() self.registry.register_node(Node, view=MyNodeView, child_nodetypes=['*']) self.registry.register_node(TestType, view=MyNodeView, child_nodetypes=['*'], parent_nodetypes=['*']) self.registry.register_view('node', ExpandedNodeView) self.registry.register_view(TestType, ExpandedNodeView) # Make some nodes self.root = Node(name=u'root', title=u'Root Node') if not hasattr(self, 'nodetype'): self.nodetype = Node self.node1 = self.nodetype(name=u'node1', title=u'Node 1', parent=self.root) self.node2 = self.nodetype(name=u'node2', title=u'Node 2', parent=self.root) self.node3 = self.nodetype(name=u'node3', title=u'Node 3', parent=self.node2) self.node4 = self.nodetype(name=u'node4', title=u'Node 4', parent=self.node3) self.node5 = self.nodetype(name=u'node5', title=u'Node 5', parent=self.root) db.session.add_all([self.root, self.node1, self.node2, self.node3, self.node4, self.node5]) db.session.commit() self.rootpub = NodePublisher(self.root, self.registry, u'/') self.nodepub = NodePublisher(self.root, self.registry, u'/node2', u'/') self.nodepub_differenturl = NodePublisher(self.root, self.registry, u'/node2', u'/newnode2') self.nodepub_defaulturl = NodePublisher(self.root, self.registry, u'/node2') def test_init_root(self): deferpub = NodePublisher(None, self.registry, u'/') self.assertEqual(deferpub.root, None) self.assertEqual(deferpub.root_id, None) deferpub.root = self.node1 self.assertEqual(deferpub.root, self.node1) self.assertEqual(deferpub.root_id, self.node1.id) def test_publishview(self): """Publish a default view.""" with self.app.test_request_context(): response = self.rootpub.publish(u'/node2') self.assertEqual(response, 'node-index') with self.app.test_request_context(): response = self.nodepub.publish(u'/') self.assertEqual(response, 'node-index') with self.app.test_request_context(): response = self.nodepub_defaulturl.publish(u'/node2') self.assertEqual(response, 'node-index') with self.app.test_request_context(): response = self.nodepub_differenturl.publish(u'/newnode2') self.assertEqual(response, 'node-index') def test_methods(self): """Publish views with different methods.""" with self.app.test_request_context(method='GET'): response = self.rootpub.publish(u'/node2/edit') self.assertEqual(response, 'edit-GET') with self.app.test_request_context(method='GET'): response = self.nodepub.publish(u'/edit') self.assertEqual(response, 'edit-GET') with self.app.test_request_context(method='POST'): response = self.rootpub.publish(u'/node2/edit') self.assertEqual(response, 'edit-POST') with self.app.test_request_context(method='POST'): response = self.nodepub.publish(u'/edit') self.assertEqual(response, 'edit-POST') with self.app.test_request_context(method='GET'): response = self.rootpub.publish(u'/node2/multimethod') self.assertEqual(response, 'multimethod-GET') with self.app.test_request_context(method='GET'): response = self.nodepub.publish(u'/multimethod') self.assertEqual(response, 'multimethod-GET') with self.app.test_request_context(method='POST'): response = self.rootpub.publish(u'/node2/multimethod') self.assertEqual(response, 'multimethod-POST') with self.app.test_request_context(method='POST'): response = self.nodepub.publish(u'/multimethod') self.assertEqual(response, 'multimethod-POST') with self.app.test_request_context(method='PUT'): response = self.rootpub.publish(u'/node2/multimethod') self.assertEqual(response, 'multimethod-PUT') with self.app.test_request_context(method='PUT'): response = self.nodepub.publish(u'/multimethod') self.assertEqual(response, 'multimethod-PUT') with self.app.test_request_context(method='GET'): self.assertRaises(NotFound, self.rootpub.publish, u'/node2/random') with self.app.test_request_context(method='GET'): self.assertRaises(NotFound, self.nodepub.publish, u'/random') def test_redirect_gone(self): """ Test the publisher's 30x and 410 responses. """ self.node2.name = u'nodeX' db.session.commit() with self.app.test_request_context(method='GET'): response = self.rootpub.publish(u'/node2/edit') self.assertTrue(response.status[:3] in ['301', '302']) self.assertEqual(response.headers['Location'], '/nodeX/edit') db.session.delete(self.node2) db.session.commit() with self.app.test_request_context(method='GET'): self.assertRaises(Gone, self.rootpub.publish, u'/node2/edit') def test_noroot(self): """ Test the publisher's NOROOT 404 response. """ newpub = NodePublisher(self.root, self.registry, u'/no-node') with self.app.test_request_context(method='GET'): self.assertRaises(NotFound, newpub.publish, '/') def test_urlfor(self): """Test the publisher's url making functionality""" with self.app.test_request_context(method='GET'): pub = self.rootpub self.assertEqual(pub.url_for(self.node2), '/node2/') self.assertEqual(pub.url_for(self.node2, 'editget'), '/node2/edit') self.assertEqual(pub.url_for(self.node2, 'editget', _external=True), 'http://localhost/node2/edit') self.assertEqual(pub.url_for(self.node2, 'editget', js=False), '/node2/edit?js=False') self.assertEqual(pub.url_for(self.node3, 'editget'), '/node2/node3/edit') self.assertRaises(ViewNotFound, pub.url_for, self.node3, 'random') pub = self.nodepub self.assertEqual(pub.url_for(self.node2, 'editget'), '/edit') self.assertEqual(pub.url_for(self.node3, 'editget'), '/node3/edit') self.assertRaises(ViewNotFound, pub.url_for, self.node3, 'random') pub = self.nodepub_defaulturl self.assertEqual(pub.url_for(self.node2, 'editget'), '/node2/edit') self.assertEqual(pub.url_for(self.node3, 'editget'), '/node2/node3/edit') self.assertRaises(ViewNotFound, pub.url_for, self.node3, 'random') pub = self.nodepub_differenturl self.assertEqual(pub.url_for(self.node2, 'editget'), '/newnode2/edit') self.assertEqual(pub.url_for(self.node3, 'editget'), '/newnode2/node3/edit') self.assertRaises(ViewNotFound, pub.url_for, self.node3, 'random')
class TestNodeTraversal(TestDatabaseFixture): """Dictionary access to node hierarchy.""" def setUp(self): super(TestNodeTraversal, self).setUp() # Make some nodes self.root = Node(name=u'root', title=u'Root Node') if not hasattr(self, 'nodetype'): self.nodetype = Node self.node1 = self.nodetype(name=u'node1', title=u'Node 1', parent=self.root) self.node2 = self.nodetype(name=u'node2', title=u'Node 2', parent=self.root) self.node3 = self.nodetype(name=u'node3', title=u'Node 3', parent=self.node2) self.node4 = self.nodetype(name=u'node4', title=u'Node 4', parent=self.node3) self.node5 = self.nodetype(name=u'node5', title=u'Node 5', parent=self.root) db.session.add_all([self.root, self.node1, self.node2, self.node3, self.node4, self.node5]) db.session.commit() self.rootpub = NodePublisher(self.root, None, u'/') self.nodepub = NodePublisher(self.root, None, u'/node2', u'/') def test_invalid_publisher(self): """Publisher paths must be absolute.""" self.assertRaises(ValueError, NodePublisher, self.root, None, u'node2') self.assertRaises(ValueError, NodePublisher, self.root, None, u'/node2', u'node2') def test_traverse_basepaths(self): """Publisher basepaths must be stored accurately.""" self.assertEqual(self.rootpub.basepath, u'/') self.assertEqual(self.nodepub.basepath, u'/node2') newpub = NodePublisher(self.root, None, u'/node2/') self.assertEqual(newpub.basepath, '/node2') def test_traverse_noroot_root(self): """If there's no root node, status is NOROOT (root publisher).""" db.session.delete(self.root) db.session.commit() status, node, path = self.rootpub.traverse(u'/node2') self.assertEqual(status, TRAVERSE_STATUS.NOROOT) def test_traverse_noroot_node(self): """If there's no root node, status is NOROOT (node publisher).""" db.session.delete(self.node2) db.session.commit() status, node, path = self.nodepub.traverse(u'/') self.assertEqual(status, TRAVERSE_STATUS.NOROOT) def test_traverse_match_root(self): """Traversal direct match for root publisher.""" status, node, path = self.rootpub.traverse(u'/node2') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node2) self.assertEqual(path, None) status, node, path = self.rootpub.traverse(u'/node2/node3') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node3) self.assertEqual(path, None) status, node, path = self.rootpub.traverse(u'/node2/node3/node4') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node4) self.assertEqual(path, None) def test_traverse_match_root_slashless(self): """Traversal direct match for root publisher (without leading slashes).""" status, node, path = self.rootpub.traverse(u'node2') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node2) self.assertEqual(path, None) status, node, path = self.rootpub.traverse(u'node2/node3') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node3) self.assertEqual(path, None) status, node, path = self.rootpub.traverse(u'node2/node3/node4') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node4) self.assertEqual(path, None) def test_traverse_match_node(self): """Traversal direct match for node publisher.""" status, node, path = self.nodepub.traverse(u'/') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node2) self.assertEqual(path, None) status, node, path = self.nodepub.traverse(u'/node3') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node3) self.assertEqual(path, None) status, node, path = self.nodepub.traverse(u'/node3/node4') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node4) self.assertEqual(path, None) def test_traverse_match_node_slashless(self): """Traversal direct match for node publisher (without leading slashes).""" status, node, path = self.nodepub.traverse(u'') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node2) self.assertEqual(path, None) status, node, path = self.nodepub.traverse(u'node3') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node3) self.assertEqual(path, None) status, node, path = self.nodepub.traverse(u'node3/node4') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node4) self.assertEqual(path, None) def test_traverse_partial_match(self): """Test for partial path matching.""" status, node, path = self.rootpub.traverse(u'/nodeX') self.assertEqual(status, TRAVERSE_STATUS.PARTIAL) self.assertEqual(node, self.root) self.assertEqual(path, '/nodeX') status, node, path = self.rootpub.traverse(u'/node3/node4') self.assertEqual(status, TRAVERSE_STATUS.PARTIAL) self.assertEqual(node, self.root) self.assertEqual(path, '/node3/node4') status, node, path = self.rootpub.traverse(u'/node2/node4') self.assertEqual(status, TRAVERSE_STATUS.PARTIAL) self.assertEqual(node, self.node2) self.assertEqual(path, '/node4') def test_traverse_redirect_root(self): """Renamed nodes result in REDIRECT status (root publisher).""" self.node2.name = u'nodeX' db.session.commit() status, node, path = self.rootpub.traverse(u'/nodeX') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node2) self.assertEqual(path, None) status, node, path = self.rootpub.traverse(u'/node2') self.assertEqual(status, TRAVERSE_STATUS.REDIRECT) self.assertEqual(node, self.root) self.assertEqual(path, '/nodeX') status, node, path = self.rootpub.traverse(u'/node2/node3') self.assertEqual(status, TRAVERSE_STATUS.REDIRECT) self.assertEqual(node, self.root) self.assertEqual(path, '/nodeX/node3') status, node, path = self.rootpub.traverse(u'/node2/node4') self.assertEqual(status, TRAVERSE_STATUS.REDIRECT) self.assertEqual(node, self.root) self.assertEqual(path, '/nodeX/node4') def test_traverse_redirect_node(self): """Renamed nodes result in REDIRECT status (node publisher).""" self.node3.name = u'nodeX' db.session.commit() status, node, path = self.nodepub.traverse(u'/nodeX') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node3) self.assertEqual(path, None) status, node, path = self.nodepub.traverse(u'/node3') self.assertEqual(status, TRAVERSE_STATUS.REDIRECT) self.assertEqual(node, self.node2) self.assertEqual(path, '/nodeX') status, node, path = self.nodepub.traverse(u'/node3/node4') self.assertEqual(status, TRAVERSE_STATUS.REDIRECT) self.assertEqual(node, self.node2) self.assertEqual(path, '/nodeX/node4') def test_traverse_redirect_subnode(self): """Renamed nodes result in REDIRECT status (node publisher).""" self.node4.name = u'nodeX' db.session.commit() status, node, path = self.nodepub.traverse(u'/node3/nodeX') self.assertEqual(status, TRAVERSE_STATUS.MATCH) self.assertEqual(node, self.node4) self.assertEqual(path, None) status, node, path = self.nodepub.traverse(u'/node3/node4') self.assertEqual(status, TRAVERSE_STATUS.REDIRECT) self.assertEqual(node, self.node3) self.assertEqual(path, '/node3/nodeX') self.nodepub.urlpath = self.nodepub.basepath status, node, path = self.nodepub.traverse(u'/node2/node3/node4') self.assertEqual(status, TRAVERSE_STATUS.REDIRECT) self.assertEqual(node, self.node3) self.assertEqual(path, '/node2/node3/nodeX') def test_traverse_gone_root(self): """Deleted nodes cause a GONE response status (root publisher).""" db.session.delete(self.node3) db.session.commit() status, node, path = self.rootpub.traverse(u'/node2/node3') self.assertEqual(status, TRAVERSE_STATUS.GONE) self.assertEqual(node, self.node2) status, node, path = self.rootpub.traverse(u'/node2/node3/node4') self.assertEqual(status, TRAVERSE_STATUS.GONE) self.assertEqual(node, self.node2) def test_traverse_gone_node(self): """Deleted nodes cause a GONE response status (node publisher).""" db.session.delete(self.node3) db.session.commit() status, node, path = self.nodepub.traverse(u'/node3') self.assertEqual(status, TRAVERSE_STATUS.GONE) self.assertEqual(node, self.node2) status, node, path = self.nodepub.traverse(u'/node3/node4') self.assertEqual(status, TRAVERSE_STATUS.GONE) self.assertEqual(node, self.node2) def test_traverse_gone_root_noredirect(self): """Deleted nodes return PARTIAL when redirects are disabled (root publisher).""" db.session.delete(self.node3) db.session.commit() status, node, path = self.rootpub.traverse(u'/node2/node3', redirect=False) self.assertEqual(status, TRAVERSE_STATUS.PARTIAL) self.assertEqual(node, self.node2) self.assertEqual(path, u'/node3') status, node, path = self.rootpub.traverse(u'/node2/node3/node4', redirect=False) self.assertEqual(status, TRAVERSE_STATUS.PARTIAL) self.assertEqual(node, self.node2) self.assertEqual(path, u'/node3/node4') def test_traverse_gone_node_noredirect(self): """Deleted nodes return PARTIAL when redirects are disabled (node publisher).""" db.session.delete(self.node3) db.session.commit() status, node, path = self.nodepub.traverse(u'/node3', redirect=False) self.assertEqual(status, TRAVERSE_STATUS.PARTIAL) self.assertEqual(node, self.node2) self.assertEqual(path, u'/node3') status, node, path = self.nodepub.traverse(u'/node3/node4', redirect=False) self.assertEqual(status, TRAVERSE_STATUS.PARTIAL) self.assertEqual(node, self.node2) self.assertEqual(path, u'/node3/node4')