示例#1
0
def test_view_after_doesnt_apply_to_exception_view():
    class App(morepath.App):
        pass

    class Root(object):
        pass

    class MyException(Exception):
        pass

    @App.path(model=Root, path='')
    def get_root():
        return Root()

    @App.view(model=Root)
    def view(self, request):
        @request.after
        def set_header(response):
            response.headers.add('Foo', 'FOO')
        raise MyException()

    @App.view(model=MyException)
    def exc_view(self, request):
        return "My exception"

    dectate.commit(App)

    c = Client(App())

    response = c.get('/')
    assert response.body == b'My exception'
    assert response.headers.get('Foo') is None
示例#2
0
def test_dump_json():
    class App(morepath.App):
        pass

    @App.dump_json(model=Foo)
    def dump_foo():
        pass

    @App.dump_json(model=Bar)
    def dump_bar():
        pass

    dectate.commit(App)

    r = objects(dectate.query_app(
        App, 'dump_json'))

    assert r == [dump_foo, dump_bar]

    r = objects(dectate.query_app(
        App, 'dump_json',
        model='morepath.tests.test_querytool.Foo'))

    assert r == [dump_foo]

    r = objects(dectate.query_app(
        App, 'dump_json',
        model='morepath.tests.test_querytool.SubFoo'))

    assert r == [dump_foo]
示例#3
0
def test_predicate_fallback():
    class App(morepath.App):
        pass

    dectate.commit(App)

    r = objects(dectate.query_app(App, 'predicate_fallback'))
    assert r == [
        core.model_not_found,
        core.name_not_found,
        core.method_not_allowed,
        core.body_model_unprocessable
    ]

    r = objects(dectate.query_app(App, 'predicate_fallback',
                                  dispatch='morepath.generic.view'))
    assert r == [
        core.model_not_found,
        core.name_not_found,
        core.method_not_allowed,
        core.body_model_unprocessable
    ]

    # there aren't any predicates for path
    r = objects(dectate.query_app(App, 'predicate_fallback',
                                  dispatch='morepath.generic.path'))
    assert r == []

    r = objects(dectate.query_app(App, 'predicate_fallback',
                                  func='morepath.core.model_predicate'))
    assert r == [
        core.model_not_found,
    ]
示例#4
0
def test_view_body_model():
    class App(morepath.App):
        pass

    @App.view(model=Foo, request_method='POST', body_model=Base)
    def foo_base(self, request):
        pass

    @App.view(model=Foo, request_method='POST', body_model=Foo)
    def foo_foo(self, request):
        pass

    dectate.commit(App)

    r = objects(dectate.query_app(
        App, 'view',
        model='morepath.tests.test_querytool.Foo',
        body_model='morepath.tests.test_querytool.Base'))

    assert r == [foo_base]

    r = objects(dectate.query_app(
        App, 'view',
        model='morepath.tests.test_querytool.Foo',
        body_model='morepath.tests.test_querytool.Foo'))
    assert r == [foo_base, foo_foo]
示例#5
0
def test_template_directory():
    class App(morepath.App):
        pass

    # non-decorator so we can import template_directory_a
    App.template_directory()(template_directory_a)

    @App.template_directory(after=template_directory_a, name='blah')
    def b():
        return '/'

    dectate.commit(App)

    r = objects(dectate.query_app(App, 'template_directory'))

    assert r == [template_directory_a, b]

    r = objects(dectate.query_app(App, 'template_directory',
                                  name='blah'))

    assert r == [b]

    r = objects(dectate.query_app(
        App, 'template_directory',
        after='morepath.tests.test_querytool.template_directory_a'))
    assert r == [b]
示例#6
0
def test_mount():
    class App(morepath.App):
        pass

    @App.path(path='foo', model=Foo)
    def get_foo():
        pass

    @App.mount(path='mounted', app=Mounted)
    def mount_app():
        return Mounted()

    dectate.commit(App, Mounted)

    r = objects(dectate.query_app(
        App, 'mount'))

    assert r == [get_foo, mount_app]

    r = objects(dectate.query_app(
        App, 'mount', app='morepath.tests.test_querytool.Mounted'))

    assert r == [mount_app]

    r = objects(dectate.query_app(
        App, 'mount', model='morepath.tests.test_querytool.Foo'))

    assert r == [get_foo]
示例#7
0
def test_defer_link_to_parent_from_root():
    class root(morepath.App):
        pass

    class sub(morepath.App):
        pass

    @root.path(path='')
    class Model(object):
        pass

    class OtherModel(object):
        pass

    @root.view(model=Model)
    def model_default(self, request):
        return request.link(OtherModel())

    @root.defer_links(model=OtherModel)
    def get_parent(app, obj):
        return app.parent

    dectate.commit(root, sub)

    c = Client(root())

    with pytest.raises(LinkError):
        c.get('/')
