def test_persist_on_commit_with_edit_no_clock_tick_with_strict_mode( self, session): temporal.temporal_session(session, strict_mode=True) create_activity = models.Activity(description='Create temp') session.add(create_activity) t = models.PersistOnCommitTable(prop_a=1234, activity=create_activity) session.add(t) session.commit() history_table = models.PersistOnCommitTable.temporal_options.history_models[ models.PersistOnCommitTable.prop_a.property] history_query = session.query(history_table).order_by( history_table.prop_a) assert history_query.count() == 1 session.flush() assert history_query.count() == 1 # we're setting this outside a clock tick, which won't get picked up by the history builder # since we never used clock_tick t.prop_a = 5678 with pytest.raises(AssertionError): session.commit()
def sessionmaker(): """ yields a temporalized sessionmaker -- per test session """ Session = orm.sessionmaker() yield temporal.temporal_session(Session) Session.close_all()
def test_is_temporal_session_on_temporal_session(self, session): # verify temporal session assert is_temporal_session(session) # verify double-wrapped session double_wrapped_session = temporal_session(session) assert is_temporal_session(double_wrapped_session)
def test_persist_no_temporal_changes(self, non_temporal_session): """temporalize after transaction has started to cover some additional edge cases""" session = temporal.temporal_session(non_temporal_session) t = models.NonTemporalTable() session.add(t) session.commit()
def test_allow_flushes_within_clock_ticks_when_strict_but_no_change(self, session, session_func_name): session = temporal.temporal_session(session, strict_mode=True) t = models.SimpleTableTemporal( prop_a=1, prop_b='foo', prop_c=datetime.datetime(2016, 5, 11, tzinfo=datetime.timezone.utc)) session.add(t) session.commit() with t.clock_tick(): t.prop_a = 1 eval('session.{func_name}()'.format(func_name=session_func_name))
def test_edit_on_double_wrapped(self, session): double_wrapped_session = temporal.temporal_session(session) t = models.SimpleTableTemporal( prop_a=1, prop_b='foo', prop_c=datetime.datetime(2016, 5, 11, 1, 2, 3, tzinfo=datetime.timezone.utc), prop_d={'foo': 'old value'}, prop_e=psql_extras.DateRange(datetime.date(2016, 1, 1), datetime.date(2016, 1, 10)), prop_f=['old', 'stuff'], ) double_wrapped_session.add(t) double_wrapped_session.commit() t = double_wrapped_session.query(models.SimpleTableTemporal).first() with t.clock_tick(): t.prop_a = 2 t.prop_b = 'bar' double_wrapped_session.commit() history_tables = { 'prop_a': temporal.get_history_model(models.SimpleTableTemporal.prop_a), 'prop_b': temporal.get_history_model(models.SimpleTableTemporal.prop_b), } for attr, history in history_tables.items(): clock_query = session.query(history) assert clock_query.count() == 2, \ "%r missing a history entry for initial value" % history recorded_history = clock_query[-1] assert 2 in recorded_history.vclock assert getattr(t, attr) == getattr(recorded_history, attr)
def test_disallow_flushes_on_changes_without_clock_ticks_when_strict(self, session, session_func_name): session = temporal.temporal_session(session, strict_mode=True) t = models.SimpleTableTemporal( prop_a=1, prop_b='foo', prop_c=datetime.datetime(2016, 5, 11, tzinfo=datetime.timezone.utc)) session.add(t) session.commit() # this change should have been done within a clock tick t.prop_a = 2 with pytest.raises(AssertionError) as excinfo: eval('session.{func_name}()'.format(func_name=session_func_name)) assert re.match( r'.*flush\(\) has triggered for a changed temporalized property outside of a clock tick.*', str(excinfo) )
def test_disallow_flushes_within_clock_ticks_when_strict( self, session, session_func_name): session = temporal.temporal_session(session, strict_mode=True) t = models.SimpleTableTemporal(prop_a=1, prop_b='foo', prop_c=datetime.datetime( 2016, 5, 11, tzinfo=datetime.timezone.utc)) session.add(t) session.commit() with t.clock_tick(): t.prop_a = 2 with pytest.raises(AssertionError) as excinfo: getattr(session, session_func_name)() assert re.match( r'.*flush\(\) has triggered for a changed temporalized property outside of a clock tick.*', str(excinfo), )
def test_persist_no_changes(self, non_temporal_session): """temporalize after transaction has started to cover some additional edge cases""" temporal.temporal_session(non_temporal_session)
def sessionmaker(): Session = orm.sessionmaker() yield temporal.temporal_session(Session) Session.close_all()