99 lines
4.3 KiB
Python
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()
|