示例#8
0
def test_excview_named_view():
    class app(morepath.App):
        pass

    @app.path(path='')
    class Root(object):
        pass

    class MyException(Exception):
        pass

    @app.view(model=Root, name='view')
    def view(self, request):
        raise MyException()

    # the view name should have no infleunce on myexception lookup
    @app.view(model=MyException)
    def myexception_default(self, request):
        return "My exception"

    dectate.commit(app)

    c = Client(app())
    response = c.get('/view')
    assert response.body == b'My exception'
示例#9
0
def test_function():
    class App(morepath.App):
        pass

    @App.predicate(generic, name='v', default='', index=reg.KeyIndex)
    def get(v):
        return v

    @App.function(generic, v='A')
    def a(v):
        return v

    @App.function(generic, v='B')
    def b(v):
        return v

    dectate.commit(App)

    app = App()

    assert generic('A', lookup=app.lookup) == 'A'
    assert generic('B', lookup=app.lookup) == 'B'

    r = objects(dectate.query_app(App, 'function'))
    assert r == [a, b]

    r = objects(
        dectate.query_app(App, 'function',
                          func='morepath.tests.test_querytool.generic'))
    assert r == [a, b]

    r = objects(dectate.query_app(App, 'function', v='A'))
    assert r == [a]
示例#10
0
def test_permission_directive_no_identity():
    class app(morepath.App):
        pass

    class Model(object):
        def __init__(self, id):
            self.id = id

    class Permission(object):
        pass

    @app.path(model=Model, path='{id}',
              variables=lambda model: {'id': model.id})
    def get_model(id):
        return Model(id)

    @app.permission_rule(model=Model, permission=Permission, identity=None)
    def get_permission(identity, model, permission):
        if model.id == 'foo':
            return True
        else:
            return False

    @app.view(model=Model, permission=Permission)
    def default(self, request):
        return "Model: %s" % self.id

    dectate.commit(app)

    c = Client(app())

    response = c.get('/foo')
    assert response.body == b'Model: foo'
    response = c.get('/bar', status=403)
示例#11
0
def test_predicates():
    class app(App):
        pass

    dectate.commit(app)

    def view(self, request):
        return "all"

    def post_view(self, request):
        return "post"

    view_registry = app.config.view_registry

    view_registry.register_view(dict(model=Model), view)
    view_registry.register_view(
        dict(model=Model, request_method='POST'),
        post_view)

    model = Model()
    assert resolve_response(
        model, app().request(get_environ(path=''))).body == b'all'
    assert (
        resolve_response(
            model, app().request(get_environ(path='', method='POST'))).body ==
        b'post')
示例#12
0
def test_no_permission():
    class app(morepath.App):
        pass

    class Model(object):
        def __init__(self, id):
            self.id = id

    class Permission(object):
        pass

    @app.path(model=Model, path='{id}',
              variables=lambda model: {'id': model.id})
    def get_model(id):
        return Model(id)

    @app.view(model=Model, permission=Permission)
    def default(self, request):
        return "Model: %s" % self.id

    dectate.commit(app)

    c = Client(app())

    c.get('/foo', status=403)
示例#13
0
def test_method():

    @App.predicate(App.generic, name='v', default='', index=reg.KeyIndex)
    def get(self, v):
        return v

    @App.method(App.generic, v='A')
    def a(app, v):
        return v

    @App.method(App.generic, v='B')
    def b(app, v):
        return v

    dectate.commit(App)

    app = App()

    assert app.generic('A') == 'A'
    assert app.generic('B') == 'B'

    r = objects(dectate.query_app(App, 'method'))
    assert r == [a, b]

    r = objects(
        dectate.query_app(
            App, 'method',
            dispatch_method='morepath.tests.test_querytool.App.generic'))
    assert r == [a, b]

    r = objects(dectate.query_app(App, 'method', v='A'))
    assert r == [a]
示例#14
0
def test_other_exception_excview():
    class app(morepath.App):
        pass

    class MyException(Exception):
        pass

    @app.path(path='')
    class Root(object):
        pass

    @app.view(model=Root)
    def root_default(self, request):
        raise MyException()

    @app.view(model=MyException)
    def myexception_default(self, request):
        return "My exception"

    dectate.commit(app)

    c = Client(app())

    response = c.get('/')
    assert response.body == b'My exception'
示例#15
0
def test_app_extends_settings():
    class alpha(morepath.App):
        pass

    class beta(alpha):
        pass

    @alpha.setting('one', 'foo')
    def get_foo_setting():
        return 'FOO'

    @beta.setting('one', 'bar')
    def get_bar_setting():
        return 'BAR'

    dectate.commit(alpha, beta)

    alpha_inst = alpha()

    settings = alpha_inst.config.setting_registry

    assert settings.one.foo == 'FOO'
    with pytest.raises(AttributeError):
        settings.one.bar

    beta_inst = beta()
    settings = beta_inst.config.setting_registry

    assert settings.one.foo == 'FOO'
    assert settings.one.bar == 'BAR'
