Exemple #1
0
    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')
Exemple #2
0
 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)
Exemple #3
0
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'])
Exemple #4
0
    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'/')
Exemple #5
0
    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'/')
Exemple #6
0
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')
Exemple #7
0
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')