feat(home): 랭킹 탭 목록을 연결한다
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user