示例#16
0
def test_traject_consume_combination():

    class app(morepath.App):
        pass

    dectate.commit(app)

    traject = app.config.path_registry

    def get_model(foo):
        result = Model()
        result.foo = foo
        return result

    traject.add_pattern('special', (Special, paramfac))
    traject.add_pattern('{foo}', (get_model, paramfac))

    mount = app()

    found, request = consume(mount, 'something')
    assert isinstance(found, Model)
    assert request.unconsumed == []
    assert found.foo == 'something'

    found, request = consume(mount, 'special')
    assert isinstance(found, Special)
    assert request.unconsumed == []
示例#17
0
def test_traject_consume_parameter():
    class app(morepath.App):
        pass

    dectate.commit(app)

    traject = app.config.path_registry

    class Model(object):
        def __init__(self, a):
            self.a = a

    get_param = ParameterFactory({'a': 0}, {'a': Converter(int)}, [])
    traject.add_pattern('sub', (Model, get_param))

    mount = app()

    found, request = consume(mount, 'sub?a=1')
    assert isinstance(found, Model)
    assert found.a == 1
    assert request.unconsumed == []
    found, request = consume(mount, 'sub')
    assert isinstance(found, Model)
    assert found.a == 0
    assert request.unconsumed == []
示例#18
0
def test_filter_class():
    class MyApp(App):
        pass

    @MyApp.directive('view')
    class ViewAction(Action):
        config = {
            'registry': list
        }

        filter_compare = {
            'model': issubclass
        }

        def __init__(self, model):
            self.model = model

        def identifier(self, registry):
            return self.model

        def perform(self, obj, registry):
            registry.append((self.model, obj))

    class Alpha(object):
        pass

    class Beta(object):
        pass

    class Gamma(Beta):
        pass

    class Delta(Gamma):
        pass

    @MyApp.view(model=Alpha)
    def f():
        pass

    @MyApp.view(model=Beta)
    def g():
        pass

    @MyApp.view(model=Gamma)
    def h():
        pass

    @MyApp.view(model=Delta)
    def i():
        pass

    commit(MyApp)

    assert list(Query(ViewAction).filter(model=Alpha).obj()(MyApp)) == [f]

    assert list(Query(ViewAction).filter(model=Beta).obj()(MyApp)) == [g, h, i]

    assert list(Query(ViewAction).filter(model=Gamma).obj()(MyApp)) == [h, i]

    assert list(Query(ViewAction).filter(model=Delta).obj()(MyApp)) == [i]
示例#19
0
def test_filter_not_found():
    class MyApp(App):
        pass

    @MyApp.directive('foo')
    class FooAction(Action):
        config = {
            'registry': list
        }

        def __init__(self, name):
            self.name = name

        def identifier(self, registry):
            return self.name

        def perform(self, obj, registry):
            registry.append((self.name, obj))

    @MyApp.foo('a')
    def f():
        pass

    @MyApp.foo('b')
    def g():
        pass

    commit(MyApp)

    q = Query(FooAction).filter(unknown='a').attrs('name')

    assert list(q(MyApp)) == []
示例#20
0
def test_traject_nested_with_variable():
    class app(morepath.App):
        pass

    dectate.commit(app)

    traject = app.config.path_registry

    def get_model(id):
        result = Model()
        result.id = id
        return result

    def get_special(id):
        result = Special()
        result.id = id
        return result

    traject.add_pattern('{id}', (get_model, paramfac))
    traject.add_pattern('{id}/sub', (get_special, paramfac))

    mount = app()

    found, request = consume(mount, 'a')
    assert isinstance(found, Model)
    assert request.unconsumed == []
    found, request = consume(mount, 'b')
    assert isinstance(found, Model)
    assert request.unconsumed == []
    found, request = consume(mount, 'a/sub')
    assert isinstance(found, Special)
    assert request.unconsumed == []
示例#21
0
def test_traject_with_multiple_variables():
    class app(morepath.App):
        pass

    dectate.commit(app)

    traject = app.config.path_registry

    def get_model(first_id):
        result = Model()
        result.first_id = first_id
        return result

    def get_special(first_id, second_id):
        result = Special()
        result.first_id = first_id
        result.second_id = second_id
        return result
    traject.add_pattern('{first_id}', (get_model, paramfac))
    traject.add_pattern('{first_id}/{second_id}', (get_special, paramfac))

    mount = app()

    found, request = consume(mount, 'a')
    assert isinstance(found, Model)
    assert found.first_id == 'a'
    assert not hasattr(found, 'second_id')
    assert request.unconsumed == []

    found, request = consume(mount, 'a/b')
    assert isinstance(found, Special)
    assert found.first_id == 'a'
    assert found.second_id == 'b'
    assert request.unconsumed == []
