def test_locateChildSpinneretResource(self): """ If ``locateChild`` returns something adaptable to `ISpinneretResource` it is adapted to an `IResource`. """ @implementer(ISpinneretResource) class _ResultingResource(object): def render_GET(zelf, request): request.setResponseCode(http.OK) return b'hello world' @implementer(ISpinneretResource) class _TestResource(object): def locateChild(zelf, request, segments): return _ResultingResource(), [] resource = SpinneretResource(_TestResource()) request = InMemoryRequest(['']) request.method = b'GET' result = getChildForRequest(resource, request) request.render(result) self.assertThat( b''.join(request.written), Equals(b'hello world')) self.assertThat( http.OK, Equals(request.responseCode)) self.assertThat( request.postpath, Equals([]))
def test_renderableResourceMethods(self): """ `IRenderable` results allow any HTTP method. """ class _TestElement(Element): loader = TagLoader(tags.span(u'Hello ', tags.em(u'World'))) @implementer(ISpinneretResource) class _TestResource(object): def locateChild(zelf, request, segments): return _TestElement(), [] resource = SpinneretResource(_TestResource()) request = InMemoryRequest(['']) request.method = 'POST' result = getChildForRequest(resource, request) request.render(result) self.assertThat( b''.join(request.written), Equals(b'<!DOCTYPE html>\n<span>Hello <em>World</em></span>')) self.assertThat( http.OK, Equals(request.responseCode)) self.assertThat( request.postpath, Equals([]))
def test_existingRenderer(self): """ Call the renderer defined that matches the request method. """ called = [] resource = Resource() request = InMemoryRequest([]) request.method = b'PUT' resource.render_PUT = called.append _renderResource(resource, request) self.assertThat( called, Equals([request]))
def test_renderDeferred(self): """ It is possible to return a `Deferred` from a render method. """ class _RenderDeferred(SpinneretResource): def render_GET(zelf, request): return d d = Deferred() resource = _RenderDeferred() request = InMemoryRequest([]) request.method = b'GET' request.render(resource) self.assertThat(request.written, Equals([])) d.callback(b'hello') self.assertThat(request.written, Equals([b'hello']))
def test_hasAllowedMethods(self): """ Raise `UnsupportedErrors`, with the value of ``resource.allowedMethods``, if there are no matching renderers. """ resource = Resource() request = InMemoryRequest([]) request.method = b'PUT' resource.allowedMethods = [b'GET', b'HEAD'] self.assertThat( partial(_renderResource, resource, request), MatchesException( UnsupportedMethod, MatchesStructure( allowedMethods=MatchesSetwise(Equals('GET'), Equals('HEAD')))))
def test_computeAllowedMethods(self): """ Raise `UnsupportedErrors`, computing the allowed methods, if there are no matching renderers. """ class _Resource(object): render_GET = identity render_HEAD = identity resource = _Resource() request = InMemoryRequest([]) request.method = b'PUT' self.assertThat( partial(_renderResource, resource, request), MatchesException( UnsupportedMethod, MatchesStructure( allowedMethods=MatchesSetwise(Equals('GET'), Equals('HEAD')))))