feat: 增强日历功能并集成 AgentScope 代理服务

This commit is contained in:
qzl
2026-03-11 17:16:11 +08:00
parent e20e7d2a02
commit 85b314cf64
53 changed files with 3642 additions and 297 deletions
@@ -103,6 +103,18 @@ def test_metadata_rejects_unknown_field() -> None:
ScheduleItemMetadata.model_validate({"color": "#FF6B6B", "unknown": True})
@pytest.mark.parametrize("value", [None, 0, 15, 10080])
def test_metadata_accepts_reminder_minutes(value: int | None) -> None:
metadata = ScheduleItemMetadata(reminder_minutes=value)
assert metadata.reminder_minutes == value
@pytest.mark.parametrize("value", [-1, 10081])
def test_metadata_rejects_out_of_range_reminder_minutes(value: int) -> None:
with pytest.raises(ValidationError):
ScheduleItemMetadata(reminder_minutes=value)
def test_metadata_attachment_rejects_unknown_field() -> None:
with pytest.raises(ValidationError):
ScheduleItemMetadataAttachment.model_validate(
@@ -221,7 +221,12 @@ async def test_create_maps_metadata_to_extra_metadata(mock_session: AsyncMock) -
request = ScheduleItemCreateRequest(
title="Roadmap",
start_at=datetime(2026, 2, 28, 16, 0, 0, tzinfo=timezone.utc),
metadata=ScheduleItemMetadata(location="会议室A", color="#4F46E5", version=1),
metadata=ScheduleItemMetadata(
location="会议室A",
color="#4F46E5",
reminder_minutes=15,
version=1,
),
)
service = ScheduleItemService(
repository=CaptureRepo(None),
@@ -234,6 +239,7 @@ async def test_create_maps_metadata_to_extra_metadata(mock_session: AsyncMock) -
assert captured is not None
assert "extra_metadata" in captured
assert captured["extra_metadata"]["location"] == "会议室A"
assert captured["extra_metadata"]["reminder_minutes"] == 15
assert "metadata" not in captured
@@ -261,7 +267,10 @@ async def test_update_maps_metadata_to_extra_metadata(mock_session: AsyncMock) -
item.id,
ScheduleItemUpdateRequest(
metadata=ScheduleItemMetadata(
location="线上会议", color="#3B82F6", version=1
location="线上会议",
color="#3B82F6",
reminder_minutes=30,
version=1,
)
),
)
@@ -269,4 +278,38 @@ async def test_update_maps_metadata_to_extra_metadata(mock_session: AsyncMock) -
assert captured is not None
assert "extra_metadata" in captured
assert captured["extra_metadata"]["location"] == "线上会议"
assert captured["extra_metadata"]["reminder_minutes"] == 30
assert "metadata" not in captured
@pytest.mark.asyncio
async def test_update_maps_null_metadata_to_extra_metadata_null(
mock_session: AsyncMock,
) -> None:
user_id = UUID("00000000-0000-0000-0000-000000000001")
item = _create_mock_schedule_item()
captured: dict | None = None
class CaptureRepo(FakeRepo):
async def update_by_item_id(
self, item_id: UUID, owner_id: UUID, data: dict
) -> ScheduleItem | None:
nonlocal captured
captured = data
return await super().update_by_item_id(item_id, owner_id, data)
service = ScheduleItemService(
repository=CaptureRepo(item),
session=mock_session,
current_user=CurrentUser(id=user_id),
)
await service.update(
item.id,
ScheduleItemUpdateRequest(metadata=None),
)
assert captured is not None
assert "extra_metadata" in captured
assert captured["extra_metadata"] is None
assert "metadata" not in captured