From a95c91d31fd12a10cce8444780274031e465217d Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 30 Sep 2026 19:08:15 +0900 Subject: [PATCH] =?UTF-8?q?feat(menu):=20=EA=B4=80=EB=A6=AC=EC=9E=90=20?= =?UTF-8?q?=EC=84=A0=EB=AC=BC=ED=95=A8=20=EB=A9=94=EB=89=B4=EB=A5=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/vividnext/sodalive/menu/MenuService.kt | 17 +++++- .../sodalive/menu/MenuServiceTest.kt | 57 +++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/test/kotlin/kr/co/vividnext/sodalive/menu/MenuServiceTest.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuService.kt index 957b7bb8..77455f1f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuService.kt @@ -1,6 +1,7 @@ package kr.co.vividnext.sodalive.menu import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.member.MemberRole import org.springframework.stereotype.Service @Service @@ -8,6 +9,20 @@ class MenuService( private val repository: MenuRepository ) { fun getMenus(member: Member): List { - return repository.getMenu(member.role) + val menus = repository.getMenu(member.role) + if (member.role != MemberRole.ADMIN) return menus + + return menus + giftManagementMenu + } + + private companion object { + val giftManagementMenu = GetMenuResponse( + title = "선물함 관리", + items = listOf( + GetMenuResponse(title = "선물함 리스트", route = "/gift/list"), + GetMenuResponse(title = "선물 카테고리", route = "/gift/category"), + GetMenuResponse(title = "선물 사이즈", route = "/gift/size") + ) + ) } } diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/menu/MenuServiceTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/menu/MenuServiceTest.kt new file mode 100644 index 00000000..8f143b43 --- /dev/null +++ b/src/test/kotlin/kr/co/vividnext/sodalive/menu/MenuServiceTest.kt @@ -0,0 +1,57 @@ +package kr.co.vividnext.sodalive.menu + +import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.member.MemberRole +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertNull +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.mockito.Mockito + +class MenuServiceTest { + private val repository = Mockito.mock(MenuRepository::class.java) + private val service = MenuService(repository) + + @Test + @DisplayName("관리자 메뉴 마지막에 선물함 관리 메뉴를 추가한다") + fun shouldAppendGiftMenuForAdmin() { + Mockito.`when`(repository.getMenu(MemberRole.ADMIN)).thenReturn( + listOf(GetMenuResponse(title = "회원 관리", route = "/member/list")) + ) + + val menus = service.getMenus(member(MemberRole.ADMIN)) + + assertEquals("회원 관리", menus[0].title) + val giftMenu = menus.last() + assertEquals("선물함 관리", giftMenu.title) + assertNull(giftMenu.route) + assertEquals( + listOf("선물함 리스트", "선물 카테고리", "선물 사이즈"), + giftMenu.items?.map { it.title } + ) + assertEquals( + listOf("/gift/list", "/gift/category", "/gift/size"), + giftMenu.items?.map { it.route } + ) + } + + @Test + @DisplayName("관리자가 아니면 선물함 관리 메뉴를 추가하지 않는다") + fun shouldNotAppendGiftMenuForNonAdmin() { + Mockito.`when`(repository.getMenu(MemberRole.CONTENT_MANAGER)).thenReturn( + listOf(GetMenuResponse(title = "콘텐츠 리스트", route = "/content/list")) + ) + + val menus = service.getMenus(member(MemberRole.CONTENT_MANAGER)) + + assertEquals(1, menus.size) + assertEquals("콘텐츠 리스트", menus[0].title) + } + + private fun member(role: MemberRole) = Member( + email = "${role.name.lowercase()}@test.com", + password = "password", + nickname = role.name.lowercase(), + role = role + ) +}