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()
Beispiel #2
0
def sessionmaker():
    """ yields a temporalized sessionmaker -- per test session """
    Session = orm.sessionmaker()

    yield temporal.temporal_session(Session)

    Session.close_all()
Beispiel #3
0
    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()
Beispiel #5
0
    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))
Beispiel #6
0
    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)
Beispiel #7
0
    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)
        )
Beispiel #8
0
    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()