From 32b0ac5a6b7e4b9191bb7ddff01f444908b4459a Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Sat, 15 Feb 2014 11:32:54 +0100 Subject: [PATCH] Add tests, fix test breakage --- .gitignore | 2 ++ vdirsyncer/__init__.py | 0 vdirsyncer/storage/__init__.py | 0 vdirsyncer/storage/base.py | 4 +-- vdirsyncer/storage/filesystem.py | 2 +- vdirsyncer/storage/memory.py | 17 +++++++---- vdirsyncer/tests/test_storage.py | 49 ++++++++++++++++++++++++++++++++ 7 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 .gitignore create mode 100644 vdirsyncer/__init__.py create mode 100644 vdirsyncer/storage/__init__.py create mode 100644 vdirsyncer/tests/test_storage.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a295864 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.pyc +__pycache__ diff --git a/vdirsyncer/__init__.py b/vdirsyncer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vdirsyncer/storage/__init__.py b/vdirsyncer/storage/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vdirsyncer/storage/base.py b/vdirsyncer/storage/base.py index dead9b5..69c3f81 100644 --- a/vdirsyncer/storage/base.py +++ b/vdirsyncer/storage/base.py @@ -6,13 +6,13 @@ class Item(object): @property def uid(self): - for line in raw.splitlines(): + for line in self.raw.splitlines(): if line.startswith(b'UID'): return line.lstrip(b'UID:').strip() class Storage(object): - def __init__(self, fileext, item_class=Item): + def __init__(self, fileext='', item_class=Item): self.fileext = fileext self.item_class = item_class diff --git a/vdirsyncer/storage/filesystem.py b/vdirsyncer/storage/filesystem.py index 5e618c7..32fe835 100644 --- a/vdirsyncer/storage/filesystem.py +++ b/vdirsyncer/storage/filesystem.py @@ -11,7 +11,7 @@ class FilesystemStorage(Storage): return os.path.getmtime(href) def _get_href(self, obj): - return os.path.join(self.path, obj.uid + b'b' + self.fileext) + return os.path.join(self.path, obj.uid + self.fileext) def _get_hrefs(self): for fname in os.listdir(self.path): diff --git a/vdirsyncer/storage/memory.py b/vdirsyncer/storage/memory.py index 414c919..f976965 100644 --- a/vdirsyncer/storage/memory.py +++ b/vdirsyncer/storage/memory.py @@ -7,6 +7,9 @@ class MemoryStorage(Storage): self.items = {} # href => (etag, object) super(MemoryStorage, self).__init__(**kwargs) + def _get_href(self, obj): + return obj.uid + self.fileext + def list_items(self): for href, (etag, obj) in self.items.items(): yield href, etag @@ -20,15 +23,17 @@ class MemoryStorage(Storage): return href in self.items def upload(self, obj): - if obj.uid in self.items: + href = self._get_href(obj) + if href in self.items: raise exceptions.AlreadyExistingError(obj) etag = datetime.datetime.now() - self.items[obj.uid] = (etag, obj) - return obj.uid, etag + self.items[href] = (etag, obj) + return href, etag def update(self, obj, etag): - if obj.uid not in self.items: + href = self._get_href(obj) + if href not in self.items: raise exceptions.NotFoundError(obj) etag = datetime.datetime.now() - self.items[obj.uid] = (etag, obj) - return obj.uid, etag + self.items[href] = (etag, obj) + return href, etag diff --git a/vdirsyncer/tests/test_storage.py b/vdirsyncer/tests/test_storage.py new file mode 100644 index 0000000..4eb4cb5 --- /dev/null +++ b/vdirsyncer/tests/test_storage.py @@ -0,0 +1,49 @@ +from unittest import TestCase +import os +import tempfile +import shutil +from vdirsyncer.storage.base import Item +from vdirsyncer.storage.filesystem import FilesystemStorage +from vdirsyncer.storage.memory import MemoryStorage + +class StorageTests(object): + def _get_storage(self, **kwargs): + raise NotImplementedError() + + def test_generic_upload(self): + items = [ + 'UID:1', + 'UID:2', + 'UID:3', + 'UID:4', + 'UID:5', + 'UID:6', + 'UID:7', + 'UID:8', + 'UID:9' + ] + fileext = '' + s = self._get_storage(fileext=fileext) + for item in items: + s.upload(Item(item)) + hrefs = [href for href, etag in s.list_items()] + prefix = os.path.commonprefix(hrefs) + a = set(x[len(prefix):] for x in hrefs) + b = set(str(y) + fileext for y in range(1, 10)) + assert a == b + + +class FilesystemStorageTests(TestCase, StorageTests): + tmpdir = None + def _get_storage(self, **kwargs): + path = self.tmpdir = tempfile.mkdtemp() + return FilesystemStorage(path=path, **kwargs) + + def tearDown(self): + if self.tmpdir is not None: + shutil.rmtree(self.tmpdir) + self.tmpdir = None + +class MemoryStorageTests(TestCase, StorageTests): + def _get_storage(self, **kwargs): + return MemoryStorage(**kwargs)