Skip to content

Commit e4ce6ee

Browse files
committed
Added relationships module in tests
1 parent 7d29e6a commit e4ce6ee

File tree

8 files changed

+199
-20
lines changed

8 files changed

+199
-20
lines changed

tests/models.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from sqlalchemy import Column, ForeignKey, Integer, String
22
from sqlalchemy.ext.declarative import declarative_base
33
from sqlalchemy.orm import relationship
4-
from sqlalchemy.util.langhelpers import generic_repr
54
from sqlalchemyseed.util import generate_repr
65

76
Base = declarative_base()
@@ -115,14 +114,15 @@ class Single(Base):
115114
value = Column(String(45))
116115

117116
def __repr__(self) -> str:
118-
return generic_repr(self)
117+
return generate_repr(self)
119118

120119

121120
class One(Base):
122121
"""
123122
One class with no other Parent that relates to its child.
124123
"""
125124
__tablename__ = 'single_parent'
125+
126126
id = Column(Integer, primary_key=True)
127127
value = Column(String(45))
128128

@@ -137,7 +137,10 @@ class OneToOne(Base):
137137
__tablename__ = 'one_to_one'
138138

139139
id = Column(Integer, primary_key=True)
140+
value = Column(String(45))
140141

142+
def __repr__(self) -> str:
143+
return generate_repr(self)
141144

