From d61c4fc31b3e8bad9102e8675eaba5d8ced47848 Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Mon, 17 Mar 2014 22:43:41 +0100 Subject: [PATCH] WIP --- install-deps.sh | 8 ++++++ tests/storage/dav/__init__.py | 2 ++ tests/storage/dav/_owncloud.py | 50 ++++++++++++++++++++++++++++++++++ tests/storage/dav/_radicale.py | 44 +++++++++++++----------------- 4 files changed, 79 insertions(+), 25 deletions(-) create mode 100644 tests/storage/dav/_owncloud.py diff --git a/install-deps.sh b/install-deps.sh index b0e9048..e2b4446 100755 --- a/install-deps.sh +++ b/install-deps.sh @@ -20,4 +20,12 @@ radicale_storage_database() { pip install --use-mirrors sqlalchemy pysqlite; } radicale_storage_filesystem() { true; } +davserver_owncloud() { + pip install paste + git clone git@github.com:untitaker/owncloud-testserver.git + cd ./owncloud-testserver/ + sh install.sh +} + + davserver_$DAV_SERVER diff --git a/tests/storage/dav/__init__.py b/tests/storage/dav/__init__.py index 9d14194..5a26664 100644 --- a/tests/storage/dav/__init__.py +++ b/tests/storage/dav/__init__.py @@ -18,6 +18,8 @@ from vdirsyncer.storage.base import Item dav_server = os.environ.get('DAV_SERVER', '').strip() or 'radicale' if dav_server in ('radicale', 'radicale_git'): from ._radicale import ServerMixin +elif dav_server == 'owncloud': + from ._owncloud import ServerMixin else: raise RuntimeError('{} is not a known DAV server.'.format(dav_server)) diff --git a/tests/storage/dav/_owncloud.py b/tests/storage/dav/_owncloud.py new file mode 100644 index 0000000..a42601e --- /dev/null +++ b/tests/storage/dav/_owncloud.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +''' + vdirsyncer.tests.storage.dav._owncloud + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Using utilities from paste to wrap the PHP application into WSGI. + + :copyright: (c) 2014 Markus Unterwaditzer + :license: MIT, see LICENSE for more details. +''' + +from paste.cgiapp import CGIApplication +from vdirsyncer.utils import expand_path +from ._radicale import wsgi_setup +import subprocess +import os + +owncloud_repo = expand_path(os.path.join(os.path.dirname(__file__), '../../../owncloud-testserver/')) +app = CGIApplication(None, 'php.cgi', [owncloud_repo], include_os_environ=False, query_string=None) + +def middleware(environ, start_response): + print(environ) + environ['REQUEST_URI'] = 'http://127.0.0.1' + environ['PATH_INFO'] + return app(environ, start_response) + +class ServerMixin(object): + storage_class = None + wsgi_teardown = None + + def setup_method(self, method): + subprocess.call([os.path.join(owncloud_repo, 'install.sh')]) + self.wsgi_teardown = wsgi_setup(middleware) + + def get_storage_args(self, collection='test'): + assert self.storage_class.fileext in ('.ics', '.vcf') + if self.storage_class.fileext == '.vcf': + url = 'http://127.0.0.1/remote.php/carddav/addressbooks/asdf/' + else: + url = 'http://127.0.0.1/remote.php/carddav/addressbooks/asdf/' + if collection is not None: + assert collection in ('test', 'test1', 'test2', 'test3', 'test4', + 'test5', 'test6', 'test7', 'test8', 'test9', + 'test10') + + return {'url': url, 'collection': collection} + + def teardown_method(self, method): + if self.wsgi_teardown is not None: + self.wsgi_teardown() + self.wsgi_teardown = None diff --git a/tests/storage/dav/_radicale.py b/tests/storage/dav/_radicale.py index ab7b323..80317f9 100644 --- a/tests/storage/dav/_radicale.py +++ b/tests/storage/dav/_radicale.py @@ -113,10 +113,24 @@ class Response(object): raise HTTPError(str(self.status_code)) +def wsgi_setup(app): + c = Client(app, WerkzeugResponse) + def x(session, method, url, data=None, headers=None, **kw): + path = urlparse.urlparse(url).path + assert isinstance(data, bytes) or data is None + r = c.open(path=path, method=method, data=data, headers=headers) + r = Response(r) + return r + + p = mock.patch('requests.Session.request', new=x) + p.start() + return p.stop + + class ServerMixin(object): '''hrefs are paths without scheme or netloc''' storage_class = None - patcher = None + wsgi_teardown = None tmpdir = None def setup_method(self, method): @@ -124,18 +138,7 @@ class ServerMixin(object): do_the_radicale_dance(self.tmpdir) from radicale import Application app = Application() - - c = Client(app, WerkzeugResponse) - - def x(session, method, url, data=None, headers=None, **kw): - path = urlparse.urlparse(url).path - assert isinstance(data, bytes) or data is None - r = c.open(path=path, method=method, data=data, headers=headers) - r = Response(r) - return r - - self.patcher = p = mock.patch('requests.Session.request', new=x) - p.start() + self.wsgi_teardown = wsgi_setup(app) def get_storage_args(self, collection='test'): url = 'http://127.0.0.1/bob/' @@ -148,15 +151,6 @@ class ServerMixin(object): if self.tmpdir is not None: shutil.rmtree(self.tmpdir) self.tmpdir = None - if self.patcher is not None: - self.patcher.stop() - self.patcher = None - - def test_dav_broken_item(self): - item = Item(u'UID:1') - s = self._get_storage() - try: - s.upload(item) - except exceptions.Error: - pass - assert not list(s.list()) + if self.wsgi_teardown is not None: + self.wsgi_teardown() + self.wsgi_teardown = None