self.metadata = prev_meta
+def flag_combinations(*combinations):
+ """A facade around @testing.combinations() oriented towards boolean
+ keyword-based arguments.
+
+ Basically generates a nice looking identifier based on the keywords
+ and also sets up the argument names.
+
+ E.g.::
+
+ @testing.flag_combinations(
+ dict(lazy=False, passive=False),
+ dict(lazy=True, passive=False),
+ dict(lazy=False, passive=True),
+ dict(lazy=False, passive=True, raiseload=True),
+ )
+
+
+ would result in::
+
+ @testing.combinations(
+ ('', False, False, False),
+ ('lazy', True, False, False),
+ ('lazy_passive', True, True, False),
+ ('lazy_passive', True, True, True),
+ id_='iaaa',
+ argnames='lazy,passive,raiseload'
+ )
+
+ """
+
+ from . import config
+
+ keys = set()
+
+ for d in combinations:
+ keys.update(d)
+
+ keys = sorted(keys)
+
+ return config.combinations(
+ *[
+ ("_".join(k for k in keys if d.get(k, False)),)
+ + tuple(d.get(k, False) for k in keys)
+ for d in combinations
+ ],
+ id_="i" + ("a" * len(keys)),
+ argnames=",".join(keys)
+ )
+
+
def metadata_fixture(ddl="function"):
"""Provide MetaData for a pytest fixture."""
class InactiveHistoryNoRaiseTest(_fixtures.FixtureTest):
run_inserts = None
- def _run_test(self, detached, raiseload, backref, active_history, delete):
-
- if delete:
- assert not backref, "delete and backref are mutually exclusive"
-
- Address, addresses, users, User = (
- self.classes.Address,
- self.tables.addresses,
- self.tables.users,
- self.classes.User,
- )
-
- opts = {}
- if active_history:
- opts["active_history"] = True
- if raiseload:
- opts["lazy"] = "raise"
-
- mapper(
- Address,
- addresses,
- properties={
- "user": relationship(User, back_populates="addresses", **opts)
- },
- )
- mapper(
- User,
- users,
- properties={
- "addresses": relationship(Address, back_populates="user")
- },
- )
-
- s = Session()
-
- a1 = Address(email_address="a1")
- u1 = User(name="u1", addresses=[a1])
- s.add_all([a1, u1])
- s.commit()
-
- if backref:
- u1.addresses
-
- if detached:
- s.expunge(a1)
-
- def go():
- u1.addresses = []
-
- if active_history:
- if raiseload:
- assert_raises_message(
- exc.InvalidRequestError,
- "'Address.user' is not available due to lazy='raise'",
- go,
- )
- return
- elif detached:
- assert_raises_message(
- orm_exc.DetachedInstanceError,
- "lazy load operation of attribute 'user' "
- "cannot proceed",
- go,
- )
- return
- go()
- else:
- if detached:
- s.expunge(a1)
-
- if delete:
-
- def go():
- del a1.user
-
- else:
-
- def go():
- a1.user = None
-
- if active_history:
- if raiseload:
- assert_raises_message(
- exc.InvalidRequestError,
- "'Address.user' is not available due to lazy='raise'",
- go,
- )
- return
- elif detached:
- assert_raises_message(
- orm_exc.DetachedInstanceError,
- "lazy load operation of attribute 'user' "
- "cannot proceed",
- go,
- )
- return
- go()
-
- if detached:
- s.add(a1)
-
- s.commit()
-
- def test_replace_m2o(self):
- self._run_test(
+ @testing.flag_combinations(
+ dict(
detached=False,
raiseload=False,
backref=False,
delete=False,
active_history=False,
- )
-
- def test_replace_m2o_detached(self):
- self._run_test(
+ ),
+ dict(
detached=True,
raiseload=False,
backref=False,
delete=False,
active_history=False,
- )
-
- def test_replace_m2o_raiseload(self):
- self._run_test(
+ ),
+ dict(
detached=False,
raiseload=True,
backref=False,
delete=False,
active_history=False,
- )
-
- def test_replace_m2o_detached_raiseload(self):
- self._run_test(
+ ),
+ dict(
detached=True,
raiseload=True,
backref=False,
delete=False,
active_history=False,
- )
-
- def test_replace_m2o_backref(self):
- self._run_test(
+ ),
+ dict(
detached=False,
raiseload=False,
backref=True,
delete=False,
active_history=False,
- )
-
- def test_replace_m2o_detached_backref(self):
- self._run_test(
+ ),
+ dict(
detached=True,
raiseload=False,
backref=True,
delete=False,
active_history=False,
- )
-
- def test_replace_m2o_raiseload_backref(self):
- self._run_test(
+ ),
+ dict(
detached=False,
raiseload=True,
backref=True,
delete=False,
active_history=False,
- )
-
- def test_replace_m2o_detached_raiseload_backref(self):
- self._run_test(
+ ),
+ dict(
detached=True,
raiseload=True,
backref=True,
delete=False,
active_history=False,
- )
-
- def test_replace_m2o_activehistory(self):
- self._run_test(
+ ),
+ dict(
detached=False,
raiseload=False,
backref=False,
delete=False,
active_history=True,
- )
-
- def test_replace_m2o_detached_activehistory(self):
- self._run_test(
+ ),
+ dict(
detached=True,
raiseload=False,
backref=False,
delete=False,
active_history=True,
- )
-
- def test_replace_m2o_raiseload_activehistory(self):
- self._run_test(
+ ),
+ dict(
detached=False,
raiseload=True,
backref=False,
delete=False,
active_history=True,
- )
-
- def test_replace_m2o_detached_raiseload_activehistory(self):
- self._run_test(
+ ),
+ dict(
detached=True,
raiseload=True,
backref=False,
delete=False,
active_history=True,
- )
-
- def test_replace_m2o_backref_activehistory(self):
- self._run_test(
+ ),
+ dict(
detached=False,
raiseload=False,
backref=True,
delete=False,
active_history=True,
- )
-
- def test_replace_m2o_detached_backref_activehistory(self):
- self._run_test(
+ ),
+ dict(
detached=True,
raiseload=False,
backref=True,
delete=False,
active_history=True,
- )
-
- def test_replace_m2o_raiseload_backref_activehistory(self):
- self._run_test(
+ ),
+ dict(
detached=False,
raiseload=True,
backref=True,
delete=False,
active_history=True,
- )
-
- def test_replace_m2o_detached_raiseload_backref_activehistory(self):
- self._run_test(
+ ),
+ dict(
detached=True,
raiseload=True,
backref=True,
delete=False,
active_history=True,
- )
-
- def test_delete_m2o(self):
- self._run_test(
+ ),
+ dict(
detached=False,
raiseload=False,
backref=False,
delete=True,
active_history=False,
- )
-
- def test_delete_m2o_detached(self):
- self._run_test(
+ ),
+ dict(
detached=True,
raiseload=False,
backref=False,
delete=True,
active_history=False,
- )
-
- def test_delete_m2o_raiseload(self):
- self._run_test(
+ ),
+ dict(
detached=False,
raiseload=True,
backref=False,
delete=True,
active_history=False,
- )
-
- def test_delete_m2o_detached_raiseload(self):
- self._run_test(
+ ),
+ dict(
detached=True,
raiseload=True,
backref=False,
delete=True,
active_history=False,
- )
-
- def test_delete_m2o_activehistory(self):
- self._run_test(
+ ),
+ dict(
detached=False,
raiseload=False,
backref=False,
delete=True,
active_history=True,
- )
-
- def test_delete_m2o_detached_activehistory(self):
- self._run_test(
+ ),
+ dict(
detached=True,
raiseload=False,
backref=False,
delete=True,
active_history=True,
- )
-
- def test_delete_m2o_raiseload_activehistory(self):
- self._run_test(
+ ),
+ dict(
detached=False,
raiseload=True,
backref=False,
delete=True,
active_history=True,
- )
-
- def test_delete_m2o_detached_raiseload_activehistory(self):
- self._run_test(
+ ),
+ dict(
detached=True,
raiseload=True,
backref=False,
delete=True,
active_history=True,
+ ),
+ )
+ def test_m2o(self, detached, raiseload, backref, active_history, delete):
+
+ if delete:
+ assert not backref, "delete and backref are mutually exclusive"
+
+ Address, addresses, users, User = (
+ self.classes.Address,
+ self.tables.addresses,
+ self.tables.users,
+ self.classes.User,
+ )
+
+ opts = {}
+ if active_history:
+ opts["active_history"] = True
+ if raiseload:
+ opts["lazy"] = "raise"
+
+ mapper(
+ Address,
+ addresses,
+ properties={
+ "user": relationship(User, back_populates="addresses", **opts)
+ },
)
+ mapper(
+ User,
+ users,
+ properties={
+ "addresses": relationship(Address, back_populates="user")
+ },
+ )
+
+ s = Session()
+
+ a1 = Address(email_address="a1")
+ u1 = User(name="u1", addresses=[a1])
+ s.add_all([a1, u1])
+ s.commit()
+
+ if backref:
+ u1.addresses
+
+ if detached:
+ s.expunge(a1)
+
+ def go():
+ u1.addresses = []
+
+ if active_history:
+ if raiseload:
+ assert_raises_message(
+ exc.InvalidRequestError,
+ "'Address.user' is not available due to lazy='raise'",
+ go,
+ )
+ return
+ elif detached:
+ assert_raises_message(
+ orm_exc.DetachedInstanceError,
+ "lazy load operation of attribute 'user' "
+ "cannot proceed",
+ go,
+ )
+ return
+ go()
+ else:
+ if detached:
+ s.expunge(a1)
+
+ if delete:
+
+ def go():
+ del a1.user
+
+ else:
+
+ def go():
+ a1.user = None
+
+ if active_history:
+ if raiseload:
+ assert_raises_message(
+ exc.InvalidRequestError,
+ "'Address.user' is not available due to lazy='raise'",
+ go,
+ )
+ return
+ elif detached:
+ assert_raises_message(
+ orm_exc.DetachedInstanceError,
+ "lazy load operation of attribute 'user' "
+ "cannot proceed",
+ go,
+ )
+ return
+ go()
+
+ if detached:
+ s.add(a1)
+
+ s.commit()
class RelationDeprecationTest(fixtures.MappedTest):