Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ interface GuestUseCase {
): Guest

fun respondInvitation(
guestId: UUID?,
invitationId: UUID,
memberId: UUID,
nickname: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ interface GuestPersistencePort {
fun findAttendanceByMemberAndInvitation(memberId: UUID, invitationId: UUID): Boolean?

fun findOwnerNickname(invitationId: UUID, memberId: UUID): String

fun findIdByMemberAndInvitation(memberId: UUID, invitationId: UUID): UUID?
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ class GuestService(
}

override fun respondInvitation(
guestId: UUID?,
invitationId: UUID,
memberId: UUID,
nickname: String,
Expand All @@ -59,6 +58,8 @@ class GuestService(

val invitation = invitationUseCase.findById(invitationId)

val guestId = guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId)

if (guestId == null) {
guestPersistencePort.save(
GuestVO(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,9 @@ class GuestServiceTest : DescribeSpec({
modifiedAt = LocalDateTime.now()
)

every { guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId) } returns null

guestService.respondInvitation(
guestId = null,
invitationId = invitationId,
memberId = memberId,
nickname = guestNickname,
Expand All @@ -144,78 +145,8 @@ class GuestServiceTest : DescribeSpec({
verify(exactly = 1) { memberUseCase.findById(memberId) }
verify(exactly = 1) { invitationUseCase.findById(invitationId) }
verify(exactly = 1) {
guestPersistencePort.save(match<GuestVO> { guestVO ->
guestVO.member == member &&
guestVO.invitation == invitation &&
guestVO.nickname == guestNickname &&
guestVO.attendance == attendance
})
guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId)
}
confirmVerified(memberUseCase, invitationUseCase, guestPersistencePort)
}

it("guestId가 null이 아니면 기존 Guest의 attendance만 업데이트한다.") {
val guestId = UUID.randomUUID()
val expectedGuest = Guest(
id = guestId,
member = member,
invitation = invitation,
nickname = guestNickname,
attendance = true,
createdAt = LocalDateTime.now(),
modifiedAt = LocalDateTime.now()
)

every { guestPersistencePort.findById(any()) } returns expectedGuest

val updatedAttendance = false
expectedGuest.updateAttendance(updatedAttendance)

val slotGuest = slot<Guest>()
every { guestPersistencePort.save(capture(slotGuest)) } just runs

guestService.respondInvitation(
guestId = guestId,
invitationId = invitationId,
memberId = memberId,
nickname = guestNickname,
attendance = updatedAttendance
)

slotGuest.captured.attendance shouldBe updatedAttendance

verify(exactly = 1) { memberUseCase.findById(memberId) }
verify(exactly = 1) { invitationUseCase.findById(invitationId) }
verify(exactly = 1) { guestPersistencePort.findById(any()) }
verify(exactly = 1) { guestPersistencePort.save(any<Guest>()) }
confirmVerified(memberUseCase, invitationUseCase, guestPersistencePort)
}
}

context("respondInvitation 메서드를 통해서") {
it("guestId가 null이면 새로운 Guest를 생성한다.") {
val attendance = true

every { guestPersistencePort.save(any<GuestVO>()) } returns Guest(
id = UUID.randomUUID(),
member = member,
invitation = invitation,
nickname = guestNickname,
attendance = attendance,
createdAt = LocalDateTime.now(),
modifiedAt = LocalDateTime.now()
)

guestService.respondInvitation(
guestId = null,
invitationId = invitationId,
memberId = memberId,
nickname = guestNickname,
attendance = attendance
)

verify(exactly = 1) { memberUseCase.findById(memberId) }
verify(exactly = 1) { invitationUseCase.findById(invitationId) }
verify(exactly = 1) {
guestPersistencePort.save(match<GuestVO> { guestVO ->
guestVO.member == member &&
Expand All @@ -240,6 +171,7 @@ class GuestServiceTest : DescribeSpec({
)

every { guestPersistencePort.findById(any()) } returns expectedGuest
every { guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId) } returns guestId

val updatedAttendance = false
expectedGuest.updateAttendance(updatedAttendance)
Expand All @@ -248,7 +180,6 @@ class GuestServiceTest : DescribeSpec({
every { guestPersistencePort.save(capture(slotGuest)) } just runs

guestService.respondInvitation(
guestId = guestId,
invitationId = invitationId,
memberId = memberId,
nickname = guestNickname,
Expand All @@ -261,9 +192,13 @@ class GuestServiceTest : DescribeSpec({
verify(exactly = 1) { invitationUseCase.findById(invitationId) }
verify(exactly = 1) { guestPersistencePort.findById(any()) }
verify(exactly = 1) { guestPersistencePort.save(any<Guest>()) }
verify(exactly = 1) {
guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId)
}
confirmVerified(memberUseCase, invitationUseCase, guestPersistencePort)
}
}

context("findAttendGuestsByInvitation, findNotAttendGuestsByInvitation 메서드를 통해서") {
it("참석하는 게스트와 참석하지 않는 게스트 목록이 반환되어야 한다.") {
val attendingGuest1 = Guest(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class GuestEntity(
@Column
val nickname: String,

@Column(nullable = false)
@Column
val attendance: Boolean,
) : BaseTimeEntity() {
fun toDomain(): Guest =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,10 @@ interface GuestJPARepository : JpaRepository<GuestEntity, UUID> {
"WHERE g.member.id = :memberId " +
"AND g.invitation.id = :invitationId")
fun findOwnerNickname(invitationId: UUID, memberId: UUID): String

@Query("SELECT g.id " +
"FROM guest g " +
"WHERE g.member.id = :memberId " +
"AND g.invitation.id = :invitationId")
fun findIdByMemberIdAndInvitationId(memberId: UUID, invitationId: UUID): UUID?
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,9 @@ import kotlin.jvm.optionals.getOrNull
class GuestRepository(
private val guestJPARepository: GuestJPARepository,
) : GuestPersistencePort {
override fun save(guestVo: GuestVO): Guest {
return guestJPARepository.save(GuestEntity.from(guestVo))
override fun save(guestVo: GuestVO) =
guestJPARepository.save(GuestEntity.from(guestVo))
.toDomain()
}

override fun save(guest: Guest) {
guestJPARepository.save(GuestEntity.from(guest))
Expand All @@ -46,10 +45,12 @@ class GuestRepository(
.map(GuestEntity::toDomain)
}

override fun findAttendanceByMemberAndInvitation(memberId: UUID, invitationId: UUID): Boolean? {
return guestJPARepository.findAttendanceByMemberIdAndInvitationId(memberId, invitationId)
}
override fun findAttendanceByMemberAndInvitation(memberId: UUID, invitationId: UUID) =
guestJPARepository.findAttendanceByMemberIdAndInvitationId(memberId, invitationId)

override fun findOwnerNickname(invitationId: UUID, memberId: UUID): String =
guestJPARepository.findOwnerNickname(invitationId, memberId)

override fun findIdByMemberAndInvitation(memberId: UUID, invitationId: UUID) =
guestJPARepository.findIdByMemberIdAndInvitationId(memberId, invitationId)
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class GuestRepositoryTest(
lateinit var invitationEntity: InvitationEntity
lateinit var memberEntity: MemberEntity

beforeSpec {
beforeEach {
memberEntity = MemberEntity.from(
MemberVO(
socialId = "6316",
Expand All @@ -54,7 +54,7 @@ class GuestRepositoryTest(
)
}

afterSpec {
afterEach {
guestJPARepository.deleteAllInBatch()
invitationJPARepository.deleteAllInBatch()
memberJPARepository.deleteAllInBatch()
Expand All @@ -72,5 +72,27 @@ class GuestRepositoryTest(
savedGuest.invitation.id shouldBe invitationEntity.id
}
}

context("findIdByMemberIdAndInvitationId() 메서드에서") {
it("Guest가 존재하면 guestId를 반환해야 한다.") {
val savedGuest = guestRepository.save(guestVO)

val memberId = memberEntity.id!!
val invitationId = invitationEntity.id!!

val guestId = guestRepository.findIdByMemberAndInvitation(memberId, invitationId)

guestId shouldBe savedGuest.id
}

it("Guest가 존재하지 않으면 null을 반환해야 한다.") {
val memberId = memberEntity.id!!
val invitationId = invitationEntity.id!!

val guestId = guestRepository.findIdByMemberAndInvitation(memberId, invitationId)

guestId shouldBe null
}
}
}
})
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package site.yourevents.guest.dto.request
import java.util.UUID

data class InvitationRespondRequest(
val guestId: UUID?,
val invitationId: UUID,
val nickname: String,
val attendance: Boolean,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ class GuestFacade(
val memberId = authDetails.uuid

guestUseCase.respondInvitation(
invitationRespondRequest.guestId,
invitationRespondRequest.invitationId,
memberId,
invitationRespondRequest.nickname,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,10 @@ class GuestFacadeTest : DescribeSpec({
any(),
any(),
any(),
any()
)
} just runs

val request = InvitationRespondRequest(
guestId = UUID.randomUUID(),
invitationId = UUID.randomUUID(),
nickname = "nickname",
attendance = true
Expand All @@ -49,7 +47,6 @@ class GuestFacadeTest : DescribeSpec({
any(),
any(),
any(),
any()
)
}
confirmVerified(guestUseCase)
Expand Down