コード例 #1
0
def test_middleware():
    """
    Verify that Middleware can access Resources and that
    the Middleware is setup and torndown.
    """
    class TestMiddleware(object):
        """
        Example middleware that sets it's state at
        setup and teardown.
        """
        def __call__(self, context):
            context.store['state'] = 'setup'
            yield
            context.store['state'] = 'torndown'

    data_store = {}

    data_manager = DataManager()
    data_manager.register_services(test=TestService())
    # Middleware that starts and ends with the context
    data_manager.register_context_middleware(
        TestMiddleware(),
    )
    data_manager.register_resources(
        store=ValueResource(data_store)
    )

    with data_manager.dal() as dal:
        assert dal.test.get_state() == 'setup'
        dal.test.change_state('middle')
        assert dal.test.get_state() == 'middle'

    assert data_store['state'] == 'torndown'
コード例 #2
0
def test_resource_setup_and_teardown():
    """
    Verify that Resources are setup and torndown.
    """
    class TestResource(object):
        """
        Example resource that sets as state at
        setup/teardown.
        """
        def __init__(self, store):
            self._store = store

        def __call__(self, context):
            self._store['state'] = 'setup'
            yield self._store['state']
            self._store['state'] = 'torndown'

    store = {}
    data_manager = DataManager()
    data_manager.register_resources(test_state=TestResource(store))

    with data_manager.context() as ctx:
        assert 'test_state' not in ctx, 'Resource should be lazy created'
        assert ctx.test_state == 'setup', 'Resource should have been setup'

    assert store['state'] == 'torndown', 'Resource should have been torndown'
    assert len(ctx.get_resource_exit_errors()) == 0
コード例 #3
0
def test_resource_that_has_setup_error():
    """
    Verify that a resource that raises an exception on setup
    prevents dal context from continuing.
    """
    class SetupError(Exception):
        pass

    def error_resource(context):
        if True:
            raise SetupError()
        pytest.fail('Should never get to the point of yielding')
        yield
        pytest.fail('Should never recover')

    data_manager = DataManager()
    data_manager.register_resources(test=error_resource)

    with pytest.raises(SetupError):
        with data_manager.context() as ctx:
            try:
                assert ctx.test
            except SetupError:
                # Expected
                raise
            else:
                pytest.fail('Should have raised SetupError inside context')

    # Even though an error occurred during setup, the resource
    # never has a chance to recover so can't generate any new
    # errors on exit
    assert len(ctx.get_resource_exit_errors()) == 0
コード例 #4
0
def test_resource_setup_and_teardown():
    """
    Verify that Resources are setup and torndown.
    """
    class TestResource(object):
        """
        Example resource that sets as state at
        setup/teardown.
        """
        def __init__(self, store):
            self._store = store

        def __call__(self, context):
            self._store['state'] = 'setup'
            yield self._store['state']
            self._store['state'] = 'torndown'

    store = {}
    data_manager = DataManager()
    data_manager.register_resources(
        test_state=TestResource(store)
    )

    with data_manager.context() as ctx:
        assert 'test_state' not in ctx, 'Resource should be lazy created'
        assert ctx.test_state == 'setup', 'Resource should have been setup'

    assert store['state'] == 'torndown', 'Resource should have been torndown'
    assert len(ctx.get_resource_exit_errors()) == 0
コード例 #5
0
def test_middleware():
    """
    Verify that Middleware can access Resources and that
    the Middleware is setup and torndown.
    """
    class TestMiddleware(object):
        """
        Example middleware that sets it's state at
        setup and teardown.
        """
        def __call__(self, context):
            context.store['state'] = 'setup'
            yield
            context.store['state'] = 'torndown'

    data_store = {}

    data_manager = DataManager()
    data_manager.register_services(test=StateTestService())
    # Middleware that starts and ends with the context
    data_manager.register_context_middleware(TestMiddleware(), )
    data_manager.register_resources(store=ValueResource(data_store))

    with data_manager.dal() as dal:
        assert dal.test.get_state() == 'setup'
        dal.test.change_state('middle')
        assert dal.test.get_state() == 'middle'

    assert data_store['state'] == 'torndown'
コード例 #6
0
ファイル: test_services.py プロジェクト: six8/polydatum
def get_dam():
    data_manager = DataManager()
    data_manager.register_services(users=UserService().register_services(profile=UserProfileService()))
    data_manager.register_resources(
        user_db=MockStoreResource(MockStore()), user_profile_db=MockStoreResource(MockStore())
    )
    return data_manager
コード例 #7
0
def test_resource_that_has_setup_error():
    """
    Verify that a resource that raises an exception on setup
    prevents dal context from continuing.
    """
    class SetupError(Exception):
        pass

    def error_resource(context):
        if True:
            raise SetupError()
        pytest.fail('Should never get to the point of yielding')
        yield
        pytest.fail('Should never recover')

    data_manager = DataManager()
    data_manager.register_resources(test=error_resource)

    with pytest.raises(SetupError):
        with data_manager.context() as ctx:
            try:
                assert ctx.test
            except SetupError:
                # Expected
                raise
            else:
                pytest.fail('Should have raised SetupError inside context')

    # Even though an error occurred during setup, the resource
    # never has a chance to recover so can't generate any new
    # errors on exit
    assert len(ctx.get_resource_exit_errors()) == 0
コード例 #8
0
def get_dam():
    data_manager = DataManager()
    data_manager.register_services(users=UserService().register_services(
        profile=UserProfileService()))
    data_manager.register_resources(
        user_db=MockStoreResource(MockStore()),
        user_profile_db=MockStoreResource(MockStore()),
    )
    return data_manager
コード例 #9
0
def test_register_unique_resource():
    """
    Verify you can not register an existing resource
    """
    def resource(context):
        yield

    data_manager = DataManager()
    data_manager.register_resources(test=resource)

    with pytest.raises(AlreadyExistsException):
        data_manager.register_resources(test=resource)
コード例 #10
0
def test_register_unique_resource():
    """
    Verify you can not register an existing resource
    """
    def resource(context):
        yield

    data_manager = DataManager()
    data_manager.register_resources(test=resource)

    with pytest.raises(AlreadyExistsException):
        data_manager.register_resources(test=resource)
コード例 #11
0
def test_replace_unique_resource():
    """
    Verify you can replace an existing resource
    """
    def resource_a(context):
        yield 'a'

    def resource_b(context):
        yield 'b'

    data_manager = DataManager()
    data_manager.register_resources(test=resource_a)

    data_manager.replace_resource('test', resource_b)

    with data_manager.context() as ctx:
        assert ctx.test == 'b'
コード例 #12
0
def test_replace_unique_resource():
    """
    Verify you can replace an existing resource
    """

    def resource_a(context):
        yield 'a'

    def resource_b(context):
        yield 'b'

    data_manager = DataManager()
    data_manager.register_resources(test=resource_a)

    data_manager.replace_resource('test', resource_b)

    with data_manager.context() as ctx:
        assert ctx.test == 'b'
コード例 #13
0
def test_resource_that_yields_too_much():
    """
    Verify that a resource that yields more
    than once raises a RuntimeError, but is suppressed
    """
    def chatty_resource(context):
        """
        Resource should only yield once
        """
        yield True
        yield False

    data_manager = DataManager()
    data_manager.register_resources(test=chatty_resource)

    with data_manager.context() as ctx:
        assert ctx.test

    assert ctx.get_resource_exit_errors()[0][0] is RuntimeError
コード例 #14
0
def test_resource_that_yields_too_much():
    """
    Verify that a resource that yields more
    than once raises a RuntimeError, but is suppressed
    """
    def chatty_resource(context):
        """
        Resource should only yield once
        """
        yield True
        yield False

    data_manager = DataManager()
    data_manager.register_resources(test=chatty_resource)

    with data_manager.context() as ctx:
        assert ctx.test

    assert ctx.get_resource_exit_errors()[0][0] is RuntimeError
コード例 #15
0
def test_resource_active_context():
    """
    Verify that Resources can not be used if the context is not active.
    """
    data_manager = DataManager()
    data_manager.register_resources(test=ValueResource(True))

    ctx = data_manager.context()

    with pytest.raises(RuntimeError):
        assert ctx.test
        pytest.fail('Resource should not be useable when context has not been setup')

    with ctx:
        assert ctx.test is True

    assert len(ctx.get_resource_exit_errors()) == 0

    with pytest.raises(RuntimeError):
        assert ctx.test
        pytest.fail('Resource should not be useable when context has been torndown')
コード例 #16
0
def test_resource_that_does_not_yield():
    """
    Verify that a resource that does not yield raises a
    ResourceSetupException and ends the context
    """
    def bogus_resource(context):
        """
        This is a valid generator function because of the ``yield``
        but the ``yield`` will never occur so this is an invalid resource.
        Resources must ``yield`` once to be valid.
        """
        if False:
            yield

    data_manager = DataManager()
    data_manager.register_resources(test=bogus_resource)

    with pytest.raises(ResourceSetupException):
        with data_manager.context() as ctx:
            assert ctx.test
            pytest.fail('Context should not have continued')

    assert len(ctx.get_resource_exit_errors()) == 0
コード例 #17
0
def test_resource_active_context():
    """
    Verify that Resources can not be used if the context is not active.
    """
    data_manager = DataManager()
    data_manager.register_resources(test=ValueResource(True))

    ctx = data_manager.context()

    with pytest.raises(RuntimeError):
        assert ctx.test
        pytest.fail(
            'Resource should not be useable when context has not been setup')

    with ctx:
        assert ctx.test is True

    assert len(ctx.get_resource_exit_errors()) == 0

    with pytest.raises(RuntimeError):
        assert ctx.test
        pytest.fail(
            'Resource should not be useable when context has been torndown')
コード例 #18
0
def test_resource_that_does_not_yield():
    """
    Verify that a resource that does not yield raises a
    ResourceSetupException and ends the context
    """
    def bogus_resource(context):
        """
        This is a valid generator function because of the ``yield``
        but the ``yield`` will never occur so this is an invalid resource.
        Resources must ``yield`` once to be valid.
        """
        if False:
            yield

    data_manager = DataManager()
    data_manager.register_resources(test=bogus_resource)


    with pytest.raises(ResourceSetupException):
        with data_manager.context() as ctx:
            assert ctx.test
            pytest.fail('Context should not have continued')

    assert len(ctx.get_resource_exit_errors()) == 0