Skip to content

Commit cfd69e8

Browse files
authored
Feat: sponsor test 코드 작성 & sponsor 코드 수정 (#100)
- sponsor 테스트 코드를 작성했습니다 - sponsor api 코드를 수정했습니다 - amount 자료형을 int으로 하고, sponsored_date의 자료형을 Date로 바꿨습니다 - 제가 그 당시에 코드를 대충 짰나 봅니다 ㅠㅠ <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - Refactor - Standardized sponsor amount to an integer value. - Sponsored date is now date-only (no time/timezone). - API endpoints now accept numeric sponsor IDs instead of strings. - Tests - Added comprehensive tests for sponsor creation, retrieval, listing, and updates. - Chores - Database schema updated to align column types with the new formats. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent 5979069 commit cfd69e8

File tree

8 files changed

+247
-9
lines changed

8 files changed

+247
-9
lines changed

wacruit/src/apps/sponsor/models.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from datetime import datetime
1+
from datetime import date
22

3-
from sqlalchemy import DateTime
3+
from sqlalchemy import Date
44
from sqlalchemy.orm import Mapped
55
from sqlalchemy.orm import mapped_column
66

@@ -14,7 +14,7 @@ class Sponsor(DeclarativeBase):
1414

1515
id: Mapped[intpk]
1616
name: Mapped[str30]
17-
amount: Mapped[str30]
17+
amount: Mapped[int]
1818
email: Mapped[str30 | None]
1919
phone_number: Mapped[str30 | None]
20-
sponsored_date: Mapped[datetime] = mapped_column(DateTime(timezone=True))
20+
sponsored_date: Mapped[date] = mapped_column(Date)

wacruit/src/apps/sponsor/repositories.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def create_sponsor(self, sponsor: Sponsor):
2323
def get_sponsor_by_sponsor_name(self, sponsor_name: str) -> Sponsor | None:
2424
return self.session.query(Sponsor).filter(Sponsor.name == sponsor_name).first()
2525

26-
def get_sponsor_by_id(self, sponsor_id: str) -> Sponsor | None:
26+
def get_sponsor_by_id(self, sponsor_id: int) -> Sponsor | None:
2727
return self.session.query(Sponsor).filter(Sponsor.id == sponsor_id).first()
2828

2929
def get_all_sponsors(self) -> list[Sponsor]:

wacruit/src/apps/sponsor/services.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def create_sponsor(self, request: SponsorCreateRequest):
2929
)
3030
return self.sponsor_repository.create_sponsor(sponsor)
3131

32-
def get_sponsor_by_id(self, sponsor_id: str) -> SponsorInfoResponse:
32+
def get_sponsor_by_id(self, sponsor_id: int) -> SponsorInfoResponse:
3333
sponsor = self.sponsor_repository.get_sponsor_by_id(sponsor_id)
3434
if not sponsor:
3535
raise SponsorNotFoundException
@@ -46,7 +46,7 @@ def get_all_sponsors(self) -> ListResponse[SponsorBriefResponse]:
4646
)
4747

4848
def update_sponsor(
49-
self, sponsor_id: str, request: SponsorUpdateRequest
49+
self, sponsor_id: int, request: SponsorUpdateRequest
5050
) -> SponsorInfoResponse:
5151
sponsor = self.sponsor_repository.get_sponsor_by_id(sponsor_id)
5252
if not sponsor:

wacruit/src/apps/sponsor/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def create_sponsor(
2727
@v3_router.get("/{sponsor_id}")
2828
def get_sponsor(
2929
admin_user: AdminUser,
30-
sponsor_id: str,
30+
sponsor_id: int,
3131
sponsor_service: Annotated[SponsorService, Depends()],
3232
) -> SponsorInfoResponse:
3333
return sponsor_service.get_sponsor_by_id(sponsor_id)
@@ -43,7 +43,7 @@ def get_all_sponsors(
4343
@v3_router.patch("/{sponsor_id}")
4444
def update_sponsor(
4545
admin_user: AdminUser,
46-
sponsor_id: str,
46+
sponsor_id: int,
4747
request: SponsorUpdateRequest,
4848
sponsor_service: Annotated[SponsorService, Depends()],
4949
) -> SponsorInfoResponse:
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""fix sponsor amount & sponsored_date type
2+
3+
Revision ID: 16b579609e97
4+
Revises: 4869ce051b80
5+
Create Date: 2025-08-25 21:36:23.655109
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
from sqlalchemy.dialects import mysql
11+
12+
# revision identifiers, used by Alembic.
13+
revision = "16b579609e97"
14+
down_revision = "4869ce051b80"
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade() -> None:
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.alter_column(
22+
"sponsor",
23+
"amount",
24+
existing_type=mysql.VARCHAR(length=30),
25+
type_=sa.Integer(),
26+
existing_nullable=False,
27+
)
28+
# ### end Alembic commands ###
29+
30+
31+
def downgrade() -> None:
32+
# ### commands auto generated by Alembic - please adjust! ###
33+
op.alter_column(
34+
"sponsor",
35+
"amount",
36+
existing_type=sa.Integer(),
37+
type_=mysql.VARCHAR(length=30),
38+
existing_nullable=False,
39+
)
40+
# ### end Alembic commands ###
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""fix sponsored_date type
2+
3+
Revision ID: f1532cef4ac5
4+
Revises: 16b579609e97
5+
Create Date: 2025-08-25 21:42:00.063456
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
from sqlalchemy.dialects import mysql
11+
12+
# revision identifiers, used by Alembic.
13+
revision = "f1532cef4ac5"
14+
down_revision = "16b579609e97"
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade() -> None:
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.alter_column(
22+
"sponsor",
23+
"sponsored_date",
24+
existing_type=mysql.DATETIME(),
25+
type_=sa.Date(),
26+
existing_nullable=False,
27+
)
28+
# ### end Alembic commands ###
29+
30+
31+
def downgrade() -> None:
32+
# ### commands auto generated by Alembic - please adjust! ###
33+
op.alter_column(
34+
"sponsor",
35+
"sponsored_date",
36+
existing_type=sa.Date(),
37+
type_=mysql.DATETIME(),
38+
existing_nullable=False,
39+
)
40+
# ### end Alembic commands ###
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import datetime
2+
from typing import List
3+
4+
from pydantic import EmailStr
5+
import pytest
6+
from sqlalchemy.orm import Session
7+
8+
from wacruit.src.apps.sponsor.models import Sponsor
9+
from wacruit.src.apps.sponsor.repositories import SponsorRepository
10+
from wacruit.src.apps.sponsor.schemas import SponsorCreateRequest
11+
from wacruit.src.apps.sponsor.schemas import SponsorUpdateRequest
12+
from wacruit.src.apps.sponsor.services import SponsorService
13+
from wacruit.src.database.connection import Transaction
14+
15+
16+
@pytest.fixture
17+
def sponsor_repository(db_session: Session) -> SponsorRepository:
18+
return SponsorRepository(session=db_session, transaction=Transaction(db_session))
19+
20+
21+
@pytest.fixture
22+
def sponsor_service(sponsor_repository: SponsorRepository) -> SponsorService:
23+
return SponsorService(sponsor_repository=sponsor_repository)
24+
25+
26+
@pytest.fixture
27+
def created_sponsor(db_session: Session) -> Sponsor:
28+
sponsor = Sponsor(
29+
name="김와플",
30+
amount=50000,
31+
32+
phone_number="010-1234-5678",
33+
sponsored_date=datetime.date(2025, 1, 1),
34+
)
35+
db_session.add(sponsor)
36+
db_session.commit()
37+
return sponsor
38+
39+
40+
@pytest.fixture
41+
def created_sponsor_list(db_session: Session) -> List[Sponsor]:
42+
sponsors = [
43+
Sponsor(
44+
name="김와플",
45+
amount=50000,
46+
47+
phone_number="010-1111-1111",
48+
sponsored_date=datetime.date(2025, 1, 1),
49+
),
50+
Sponsor(
51+
name="이와플",
52+
amount=200000,
53+
54+
phone_number="010-2222-2222",
55+
sponsored_date=datetime.date(2025, 1, 1),
56+
),
57+
Sponsor(
58+
name="최와플",
59+
amount=300000,
60+
61+
phone_number="010-3333-3333",
62+
sponsored_date=datetime.date(2025, 1, 1),
63+
),
64+
]
65+
66+
db_session.add_all(sponsors)
67+
db_session.commit()
68+
69+
return sponsors
70+
71+
72+
@pytest.fixture
73+
def sponsor_create_dto():
74+
return SponsorCreateRequest(
75+
name="김와플",
76+
amount=100000,
77+
sponsored_date=datetime.date(2025, 1, 1),
78+
email=EmailStr("[email protected]"),
79+
phone_number="010-1234-5678",
80+
)
81+
82+
83+
@pytest.fixture
84+
def sponsor_update_dto():
85+
return SponsorUpdateRequest(
86+
amount=1000000,
87+
email=EmailStr("[email protected]"),
88+
phone_number="010-2222-3333",
89+
)
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from typing import List
2+
3+
import pytest
4+
5+
from wacruit.src.apps.sponsor.exceptions import SponsorAlreadyExistsException
6+
from wacruit.src.apps.sponsor.exceptions import SponsorNotFoundException
7+
from wacruit.src.apps.sponsor.models import Sponsor
8+
from wacruit.src.apps.sponsor.schemas import SponsorCreateRequest
9+
from wacruit.src.apps.sponsor.schemas import SponsorUpdateRequest
10+
from wacruit.src.apps.sponsor.services import SponsorService
11+
12+
13+
def test_create_sponsor(
14+
sponsor_service: SponsorService, sponsor_create_dto: SponsorCreateRequest
15+
):
16+
created_sponsor = sponsor_service.create_sponsor(sponsor_create_dto)
17+
18+
assert created_sponsor.id is not None
19+
assert created_sponsor.name == sponsor_create_dto.name
20+
assert created_sponsor.email == sponsor_create_dto.email
21+
assert created_sponsor.phone_number == sponsor_create_dto.phone_number
22+
assert created_sponsor.sponsored_date == sponsor_create_dto.sponsored_date
23+
24+
25+
def test_create_duplicate_sponsor(
26+
sponsor_service: SponsorService, sponsor_create_dto: SponsorCreateRequest
27+
):
28+
sponsor_service.create_sponsor(sponsor_create_dto)
29+
with pytest.raises(SponsorAlreadyExistsException):
30+
sponsor_service.create_sponsor(sponsor_create_dto)
31+
32+
33+
def test_get_sponsor_by_existing_id(
34+
sponsor_service: SponsorService, created_sponsor: Sponsor
35+
):
36+
sponsor = sponsor_service.get_sponsor_by_id(created_sponsor.id)
37+
assert sponsor.id == created_sponsor.id
38+
assert sponsor.name == created_sponsor.name
39+
assert sponsor.amount == created_sponsor.amount
40+
assert sponsor.email == created_sponsor.email
41+
assert sponsor.phone_number == created_sponsor.phone_number
42+
assert sponsor.sponsored_date == created_sponsor.sponsored_date
43+
44+
45+
def test_get_sponsor_by_non_existing_id(sponsor_service: SponsorService):
46+
with pytest.raises(SponsorNotFoundException):
47+
sponsor_service.get_sponsor_by_id(1234)
48+
49+
50+
def test_get_all_sponsors(
51+
sponsor_service: SponsorService, created_sponsor_list: List[Sponsor]
52+
):
53+
sponsors = sponsor_service.get_all_sponsors()
54+
assert len(sponsors.items) == len(created_sponsor_list)
55+
for i in range(3):
56+
assert sponsors.items[i].name == created_sponsor_list[i].name
57+
58+
59+
def test_update_sponsor(
60+
sponsor_service: SponsorService,
61+
sponsor_create_dto: SponsorCreateRequest,
62+
sponsor_update_dto: SponsorUpdateRequest,
63+
):
64+
sponsor = sponsor_service.create_sponsor(sponsor_create_dto)
65+
assert sponsor.id is not None
66+
updated_sponsor = sponsor_service.update_sponsor(sponsor.id, sponsor_update_dto)
67+
assert updated_sponsor.amount == sponsor_update_dto.amount
68+
assert updated_sponsor.email == sponsor_update_dto.email
69+
assert updated_sponsor.phone_number == sponsor_update_dto.phone_number

0 commit comments

Comments
 (0)