142145
class OneToMany(Base):
143146
"""
@@ -148,7 +151,7 @@ class OneToMany(Base):
148151
id = Column(Integer, primary_key=True)
149152

150153
def __repr__(self) -> str:
151-
return generic_repr(self)
154+
return generate_repr(self)
152155

153156

154157
class ManyToOne(Base):
@@ -169,7 +172,7 @@ class ManyToMany(Base):
169172
id = Column(Integer, primary_key=True)
170173

171174
def __repr__(self) -> str:
172-
return generic_repr(self,)
175+
return generate_repr(self,)
173176

174177

175178
val = Single(value='str value')

tests/relationships/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import association_object, many_to_many, one_to_many, one_to_one
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from sqlalchemy import Column, ForeignKey, Integer, String
2+
from sqlalchemy.ext.declarative import declarative_base
3+
from sqlalchemy.orm import relationship
4+
5+
Base = declarative_base()
6+
7+
8+
class Association(Base):
9+
__tablename__ = 'association'
10+
left_id = Column(ForeignKey('left.id'), primary_key=True)
11+
right_id = Column(ForeignKey('right.id'), primary_key=True)
12+
extra_data = Column(String(45))
13+
child = relationship("Child", back_populates="parents")
14+
parent = relationship("Parent", back_populates="children")
15+
16+
17+
class Parent(Base):
18+
__tablename__ = 'left'
19+
id = Column(Integer, primary_key=True)
20+
value = Column(String(45))
21+
children = relationship("Association", back_populates="parent")
22+
23+
24+
class Child(Base):
25+
__tablename__ = 'right'
26+
id = Column(Integer, primary_key=True)
27+
value = Column(String(45))
28+
parents = relationship("Association", back_populates="child")
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from sqlalchemy import Column, ForeignKey, Integer, Table
2+
from sqlalchemy.ext.declarative import declarative_base
3+
from sqlalchemy.orm import relationship
4+
from sqlalchemy.sql.sqltypes import String
5+
6+
Base = declarative_base()
7+
8+
9+
association_table = Table(
10+
'association',
11+
Base.metadata,
12+
Column('left_id', ForeignKey('left.id'), primary_key=True),
13+
Column('right_id', ForeignKey('right.id'), primary_key=True),
14+
)
15+
16+
17+
class Parent(Base):
18+
__tablename__ = 'left'
19+
id = Column(Integer, primary_key=True)
20+
value = Column(String(45))
21+
children = relationship(
22+
"Child",
23+
secondary=association_table,
24+
back_populates="parents")
25+
26+
27+
class Child(Base):
28+
__tablename__ = 'right'
29+
id = Column(Integer, primary_key=True)
30+
value = Column(String(45))
31+
parents = relationship(
32+
"Parent",
33+
secondary=association_table,
34+
back_populates="children")

tests/relationships/many_to_one.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from sqlalchemy import Column, ForeignKey, Integer
2+
from sqlalchemy.ext.declarative import declarative_base
3+
from sqlalchemy.orm import relationship
4+
from sqlalchemy.sql.sqltypes import String
5+
6+
Base = declarative_base()
7+
8+
9+
class Parent(Base):
10+
__tablename__ = 'parent'
11+
id = Column(Integer, primary_key=True)
12+
value = Column(String(45))
13+
child_id = Column(Integer, ForeignKey('child.id'))
14+
child = relationship("Child", back_populates="parents")
15+
16+
17+
class Child(Base):
18+
__tablename__ = 'child'
19+
id = Column(Integer, primary_key=True)
20+
value = Column(String(45))
21+
parents = relationship("Parent", back_populates="child")

tests/relationships/one_to_many.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from sqlalchemy import Column, ForeignKey, Integer, String
2+
from sqlalchemy.ext.declarative import declarative_base
3+
from sqlalchemy.orm import relationship
4+
5+
Base = declarative_base()
6+
7+
8+
class Parent(Base):
9+
__tablename__ = 'parent'
10+
id = Column(Integer, primary_key=True)
11+
value = Column(String(45))
12+
children = relationship("Child", back_populates="parent")
13+
14+
15+
class Child(Base):
16+
__tablename__ = 'child'
17+
id = Column(Integer, primary_key=True)
18+
value = Column(String(45))
19+
parent_id = Column(Integer, ForeignKey('parent.id'))
20+
parent = relationship("Parent", back_populates="children")

tests/relationships/one_to_one.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from sqlalchemy import Column, ForeignKey, Integer
2+
from sqlalchemy.ext.declarative import declarative_base
3+
from sqlalchemy.orm import relationship
4+
from sqlalchemy.sql.sqltypes import String
5+
6+
Base = declarative_base()
7+
8+
9+
class Parent(Base):
10+
__tablename__ = 'parent'
11+
id = Column(Integer, primary_key=True)
12+
value = Column(String(45))
13+
14+
child = relationship("Child", back_populates="parent", uselist=False)
15+
16+
17+
class Child(Base):
18+
__tablename__ = 'child'
19+
id = Column(Integer, primary_key=True)
20+
value = Column(String(45))
21+
22+
parent_id = Column(Integer, ForeignKey('parent.id'))
23+
parent = relationship("Parent", back_populates="child")

tests/test_seeder.py

Lines changed: 65 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from typing import List
12
import unittest
23

34
from sqlalchemy import create_engine
@@ -6,26 +7,74 @@
67
from sqlalchemyseed import HybridSeeder, errors
78
from sqlalchemyseed import Seeder
89
from tests.models import Base, Company
10+
from sqlalchemy.ext.declarative import declarative_base
11+
from sqlalchemy import Column, Integer, ForeignKey
12+
from sqlalchemy.orm import relationship
13+
914

1015
from tests import instances as ins
16+
from tests import relationships as rel
17+
18+
19+
class TestSeederRelationship(unittest.TestCase):
20+
"""
21+
TestSeederRelationship class for testing Seeder class dealing with relationships.
22+
"""
23+
24+
def setUp(self) -> None:
25+
self.engine = create_engine('sqlite://')
26+
Session = sessionmaker(bind=self.engine)
27+
session = Session()
28+
self.seeder = Seeder(session)
29+
self.Base = None
30+
31+
def tearDown(self) -> None:
32+
33+
self.Base.metadata.drop_all(self.engine)
34+
self.Base = None
35+
36+
def test_seed_one_to_many(self):
37+
"""
38+
Test seed one to many relationship
39+
"""
40+
# assign classes to remove module
41+
Parent = rel.one_to_many.Parent
42+
Child = rel.one_to_many.Child
43+
44+
self.Base = rel.one_to_many.Base
45+
self.Base.metadata.create_all(self.engine)
46+
json = {
47+
'model': 'tests.relationships.one_to_many.Parent',
48+
'data': {
49+
'value': 'parent',
50+
'!children': [
51+
{
52+
'data': {
53+
'value': 'child',
54+
},
55+
},
56+
{
57+
'data': {
58+
'value': 'child',
59+
},
60+
},
61+
],
62+
},
63+
}
64+
self.seeder.seed(json)
65+
66+
# seeder.instances should only contain the first level entities
67+
self.assertEqual(len(self.seeder.instances), 1)
68+
69+
parent: Parent = self.seeder.instances[0]
70+
children: List[Child] = parent.children
71+
72+
self.assertEqual(parent.value, 'parent')
73+
for child in children:
74+
self.assertEqual(child.value, 'child')
75+
self.assertEqual(child.parent, parent)
1176

1277

13-
# class TestSeeder(unittest.TestCase):
14-
# """
15-
# TestSeeder class for testing Seeder class.
16-
# """
17-
# def setUp(self) -> None:
18-
# self.engine = create_engine('sqlite://')
19-
# Session = sessionmaker(bind=self.engine)
20-
# session = Session()
21-
# Base.metadata.create_all(self.engine)
22-
# self.seeder = Seeder(session)
23-
24-
# def tearDown(self) -> None:
25-
# Base.metadata.drop_all(self.engine)
26-
27-
# def test_single(self):
28-
2978
class TestSeeder(unittest.TestCase):
3079
"""
3180
Test class for Seeder class

0 commit comments

Comments
 (0)