import os
import pytest
pytest.importorskip("uri_register")
from uri_register import UriRegister
@pytest.fixture
def db_url():
return os.environ.get("DATABASE_URL", "postgres://localhost/access")
@pytest.fixture
def register_sync(db_url):
return UriRegister(
db_url,
"uri_register", 20, 10000, )
@pytest.fixture
async def register_async(db_url):
return await UriRegister.new_async(
db_url,
"uri_register", 20, 10000, )
def test_sync_register_single_uri(register_sync):
uri = "http://example.org/test/sync/single"
id1 = register_sync.register_uri(uri)
assert isinstance(id1, int)
assert id1 > 0
id2 = register_sync.register_uri(uri)
assert id1 == id2
def test_sync_register_uri_batch(register_sync):
uris = [
"http://example.org/test/sync/batch/1",
"http://example.org/test/sync/batch/2",
"http://example.org/test/sync/batch/3",
]
ids = register_sync.register_uri_batch(uris)
assert isinstance(ids, list)
assert len(ids) == len(uris)
for id in ids:
assert isinstance(id, int)
assert id > 0
for i, uri in enumerate(uris):
individual_id = register_sync.register_uri(uri)
assert ids[i] == individual_id
def test_sync_register_uri_batch_with_duplicates(register_sync):
uris = [
"http://example.org/test/sync/dup/1",
"http://example.org/test/sync/dup/2",
"http://example.org/test/sync/dup/1", ]
ids = register_sync.register_uri_batch(uris)
assert len(ids) == 3
assert ids[0] == ids[2]
assert ids[1] != ids[0]
def test_sync_register_uri_batch_hashmap(register_sync):
uris = [
"http://example.org/test/sync/hashmap/1",
"http://example.org/test/sync/hashmap/2",
"http://example.org/test/sync/hashmap/1", ]
mapping = register_sync.register_uri_batch_hashmap(uris)
assert isinstance(mapping, dict)
assert len(mapping) == 2
assert "http://example.org/test/sync/hashmap/1" in mapping
assert "http://example.org/test/sync/hashmap/2" in mapping
for _uri, id in mapping.items():
assert isinstance(id, int)
assert id > 0
def test_sync_stats(register_sync):
register_sync.register_uri("http://example.org/test/sync/stats/1")
register_sync.register_uri("http://example.org/test/sync/stats/2")
stats = register_sync.stats()
assert isinstance(stats, dict)
assert "total_uris" in stats
assert "size_bytes" in stats
assert isinstance(stats["total_uris"], int)
assert isinstance(stats["size_bytes"], int)
assert stats["total_uris"] >= 2 assert stats["size_bytes"] > 0
def test_sync_empty_batch(register_sync):
ids = register_sync.register_uri_batch([])
assert ids == []
mapping = register_sync.register_uri_batch_hashmap([])
assert mapping == {}
def test_sync_batch_performance(register_sync):
uris = [f"http://example.org/test/sync/perf/{i}" for i in range(100)]
ids = register_sync.register_uri_batch(uris)
assert len(ids) == 100
assert len(set(ids)) == 100
@pytest.mark.asyncio
async def test_async_register_single_uri(register_async):
uri = "http://example.org/test/async/single"
id1 = await register_async.register_uri_async(uri)
assert isinstance(id1, int)
assert id1 > 0
id2 = await register_async.register_uri_async(uri)
assert id1 == id2
@pytest.mark.asyncio
async def test_async_register_uri_batch(register_async):
uris = [
"http://example.org/test/async/batch/1",
"http://example.org/test/async/batch/2",
"http://example.org/test/async/batch/3",
]
ids = await register_async.register_uri_batch_async(uris)
assert isinstance(ids, list)
assert len(ids) == len(uris)
for id in ids:
assert isinstance(id, int)
assert id > 0
for i, uri in enumerate(uris):
individual_id = await register_async.register_uri_async(uri)
assert ids[i] == individual_id
@pytest.mark.asyncio
async def test_async_register_uri_batch_with_duplicates(register_async):
uris = [
"http://example.org/test/async/dup/1",
"http://example.org/test/async/dup/2",
"http://example.org/test/async/dup/1", ]
ids = await register_async.register_uri_batch_async(uris)
assert len(ids) == 3
assert ids[0] == ids[2]
assert ids[1] != ids[0]
@pytest.mark.asyncio
async def test_async_register_uri_batch_hashmap(register_async):
uris = [
"http://example.org/test/async/hashmap/1",
"http://example.org/test/async/hashmap/2",
"http://example.org/test/async/hashmap/1", ]
mapping = await register_async.register_uri_batch_hashmap_async(uris)
assert isinstance(mapping, dict)
assert len(mapping) == 2
assert "http://example.org/test/async/hashmap/1" in mapping
assert "http://example.org/test/async/hashmap/2" in mapping
for _uri, id in mapping.items():
assert isinstance(id, int)
assert id > 0
@pytest.mark.asyncio
async def test_async_stats(register_async):
await register_async.register_uri_async("http://example.org/test/async/stats/1")
await register_async.register_uri_async("http://example.org/test/async/stats/2")
stats = await register_async.stats_async()
assert isinstance(stats, dict)
assert "total_uris" in stats
assert "size_bytes" in stats
assert isinstance(stats["total_uris"], int)
assert isinstance(stats["size_bytes"], int)
assert stats["total_uris"] >= 2 assert stats["size_bytes"] > 0
@pytest.mark.asyncio
async def test_async_empty_batch(register_async):
ids = await register_async.register_uri_batch_async([])
assert ids == []
mapping = await register_async.register_uri_batch_hashmap_async([])
assert mapping == {}
@pytest.mark.asyncio
async def test_async_batch_performance(register_async):
uris = [f"http://example.org/test/async/perf/{i}" for i in range(100)]
ids = await register_async.register_uri_batch_async(uris)
assert len(ids) == 100
assert len(set(ids)) == 100
def test_sync_instance_can_use_sync_methods(register_sync):
uri = "http://example.org/test/mixed/sync"
id1 = register_sync.register_uri(uri)
id2 = register_sync.register_uri(uri)
assert id1 == id2
@pytest.mark.asyncio
async def test_async_instance_can_use_both_methods(register_async):
uri_async = "http://example.org/test/mixed/async"
uri_sync = "http://example.org/test/mixed/sync_from_async"
id_async = await register_async.register_uri_async(uri_async)
assert id_async > 0
id_sync = register_async.register_uri(uri_sync)
assert id_sync > 0