182 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import six
 | |
| import sqlalchemy as sa
 | |
| from pytest import mark
 | |
| from sqlalchemy.util.langhelpers import symbol
 | |
| from sqlalchemy_utils.path import Path, AttrPath
 | |
| from tests import TestCase
 | |
| 
 | |
| 
 | |
| class TestAttrPath(TestCase):
 | |
|     def create_models(self):
 | |
|         class Document(self.Base):
 | |
|             __tablename__ = 'document'
 | |
|             id = sa.Column(sa.Integer, primary_key=True)
 | |
|             name = sa.Column(sa.Unicode(255))
 | |
|             locale = sa.Column(sa.String(10))
 | |
| 
 | |
|         class Section(self.Base):
 | |
|             __tablename__ = 'section'
 | |
|             id = sa.Column(sa.Integer, primary_key=True)
 | |
|             name = sa.Column(sa.Unicode(255))
 | |
|             locale = sa.Column(sa.String(10))
 | |
| 
 | |
|             document_id = sa.Column(
 | |
|                 sa.Integer, sa.ForeignKey(Document.id)
 | |
|             )
 | |
| 
 | |
|             document = sa.orm.relationship(Document, backref='sections')
 | |
| 
 | |
|         class SubSection(self.Base):
 | |
|             __tablename__ = 'subsection'
 | |
|             id = sa.Column(sa.Integer, primary_key=True)
 | |
|             name = sa.Column(sa.Unicode(255))
 | |
|             locale = sa.Column(sa.String(10))
 | |
| 
 | |
|             section_id = sa.Column(
 | |
|                 sa.Integer, sa.ForeignKey(Section.id)
 | |
|             )
 | |
| 
 | |
|             section = sa.orm.relationship(Section, backref='subsections')
 | |
| 
 | |
|         self.Document = Document
 | |
|         self.Section = Section
 | |
|         self.SubSection = SubSection
 | |
| 
 | |
|     @mark.parametrize(
 | |
|         ('class_', 'path', 'direction'),
 | |
|         (
 | |
|             ('SubSection', 'section', symbol('MANYTOONE')),
 | |
|         )
 | |
|     )
 | |
|     def test_direction(self, class_, path, direction):
 | |
|         assert (
 | |
|             AttrPath(getattr(self, class_), path).direction == direction
 | |
|         )
 | |
| 
 | |
|     def test_invert(self):
 | |
|         path = ~ AttrPath(self.SubSection, 'section.document')
 | |
|         assert path.parts == [
 | |
|             self.Document.sections,
 | |
|             self.Section.subsections
 | |
|         ]
 | |
|         assert str(path.path) == 'sections.subsections'
 | |
| 
 | |
|     def test_len(self):
 | |
|         len(AttrPath(self.SubSection, 'section.document')) == 2
 | |
| 
 | |
|     def test_init(self):
 | |
|         path = AttrPath(self.SubSection, 'section.document')
 | |
|         assert path.class_ == self.SubSection
 | |
|         assert path.path == Path('section.document')
 | |
| 
 | |
|     def test_iter(self):
 | |
|         path = AttrPath(self.SubSection, 'section.document')
 | |
|         assert list(path) == [
 | |
|             self.SubSection.section,
 | |
|             self.Section.document
 | |
|         ]
 | |
| 
 | |
|     def test_repr(self):
 | |
|         path = AttrPath(self.SubSection, 'section.document')
 | |
|         assert repr(path) == (
 | |
|             "AttrPath(SubSection, 'section.document')"
 | |
|         )
 | |
| 
 | |
|     def test_index(self):
 | |
|         path = AttrPath(self.SubSection, 'section.document')
 | |
|         assert path.index(self.Section.document) == 1
 | |
|         assert path.index(self.SubSection.section) == 0
 | |
| 
 | |
|     def test_getitem(self):
 | |
|         path = AttrPath(self.SubSection, 'section.document')
 | |
