From b00b7ff5d828099e8f0190fee44ad1daf2054717 Mon Sep 17 00:00:00 2001 From: Roald de Vries Date: Thu, 24 Nov 2016 16:41:49 +0100 Subject: add public root resource to serve static files --- service/pixelated/resources/auth.py | 2 +- service/pixelated/resources/root_resource.py | 12 +++++++ service/test/unit/resources/test_root_resource.py | 44 ++++++++++++++++++++++- 3 files changed, 56 insertions(+), 2 deletions(-) (limited to 'service') diff --git a/service/pixelated/resources/auth.py b/service/pixelated/resources/auth.py index adac985f..ef5c9710 100644 --- a/service/pixelated/resources/auth.py +++ b/service/pixelated/resources/auth.py @@ -108,7 +108,7 @@ class PixelatedAuthSessionWrapper(object): else: log.err( result, - "HTTPAuthSessionWrapper.getChildWithDefault encountered " + "PixelatedAuthSessionWrapper.getChildWithDefault encountered " "unexpected error") return ErrorPage(500, None, None) diff --git a/service/pixelated/resources/root_resource.py b/service/pixelated/resources/root_resource.py index 8fa80bb2..608e18ef 100644 --- a/service/pixelated/resources/root_resource.py +++ b/service/pixelated/resources/root_resource.py @@ -47,6 +47,18 @@ MODE_STARTUP = 1 MODE_RUNNING = 2 +class PublicRootResource(BaseResource, object): + + def __init__(self, services_factory, assets_path): + super(PublicRootResource, self).__init__(services_factory) + self._child_resources = dict( + assets=File(assets_path) + ) + + def getChild(self, path, request): + return self._child_resources.get(path) or NoResource() + + class RootResource(BaseResource): def __init__(self, services_factory): BaseResource.__init__(self, services_factory) diff --git a/service/test/unit/resources/test_root_resource.py b/service/test/unit/resources/test_root_resource.py index 7a7b2005..082f2b22 100644 --- a/service/test/unit/resources/test_root_resource.py +++ b/service/test/unit/resources/test_root_resource.py @@ -1,14 +1,42 @@ +import os import re from mock import MagicMock, patch from mockito import mock, when, any as ANY +import pixelated from pixelated.application import UserAgentMode from pixelated.resources.features_resource import FeaturesResource from test.unit.resources import DummySite +from twisted.cred.checkers import ANONYMOUS +from twisted.internet.defer import succeed from twisted.trial import unittest +from twisted.web.resource import IResource +from twisted.web.static import File from twisted.web.test.requesthelper import DummyRequest -from pixelated.resources.root_resource import RootResource, MODE_STARTUP, MODE_RUNNING +from pixelated.resources.root_resource import PublicRootResource, RootResource, MODE_STARTUP, MODE_RUNNING + + +class TestPublicRootResource(unittest.TestCase): + + def setUp(self): + self.portal_mock = mock() + assets_path = os.path.abspath( + os.path.join(os.path.abspath(pixelated.__file__), '..', '..', '..', 'web-ui', 'public') + ) + services_factory = mock() + self.public_root_resource = PublicRootResource(services_factory, assets_path=assets_path) + self.web = DummySite(self.public_root_resource) + self.request = DummyRequest(['assets', 'dummy.json']) + + def test_assets_should_be_available(self): + d = self.web.get(self.request) + + def assert_response(_): + self.assertEqual(200, self.request.responseCode) + + d.addCallback(assert_response) + return d class TestRootResource(unittest.TestCase): @@ -103,6 +131,20 @@ class TestRootResource(unittest.TestCase): d.addCallback(assert_unauthorized) return d + def test_GET_should_return_404_for_non_existing_resource(self): + request = DummyRequest(['/non-existing-child']) + request.method = 'GET' + + request.getCookie = MagicMock(return_value='stubbed csrf token') + + d = self.web.get(request) + + def assert_not_found(_): + self.assertEqual(404, request.responseCode) + + d.addCallback(assert_not_found) + return d + def test_should_404_non_existing_resource_with_valid_csrf(self): request = DummyRequest(['/non-existing-child']) request.method = 'POST' -- cgit v1.2.3