Add tests for sound repository, user OAuth repository, credit service, and credit decorators
- Implement comprehensive tests for SoundRepository covering CRUD operations and search functionalities. - Create tests for UserOauthRepository to validate OAuth record management. - Develop tests for CreditService to ensure proper credit management, including validation, deduction, and addition of credits. - Add tests for credit-related decorators to verify correct behavior in credit management scenarios.
This commit is contained in:
108
app/repositories/credit_transaction.py
Normal file
108
app/repositories/credit_transaction.py
Normal file
@@ -0,0 +1,108 @@
|
||||
"""Repository for credit transaction database operations."""
|
||||
|
||||
from sqlmodel import select
|
||||
from sqlmodel.ext.asyncio.session import AsyncSession
|
||||
|
||||
from app.models.credit_transaction import CreditTransaction
|
||||
from app.repositories.base import BaseRepository
|
||||
|
||||
|
||||
class CreditTransactionRepository(BaseRepository[CreditTransaction]):
|
||||
"""Repository for credit transaction operations."""
|
||||
|
||||
def __init__(self, session: AsyncSession) -> None:
|
||||
"""Initialize the repository.
|
||||
|
||||
Args:
|
||||
session: Database session
|
||||
|
||||
"""
|
||||
super().__init__(CreditTransaction, session)
|
||||
|
||||
async def get_by_user_id(
|
||||
self,
|
||||
user_id: int,
|
||||
limit: int = 50,
|
||||
offset: int = 0,
|
||||
) -> list[CreditTransaction]:
|
||||
"""Get credit transactions for a user.
|
||||
|
||||
Args:
|
||||
user_id: The user ID
|
||||
limit: Maximum number of transactions to return
|
||||
offset: Number of transactions to skip
|
||||
|
||||
Returns:
|
||||
List of credit transactions ordered by creation date (newest first)
|
||||
|
||||
"""
|
||||
stmt = (
|
||||
select(CreditTransaction)
|
||||
.where(CreditTransaction.user_id == user_id)
|
||||
.order_by(CreditTransaction.created_at.desc())
|
||||
.limit(limit)
|
||||
.offset(offset)
|
||||
)
|
||||
result = await self.session.exec(stmt)
|
||||
return list(result.all())
|
||||
|
||||
async def get_by_action_type(
|
||||
self,
|
||||
action_type: str,
|
||||
limit: int = 50,
|
||||
offset: int = 0,
|
||||
) -> list[CreditTransaction]:
|
||||
"""Get credit transactions by action type.
|
||||
|
||||
Args:
|
||||
action_type: The action type to filter by
|
||||
limit: Maximum number of transactions to return
|
||||
offset: Number of transactions to skip
|
||||
|
||||
Returns:
|
||||
List of credit transactions ordered by creation date (newest first)
|
||||
|
||||
"""
|
||||
stmt = (
|
||||
select(CreditTransaction)
|
||||
.where(CreditTransaction.action_type == action_type)
|
||||
.order_by(CreditTransaction.created_at.desc())
|
||||
.limit(limit)
|
||||
.offset(offset)
|
||||
)
|
||||
result = await self.session.exec(stmt)
|
||||
return list(result.all())
|
||||
|
||||
async def get_successful_transactions(
|
||||
self,
|
||||
user_id: int | None = None,
|
||||
limit: int = 50,
|
||||
offset: int = 0,
|
||||
) -> list[CreditTransaction]:
|
||||
"""Get successful credit transactions.
|
||||
|
||||
Args:
|
||||
user_id: Optional user ID to filter by
|
||||
limit: Maximum number of transactions to return
|
||||
offset: Number of transactions to skip
|
||||
|
||||
Returns:
|
||||
List of successful credit transactions
|
||||
|
||||
"""
|
||||
stmt = (
|
||||
select(CreditTransaction)
|
||||
.where(CreditTransaction.success == True) # noqa: E712
|
||||
)
|
||||
|
||||
if user_id is not None:
|
||||
stmt = stmt.where(CreditTransaction.user_id == user_id)
|
||||
|
||||
stmt = (
|
||||
stmt.order_by(CreditTransaction.created_at.desc())
|
||||
.limit(limit)
|
||||
.offset(offset)
|
||||
)
|
||||
|
||||
result = await self.session.exec(stmt)
|
||||
return list(result.all())
|
||||
Reference in New Issue
Block a user