Skip to content

Commit 1f23aa7

Browse files
committed
Update test cases, validator, instances, and commented out not yet used lines
1 parent 077823e commit 1f23aa7

File tree

5 files changed

+114
-52
lines changed

5 files changed

+114
-52
lines changed

sqlalchemyseed/_future/seeder.py

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -152,33 +152,32 @@ def _setup_instance(self, class_, kwargs: dict, parent: Entity):
152152
# if key is validator.Key.filter() and self.session is not None:
153153
# return self.session.query(class_).filter_by(**filtered_kwargs).one()
154154

155-
156-
class HybridSeeder:
157-
__model_key = validator.Key.model()
158-
__source_keys = [validator.Key.data(), validator.Key.filter()]
159-
160-
def __init__(self, session: sqlalchemy.orm.Session, ref_prefix):
161-
self.session = session
162-
self._class_registry = class_registry.ClassRegistry()
163-
self._instances = []
164-
self.ref_prefix = ref_prefix
165-
166-
@property
167-
def instances(self):
168-
return tuple(self._instances)
169-
170-
def seed(self, entities):
171-
validator.SchemaValidator.validate(
172-
entities, ref_prefix=self.ref_prefix)
173-
174-
self._pre_seed(entities)
175-
176-
def _pre_seed(self, entity, parent=None):
177-
if isinstance(entity, dict):
178-
self._seed(entity, parent)
179-
else: # is list
180-
for item in entity:
181-
self._pre_seed(item, parent)
182-
183-
def _seed(self, entity, parent):
184-
pass
155+
# class HybridSeeder:
156+
# __model_key = validator.Key.model()
157+
# __source_keys = [validator.Key.data(), validator.Key.filter()]
158+
#
159+
# def __init__(self, session: sqlalchemy.orm.Session, ref_prefix):
160+
# self.session = session
161+
# self._class_registry = class_registry.ClassRegistry()
162+
# self._instances = []
163+
# self.ref_prefix = ref_prefix
164+
#
165+
# @property
166+
# def instances(self):
167+
# return tuple(self._instances)
168+
#
169+
# def seed(self, entities):
170+
# validator.SchemaValidator.validate(
171+
# entities, ref_prefix=self.ref_prefix)
172+
#
173+
# self._pre_seed(entities)
174+
#
175+
# def _pre_seed(self, entity, parent=None):
176+
# if isinstance(entity, dict):
177+
# self._seed(entity, parent)
178+
# else: # is list
179+
# for item in entity:
180+
# self._pre_seed(item, parent)
181+
#
182+
# def _seed(self, entity, parent):
183+
# pass

