Files
invoke-ai--invokeai/tests/app/services/session_queue/test_session_queue_clear.py
T
wehub-resource-sync cddb07a176
docs / deploy (push) Has been cancelled
docs / changes (push) Has been cancelled
docs / check-and-build (push) Has been cancelled
build container image / cpu (push) Has been cancelled
build container image / cuda (push) Has been cancelled
build container image / rocm (push) Has been cancelled
frontend checks / frontend-checks (push) Has been cancelled
frontend tests / frontend-tests (push) Has been cancelled
lfs checks / lfs-check (push) Has been cancelled
python checks / python-checks (push) Has been cancelled
python tests / py3.12: macos-default (push) Has been cancelled
python tests / py3.11: windows-cpu (push) Has been cancelled
python tests / py3.12: windows-cpu (push) Has been cancelled
python tests / py3.11: linux-cpu (push) Has been cancelled
typegen checks / typegen-checks (push) Has been cancelled
uv lock checks / uv-lock-checks (push) Has been cancelled
openapi checks / openapi-checks (push) Has been cancelled
python tests / py3.11: macos-default (push) Has been cancelled
python tests / py3.12: linux-cpu (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:22:06 +08:00

107 lines
3.8 KiB
Python

"""Tests for session queue clear() user_id scoping."""
import uuid
import pytest
from invokeai.app.services.invoker import Invoker
from invokeai.app.services.session_queue.session_queue_sqlite import SqliteSessionQueue
@pytest.fixture
def session_queue(mock_invoker: Invoker) -> SqliteSessionQueue:
"""Create a SqliteSessionQueue backed by the mock invoker's in-memory database."""
db = mock_invoker.services.board_records._db
queue = SqliteSessionQueue(db=db)
queue.start(mock_invoker)
return queue
def _insert_queue_item(session_queue: SqliteSessionQueue, queue_id: str, user_id: str) -> None:
"""Directly insert a minimal queue item for the given user."""
session_id = str(uuid.uuid4())
batch_id = str(uuid.uuid4())
with session_queue._db.transaction() as cursor:
cursor.execute(
"""--sql
INSERT INTO session_queue (queue_id, session, session_id, batch_id, field_values, priority, workflow, origin, destination, retried_from_item_id, user_id)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""",
(queue_id, "{}", session_id, batch_id, None, 0, None, None, None, None, user_id),
)
def _count_items(session_queue: SqliteSessionQueue, queue_id: str, user_id: str | None = None) -> int:
"""Count items in the queue, optionally filtered by user_id."""
with session_queue._db.transaction() as cursor:
if user_id is not None:
cursor.execute(
"SELECT COUNT(*) FROM session_queue WHERE queue_id = ? AND user_id = ?",
(queue_id, user_id),
)
else:
cursor.execute(
"SELECT COUNT(*) FROM session_queue WHERE queue_id = ?",
(queue_id,),
)
return cursor.fetchone()[0]
def test_clear_with_user_id_only_deletes_own_items(session_queue: SqliteSessionQueue) -> None:
"""Non-admin clear (user_id provided) should only remove that user's items."""
queue_id = "default"
user_a = "user_a"
user_b = "user_b"
_insert_queue_item(session_queue, queue_id, user_a)
_insert_queue_item(session_queue, queue_id, user_a)
_insert_queue_item(session_queue, queue_id, user_b)
result = session_queue.clear(queue_id, user_id=user_a)
assert result.deleted == 2
assert _count_items(session_queue, queue_id, user_a) == 0
assert _count_items(session_queue, queue_id, user_b) == 1
def test_clear_without_user_id_deletes_all_items(session_queue: SqliteSessionQueue) -> None:
"""Admin clear (no user_id) should remove all items in the queue."""
queue_id = "default"
_insert_queue_item(session_queue, queue_id, "user_a")
_insert_queue_item(session_queue, queue_id, "user_b")
_insert_queue_item(session_queue, queue_id, "user_c")
result = session_queue.clear(queue_id)
assert result.deleted == 3
assert _count_items(session_queue, queue_id) == 0
def test_clear_with_user_id_does_not_affect_other_queues(session_queue: SqliteSessionQueue) -> None:
"""Clearing one queue should not affect items in another queue."""
queue_a = "queue_a"
queue_b = "queue_b"
user_id = "user_x"
_insert_queue_item(session_queue, queue_a, user_id)
_insert_queue_item(session_queue, queue_b, user_id)
result = session_queue.clear(queue_a, user_id=user_id)
assert result.deleted == 1
assert _count_items(session_queue, queue_a) == 0
assert _count_items(session_queue, queue_b) == 1
def test_clear_returns_zero_when_no_matching_items(session_queue: SqliteSessionQueue) -> None:
"""Clear should return 0 deleted when there are no items for the given user."""
queue_id = "default"
_insert_queue_item(session_queue, queue_id, "user_b")
result = session_queue.clear(queue_id, user_id="user_a")
assert result.deleted == 0
assert _count_items(session_queue, queue_id) == 1