|         assert path[0] is self.SubSection.section
 | |
|         assert path[1] is self.Section.document
 | |
| 
 | |
|     def test_getitem_with_slice(self):
 | |
|         path = AttrPath(self.SubSection, 'section.document')
 | |
|         assert path[:] == AttrPath(self.SubSection, 'section.document')
 | |
|         assert path[:-1] == AttrPath(self.SubSection, 'section')
 | |
|         assert path[1:] == AttrPath(self.Section, 'document')
 | |
| 
 | |
|     def test_eq(self):
 | |
|         assert (
 | |
|             AttrPath(self.SubSection, 'section.document') ==
 | |
|             AttrPath(self.SubSection, 'section.document')
 | |
|         )
 | |
|         assert not (
 | |
|             AttrPath(self.SubSection, 'section') ==
 | |
|             AttrPath(self.SubSection, 'section.document')
 | |
|         )
 | |
| 
 | |
|     def test_ne(self):
 | |
|         assert not (
 | |
|             AttrPath(self.SubSection, 'section.document') !=
 | |
|             AttrPath(self.SubSection, 'section.document')
 | |
|         )
 | |
|         assert (
 | |
|             AttrPath(self.SubSection, 'section') !=
 | |
|             AttrPath(self.SubSection, 'section.document')
 | |
|         )
 | |
| 
 | |
| 
 | |
| class TestPath(object):
 | |
|     def test_init(self):
 | |
|         path = Path('attr.attr2')
 | |
|         assert path.path == 'attr.attr2'
 | |
| 
 | |
|     def test_init_with_path_object(self):
 | |
|         path = Path(Path('attr.attr2'))
 | |
|         assert path.path == 'attr.attr2'
 | |
| 
 | |
|     def test_iter(self):
 | |
|         path = Path('s.s2.s3')
 | |
|         assert list(path) == ['s', 's2', 's3']
 | |
| 
 | |
|     @mark.parametrize(('path', 'length'), (
 | |
|         (Path('s.s2.s3'), 3),
 | |
|         (Path('s.s2'), 2),
 | |
|         (Path(''), 0)
 | |
|     ))
 | |
|     def test_len(self, path, length):
 | |
|         return len(path) == length
 | |
| 
 | |
|     def test_reversed(self):
 | |
|         path = Path('s.s2.s3')
 | |
|         assert list(reversed(path)) == ['s3', 's2', 's']
 | |
| 
 | |
|     def test_repr(self):
 | |
|         path = Path('s.s2')
 | |
|         assert repr(path) == "Path('s.s2')"
 | |
| 
 | |
|     def test_getitem(self):
 | |
|         path = Path('s.s2')
 | |
|         assert path[0] == 's'
 | |
|         assert path[1] == 's2'
 | |
| 
 | |
|     def test_str(self):
 | |
|         assert str(Path('s.s2')) == 's.s2'
 | |
| 
 | |
|     def test_index(self):
 | |
|         assert Path('s.s2.s3').index('s2') == 1
 | |
| 
 | |
|     def test_unicode(self):
 | |
|         assert six.text_type(Path('s.s2')) == u's.s2'
 | |
| 
 | |
|     def test_getitem_with_slice(self):
 | |
|         path = Path('s.s2.s3')
 | |
|         assert path[1:] == Path('s2.s3')
 | |
| 
 | |
|     @mark.parametrize(('test', 'result'), (
 | |
|         (Path('s.s2') == Path('s.s2'), True),
 | |
|         (Path('s.s2') == Path('s.s3'), False)
 | |
|     ))
 | |
|     def test_eq(self, test, result):
 | |
|         assert test is result
 | |
| 
 | |
|     @mark.parametrize(('test', 'result'), (
 | |
|         (Path('s.s2') != Path('s.s2'), False),
 | |
|         (Path('s.s2') != Path('s.s3'), True)
 | |
|     ))
 | |
|     def test_ne(self, test, result):
 | |
|         assert test is result
 | 