sqlalchemyseed/seeder.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ def instantiate_obj(self,
160160
filtered_kwargs = {
161161
k: v
162162
for k, v in kwargs.items() if not k.startswith("!")
163-
and not isinstance(getattr(class_, k), RelationshipProperty)
163+
and not isinstance(getattr(class_, k), RelationshipProperty)
164164
}
165165

166166
if key_is_data is True:
@@ -201,7 +201,7 @@ def instantiate_obj(self,
201201
filtered_kwargs = {
202202
k: v
203203
for k, v in kwargs.items() if not k.startswith("!")
204-
and not isinstance(getattr(class_, k), RelationshipProperty)
204+
and not isinstance(getattr(class_, k), RelationshipProperty)
205205
}
206206

207207
if key_is_data is True:
@@ -236,7 +236,3 @@ def _query_instance_id(self, class_, filtered_kwargs, foreign_key):
236236
result = (self.session.query(getattr(
237237
class_, column_name)).filter_by(**filtered_kwargs).one())
238238
return getattr(result, column_name)
239-
240-
241-
if __name__ == "__main__":
242-
pass

sqlalchemyseed/validator.py

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,11 @@ def check_source_data(source_data, source_key: Key):
9999
raise errors.EmptyDataError("Empty list, 'data' or 'filter' list should not be empty.")
100100

101101

102-
def iter_reference_relationships(kwargs: dict, ref_prefix):
103-
for attr_name, value in kwargs.items():
104-
if attr_name.startswith(ref_prefix):
105-
# removed prefix
106-
yield attr_name[len(ref_prefix):], value
102+
# def iter_reference_relationships(kwargs: dict, ref_prefix):
103+
# for attr_name, value in kwargs.items():
104+
# if attr_name.startswith(ref_prefix):
105+
# # removed prefix
106+
# yield attr_name[len(ref_prefix):], value
107107

108108

109109
class SchemaValidator:
@@ -123,9 +123,9 @@ def _pre_validate(cls, entities: dict, is_parent=True, ref_prefix='!'):
123123
return
124124
if isinstance(entities, dict):
125125
return cls._validate(entities, is_parent, ref_prefix)
126-
elif isinstance(entities, list):
127-
for entity in entities:
128-
cls._pre_validate(entity, is_parent, ref_prefix)
126+
# iterate list
127+
for entity in entities:
128+
cls._pre_validate(entity, is_parent, ref_prefix)
129129

130130
@classmethod
131131
def _validate(cls, entity: dict, entity_is_parent=True, ref_prefix='!'):
@@ -139,10 +139,9 @@ def _validate(cls, entity: dict, entity_is_parent=True, ref_prefix='!'):
139139
check_source_data(source_data, source_key)
140140

141141
if isinstance(source_data, list):
142-
143142
for item in source_data:
144143
if not source_key.is_valid_type(item):
145-
raise TypeError(
144+
raise errors.InvalidDataTypeError(
146145
f"Invalid type, '{source_key.label}' should be '{source_key.type}'")
147146

148147
# check if item is a relationship attribute
@@ -156,8 +155,3 @@ def _scan_attributes(cls, source_data: dict, ref_prefix):
156155
for key, value in source_data.items():
157156
if str(key).startswith(ref_prefix):
158157
cls._pre_validate(value, is_parent=False, ref_prefix=ref_prefix)
159-
160-
161-
if __name__ == '__main__':
162-
instance = [[]]
163-
SchemaValidator.validate(instance)

tests/instances.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,25 @@
55
}
66
}
77

8+
PARENT_INVALID = 'str is not valid type for parent'
9+
10+
PARENT_EMPTY = []
11+
12+
PARENT_EMPTY_DATA_LIST_INVALID = {
13+
'model': 'tests.models.Company',
14+
'data': []
15+
}
16+
17+
PARENT_MISSING_MODEL_INVALID = {
18+
'data': {
19+
20+
}
21+
}
22+
23+
PARENT_INVALID_MODEL_INVALID = {
24+
'model': 9_999
25+
}
26+
827
PARENT_WITH_EXTRA_LENGTH_INVALID = {
928
'model': 'tests.models.Company',
1029
'data': {
@@ -34,6 +53,19 @@
3453
]
3554
}
3655

56+
PARENT_WITH_DATA_AND_INVALID_DATA_INVALID = {
57+
'model': 'tests.models.Company',
58+
'data': [
59+
{},
60+
9_999_999
61+
]
62+
}
63+
64+
PARENT_WITH_INVALID_DATA_INVALID = {
65+
'model': 'tests.models.Company',
66+
'data': 'str is an invalid type of \'data\''
67+
}
68+
3769
PARENTS = [
3870
{
3971
'model': 'tests.models.Company',

tests/test_validator.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import unittest
22

33
from sqlalchemyseed import errors
4-
from sqlalchemyseed.validator import SchemaValidator
4+
from sqlalchemyseed.validator import SchemaValidator, Key
55
from tests import instances as ins
66

77

@@ -10,6 +10,25 @@ class TestSchemaValidator(unittest.TestCase):
1010
def test_parent(self):
1111
self.assertIsNone(SchemaValidator.validate(ins.PARENT))
1212

13+
def test_parent_invalid(self):
14+
self.assertRaises(errors.InvalidDataTypeError,
15+
lambda: SchemaValidator.validate(ins.PARENT_INVALID))
16+
17+
def test_parent_empty(self):
18+
self.assertIsNone(SchemaValidator.validate(ins.PARENT_EMPTY))
19+
20+
def test_parent_empty_data_list_invalid(self):
21+
self.assertRaises(errors.EmptyDataError,
22+
lambda: SchemaValidator.validate(ins.PARENT_EMPTY_DATA_LIST_INVALID))
23+
24+
def test_parent_missing_model_invalid(self):
25+
self.assertRaises(errors.MissingRequiredKeyError,
26+
lambda: SchemaValidator.validate(ins.PARENT_MISSING_MODEL_INVALID))
27+
28+
def test_parent_invalid_model_invalid(self):
29+
self.assertRaises(errors.InvalidDataTypeError,
30+
lambda: SchemaValidator.validate(ins.PARENT_INVALID_MODEL_INVALID))
31+
1332
def test_parent_with_extra_length_invalid(self):
1433
self.assertRaises(errors.MaxLengthExceededError,
1534
lambda: SchemaValidator.validate(ins.PARENT_WITH_EXTRA_LENGTH_INVALID))
@@ -24,6 +43,14 @@ def test_parent_without_data_invalid(self):
2443
self.assertRaises(errors.MissingRequiredKeyError,
2544
lambda: SchemaValidator.validate(ins.PARENT_WITHOUT_DATA_INVALID))
2645

46+
def test_parent_with_data_and_invalid_data_invalid(self):
47+
self.assertRaises(errors.InvalidDataTypeError,
48+
lambda: SchemaValidator.validate(ins.PARENT_WITH_DATA_AND_INVALID_DATA_INVALID))
49+
50+
def test_parent_with_invalid_data_invalid(self):
51+
self.assertRaises(errors.InvalidDataTypeError,
52+
lambda: SchemaValidator.validate(ins.PARENT_WITH_INVALID_DATA_INVALID))
53+
2754
def test_parent_to_child(self):
2855
self.assertIsNone(SchemaValidator.validate(ins.PARENT_TO_CHILD))
2956

@@ -38,3 +65,17 @@ def test_parent_to_children_with_multi_data(self):
3865

3966
def test_parent_to_children_with_multi_data_without_model(self):
4067
self.assertIsNone(SchemaValidator.validate(ins.PARENT_TO_CHILDREN_WITH_MULTI_DATA_WITHOUT_MODEL))
68+
69+
70+
class TestKey(unittest.TestCase):
71+
def test_key_equal_key(self):
72+
self.assertEqual(Key.model(), Key(label='model', type_=str))
73+
74+
def test_key_not_equal(self):
75+
self.assertNotEqual(Key.model(), Key.data())
76+
77+
def test_key_equal_string(self):
78+
self.assertEqual(Key.model(), 'model')
79+
80+
def test_key_not_equal_other_instance(self):
81+
self.assertNotEqual(Key.model(), object())

0 commit comments

Comments
 (0)