diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-04-11 13:03:52 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-04-11 13:03:52 -0400 |
| commit | 747f5edd2192caae4ab79ff7dc9d79045b5bad0c (patch) | |
| tree | ae7c2655773ca0762a11a057a0c7cfffbe659902 /test/orm/test_mapper.py | |
| parent | 5280f26d45f6d79013d2da3bd5e0fe4a88117b20 (diff) | |
| download | sqlalchemy-747f5edd2192caae4ab79ff7dc9d79045b5bad0c.tar.gz | |
- [feature] Added new flag to @validates
include_removes. When True, collection
remove and attribute del events
will also be sent to the validation function,
which accepts an additional argument
"is_remove" when this flag is used.
Diffstat (limited to 'test/orm/test_mapper.py')
| -rw-r--r-- | test/orm/test_mapper.py | 64 |
1 files changed, 60 insertions, 4 deletions
diff --git a/test/orm/test_mapper.py b/test/orm/test_mapper.py index 1c5f29b71..79ae7ff59 100644 --- a/test/orm/test_mapper.py +++ b/test/orm/test_mapper.py @@ -1950,10 +1950,11 @@ class DeepOptionsTest(_fixtures.FixtureTest): class ValidatorTest(_fixtures.FixtureTest): def test_scalar(self): users = self.tables.users - + canary = [] class User(fixtures.ComparableEntity): @validates('name') def validate_name(self, key, name): + canary.append((key, name)) assert name != 'fred' return name + ' modified' @@ -1963,6 +1964,7 @@ class ValidatorTest(_fixtures.FixtureTest): eq_(u1.name, 'ed modified') assert_raises(AssertionError, setattr, u1, "name", "fred") eq_(u1.name, 'ed modified') + eq_(canary, [('name', 'ed'), ('name', 'fred')]) sess.add(u1) sess.flush() sess.expunge_all() @@ -1973,9 +1975,11 @@ class ValidatorTest(_fixtures.FixtureTest): self.tables.addresses, self.classes.Address) + canary = [] class User(fixtures.ComparableEntity): @validates('addresses') def validate_address(self, key, ad): + canary.append((key, ad)) assert '@' in ad.email_address return ad @@ -1983,8 +1987,11 @@ class ValidatorTest(_fixtures.FixtureTest): mapper(Address, addresses) sess = create_session() u1 = User(name='edward') - assert_raises(AssertionError, u1.addresses.append, Address(email_address='noemail')) - u1.addresses.append(Address(id=15, email_address='foo@bar.com')) + a0 = Address(email_address='noemail') + assert_raises(AssertionError, u1.addresses.append, a0) + a1 = Address(id=15, email_address='foo@bar.com') + u1.addresses.append(a1) + eq_(canary, [('addresses', a0), ('addresses', a1)]) sess.add(u1) sess.flush() sess.expunge_all() @@ -2019,11 +2026,60 @@ class ValidatorTest(_fixtures.FixtureTest): mapper(Address, addresses) eq_( - dict((k, v.__name__) for k, v in u_m.validators.items()), + dict((k, v[0].__name__) for k, v in u_m.validators.items()), {'name':'validate_name', 'addresses':'validate_address'} ) + def test_validator_w_removes(self): + users, addresses, Address = (self.tables.users, + self.tables.addresses, + self.classes.Address) + canary = [] + class User(fixtures.ComparableEntity): + + @validates('name', include_removes=True) + def validate_name(self, key, item, remove): + canary.append((key, item, remove)) + return item + + @validates('addresses', include_removes=True) + def validate_address(self, key, item, remove): + canary.append((key, item, remove)) + return item + + mapper(User, + users, + properties={'addresses':relationship(Address)}) + mapper(Address, addresses) + + u1 = User() + u1.name = "ed" + u1.name = "mary" + del u1.name + a1, a2, a3 = Address(), Address(), Address() + u1.addresses.append(a1) + u1.addresses.remove(a1) + u1.addresses = [a1, a2] + u1.addresses = [a2, a3] + + eq_(canary, [ + ('name', 'ed', False), + ('name', 'mary', False), + ('name', 'mary', True), + # append a1 + ('addresses', a1, False), + # remove a1 + ('addresses', a1, True), + # set to [a1, a2] - this is two appends + ('addresses', a1, False), ('addresses', a2, False), + # set to [a2, a3] - this is a remove of a1, + # append of a3. the appends are first. + ('addresses', a3, False), + ('addresses', a1, True), + ] + ) + class ComparatorFactoryTest(_fixtures.FixtureTest, AssertsCompiledSQL): def test_kwarg_accepted(self): users, Address = self.tables.users, self.classes.Address |
