71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
from __future__ import annotations
|
|
|
|
import pytest
|
|
import pytest_asyncio
|
|
|
|
from app.features.presets.repository import PresetsRepository
|
|
from app.library.sqlite_store import SqliteStore
|
|
|
|
|
|
@pytest_asyncio.fixture
|
|
async def repo():
|
|
PresetsRepository._reset_singleton()
|
|
SqliteStore._reset_singleton()
|
|
|
|
store = SqliteStore(db_path=":memory:")
|
|
await store.get_connection()
|
|
|
|
repository = PresetsRepository.get_instance()
|
|
yield repository
|
|
|
|
if store._conn:
|
|
await store._conn.close()
|
|
if store._engine:
|
|
await store._engine.dispose()
|
|
|
|
PresetsRepository._reset_singleton()
|
|
SqliteStore._reset_singleton()
|
|
|
|
|
|
class TestPresetsRepository:
|
|
@pytest.mark.asyncio
|
|
async def test_create_and_get(self, repo):
|
|
preset = await repo.create({"name": "Custom", "cli": "--format best"})
|
|
|
|
assert preset.id is not None, "Should generate ID for new preset"
|
|
assert preset.name == "custom", "Should normalize preset name"
|
|
assert preset.cli == "--format best", "Should store preset cli"
|
|
|
|
fetched = await repo.get(preset.id)
|
|
assert fetched is not None, "Should fetch preset by id"
|
|
assert fetched.name == "custom", "Should return matching preset"
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_create_normalizes_spaces(self, repo):
|
|
preset = await repo.create({"name": "My Preset"})
|
|
|
|
assert preset.name == "my_preset", "Should normalize spaces to underscores"
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_list_orders_by_priority_then_name(self, repo):
|
|
await repo.create({"name": "B", "priority": 1})
|
|
await repo.create({"name": "A", "priority": 1})
|
|
await repo.create({"name": "C", "priority": 2})
|
|
|
|
items = await repo.list()
|
|
|
|
assert items[0].name == "c", "Highest priority should be first"
|
|
assert items[1].name == "a", "Same priority should sort by name"
|
|
assert items[2].name == "b", "Same priority should sort by name"
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_list_paginated(self, repo):
|
|
for i in range(5):
|
|
await repo.create({"name": f"Item {i}", "priority": i})
|
|
|
|
items, total, page, total_pages = await repo.list_paginated(page=1, per_page=2)
|
|
|
|
assert len(items) == 2, "Should return 2 items per page"
|
|
assert total == 5, "Should report total count"
|
|
assert page == 1, "Should be on page 1"
|
|
assert total_pages == 3, "Should have 3 pages total"
|