Skip to content
This repository was archived by the owner on Jul 7, 2025. It is now read-only.

Commit 22cb0e3

Browse files
committed
익명 및 회원 편지 발신자 처리 로직 개선
- 회원 및 비회원 발신자에 대한 이름 처리 로직 추가(`LetterQueryService`). - `UserManagementPort` 의존성 삭제 및 관련 코드 변경. - 발신자가 익명인 경우 "비회원 발신자"로 이름이 표시되도록 수정. - 테스트 케이스 추가 및 기존 테스트 로직 최적화. - `LetterFixture`에 익명 발신자 생성 헬퍼 메서드 추가.
1 parent 3c84793 commit 22cb0e3

2 files changed

Lines changed: 234 additions & 98 deletions

File tree

Application-Module/src/test/kotlin/com/asap/application/letter/service/LetterQueryServiceTest.kt

Lines changed: 212 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import com.asap.application.letter.port.out.IndependentLetterManagementPort
55
import com.asap.application.letter.port.out.SendLetterManagementPort
66
import com.asap.application.letter.port.out.SpaceLetterManagementPort
77
import com.asap.application.space.port.out.SpaceManagementPort
8-
import com.asap.application.user.port.out.UserManagementPort
98
import com.asap.domain.LetterFixture
109
import com.asap.domain.SpaceFixture
1110
import com.asap.domain.UserFixture
@@ -20,15 +19,13 @@ class LetterQueryServiceTest :
2019
BehaviorSpec({
2120

2221
val mockSendLetterManagementPort = mockk<SendLetterManagementPort>(relaxed = true)
23-
val mockUserManagementPort = mockk<UserManagementPort>(relaxed = true)
2422
val mockIndependentLetterManagementPort = mockk<IndependentLetterManagementPort>(relaxed = true)
2523
val mockSpaceLetterManagementPort = mockk<SpaceLetterManagementPort>(relaxed = true)
2624
val mockSpaceManagementPort = mockk<SpaceManagementPort>(relaxed = true)
2725

2826
val letterQueryService =
2927
LetterQueryService(
3028
mockSendLetterManagementPort,
31-
mockUserManagementPort,
3229
mockIndependentLetterManagementPort,
3330
mockSpaceLetterManagementPort,
3431
mockSpaceManagementPort,
@@ -41,51 +38,78 @@ class LetterQueryServiceTest :
4138
letterId = "letter-id",
4239
userId = user.id.value,
4340
)
44-
val mockSendLetter = LetterFixture.generateSendLetter(user.id)
45-
val mockSender = UserFixture.createUser(mockSendLetter.senderId!!, "sender-name")
46-
every {
47-
mockSendLetterManagementPort.getReadLetterNotNull(
48-
receiverId = DomainId(query.userId),
49-
letterId = DomainId(query.letterId),
50-
)
51-
} returns mockSendLetter
52-
every {
53-
mockUserManagementPort.getUserNotNull(mockSender.id)
54-
} returns mockSender
55-
`when`("편지가 존재하면") {
41+
42+
`when`("회원이 보낸 편지가 존재하면") {
43+
val mockSendLetter = LetterFixture.generateSendLetter(user.id)
44+
every {
45+
mockSendLetterManagementPort.getReadLetterNotNull(
46+
receiverId = DomainId(query.userId),
47+
letterId = DomainId(query.letterId),
48+
)
49+
} returns mockSendLetter
50+
5651
val response = letterQueryService.get(query)
57-
then("편지 정보를 가져와야 한다") {
58-
response.senderName shouldBe mockSender.username
52+
then("발신자 이름은 mapper에서 처리된 이름이어야 한다") {
53+
response.senderName shouldBe mockSendLetter.senderName
5954
response.content shouldBe mockSendLetter.content.content
6055
response.sendDate shouldBe mockSendLetter.createdDate
6156
response.templateType shouldBe mockSendLetter.content.templateType
6257
response.images shouldBe mockSendLetter.content.images
6358
}
6459
}
60+
61+
`when`("익명으로 보낸 편지가 존재하면") {
62+
val anonymousSenderName = "익명 발신자"
63+
val mockAnonymousLetter = LetterFixture.generateAnonymousSendLetter(
64+
receiverId = user.id,
65+
senderName = anonymousSenderName
66+
)
67+
every {
68+
mockSendLetterManagementPort.getReadLetterNotNull(
69+
receiverId = DomainId(query.userId),
70+
letterId = DomainId(query.letterId),
71+
)
72+
} returns mockAnonymousLetter
73+
74+
val response = letterQueryService.get(query)
75+
then("발신자 이름은 저장된 senderName이어야 한다") {
76+
response.senderName shouldBe anonymousSenderName
77+
response.content shouldBe mockAnonymousLetter.content.content
78+
response.sendDate shouldBe mockAnonymousLetter.createdDate
79+
response.templateType shouldBe mockAnonymousLetter.content.templateType
80+
response.images shouldBe mockAnonymousLetter.content.images
81+
}
82+
}
6583
}
6684

6785
given("모든 무소속 편지를 조회할 떄") {
6886
val queryAll =
6987
GetIndependentLettersUsecase.QueryAll(
7088
userId = "user-id",
7189
)
72-
val mockLetters =
73-
listOf(
74-
LetterFixture.generateIndependentLetter(
75-
senderId = DomainId.generate(),
76-
senderName = "sender-name",
77-
receiverId = DomainId(queryAll.userId),
78-
),
90+
91+
`when`("회원과 비회원 편지가 함께 존재하면") {
92+
val memberLetter = LetterFixture.generateIndependentLetter(
93+
senderId = DomainId.generate(),
94+
senderName = "회원 발신자",
95+
receiverId = DomainId(queryAll.userId),
96+
)
97+
val anonymousLetter = LetterFixture.generateIndependentLetter(
98+
senderId = null,
99+
senderName = "비회원 발신자",
100+
receiverId = DomainId(queryAll.userId),
79101
)
80-
every {
81-
mockIndependentLetterManagementPort.getAllByReceiverId(DomainId(queryAll.userId))
82-
} returns mockLetters
83-
`when`("편지가 존재하면") {
102+
val mockLetters = listOf(memberLetter, anonymousLetter)
103+
104+
every {
105+
mockIndependentLetterManagementPort.getAllByReceiverId(DomainId(queryAll.userId))
106+
} returns mockLetters
107+
84108
val response = letterQueryService.getAll(queryAll)
85-
then("편지 정보를 가져와야 한다") {
86-
response.letters[0].letterId shouldBe mockLetters[0].id.value
87-
response.letters[0].senderName shouldBe mockLetters[0].sender.senderName
88-
response.letters[0].isNew shouldBe mockLetters[0].isNew()
109+
then("모든 편지의 발신자 이름이 정상적으로 표시되어야 한다") {
110+
response.letters.size shouldBe 2
111+
val senderNames = response.letters.map { it.senderName }.toSet()
112+
senderNames shouldBe setOf("회원 발신자", "비회원 발신자")
89113
}
90114
}
91115
}
@@ -100,40 +124,46 @@ class LetterQueryServiceTest :
100124
SpaceFixture.createSpace(
101125
userId = DomainId(query.userId),
102126
)
103-
val spaceLetter = LetterFixture.generateSpaceLetter(receiverId = DomainId(query.userId), spaceId = space.id)
104-
val prevSpaceLetter =
105-
LetterFixture.generateSpaceLetter(receiverId = DomainId(query.userId), spaceId = space.id)
106-
val nextSpaceLetter =
107-
LetterFixture.generateSpaceLetter(receiverId = DomainId(query.userId), spaceId = space.id)
108-
every {
109-
mockSpaceLetterManagementPort.getSpaceLetterNotNull(
110-
DomainId(query.letterId),
111-
DomainId(query.userId),
112-
)
113-
} returns spaceLetter
114-
every {
115-
mockSpaceManagementPort.getSpaceNotNull(
116-
spaceLetter.receiver.receiverId,
117-
spaceLetter.spaceId,
118-
)
119-
} returns space
120-
every {
121-
mockSpaceLetterManagementPort.countSpaceLetterBy(
122-
spaceLetter.spaceId,
123-
spaceLetter.receiver.receiverId,
127+
128+
`when`("회원이 보낸 행성 편지가 존재하면") {
129+
val spaceLetter = LetterFixture.generateSpaceLetter(
130+
receiverId = DomainId(query.userId),
131+
spaceId = space.id,
132+
senderName = "회원 발신자"
124133
)
125-
} returns 3
126-
every {
127-
mockSpaceLetterManagementPort.getNearbyLetter(
128-
spaceId = spaceLetter.spaceId,
129-
userId = spaceLetter.receiver.receiverId,
130-
letterId = spaceLetter.id,
131-
)
132-
} returns Pair(prevSpaceLetter, nextSpaceLetter)
133-
`when`("편지가 존재하면") {
134+
val prevSpaceLetter =
135+
LetterFixture.generateSpaceLetter(receiverId = DomainId(query.userId), spaceId = space.id)
136+
val nextSpaceLetter =
137+
LetterFixture.generateSpaceLetter(receiverId = DomainId(query.userId), spaceId = space.id)
138+
every {
139+
mockSpaceLetterManagementPort.getSpaceLetterNotNull(
140+
DomainId(query.letterId),
141+
DomainId(query.userId),
142+
)
143+
} returns spaceLetter
144+
every {
145+
mockSpaceManagementPort.getSpaceNotNull(
146+
spaceLetter.receiver.receiverId,
147+
spaceLetter.spaceId,
148+
)
149+
} returns space
150+
every {
151+
mockSpaceLetterManagementPort.countSpaceLetterBy(
152+
spaceLetter.spaceId,
153+
spaceLetter.receiver.receiverId,
154+
)
155+
} returns 3
156+
every {
157+
mockSpaceLetterManagementPort.getNearbyLetter(
158+
spaceId = spaceLetter.spaceId,
159+
userId = spaceLetter.receiver.receiverId,
160+
letterId = spaceLetter.id,
161+
)
162+
} returns Pair(prevSpaceLetter, nextSpaceLetter)
163+
134164
val response = letterQueryService.get(query)
135165
then("편지 정보를 가져와야 한다") {
136-
response.senderName shouldBe spaceLetter.sender.senderName
166+
response.senderName shouldBe "회원 발신자"
137167
response.spaceName shouldBe space.name
138168
response.letterCount shouldBe 3
139169
response.content shouldBe spaceLetter.content.content
@@ -150,6 +180,53 @@ class LetterQueryServiceTest :
150180
}
151181
}
152182
}
183+
184+
`when`("비회원이 보낸 행성 편지가 존재하면") {
185+
val anonymousSpaceLetter = LetterFixture.generateSpaceLetter(
186+
receiverId = DomainId(query.userId),
187+
spaceId = space.id,
188+
senderId = null,
189+
senderName = "비회원 발신자"
190+
)
191+
every {
192+
mockSpaceLetterManagementPort.getSpaceLetterNotNull(
193+
DomainId(query.letterId),
194+
DomainId(query.userId),
195+
)
196+
} returns anonymousSpaceLetter
197+
every {
198+
mockSpaceManagementPort.getSpaceNotNull(
199+
anonymousSpaceLetter.receiver.receiverId,
200+
anonymousSpaceLetter.spaceId,
201+
)
202+
} returns space
203+
every {
204+
mockSpaceLetterManagementPort.countSpaceLetterBy(
205+
anonymousSpaceLetter.spaceId,
206+
anonymousSpaceLetter.receiver.receiverId,
207+
)
208+
} returns 1
209+
every {
210+
mockSpaceLetterManagementPort.getNearbyLetter(
211+
spaceId = anonymousSpaceLetter.spaceId,
212+
userId = anonymousSpaceLetter.receiver.receiverId,
213+
letterId = anonymousSpaceLetter.id,
214+
)
215+
} returns Pair(null, null)
216+
217+
val response = letterQueryService.get(query)
218+
then("비회원 발신자 이름이 정상적으로 표시되어야 한다") {
219+
response.senderName shouldBe "비회원 발신자"
220+
response.spaceName shouldBe space.name
221+
response.letterCount shouldBe 1
222+
response.content shouldBe anonymousSpaceLetter.content.content
223+
response.receiveDate shouldBe anonymousSpaceLetter.receiveDate
224+
response.images shouldBe anonymousSpaceLetter.content.images
225+
response.templateType shouldBe anonymousSpaceLetter.content.templateType
226+
response.prevLetter shouldBe null
227+
response.nextLetter shouldBe null
228+
}
229+
}
153230
}
154231

155232
given("궤도 편지 상세 정보를 조회할 때") {
@@ -158,41 +235,43 @@ class LetterQueryServiceTest :
158235
userId = "user-id",
159236
letterId = "letter-id",
160237
)
161-
val independentLetter =
162-
LetterFixture.generateIndependentLetter(
163-
senderId = DomainId.generate(),
164-
senderName = "sender-name",
165-
receiverId = DomainId(query.userId),
166-
)
167-
val prevIndependentLetter =
168-
LetterFixture.generateIndependentLetter(
169-
senderId = DomainId.generate(),
170-
senderName = "prev-sender-name",
171-
receiverId = DomainId(query.userId),
172-
)
238+
239+
`when`("회원이 보낸 독립 편지가 존재하면") {
240+
val independentLetter =
241+
LetterFixture.generateIndependentLetter(
242+
senderId = DomainId.generate(),
243+
senderName = "sender-name",
244+
receiverId = DomainId(query.userId),
245+
)
246+
val prevIndependentLetter =
247+
LetterFixture.generateIndependentLetter(
248+
senderId = DomainId.generate(),
249+
senderName = "prev-sender-name",
250+
receiverId = DomainId(query.userId),
251+
)
173252

174-
val nextIndependentLetter =
175-
LetterFixture.generateIndependentLetter(
176-
senderId = DomainId.generate(),
177-
senderName = "next-sender-name",
178-
receiverId = DomainId(query.userId),
179-
)
180-
every {
181-
mockIndependentLetterManagementPort.getIndependentLetterByIdNotNull(
182-
DomainId(query.letterId),
183-
DomainId(query.userId),
184-
)
185-
} returns independentLetter
186-
every {
187-
mockIndependentLetterManagementPort.getNearbyLetter(
188-
userId = DomainId(query.userId),
189-
letterId = DomainId(query.letterId),
190-
)
191-
} returns Pair(prevIndependentLetter, nextIndependentLetter)
192-
every {
193-
mockIndependentLetterManagementPort.countIndependentLetterByReceiverId(DomainId(query.userId))
194-
} returns 3
195-
`when`("편지가 존재하면") {
253+
val nextIndependentLetter =
254+
LetterFixture.generateIndependentLetter(
255+
senderId = DomainId.generate(),
256+
senderName = "next-sender-name",
257+
receiverId = DomainId(query.userId),
258+
)
259+
every {
260+
mockIndependentLetterManagementPort.getIndependentLetterByIdNotNull(
261+
DomainId(query.letterId),
262+
DomainId(query.userId),
263+
)
264+
} returns independentLetter
265+
every {
266+
mockIndependentLetterManagementPort.getNearbyLetter(
267+
userId = DomainId(query.userId),
268+
letterId = DomainId(query.letterId),
269+
)
270+
} returns Pair(prevIndependentLetter, nextIndependentLetter)
271+
every {
272+
mockIndependentLetterManagementPort.countIndependentLetterByReceiverId(DomainId(query.userId))
273+
} returns 3
274+
196275
val response = letterQueryService.get(query)
197276
then("편지 정보를 가져와야 한다") {
198277
response.senderName shouldBe independentLetter.sender.senderName
@@ -211,6 +290,42 @@ class LetterQueryServiceTest :
211290
}
212291
}
213292
}
293+
294+
`when`("비회원이 보낸 독립 편지가 존재하면") {
295+
val anonymousIndependentLetter =
296+
LetterFixture.generateIndependentLetter(
297+
senderId = null,
298+
senderName = "비회원 발신자",
299+
receiverId = DomainId(query.userId),
300+
)
301+
every {
302+
mockIndependentLetterManagementPort.getIndependentLetterByIdNotNull(
303+
DomainId(query.letterId),
304+
DomainId(query.userId),
305+
)
306+
} returns anonymousIndependentLetter
307+
every {
308+
mockIndependentLetterManagementPort.getNearbyLetter(
309+
userId = DomainId(query.userId),
310+
letterId = DomainId(query.letterId),
311+
)
312+
} returns Pair(null, null)
313+
every {
314+
mockIndependentLetterManagementPort.countIndependentLetterByReceiverId(DomainId(query.userId))
315+
} returns 1
316+
317+
val response = letterQueryService.get(query)
318+
then("비회원 발신자 이름이 정상적으로 표시되어야 한다") {
319+
response.senderName shouldBe "비회원 발신자"
320+
response.letterCount shouldBe 1
321+
response.content shouldBe anonymousIndependentLetter.content.content
322+
response.sendDate shouldBe anonymousIndependentLetter.receiveDate
323+
response.images shouldBe anonymousIndependentLetter.content.images
324+
response.templateType shouldBe anonymousIndependentLetter.content.templateType
325+
response.prevLetter shouldBe null
326+
response.nextLetter shouldBe null
327+
}
328+
}
214329
}
215330

216331
given("전체 편지 조회 요청이 들어올 떄") {

0 commit comments

Comments
 (0)