76 lines
3.0 KiB
Python
76 lines
3.0 KiB
Python
|
|
"""FakeAdapter M4 tests — list_callback_tasks pagination."""
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
from backend.app.services.c2.adapter import C2HistoricalTask
|
||
|
|
from backend.app.services.c2.fake import FakeAdapter
|
||
|
|
|
||
|
|
|
||
|
|
@pytest.fixture()
|
||
|
|
def adapter() -> FakeAdapter:
|
||
|
|
return FakeAdapter()
|
||
|
|
|
||
|
|
|
||
|
|
class TestFakeAdapterListCallbackTasks:
|
||
|
|
def test_callback_1_returns_12_total(self, adapter):
|
||
|
|
page = adapter.list_callback_tasks(callback_display_id=1, page=1, page_size=25)
|
||
|
|
assert page.total == 12
|
||
|
|
|
||
|
|
def test_callback_2_returns_0_tasks(self, adapter):
|
||
|
|
page = adapter.list_callback_tasks(callback_display_id=2, page=1, page_size=25)
|
||
|
|
assert page.total == 0
|
||
|
|
assert page.items == []
|
||
|
|
|
||
|
|
def test_callback_3_returns_5_tasks(self, adapter):
|
||
|
|
page = adapter.list_callback_tasks(callback_display_id=3, page=1, page_size=25)
|
||
|
|
assert page.total == 5
|
||
|
|
assert len(page.items) == 5
|
||
|
|
|
||
|
|
def test_items_are_c2_historical_task_instances(self, adapter):
|
||
|
|
page = adapter.list_callback_tasks(callback_display_id=1, page=1, page_size=5)
|
||
|
|
for item in page.items:
|
||
|
|
assert isinstance(item, C2HistoricalTask)
|
||
|
|
|
||
|
|
def test_pagination_page1(self, adapter):
|
||
|
|
page = adapter.list_callback_tasks(callback_display_id=1, page=1, page_size=5)
|
||
|
|
assert len(page.items) == 5
|
||
|
|
assert page.page == 1
|
||
|
|
assert page.page_size == 5
|
||
|
|
|
||
|
|
def test_pagination_page2(self, adapter):
|
||
|
|
page = adapter.list_callback_tasks(callback_display_id=1, page=2, page_size=5)
|
||
|
|
assert len(page.items) == 5
|
||
|
|
assert page.page == 2
|
||
|
|
|
||
|
|
def test_pagination_last_page_partial(self, adapter):
|
||
|
|
# 12 tasks, page_size=5 → page 3 has 2 items.
|
||
|
|
page = adapter.list_callback_tasks(callback_display_id=1, page=3, page_size=5)
|
||
|
|
assert len(page.items) == 2
|
||
|
|
assert page.total == 12
|
||
|
|
|
||
|
|
def test_pagination_beyond_range_returns_empty(self, adapter):
|
||
|
|
page = adapter.list_callback_tasks(callback_display_id=1, page=99, page_size=25)
|
||
|
|
assert len(page.items) == 0
|
||
|
|
assert page.total == 12
|
||
|
|
|
||
|
|
def test_history_is_deterministic_across_instances(self):
|
||
|
|
a1 = FakeAdapter()
|
||
|
|
a2 = FakeAdapter()
|
||
|
|
p1 = a1.list_callback_tasks(callback_display_id=1, page=1, page_size=25)
|
||
|
|
p2 = a2.list_callback_tasks(callback_display_id=1, page=1, page_size=25)
|
||
|
|
assert [t.display_id for t in p1.items] == [t.display_id for t in p2.items]
|
||
|
|
|
||
|
|
def test_completed_and_submitted_mix(self, adapter):
|
||
|
|
"""Callback 1 has alternating completed/submitted tasks (even=completed)."""
|
||
|
|
page = adapter.list_callback_tasks(callback_display_id=1, page=1, page_size=12)
|
||
|
|
completed = [t for t in page.items if t.completed]
|
||
|
|
submitted = [t for t in page.items if not t.completed]
|
||
|
|
assert len(completed) == 6
|
||
|
|
assert len(submitted) == 6
|
||
|
|
|
||
|
|
def test_unknown_callback_returns_empty(self, adapter):
|
||
|
|
page = adapter.list_callback_tasks(callback_display_id=999, page=1, page_size=25)
|
||
|
|
assert page.total == 0
|
||
|
|
assert page.items == []
|