mirror of
https://github.com/samsonjs/vdirsyncer.git
synced 2026-03-25 08:55:50 +00:00
Add asyncio to the storage backends and most of the codebase. A lot of it merely uses asyncio APIs, but still doesn't actually run several things concurrently internally. Further improvements will be added on top of these changes Thanks to Thomas Grainger (@graingert) for a few useful pointers related to asyncio.
173 lines
5.1 KiB
Python
173 lines
5.1 KiB
Python
import aiostream
|
|
import pytest
|
|
|
|
from vdirsyncer.cli.discover import expand_collections
|
|
|
|
|
|
missing = object()
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"shortcuts,expected",
|
|
[
|
|
(
|
|
["from a"],
|
|
[
|
|
(
|
|
"c1",
|
|
(
|
|
{"type": "fooboo", "custom_arg": "a1", "collection": "c1"},
|
|
{"type": "fooboo", "custom_arg": "b1", "collection": "c1"},
|
|
),
|
|
),
|
|
(
|
|
"c2",
|
|
(
|
|
{"type": "fooboo", "custom_arg": "a2", "collection": "c2"},
|
|
{"type": "fooboo", "custom_arg": "b2", "collection": "c2"},
|
|
),
|
|
),
|
|
(
|
|
"a3",
|
|
(
|
|
{"type": "fooboo", "custom_arg": "a3", "collection": "a3"},
|
|
missing,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
(
|
|
["from b"],
|
|
[
|
|
(
|
|
"c1",
|
|
(
|
|
{"type": "fooboo", "custom_arg": "a1", "collection": "c1"},
|
|
{"type": "fooboo", "custom_arg": "b1", "collection": "c1"},
|
|
),
|
|
),
|
|
(
|
|
"c2",
|
|
(
|
|
{"type": "fooboo", "custom_arg": "a2", "collection": "c2"},
|
|
{"type": "fooboo", "custom_arg": "b2", "collection": "c2"},
|
|
),
|
|
),
|
|
(
|
|
"b3",
|
|
(
|
|
missing,
|
|
{"type": "fooboo", "custom_arg": "b3", "collection": "b3"},
|
|
),
|
|
),
|
|
],
|
|
),
|
|
(
|
|
["from a", "from b"],
|
|
[
|
|
(
|
|
"c1",
|
|
(
|
|
{"type": "fooboo", "custom_arg": "a1", "collection": "c1"},
|
|
{"type": "fooboo", "custom_arg": "b1", "collection": "c1"},
|
|
),
|
|
),
|
|
(
|
|
"c2",
|
|
(
|
|
{"type": "fooboo", "custom_arg": "a2", "collection": "c2"},
|
|
{"type": "fooboo", "custom_arg": "b2", "collection": "c2"},
|
|
),
|
|
),
|
|
(
|
|
"a3",
|
|
(
|
|
{"type": "fooboo", "custom_arg": "a3", "collection": "a3"},
|
|
missing,
|
|
),
|
|
),
|
|
(
|
|
"b3",
|
|
(
|
|
missing,
|
|
{"type": "fooboo", "custom_arg": "b3", "collection": "b3"},
|
|
),
|
|
),
|
|
],
|
|
),
|
|
(
|
|
[["c12", "c1", "c2"]],
|
|
[
|
|
(
|
|
"c12",
|
|
(
|
|
{"type": "fooboo", "custom_arg": "a1", "collection": "c1"},
|
|
{"type": "fooboo", "custom_arg": "b2", "collection": "c2"},
|
|
),
|
|
),
|
|
],
|
|
),
|
|
(
|
|
None,
|
|
[
|
|
(
|
|
None,
|
|
(
|
|
{"type": "fooboo", "storage_side": "a", "collection": None},
|
|
{"type": "fooboo", "storage_side": "b", "collection": None},
|
|
),
|
|
)
|
|
],
|
|
),
|
|
(
|
|
[None],
|
|
[
|
|
(
|
|
None,
|
|
(
|
|
{"type": "fooboo", "storage_side": "a", "collection": None},
|
|
{"type": "fooboo", "storage_side": "b", "collection": None},
|
|
),
|
|
)
|
|
],
|
|
),
|
|
],
|
|
)
|
|
@pytest.mark.asyncio
|
|
async def test_expand_collections(shortcuts, expected):
|
|
config_a = {"type": "fooboo", "storage_side": "a"}
|
|
|
|
config_b = {"type": "fooboo", "storage_side": "b"}
|
|
|
|
async def get_discovered_a():
|
|
return {
|
|
"c1": {"type": "fooboo", "custom_arg": "a1", "collection": "c1"},
|
|
"c2": {"type": "fooboo", "custom_arg": "a2", "collection": "c2"},
|
|
"a3": {"type": "fooboo", "custom_arg": "a3", "collection": "a3"},
|
|
}
|
|
|
|
async def get_discovered_b():
|
|
return {
|
|
"c1": {"type": "fooboo", "custom_arg": "b1", "collection": "c1"},
|
|
"c2": {"type": "fooboo", "custom_arg": "b2", "collection": "c2"},
|
|
"b3": {"type": "fooboo", "custom_arg": "b3", "collection": "b3"},
|
|
}
|
|
|
|
async def handle_not_found(config, collection):
|
|
return missing
|
|
|
|
assert (
|
|
sorted(
|
|
await aiostream.stream.list(
|
|
expand_collections(
|
|
shortcuts,
|
|
config_a,
|
|
config_b,
|
|
get_discovered_a,
|
|
get_discovered_b,
|
|
handle_not_found,
|
|
)
|
|
)
|
|
)
|
|
== sorted(expected)
|
|
)
|