#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
#
# Copyright © 2014 uralbash <root@uralbash.ru>
#
# Distributed under terms of the MIT license.
"""
test tree
"""
import unittest
from sqlalchemy import Boolean, Column, Integer
from sqlalchemy.event import contains
from sqlalchemy_mptt.mixins import BaseNestedSets
from sqlalchemy_mptt.sqlalchemy_compat import compat_layer
from sqlalchemy_mptt.tests import DatabaseSetupMixin, TreeTestingMixin
Base = compat_layer.declarative_base()
[docs]
class Tree(Base, BaseNestedSets):
__tablename__ = "tree"
id = Column(Integer, primary_key=True)
visible = Column(Boolean)
def __repr__(self):
return "<Node (%s)>" % self.id
[docs]
class TreeWithCustomId(Base, BaseNestedSets):
__tablename__ = "tree2"
ppk = Column('idd', Integer, primary_key=True)
visible = Column(Boolean)
sqlalchemy_mptt_pk_name = 'ppk'
def __repr__(self):
return "<Node (%s)>" % self.ppk
[docs]
class TreeWithCustomLevel(Base, BaseNestedSets):
__tablename__ = "tree_custom_level"
id = Column(Integer, primary_key=True)
visible = Column(Boolean)
sqlalchemy_mptt_default_level = 0
def __repr__(self):
return "<Node (%s)>" % self.id
[docs]
class TestTree(TreeTestingMixin, unittest.TestCase):
base = Base
model = Tree
[docs]
class TestTreeWithCustomId(TreeTestingMixin, unittest.TestCase):
base = Base
model = TreeWithCustomId
[docs]
class TestTreeWithCustomLevel(TreeTestingMixin, unittest.TestCase):
base = Base
model = TreeWithCustomLevel
[docs]
class Events(unittest.TestCase):
[docs]
def test_register(self):
from sqlalchemy_mptt import tree_manager
tree_manager.register_events()
self.assertTrue(
contains(
BaseNestedSets,
'before_insert',
tree_manager.before_insert
)
)
self.assertTrue(
contains(
BaseNestedSets,
'before_update',
tree_manager.before_update
)
)
self.assertTrue(
contains(
BaseNestedSets,
'before_delete',
tree_manager.before_delete
)
)
[docs]
def test_register_and_remove(self):
from sqlalchemy_mptt import tree_manager
tree_manager.register_events()
tree_manager.register_events(remove=True)
self.assertFalse(
contains(
Tree,
'before_insert',
tree_manager.before_insert
)
)
self.assertFalse(
contains(
Tree,
'before_update',
tree_manager.before_update
)
)
self.assertFalse(
contains(
Tree,
'before_delete',
tree_manager.before_delete
)
)
tree_manager.register_events()
[docs]
def test_remove(self):
from sqlalchemy_mptt import tree_manager
tree_manager.register_events(remove=True)
self.assertFalse(
contains(
Tree,
'before_insert',
tree_manager.before_insert
)
)
self.assertFalse(
contains(
Tree,
'before_update',
tree_manager.before_update
)
)
self.assertFalse(
contains(
Tree,
'before_delete',
tree_manager.before_delete
)
)
tree_manager.register_events()
[docs]
class Tree0Id(DatabaseSetupMixin, unittest.TestCase):
"""Test case where node id is provided and starts with 0
See comments in https://github.com/uralbash/sqlalchemy_mptt/issues/57
"""
base = Base
[docs]
def test(self):
root = Tree(id=0)
child = Tree(id=1, parent_id=0)
self.session.add(root)
self.session.add(child)
self.session.commit()
self.assertEqual(root.tree_id, 1)
self.assertEqual(child.tree_id, 1)
[docs]
class InitialInsert(DatabaseSetupMixin, unittest.TestCase):
"""Test case for initial insertion of node as specified in
docs/initialize.rst
"""
base = Base
[docs]
def test_documented_initial_insert(self):
from sqlalchemy_mptt import tree_manager
tree_manager.register_events(remove=True) # Disable MPTT events
_tree_id = 1
for node_id, parent_id in [(1, None), (2, 1), (3, 1), (4, 2)]:
item = Tree(
id=node_id,
parent_id=parent_id,
left=0,
right=0,
tree_id=_tree_id
)
self.session.add(item)
self.session.commit()
tree_manager.register_events() # enabled MPTT events back
Tree.rebuild_tree(
self.session,
_tree_id
) # rebuild lft, rgt value automatically