from sqlalchemy import ForeignKey from sqlalchemy import Integer from sqlalchemy import String from sqlalchemy import testing from sqlalchemy.orm import relationship from sqlalchemy.testing import fixtures from sqlalchemy.testing.fixtures import fixture_session from sqlalchemy.testing.schema import Column from sqlalchemy.testing.schema import Table class O2OTest(fixtures.MappedTest): @classmethod def define_tables(cls, metadata): Table( "jack", metadata, Column( "id", Integer, primary_key=True, test_needs_autoincrement=True ), Column("number", String(50)), Column("status", String(20)), Column("subroom", String(5)), ) Table( "port", metadata, Column( "id", Integer, primary_key=True, test_needs_autoincrement=True ), Column("name", String(30)), Column("description", String(100)), Column("jack_id", Integer, ForeignKey("jack.id")), ) @classmethod def setup_mappers(cls): class Jack(cls.Basic): pass class Port(cls.Basic): pass @testing.combinations( (True, False), (False, False), (False, True), argnames="_legacy_inactive_history_style, active_history", ) def test_basic(self, _legacy_inactive_history_style, active_history): Port, port, jack, Jack = ( self.classes.Port, self.tables.port, self.tables.jack, self.classes.Jack, ) self.mapper_registry.map_imperatively(Port, port) self.mapper_registry.map_imperatively( Jack, jack, properties=dict( port=relationship( Port, backref="jack", uselist=False, active_history=active_history, _legacy_inactive_history_style=( _legacy_inactive_history_style ), ) ), ) session = fixture_session() j = Jack(number="101") session.add(j) p = Port(name="fa0/1") session.add(p) j.port = p session.flush() jid = j.id pid = p.id j = session.get(Jack, jid) p = session.get(Port, pid) assert p.jack is not None assert p.jack is j assert j.port is not None p.jack = None assert j.port is None session.expunge_all() j = session.get(Jack, jid) p = session.get(Port, pid) j.port = None if not active_history and not _legacy_inactive_history_style: session.flush() self.assert_(p.jack is None) else: self.assert_(p.jack is None) session.flush() session.delete(j) session.flush() @testing.combinations( (True,), (False,), argnames="_legacy_inactive_history_style" ) def test_simple_replace(self, _legacy_inactive_history_style): Port, port, jack, Jack = ( self.classes.Port, self.tables.port, self.tables.jack, self.classes.Jack, ) self.mapper_registry.map_imperatively(Port, port) self.mapper_registry.map_imperatively( Jack, jack, properties=dict( port=relationship( Port, uselist=False, _legacy_inactive_history_style=( _legacy_inactive_history_style ), ) ), ) s = fixture_session() p1 = Port(name="p1") j1 = Jack(number="j1", port=p1) s.add(j1) s.commit() j1.port = Port(name="p2") s.commit() assert s.query(Port).filter_by(name="p1").one().jack_id is None @testing.combinations( (True,), (False,), argnames="_legacy_inactive_history_style" ) def test_simple_del(self, _legacy_inactive_history_style): Port, port, jack, Jack = ( self.classes.Port, self.tables.port, self.tables.jack, self.classes.Jack, ) self.mapper_registry.map_imperatively(Port, port) self.mapper_registry.map_imperatively( Jack, jack, properties=dict( port=relationship( Port, uselist=False, _legacy_inactive_history_style=( _legacy_inactive_history_style ), ) ), ) s = fixture_session() p1 = Port(name="p1") j1 = Jack(number="j1", port=p1) s.add(j1) s.commit() del j1.port s.commit() assert s.query(Port).filter_by(name="p1").one().jack_id is None