示例#22
0
def test_converter():
    class App(morepath.App):
        pass

    dectate.commit(App)

    r = objects(dectate.query_app(App, 'converter'))

    expected = [
        core.int_converter,
        core.unicode_converter
    ]
    if not compat.PY3:
        expected.append(core.str_converter)

    expected.extend([
        core.date_converter,
        core.datetime_converter
    ])

    assert r == expected

    r = objects(dectate.query_app(App, 'converter', type=builtin_ref('int')))

    assert r == [
        core.int_converter
    ]
示例#23
0
def test_predicate_fallback():
    class App(morepath.App):
        pass

    dectate.commit(App)

    r = objects(dectate.query_app(App, 'predicate_fallback'))
    assert r == [
        core.model_not_found,
        core.name_not_found,
        core.method_not_allowed
    ]

    r = objects(dectate.query_app(App, 'predicate_fallback',
                                  dispatch='morepath.App.get_view'))
    assert r == [
        core.model_not_found,
        core.name_not_found,
        core.method_not_allowed
    ]

    # there aren't any predicates for class_path
    r = objects(dectate.query_app(
        App, 'predicate_fallback',
        dispatch='morepath.App._class_path'))
    assert r == []

    r = objects(dectate.query_app(App, 'predicate_fallback',
                                  func='morepath.core.model_predicate'))
    assert r == [
        core.model_not_found,
    ]
示例#24
0
def test_settings_function():
    morepath.enable_implicit()

    class app(morepath.App):
        pass

    @app.setting('section', 'name')
    def setting():
        return 'LAH'

    @app.path(path='')
    class Model(object):
        def __init__(self):
            pass

    @app.view(model=Model)
    def default(self, request):
        return request.app.settings.section.name

    @app.view(model=Model, name='generic')
    def generic(self, request):
        with pytest.deprecated_call():
            return morepath.settings().section.name

    dectate.commit(app)

    c = Client(app())

    response = c.get('/')
    assert response.body == b'LAH'

    response = c.get('/generic')
    assert response.body == b'LAH'
示例#25
0
def test_query():
    class FooAction(Action):
        config = {
            'registry': list
        }

        def __init__(self, name):
            self.name = name

        def identifier(self, registry):
            return self.name

        def perform(self, obj, registry):
            registry.append((self.name, obj))

    class MyApp(App):
        foo = directive(FooAction)

    @MyApp.foo('a')
    def f():
        pass

    @MyApp.foo('b')
    def g():
        pass

    commit(MyApp)

    q = Query(FooAction).attrs('name')

    assert list(q(MyApp)) == [
        {'name': 'a'},
        {'name': 'b'}
    ]
示例#26
0
def test_internal():
    class app(morepath.App):
        pass

    @app.path(path='')
    class Root(object):
        pass

    @app.json(model=Root)
    def root_default(self, request):
        return {'internal': request.view(self, name='internal')}

    @app.json(model=Root, name='internal', internal=True)
    def root_internal(self, request):
        return 'Internal!'

    dectate.commit(app)

    c = Client(app())

    response = c.get('/')

    assert response.body == b'{"internal": "Internal!"}'

    c.get('/internal', status=404)
示例#27
0
def test_filter_get_value_and_default():
    class FooAction(Action):
        def filter_get_value(self, name):
            return self.kw.get(name, NOT_FOUND)

        def __init__(self, name, **kw):
            self.name = name
            self.kw = kw

        def identifier(self):
            return tuple(sorted(self.kw.items()))

        def perform(self, obj):
            pass

    class MyApp(App):
        foo = directive(FooAction)

    @MyApp.foo(name='hello', x='a', y='b')
    def f():
        pass

    @MyApp.foo(name='bye', x='a', y='c')
    def g():
        pass

    commit(MyApp)

    q = Query(FooAction).filter(name='hello').attrs('name', 'x', 'y')

    assert list(q(MyApp)) == [{'x': 'a', 'y': 'b', 'name': 'hello'}]
示例#28
0
def test_traject_path_with_leading_slash():
    class App(morepath.App):
        pass

    root = Root()

    def get_model(id):
        model = Model()
        model.id = id
        return model

    dectate.commit(App)

    path_registry = App.config.path_registry

    path_registry.register_path(
        Root, '', lambda m: {}, None, None, None, False,
        lambda: root)
    path_registry.register_path(
        Model, '/foo/{id}', lambda model: {'id': model.id},
        None, None, None, False, get_model)

    mount = App()
    obj, request = consume(mount, 'foo/a')
    assert obj.id == 'a'
    obj, request = consume(mount, '/foo/a')
    assert obj.id == 'a'
