
class PostService(
private val userService: UserService,
private val postRepository: PostRepository
) {
fun getRecommendedPosts(userId: String): List<PostDto> {
val user = userService.getUserById(userId)
val posts = postRepository.findAll()
val filtered = filterPostsForUser(posts, user)
return filtered.map { PostDto.from(it) }
}
private fun filterPostsForUser(posts: List<Post>, user: User): List<Post> {
return posts.filter {
it.isActive &&
it.region == user.region &&
it.visibility == "public"
}
}
}class PostFilter {
fun filter(posts: List<Post>, user: User): List<Post> {
return posts.filter {
it.isActive &&
it.region == user.region &&
it.visibility == "public"
}
}
}class PostService(
private val userService: UserService,
private val postRepository: PostRepository,
private val postFilter: PostFilter
) {
fun getRecommendedPosts(userId: String): List<PostDto> {
val user = userService.getUserById(userId)
val posts = postRepository.findAll()
return postFilter.filter(posts, user).map { PostDto.from(it) }
}
}class Post(
val id: String,
val region: String,
val isActive: Boolean,
val visibility: String
) {
fun isRecommendedFor(user: User): Boolean {
return isActive && visibility == "public" && region == user.region
}
}class PostService(
private val userService: UserService,
private val postRepository: PostRepository
) {
fun getRecommendedPosts(userId: String): List<PostDto> {
val user = userService.getUserById(userId)
val posts = postRepository.findAll()
val filtered = posts.filter { it.isRecommendedFor(user) }
return filtered.map { PostDto.from(it) }
}
}@Test
fun `유저 정보와 전체 포스트를 기반으로 필터링된 추천 포스트를 반환한다`() {
// given
val userId = "user123"
val user = User(region = "SEOUL")
val posts = listOf(
Post(id = "p1", region = "SEOUL", isActive = true, visibility = "public"),
Post(id = "p2", region = "BUSAN", isActive = true, visibility = "public")
)
val filteredPosts = listOf(posts.first())
whenever(userService.getUserById(userId)).thenReturn(user)
whenever(postRepository.findAll()).thenReturn(posts)
whenever(postFilter.filter(posts, user)).thenReturn(filteredPosts)
// when
val result = postService.getRecommendedPosts(userId)
// then
assertThat(result).hasSize(1)
assertThat(result.first().id).isEqualTo("p1")
}@Test
fun `user의 지역과 다른 글은 제외된다`() {
// given
val posts = listOf(
Post(region = "SEOUL", isActive = true, visibility = "public"),
Post(region = "BUSAN", isActive = true, visibility = "public")
)
val user = User(region = "SEOUL")
// when
val filtered = postFilter.filter(posts, user)
// then
assertThat(filtered).hasSize(1)
assertThat(filtered.first().region).isEqualTo("SEOUL")
}@Test
fun `추천 조건을 만족하는 포스트만 반환한다`() {
// given
val userId = "user123"
val user = User(region = "SEOUL")
val posts = listOf(
Post(id = "p1", region = "SEOUL", isActive = true, visibility = "public"),
Post(id = "p2", region = "BUSAN", isActive = true, visibility = "public"),
Post(id = "p3", region = "SEOUL", isActive = false, visibility = "public"),
Post(id = "p4", region = "SEOUL", isActive = true, visibility = "private")
)
whenever(userService.getUserById(userId)).thenReturn(user)
whenever(postRepository.findAll()).thenReturn(posts)
// when
val result = postService.getRecommendedPosts(userId)
// then
assertThat(result).hasSize(1)
assertThat(result.first().id).isEqualTo("p1")
}@Test
fun `isRecommendedFor - 동일 지역, 공개 상태, 활성화된 포스트는 true`() {
val post = Post(id = "p1", region = "SEOUL", isActive = true, visibility = "public")
val user = User(region = "SEOUL")
val result = post.isRecommendedFor(user)
assertThat(result).isTrue()
}