File: test_http_with_singlefile.py

package info (click to toggle)
vdirsyncer 0.20.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 944 kB
  • sloc: python: 7,380; makefile: 205; sh: 66
file content (93 lines) | stat: -rw-r--r-- 2,867 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
from __future__ import annotations

import aiostream
import pytest
from aioresponses import CallbackResult
from aioresponses import aioresponses

import vdirsyncer.storage.http
from vdirsyncer.storage.base import Storage
from vdirsyncer.storage.singlefile import SingleFileStorage

from . import StorageTests


class CombinedStorage(Storage):
    """A subclass of HttpStorage to make testing easier. It supports writes via
    SingleFileStorage."""

    _repr_attributes = ("url", "path")
    storage_name = "http_and_singlefile"

    def __init__(self, url, path, *, connector, **kwargs):
        if kwargs.get("collection", None) is not None:
            raise ValueError

        super().__init__(**kwargs)
        self.url = url
        self.path = path
        self._reader = vdirsyncer.storage.http.HttpStorage(url=url, connector=connector)
        self._reader._ignore_uids = False
        self._writer = SingleFileStorage(path=path)

    async def list(self, *a, **kw):
        async for item in self._reader.list(*a, **kw):
            yield item

    async def get(self, *a, **kw):
        await aiostream.stream.list(self.list())
        return await self._reader.get(*a, **kw)

    async def upload(self, *a, **kw):
        return await self._writer.upload(*a, **kw)

    async def update(self, *a, **kw):
        return await self._writer.update(*a, **kw)

    async def delete(self, *a, **kw):
        return await self._writer.delete(*a, **kw)


class TestHttpStorage(StorageTests):
    storage_class = CombinedStorage
    supports_collections = False
    supports_metadata = False

    @pytest.fixture(autouse=True)
    def setup_tmpdir(self, tmpdir, monkeypatch):
        self.tmpfile = str(tmpdir.ensure("collection.txt"))

        def callback(url, headers, **kwargs):
            """Read our tmpfile at request time.

            We can't just read this during test setup since the file get written to
            during test execution.

            It might make sense to actually run a server serving the local file.
            """
            assert headers["User-Agent"].startswith("vdirsyncer/")

            with open(self.tmpfile) as f:
                body = f.read()

            return CallbackResult(
                status=200,
                body=body,
                headers={"Content-Type": "text/calendar; charset=utf-8"},
            )

        with aioresponses() as m:
            m.get("http://localhost:123/collection.txt", callback=callback, repeat=True)
            yield

    @pytest.fixture
    def get_storage_args(self, aio_connector):
        async def inner(collection=None):
            assert collection is None
            return {
                "url": "http://localhost:123/collection.txt",
                "path": self.tmpfile,
                "connector": aio_connector,
            }

        return inner