feat(home): 랭킹 탭 목록을 연결한다

This commit is contained in:
2026-06-08 18:07:00 +09:00
parent bb60f8bb9f
commit 5d66014044
3 changed files with 178 additions and 1 deletions

View File

@@ -697,6 +697,38 @@ class HomeMainFragmentLayoutTest {
assertEquals(expectedFreeTag.paddingStart, freeTag.paddingStart)
}
@Test
fun `home ranking layout contains ranking list below text tab bar`() {
val root = inflateView(R.layout.fragment_v2_main_home)
val rankingList = root.findViewById<RecyclerView>(R.id.rv_home_creator_rankings)
val layoutParams = rankingList.layoutParams as ConstraintLayout.LayoutParams
assertNotNull(rankingList)
assertSame(root, rankingList.parent)
assertEquals(0, layoutParams.width)
assertEquals(0, layoutParams.height)
assertEquals(R.id.text_tab_bar_home, layoutParams.topToBottom)
assertEquals(ConstraintLayout.LayoutParams.PARENT_ID, layoutParams.startToStart)
assertEquals(ConstraintLayout.LayoutParams.PARENT_ID, layoutParams.endToEnd)
assertEquals(ConstraintLayout.LayoutParams.PARENT_ID, layoutParams.bottomToBottom)
assertEquals(View.GONE, rankingList.visibility)
assertEquals(false, rankingList.clipToPadding)
assertEquals(14.dpToPx(), rankingList.paddingStart)
assertEquals(14.dpToPx(), rankingList.paddingTop)
assertEquals(28.dpToPx(), rankingList.paddingBottom)
}
@Test
fun `home ranking layout does not add capsule tab bar`() {
val root = inflateView(R.layout.fragment_v2_main_home)
val layoutSource = homeMainLayoutSource()
assertFalse(root.containsClassName("kr.co.vividnext.sodalive.v2.widget.CapsuleTabBarView"))
assertFalse(layoutSource.contains("view_capsule_tab_bar"))
assertFalse(layoutSource.contains("hsv_capsule_tab_bar"))
assertFalse(layoutSource.contains("ll_capsule_tab_container"))
}
@Test
fun `popular community section is hidden until phase7 binding is implemented`() {
val root = inflateView(R.layout.fragment_v2_main_home)
@@ -1264,6 +1296,63 @@ class HomeMainFragmentLayoutTest {
}
}
@Test
fun `home ranking fragment wires adapter and grid layout manager`() {
val source = homeMainFragmentSource()
assertTrue(source.contains("HomeCreatorRankingViewModel"))
assertTrue(source.contains("CreatorRankingAdapter { openCreatorRankingProfile(it) }"))
assertTrue(source.contains("binding.rvHomeCreatorRankings.apply"))
assertTrue(source.contains("layoutManager = CreatorRankingAdapter.createGridLayoutManager(requireContext())"))
assertTrue(source.contains("adapter = creatorRankingAdapter"))
}
@Test
fun `home ranking fragment switches recommendation and ranking content by tab`() {
val source = homeMainFragmentSource()
assertTrue(source.contains("HOME_TAB_RECOMMENDATION = 0"))
assertTrue(source.contains("HOME_TAB_RANKING = 1"))
assertTrue(source.contains("HOME_TAB_FOLLOWING = 2"))
assertTrue(source.contains("binding.textTabBarHome.root.setOnTabSelectedListener { index ->"))
assertTrue(source.contains("showHomeTab(index)"))
assertTrue(source.contains("binding.nsvHomeRecommendationContent.visibility = View.GONE"))
assertTrue(source.contains("binding.rvHomeCreatorRankings.visibility = View.VISIBLE"))
assertTrue(source.contains("binding.nsvHomeRecommendationContent.visibility = View.VISIBLE"))
assertTrue(source.contains("binding.rvHomeCreatorRankings.visibility = View.GONE"))
}
@Test
fun `home ranking fragment loads rankings once on first ranking selection`() {
val source = homeMainFragmentSource()
assertTrue(source.contains("private var hasLoadedCreatorRankings = false"))
assertTrue(source.contains("if (!hasLoadedCreatorRankings)"))
assertTrue(source.contains("hasLoadedCreatorRankings = true"))
assertTrue(source.contains("homeCreatorRankingViewModel.loadCreatorRankings()"))
}
@Test
fun `home ranking fragment observes ranking state and submits items`() {
val source = homeMainFragmentSource()
assertTrue(source.contains("rankingStateLiveData.observe(viewLifecycleOwner)"))
assertTrue(source.contains("is HomeCreatorRankingUiState.Content -> creatorRankingAdapter.submitItems(state.items)"))
assertTrue(source.contains("HomeCreatorRankingUiState.Empty,"))
assertTrue(source.contains("is HomeCreatorRankingUiState.Error -> creatorRankingAdapter.submitItems(emptyList())"))
assertTrue(source.contains("HomeCreatorRankingUiState.Loading -> Unit"))
}
@Test
fun `home ranking fragment opens profile only for touchable creator`() {
val source = homeMainFragmentSource()
assertTrue(source.contains("private fun openCreatorRankingProfile(item: CreatorRankingItem)"))
assertTrue(source.contains("if (item.creatorId <= 0L) return"))
assertTrue(source.contains("openCreatorProfile(item.creatorId)"))
assertFalse(source.contains("EXTRA_USER_ID, 0L"))
}
@Test
fun `home main fragment phase9 replaces sample content with viewmodel state binding`() {
val source = homeMainFragmentSource()
@@ -1321,6 +1410,14 @@ class HomeMainFragmentLayoutTest {
).readText()
}
private fun homeMainLayoutSource(): String {
val projectRoot = java.io.File("..").canonicalFile
return java.io.File(
projectRoot,
"app/src/main/res/layout/fragment_v2_main_home.xml"
).readText()
}
private fun homeRecommendationViewModelSource(): String {
val projectRoot = java.io.File("..").canonicalFile
return java.io.File(