feat: 重构 Reminder Notification 系统并更新应用包名

This commit is contained in:
qzl
2026-03-30 18:36:57 +08:00
parent 9fb2a6857b
commit 91bf3c3f96
90 changed files with 5133 additions and 3017 deletions
@@ -157,6 +157,14 @@ class FriendshipRepoStub:
return friendship
class UserRepoStub:
async def get_by_user_id(self, user_id: UUID):
profile = MagicMock()
profile.id = user_id
profile.username = "owner"
return profile
@pytest.mark.asyncio
async def test_share_forbidden_when_not_owner() -> None:
owner_id = UUID("00000000-0000-0000-0000-000000000001")
@@ -172,6 +180,7 @@ async def test_share_forbidden_when_not_owner() -> None:
auth_gateway=cast(Any, AuthGatewayStub()),
inbox_repository=InboxRepoStub(),
friendship_repository=cast(Any, FriendshipRepoStub()),
user_repository=cast(Any, UserRepoStub()),
)
with pytest.raises(ApiProblemError) as exc_info:
@@ -204,6 +213,7 @@ async def test_share_success_creates_calendar_invitation_message() -> None:
auth_gateway=cast(Any, AuthGatewayStub()),
inbox_repository=InboxRepoStub(),
friendship_repository=cast(Any, FriendshipRepoStub()),
user_repository=cast(Any, UserRepoStub()),
)
result = await service.share(
@@ -223,7 +233,17 @@ async def test_share_success_creates_calendar_invitation_message() -> None:
assert message.sender_id == owner_id
assert message.schedule_item_id == item_id
assert message.message_type == InboxMessageType.CALENDAR
assert message.content == {"type": "invite", "permission": 5, "action": "pending"}
assert message.content is not None
assert message.content["type"] == "invite"
assert message.content["schema_version"] == 2
assert message.content["permission"] == 5
assert message.content["item"]["id"] == str(item_id)
assert message.content["item"]["title"] == "test"
assert message.content["item"]["start_at"] == "2026-02-28T16:00:00+00:00"
assert message.content["item"]["end_at"] is None
assert message.content["item"]["timezone"] == "UTC"
assert message.content["actor"]["username"] == "owner"
assert message.content["actor"]["phone"] == "+8613810000000"
session.commit.assert_awaited_once()
@@ -237,6 +257,7 @@ async def test_share_returns_not_found_when_item_missing() -> None:
auth_gateway=cast(Any, AuthGatewayStub()),
inbox_repository=InboxRepoStub(),
friendship_repository=cast(Any, FriendshipRepoStub()),
user_repository=cast(Any, UserRepoStub()),
)
with pytest.raises(ApiProblemError) as exc_info:
@@ -268,6 +289,7 @@ async def test_share_invalid_auth_user_id_returns_503() -> None:
auth_gateway=cast(Any, AuthGatewayInvalidIdStub()),
inbox_repository=InboxRepoStub(),
friendship_repository=cast(Any, FriendshipRepoStub()),
user_repository=cast(Any, UserRepoStub()),
)
with pytest.raises(ApiProblemError) as exc_info:
@@ -302,6 +324,7 @@ async def test_share_sqlalchemy_error_rolls_back() -> None:
auth_gateway=cast(Any, AuthGatewayStub()),
inbox_repository=InboxRepoStub(),
friendship_repository=cast(Any, FriendshipRepoStub()),
user_repository=cast(Any, UserRepoStub()),
)
with pytest.raises(ApiProblemError) as exc_info:
@@ -334,6 +357,7 @@ async def test_share_returns_forbidden_when_target_is_not_friend() -> None:
auth_gateway=cast(Any, AuthGatewayStub()),
inbox_repository=InboxRepoStub(),
friendship_repository=cast(Any, FriendshipRepoStub(accepted=False)),
user_repository=cast(Any, UserRepoStub()),
)
with pytest.raises(ApiProblemError) as exc_info: