diff options
Diffstat (limited to 'service/test/support')
-rw-r--r-- | service/test/support/integration/app_test_client.py | 67 | ||||
-rw-r--r-- | service/test/support/integration/soledad_test_base.py | 2 | ||||
-rw-r--r-- | service/test/support/test_helper.py | 24 |
3 files changed, 63 insertions, 30 deletions
diff --git a/service/test/support/integration/app_test_client.py b/service/test/support/integration/app_test_client.py index eab001c6..860b9c40 100644 --- a/service/test/support/integration/app_test_client.py +++ b/service/test/support/integration/app_test_client.py @@ -18,8 +18,6 @@ import multiprocessing import shutil import time -from pixelated.config.routes import setup_routes -from klein.test_resource import requestMock, _render from leap.mail.imap.account import SoledadBackedAccount from leap.soledad.client import Soledad from mock import MagicMock, Mock @@ -29,16 +27,23 @@ from pixelated.adapter.services.mail_service import MailService from pixelated.adapter.services.mailboxes import Mailboxes from pixelated.adapter.soledad.soledad_querier import SoledadQuerier from pixelated.adapter.services.tag_service import TagService -from pixelated.controllers import FeaturesController, HomeController, MailsController, TagsController, \ - SyncInfoController, AttachmentsController, ContactsController +from pixelated.resources.root_resource import RootResource import pixelated.runserver from pixelated.adapter.model.mail import PixelatedMail from pixelated.adapter.search import SearchEngine from test.support.integration.model import MailBuilder +from test.support.test_helper import request_mock +from twisted.internet import reactor +from twisted.internet.defer import Deferred +from twisted.web.resource import getChildForRequest +from twisted.web.server import Site class AppTestClient: - def __init__(self, soledad_test_folder='soledad-test/test'): + INDEX_KEY = '\xde3?\x87\xff\xd9\xd3\x14\xf0\xa7>\x1f%C{\x16.\\\xae\x8c\x13\xa7\xfb\x04\xd4]+\x8d_\xed\xd1\x8d\x0bI' \ + '\x8a\x0e\xa4tm\xab\xbf\xb4\xa5\x99\x00d\xd5w\x9f\x18\xbc\x1d\xd4_W\xd2\xb6\xe8H\x83\x1b\xd8\x9d\xad' + + def __init__(self, soledad_test_folder='/tmp/soledad-test/test'): self.soledad = initialize_soledad(tempdir=soledad_test_folder) self.mail_address = "test@pixelated.org" @@ -51,7 +56,7 @@ class AppTestClient: self.app = pixelated.runserver.app self.soledad_querier = SoledadQuerier(self.soledad) - self.soledad_querier.get_index_masterkey = lambda: '\xde3?\x87\xff\xd9\xd3\x14\xf0\xa7>\x1f%C{\x16.\\\xae\x8c\x13\xa7\xfb\x04\xd4]+\x8d_\xed\xd1\x8d\x0bI\x8a\x0e\xa4tm\xab\xbf\xb4\xa5\x99\x00d\xd5w\x9f\x18\xbc\x1d\xd4_W\xd2\xb6\xe8H\x83\x1b\xd8\x9d\xad' + self.soledad_querier.get_index_masterkey = lambda: self.INDEX_KEY self.account = SoledadBackedAccount('test', self.soledad, MagicMock()) self.mailboxes = Mailboxes(self.account, self.soledad_querier) @@ -63,55 +68,59 @@ class AppTestClient: self.search_engine = SearchEngine(self.soledad_querier) self.search_engine.index_mails(self.mail_service.all_mails()) - features_controller = FeaturesController() - features_controller.DISABLED_FEATURES.append('autoReload') - home_controller = HomeController() - mails_controller = MailsController(mail_service=self.mail_service, - draft_service=self.draft_service, - search_engine=self.search_engine) - tags_controller = TagsController(search_engine=self.search_engine) - contacts_controller = ContactsController(search_engine=self.search_engine) - sync_info_controller = SyncInfoController() - attachments_controller = AttachmentsController(self.soledad_querier) + self.app.resource = RootResource() - setup_routes(self.app, home_controller, mails_controller, tags_controller, - features_controller, sync_info_controller, attachments_controller, contacts_controller) + self.app.resource.initialize(self.soledad_querier, self.search_engine, self.mail_service, self.draft_service) def _render(self, request, as_json=True): + def get_str(_str): + return json.loads(_str) if as_json else _str + def get_request_written_data(_=None): written_data = request.getWrittenData() if written_data: - return json.loads(written_data) if as_json else written_data + return get_str(written_data) + + resource = getChildForRequest(self.app.resource, request) + result = resource.render(request) + + if isinstance(result, basestring): + return get_str(result), request - d = _render(self.app.resource(), request) if request.finished: - return get_request_written_data(), request + d = Deferred() + d.addCallback(get_request_written_data) + return d, request else: + d = request.notifyFinish() + d.addCallback(lambda _: request) d.addCallback(get_request_written_data) return d, request - def run_on_a_thread(self, logfile='/tmp/app_test_client.log', port=4567, host='localhost'): - worker = lambda: self.app.run(host=host, port=port, logFile=open(logfile, 'w')) - process = multiprocessing.Process(target=worker) + def run_on_a_thread(self, logfile='/tmp/app_test_client.log', port=4567, host='0.0.0.0'): + def _start(): + reactor.listenTCP(port, Site(self.app.resource), interface=host) + reactor.run() + process = multiprocessing.Process(target=_start) process.start() - time.sleep(1) # just let it start + time.sleep(1) return lambda: process.terminate() def get(self, path, get_args, as_json=True): - request = requestMock(path) + request = request_mock(path) request.args = get_args return self._render(request, as_json) def post(self, path, body=''): - request = requestMock(path=path, method="POST", body=body, headers={'Content-Type': ['application/json']}) + request = request_mock(path=path, method="POST", body=body, headers={'Content-Type': ['application/json']}) return self._render(request) def put(self, path, body): - request = requestMock(path=path, method="PUT", body=body, headers={'Content-Type': ['application/json']}) + request = request_mock(path=path, method="PUT", body=body, headers={'Content-Type': ['application/json']}) return self._render(request) def delete(self, path, body=""): - request = requestMock(path=path, body=body, headers={'Content-Type': ['application/json']}, method="DELETE") + request = request_mock(path=path, body=body, headers={'Content-Type': ['application/json']}, method="DELETE") return self._render(request) def add_document_to_soledad(self, _dict): diff --git a/service/test/support/integration/soledad_test_base.py b/service/test/support/integration/soledad_test_base.py index 4149462c..5892de60 100644 --- a/service/test/support/integration/soledad_test_base.py +++ b/service/test/support/integration/soledad_test_base.py @@ -15,7 +15,7 @@ # along with Pixelated. If not, see <http://www.gnu.org/licenses/>. import unittest -from pixelated.controllers import * +from pixelated.resources import * from test.support.integration.app_test_client import AppTestClient from test.support.integration.model import ResponseMail diff --git a/service/test/support/test_helper.py b/service/test/support/test_helper.py index ff1de64a..54685008 100644 --- a/service/test/support/test_helper.py +++ b/service/test/support/test_helper.py @@ -14,6 +14,7 @@ # You should have received a copy of the GNU Affero General Public License # along with Pixelated. If not, see <http://www.gnu.org/licenses/>. from datetime import datetime +import io from pixelated.adapter.model.mail import InputMail @@ -79,3 +80,26 @@ class TestRequest: def __init__(self, json): self.json = json + + +from twisted.web.test.test_web import DummyRequest + + +class PixRequestMock(DummyRequest): + def __init__(self, path): + DummyRequest.__init__(self, path) + self.content = None + self.code = None + + def getWrittenData(self): + if len(self.written): + return self.written[0] + + +def request_mock(path='', method='GET', body='', headers={}): + dummy = PixRequestMock(path.split('/')) + for name, value in headers.iteritems(): + dummy.setHeader(name, value) + dummy.method = method + dummy.content = io.BytesIO(body) + return dummy |