示例#29
0
def test_register_path():
    class App(morepath.App):
        pass

    root = Root()

    def get_model(id):
        model = Model()
        model.id = id
        return model

    dectate.commit(App)

    path_registry = App.config.path_registry

    path_registry.register_path(
        Root, '', lambda m: {},
        None, None, None, False,
        lambda: root)
    path_registry.register_path(
        Model, '{id}', lambda model: {'id': model.id},
        None, None, None, False, get_model)

    app = App()

    obj, request = consume(app, 'a')
    assert obj.id == 'a'
    model = Model()
    model.id = 'b'

    info = app._get_path(model)

    assert info.path == 'b'
    assert info.parameters == {}
示例#30
0
def test_simple_config_logging():
    log = logging.getLogger('morepath.directive.path')

    test_handler = Handler()

    log.addHandler(test_handler)
    log.setLevel(logging.DEBUG)

    class App(morepath.App):
        pass

    @App.path(path='')
    class Model(object):
        pass

    dectate.commit(App)

    messages = [r.getMessage() for r in test_handler.records]
    assert len(messages) == 1
    if PY3:
        expected = (
            "@morepath.tests.test_config_logging.App.path(path='') on "
            "<class 'morepath.tests.test_config_logging."
            "test_simple_config_logging.<locals>.Model'>")
    else:
        expected = (
            "@morepath.tests.test_config_logging.App.path(path='') on "
            "<class 'morepath.tests.test_config_logging.Model'>")
    assert messages[0] == expected
示例#31
0
def test_app_section_settings_conflict():
    class app(morepath.App):
        pass

    @app.setting_section('one')
    def settings():
        return {'foo': "FOO", 'bar': "BAR"}

    @app.setting('one', 'foo')
    def get_foo():
        return 'another'

    with pytest.raises(ConflictError):
        dectate.commit(app)
示例#32
0
def test_view():
    class app(App):
        pass

    dectate.commit(app)

    def view(self, request):
        return "View!"

    app.config.view_registry.register_view(dict(model=Model), view)

    model = Model()
    result = resolve_response(model, app().request(get_environ(path='')))
    assert result.body == b'View!'
示例#33
0
def test_app_section_settings_conflict():
    class app(morepath.App):
        pass

    @app.setting_section("one")
    def settings():
        return {"foo": "FOO", "bar": "BAR"}

    @app.setting("one", "foo")
    def get_foo():
        return "another"

    with pytest.raises(ConflictError):
        dectate.commit(app)
示例#34
0
def test_response_returned():
    class app(morepath.App):
        pass

    dectate.commit(app)

    def view(self, request):
        return Response('Hello world!')

    app.config.view_registry.register_view(dict(model=Model), view)

    model = Model()
    response = resolve_response(model, app().request(get_environ(path='')))
    assert response.body == b'Hello world!'
示例#35
0
def test_traject_consume():
    class app(morepath.App):
        pass

    dectate.commit(app)

    traject = app.config.path_registry
    traject.add_pattern('sub', (Model, paramfac))

    mount = app()

    found, request = consume(mount, 'sub')
    assert isinstance(found, Model)
    assert request.unconsumed == []
示例#36
0
def test_root_conflict2():
    class app(morepath.App):
        pass

    @app.path(path='')
    class Root(object):
        pass

    @app.path(path='/')
    class Something(object):
        pass

    with pytest.raises(ConflictError):
        dectate.commit(app)
示例#37
0
def test_filter_multiple_fields():
    class FooAction(Action):
        config = {'registry': list}

        filter_compare = {'model': issubclass}

        def __init__(self, model, name):
            self.model = model
            self.name = name

        def identifier(self, registry):
            return (self.model, self.name)

        def perform(self, obj, registry):
            registry.append((self.model, self.name, obj))

    class MyApp(App):
        foo = directive(FooAction)

    class Alpha(object):
        pass

    class Beta(object):
        pass

    @MyApp.foo(model=Alpha, name='a')
    def f():
        pass

    @MyApp.foo(model=Alpha, name='b')
    def g():
        pass

    @MyApp.foo(model=Beta, name='a')
    def h():
        pass

    @MyApp.foo(model=Beta, name='b')
    def i():
        pass

    commit(MyApp)

    q = Query(FooAction)

    assert list(q.filter(model=Alpha, name='a').obj()(MyApp)) == [f]
    assert list(q.filter(model=Alpha, name='b').obj()(MyApp)) == [g]
    assert list(q.filter(model=Beta, name='a').obj()(MyApp)) == [h]
    assert list(q.filter(model=Beta, name='b').obj()(MyApp)) == [i]
