Files
xiaoxia-saas/tests/unit/test_workspace_sqlalchemy_repositories.py
T
Xiaoxia AI c5321f4f12
CI/CD Pipeline / Validate Code Quality And Tests (push) Failing after 16s
Deploy / Deploy Staging (push) Successful in 1m55s
Deploy / Deploy Production (push) Has been skipped
feat(workspace): restore member management routes
2026-06-21 09:36:08 +08:00

99 lines
4.3 KiB
Python

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from packages.adapters.sqlalchemy_impl.models import Base
from packages.adapters.sqlalchemy_impl.user_repository import SQLAlchemyUserRepository
from packages.adapters.sqlalchemy_impl.workspace_invitation_repository import SQLAlchemyWorkspaceInvitationRepository
from packages.adapters.sqlalchemy_impl.workspace_member_repository import SQLAlchemyWorkspaceMemberRepository
from packages.adapters.sqlalchemy_impl.workspace_repository import SQLAlchemyWorkspaceRepository
from packages.application.workspace.create_workspace_use_case import CreateWorkspaceRequest, CreateWorkspaceUseCase
from packages.application.workspace.invite_member_use_case import InviteMemberRequest, InviteMemberUseCase
from packages.application.workspace.list_members_use_case import ListMembersRequest, ListMembersUseCase
from packages.application.workspace.list_workspaces_use_case import ListWorkspacesRequest, ListWorkspacesUseCase
from packages.domain.auth import password_hasher
from packages.domain.entities import User
def test_workspace_create_list_invite_and_members_with_sqlalchemy_repositories():
session = _sqlite_session()
user_repository = SQLAlchemyUserRepository(session)
workspace_repository = SQLAlchemyWorkspaceRepository(session)
workspace_member_repository = SQLAlchemyWorkspaceMemberRepository(session)
workspace_invitation_repository = SQLAlchemyWorkspaceInvitationRepository(session)
user_repository.save(
User(
id="user-1",
email="user@example.com",
username="user",
display_name="User",
password_hash=password_hasher.hash_password("Password1"),
)
)
create_response, create_error = CreateWorkspaceUseCase(
workspace_repository=workspace_repository,
workspace_member_repository=workspace_member_repository,
user_repository=user_repository,
).execute(CreateWorkspaceRequest(name="Main Workspace", owner_user_id="user-1", subscription_plan="free"))
assert create_error is None
assert create_response is not None
assert create_response.name == "Main Workspace"
list_response, list_error = ListWorkspacesUseCase(
workspace_repository=workspace_repository,
workspace_member_repository=workspace_member_repository,
).execute(ListWorkspacesRequest(user_id="user-1"))
assert list_error is None
assert list_response is not None
assert len(list_response.workspaces) == 1
assert list_response.workspaces[0].workspace_id == create_response.workspace_id
assert list_response.workspaces[0].user_role == "owner"
assert list_response.workspaces[0].member_count == 1
invite_response, invite_error = InviteMemberUseCase(
workspace_repository=workspace_repository,
workspace_member_repository=workspace_member_repository,
workspace_invitation_repository=workspace_invitation_repository,
user_repository=user_repository,
email_service=_NoopEmailService(),
).execute(
InviteMemberRequest(
workspace_id=create_response.workspace_id,
inviter_user_id="user-1",
invitee_email="Invitee@Example.com",
role="member",
)
)
assert invite_error is None
assert invite_response is not None
assert invite_response.invitee_email == "invitee@example.com"
assert workspace_invitation_repository.find_pending_by_workspace_and_email(
create_response.workspace_id, "invitee@example.com"
)
members_response, members_error = ListMembersUseCase(
workspace_repository=workspace_repository,
workspace_member_repository=workspace_member_repository,
user_repository=user_repository,
).execute(ListMembersRequest(workspace_id=create_response.workspace_id, requester_user_id="user-1"))
assert members_error is None
assert members_response is not None
assert len(members_response.members) == 1
assert members_response.members[0].role == "owner"
class _NoopEmailService:
def send_workspace_invitation_email(self, **kwargs):
return False, "disabled"
def _sqlite_session():
engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
session_factory = sessionmaker(bind=engine)
return session_factory()