示例#38
0
def test_permission_directive_identity():
    class app(morepath.App):
        pass

    class Model(object):
        def __init__(self, id):
            self.id = id

    class Permission(object):
        pass

    @app.verify_identity()
    def verify_identity(identity):
        return True

    @app.path(model=Model, path='{id}',
              variables=lambda model: {'id': model.id})
    def get_model(id):
        return Model(id)

    @app.permission_rule(model=Model, permission=Permission)
    def get_permission(identity, model, permission):
        if model.id == 'foo':
            return True
        else:
            return False

    @app.view(model=Model, permission=Permission)
    def default(self, request):
        return "Model: %s" % self.id

    @app.identity_policy()
    class IdentityPolicy(object):
        def identify(self, request):
            return Identity('testidentity')

        def remember(self, response, request, identity):
            pass

        def forget(self, response, request):
            pass

    dectate.commit(app)

    c = Client(app())

    response = c.get('/foo')
    assert response.body == b'Model: foo'
    response = c.get('/bar', status=403)
示例#39
0
def test_json_body_model():
    class app(morepath.App):
        pass

    class Collection(object):
        def __init__(self):
            self.items = []

        def add(self, item):
            self.items.append(item)

    class Item1(object):
        def __init__(self, value):
            self.value = value

    class Item2(object):
        def __init__(self, value):
            self.value = value

    collection = Collection()

    @app.path(path='/', model=Collection)
    def get_collection():
        return collection

    @app.json(model=Collection, request_method='POST', body_model=Item1)
    def default(self, request):
        self.add(request.body_obj)
        return 'done'

    @app.load_json()
    def load_json(json, request):
        if json['@type'] == 'Item1':
            return Item1(json['x'])
        elif json['@type'] == 'Item2':
            return Item2(json['x'])

    dectate.commit(app)

    c = Client(app())

    c.post_json('/', {'@type': 'Item1', 'x': 'foo'})

    assert len(collection.items) == 1
    assert isinstance(collection.items[0], Item1)
    assert collection.items[0].value == 'foo'

    c.post_json('/', {'@type': 'Item2', 'x': 'foo'}, status=422)
示例#40
0
def test_view_no_conflict_different_predicates():
    class app(morepath.App):
        pass

    class Model(object):
        pass

    @app.view(model=Model, name='a', request_method='GET')
    def a_view(self, request):
        pass

    @app.view(model=Model, name='a', request_method='POST')
    def b_view(self, request):
        pass

    dectate.commit(app)
示例#41
0
def first_default_registrations(articles_kb_app):
    # Omit the "order" to disambiguate
    @articles_kb_app.toctree()
    def toctree1(*args):
        return

    @articles_kb_app.toctree(system_order=50)
    def toctree2(*args):
        return

    @articles_kb_app.toctree(system_order=40)
    def toctree3(*args):
        return

    dectate.commit(articles_kb_app)
    yield (toctree1, toctree2, toctree3)
示例#42
0
def test_view_no_conflict_different_names():
    class app(morepath.App):
        pass

    class Model(object):
        pass

    @app.view(model=Model, name='a')
    def a_view(self, request):
        pass

    @app.view(model=Model, name='b')
    def b_view(self, request):
        pass

    dectate.commit(app)
示例#43
0
def test_app_section_settings():
    class app(morepath.App):
        pass

    @app.setting_section('one')
    def settings():
        return {'foo': "FOO", 'bar': "BAR"}

    dectate.commit(app)

    app_inst = app()

    s = app_inst.config.setting_registry

    assert s.one.foo == 'FOO'
    assert s.one.bar == 'BAR'
示例#44
0
def test_notfound_with_predicates():
    class app(morepath.App):
        pass

    dectate.commit(app)

    def view(self, request):
        return "view"

    app.get_view.register(View(view), model=Model)

    model = Model()
    request = app().request(get_environ(''))
    request.unconsumed = ['foo']
    with pytest.raises(HTTPNotFound):
        resolve_response(model, request)
示例#45
0
def test_render_html():
    class app(App):
        pass

    dectate.commit(app)

    def view(self, request):
        return '<p>Hello world!</p>'

    app.get_view.register(View(view, render=render_html), model=Model)

    request = app().request(get_environ(path=''))
    model = Model()
    response = resolve_response(model, request)
    assert response.body == b'<p>Hello world!</p>'
    assert response.content_type == 'text/html'
示例#46
0
def test_app_section_settings():
    class app(morepath.App):
        pass

    @app.setting_section("one")
    def settings():
        return {"foo": "FOO", "bar": "BAR"}

    dectate.commit(app)

    app_inst = app()

    s = app_inst.config.setting_registry

    assert s.one.foo == "FOO"
    assert s.one.bar == "BAR"
示例#47
0
def test_root_no_conflict_different_apps():
    class app_a(morepath.App):
        pass

    class app_b(morepath.App):
        pass

    @app_a.path(path='')
    class Root(object):
        pass

    @app_b.path(path='')
    class Something(object):
        pass

    dectate.commit(app_a, app_b)
示例#48
0
def test_predicate():
    class App(morepath.App):
        pass

    dectate.commit(App)

    r = objects(dectate.query_app(App, 'predicate'))
    assert r == [
        core.model_predicate,
        core.name_predicate,
        core.request_method_predicate,
        core.body_model_predicate
    ]

    r = objects(dectate.query_app(App, 'predicate',
                                  dispatch='morepath.App.get_view'))
    assert r == [
        core.model_predicate,
        core.name_predicate,
        core.request_method_predicate,
        core.body_model_predicate
    ]

    # there aren't any predicates for class_path
    r = objects(dectate.query_app(
        App, 'predicate',
        dispatch='morepath.App._class_path'))
    assert r == []

    r = objects(dectate.query_app(App, 'predicate',
                                  name='name'))
    assert r == [
        core.name_predicate,
    ]

    r = objects(dectate.query_app(App, 'predicate',
                                  index='reg.ClassIndex'))
    assert r == [
        core.model_predicate,
        core.body_model_predicate
    ]

    r = objects(dectate.query_app(App, 'predicate',
                                  after='morepath.core.model_predicate'))
    assert r == [
        core.name_predicate
    ]
示例#49
0
def test_converter():
    class App(morepath.App):
        pass

    dectate.commit(App)

    r = objects(dectate.query_app(App, "converter"))

    expected = [core.int_converter, core.unicode_converter]

    expected.extend([core.date_converter, core.datetime_converter])

    assert r == expected

    r = objects(dectate.query_app(App, "converter", type="builtins.int"))

    assert r == [core.int_converter]
示例#50
0
def test_view_conflict_with_html():
    class app(morepath.App):
        pass

    class Model(object):
        pass

    @app.view(model=Model, name='a')
    def a_view(self, request):
        pass

    @app.html(model=Model, name='a')
    def a1_view(self, request):
        pass

    with pytest.raises(ConflictError):
        dectate.commit(app)
示例#51
0
def test_url_parameter_list_unknown_explicit_converter():
    class app(morepath.App):
        pass

    class Model(object):
        def __init__(self, item):
            self.item = item

    class Unknown(object):
        pass

    @app.path(model=Model, path='/', converters={'item': [Unknown]})
    def get_model(item):
        return Model(item)

    with pytest.raises(DirectiveReportError):
        dectate.commit(app)
示例#52
0
def test_http_exception_excview():
    class app(morepath.App):
        pass

    @app.path(path='')
    class Root(object):
        pass

    @app.view(model=HTTPNotFound)
    def notfound_default(self, request):
        return "Not found!"

    dectate.commit(app)

    c = Client(app())
    response = c.get('/')
    assert response.body == b'Not found!'
示例#53
0
def test_model_conflict():
    class app(morepath.App):
        pass

    class A(object):
        pass

    @app.path(model=A, path='a')
    def get_a():
        return A()

    @app.path(model=A, path='a')
    def get_a_again():
        return A()

    with pytest.raises(ConflictError):
        dectate.commit(app)
示例#54
0
def test_traject_consume_factory_returns_none():
    class app(morepath.App):
        pass

    dectate.commit(app)

    traject = app.config.path_registry

    def get_model():
        return None

    traject.add_pattern('sub', (get_model, paramfac))

    found, request = consume(app(), 'sub')

    assert found is None
    assert request.unconsumed == ['sub']
示例#55
0
def test_multi_action_query():
    class FooAction(Action):
        config = {'registry': list}

        def __init__(self, name):
            self.name = name

        def identifier(self, registry):
            return self.name

        def perform(self, obj, registry):
            registry.append((self.name, obj))

    class BarAction(Action):
        config = {'registry': list}

        def __init__(self, name):
            self.name = name

        def identifier(self, registry):
            return self.name

        def perform(self, obj, registry):
            registry.append((self.name, obj))

    class MyApp(App):
        foo = directive(FooAction)
        bar = directive(BarAction)

    @MyApp.foo('a')
    def f():
        pass

    @MyApp.bar('b')
    def g():
        pass

    commit(MyApp)

    q = Query(FooAction, BarAction).attrs('name')

    assert sorted(list(q(MyApp)), key=lambda d: d['name']) == [{
        'name': 'a'
    }, {
        'name': 'b'
    }]
示例#56
0
def test_traject_nested_not_resolved_entirely_by_consumer():
    class app(morepath.App):
        pass

    dectate.commit(app)

    traject = app.config.path_registry
    traject.add_pattern('a', (Model, paramfac))

    mount = app()

    found, request = consume(mount, 'a')
    assert isinstance(found, Model)
    assert request.unconsumed == []
    found, request = consume(mount, 'a/b')
    assert isinstance(found, Model)
    assert request.unconsumed == ['b']
示例#57
0
def test_defer_link_should_not_cause_web_views_to_exist():
    class root(morepath.App):
        pass

    class sub(morepath.App):
        pass

    @root.path(path='')
    class Model(object):
        pass

    @root.view(model=Model)
    def model_default(self, request):
        return "Hello"

    @root.view(model=Model, name='extra')
    def model_extra(self, request):
        return "Extra"

    # note inheritance from model. we still don't
    # want the extra view to show up on the web
    @sub.path(path='')
    class SubModel(Model):
        pass

    @sub.view(model=SubModel)
    def sub_model_default(self, request):
        return request.link(Model())

    @root.mount(app=sub, path='sub')
    def mount_sub():
        return sub()

    @sub.defer_links(model=Model)
    def get_parent(app, obj):
        return app.parent

    dectate.commit(root, sub)

    c = Client(root())

    response = c.get('/sub')
    assert response.body == b'http://localhost/'

    c.get('/sub/+extra', status=404)
示例#58
0
def test_view_permission():
    class App(morepath.App):
        pass

    @App.view(model=Foo, name='n')
    def foo_n(self, request):
        pass

    @App.view(model=Foo, name='b', permission=BasePermission)
    def foo_b(self, request):
        pass

    @App.view(model=Foo, name='p', permission=Permission)
    def foo_p(self, request):
        pass

    @App.view(model=Foo, name='s', permission=SubPermission)
    def foo_s(self, request):
        pass

    dectate.commit(App)

    r = objects(dectate.query_app(
        App, 'view',
        permission='morepath.tests.test_querytool.BasePermission'))

    assert r == [foo_b, foo_p, foo_s]

    r = objects(dectate.query_app(
        App, 'view',
        permission='morepath.tests.test_querytool.Permission'))

    assert r == [foo_p, foo_s]

    r = objects(dectate.query_app(
        App, 'view',
        permission='morepath.tests.test_querytool.SubPermission'))

    assert r == [foo_s]

    r = objects(dectate.query_app(App, 'view',
                                  model='morepath.tests.test_querytool.Foo',
                                  permission=builtin_ref('None')))

    assert r == [foo_n]
示例#59
0
def test_request_view_in_mount():
    class app(morepath.App):
        pass

    class mounted(morepath.App):
        def __init__(self, mount_id):
            self.mount_id = mount_id

    @app.path(path='')
    class Root(object):
        pass

    @mounted.path(path='models/{id}')
    class Model(object):
        def __init__(self, id):
            self.id = id

    @mounted.view(model=Model)
    def model_default(self, request):
        return {'hey': 'Hey'}

    @app.view(model=Root)
    def root_default(self, request):
        child = request.app.child(mounted, id='foo')
        return request.view(Model('x'), app=child)['hey']

    @app.view(model=Root, name='inst')
    def root_inst(self, request):
        child = request.app.child(mounted(mount_id='foo'))
        return request.view(Model('x'), app=child)['hey']

    @app.mount(path='{id}', app=mounted,
               variables=lambda a: dict(id=a.mount_id))
    def get_context(id):
        return mounted(mount_id=id)

    dectate.commit(app, mounted)

    c = Client(app())

    response = c.get('/')
    assert response.body == b'Hey'

    response = c.get('/+inst')
    assert response.body == b'Hey'
示例#60
0
def test_named_mount_with_parameters():
    class app(morepath.App):
        pass

    class mounted(morepath.App):
        def __init__(self, mount_id):
            self.mount_id = mount_id

    @app.path(path='')
    class Root(object):
        pass

    @mounted.path(path='')
    class MountedRoot(object):
        def __init__(self, mount_id):
            assert isinstance(mount_id, int)
            self.mount_id = mount_id

    @mounted.view(model=MountedRoot)
    def root_default(self, request):
        return "The root for mount id: %s" % self.mount_id

    @app.mount(path='mounts/{mount_id}', app=mounted)
    def get_context(mount_id=0):
        return mounted(mount_id=mount_id)

    class Item(object):
        def __init__(self, id):
            self.id = id

    @mounted.path(path='items/{id}', model=Item)
    def get_item(id):
        return Item(id)

    @app.view(model=Root)
    def root_default2(self, request):
        child = request.app.child('mounts/{mount_id}', mount_id=3)
        return request.link(Item(4), app=child)

    dectate.commit(app, mounted)

    c = Client(app())

    response = c.get('/')
    assert response.body == b'http://localhost/mounts/3/items/4'