feat(creator): 채널 후원 버튼을 연결한다
This commit is contained in:
@@ -207,7 +207,7 @@ class CreatorChannelActivitySourceTest {
|
||||
assertTrue(source.contains("arguments = Bundle().apply"))
|
||||
assertTrue(source.contains("putLong(ARG_CREATOR_ID, creatorId)"))
|
||||
assertTrue(source.contains("private val viewModel: CreatorChannelHomeViewModel by viewModel()"))
|
||||
assertTrue(source.contains("CreatorChannelHomeSectionAdapter(::onScheduleClicked, ::onAudioContentClicked)"))
|
||||
assertTrue(source.contains("onDonationClick = ::onDonationClicked"))
|
||||
assertTrue(source.contains("binding.rvHomeSections.layoutManager = LinearLayoutManager(requireContext())"))
|
||||
assertTrue(source.contains("binding.rvHomeSections.adapter = sectionAdapter"))
|
||||
assertTrue(source.contains("viewModel.homeStateLiveData.observe(viewLifecycleOwner)"))
|
||||
@@ -610,6 +610,8 @@ class CreatorChannelActivitySourceTest {
|
||||
assertTrue(adapter.contains("latestAudioTitle?.text = item.audioContent.title"))
|
||||
assertTrue(adapter.contains("latestAudioThumbnail?.loadUrl"))
|
||||
assertTrue(adapter.contains("latestAudioPointTag?.isVisible = item.audioContent.isPointAvailable"))
|
||||
assertTrue(adapter.contains("itemView.setOnClickListener(null)"))
|
||||
assertTrue(adapter.contains("itemView.setOnClickListener { onAudioContentClick(item.audioContent) }"))
|
||||
assertFalse(adapter.contains("private fun addAudioCard"))
|
||||
assertFalse(adapter.contains("addAudioCard(item.audioContent)"))
|
||||
}
|
||||
@@ -625,9 +627,15 @@ class CreatorChannelActivitySourceTest {
|
||||
assertTrue(donationLayout.contains("@layout/view_section_title"))
|
||||
assertTrue(donationLayout.contains("@+id/hsv_donation_items"))
|
||||
assertTrue(donationLayout.contains("@+id/ll_donation_items"))
|
||||
assertTrue(donationLayout.contains("@+id/layout_donation_empty"))
|
||||
assertTrue(donationLayout.contains("@+id/tv_donation_empty_title"))
|
||||
assertTrue(donationLayout.contains("@string/creator_channel_donation_empty_title"))
|
||||
assertTrue(donationLayout.contains("android:layout_width=\"match_parent\""))
|
||||
assertTrue(donationLayout.contains("android:layout_height=\"196dp\""))
|
||||
assertTrue(donationLayout.contains("@+id/layout_donation_button"))
|
||||
assertTrue(donationLayout.contains("@drawable/ic_new_donation"))
|
||||
assertFalse(donationLayout.contains("@+id/tv_donation_button"))
|
||||
assertFalse(donationLayout.contains("android:layout_width=\"374dp\""))
|
||||
assertFalse(donationLayout.contains("@+id/ll_section_items"))
|
||||
val donationCardView = projectFile(
|
||||
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelDonationCardView.kt"
|
||||
@@ -644,16 +652,63 @@ class CreatorChannelActivitySourceTest {
|
||||
assertTrue(donationRowLayout.contains("@drawable/ic_can"))
|
||||
assertFalse(donationRowLayout.contains("android:layout_width=\"374dp\""))
|
||||
assertTrue(adapter.contains("private val donationItems: LinearLayout?"))
|
||||
assertTrue(adapter.contains("private val donationItemsScrollView: View?"))
|
||||
assertTrue(adapter.contains("private val donationEmpty: View?"))
|
||||
assertTrue(adapter.contains("donationItemsScrollView?.isVisible = item.donations.isNotEmpty()"))
|
||||
assertTrue(adapter.contains("donationEmpty?.isVisible = item.donations.isEmpty()"))
|
||||
assertTrue(adapter.contains("private fun bindDonations(item: CreatorChannelHomeSection.Donations) {\n donationItems?.removeAllViews()"))
|
||||
assertTrue(adapter.contains("R.layout.item_creator_channel_home_donation_row"))
|
||||
assertTrue(adapter.contains("donationItems?.addView(row)"))
|
||||
assertTrue(adapter.contains("val visibleDonations = item.donations.take(MAX_DONATION_ITEM_COUNT)"))
|
||||
assertTrue(adapter.contains("calculateCreatorChannelDonationCardWidthDp"))
|
||||
assertTrue(adapter.contains("calculateCreatorChannelDonationHeaderColorRes(donation.can)"))
|
||||
assertTrue(adapter.contains("formatUtcRelativeTimeText(itemView.context, donation.createdAtUtc)"))
|
||||
assertFalse(adapter.contains("tv_donation_created_at).text = donation.createdAtUtc"))
|
||||
assertTrue(adapter.contains("R.string.creator_channel_donation_fallback_message"))
|
||||
assertFalse(adapter.contains("private fun addDonationCard"))
|
||||
assertFalse(adapter.contains("addDonationCard("))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `후원 버튼은 본인 채널에서 숨기고 타인 채널에서 다이얼로그를 연다`() {
|
||||
val adapter = projectFile(
|
||||
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt"
|
||||
).readText()
|
||||
val fragment = projectFile(
|
||||
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeFragment.kt"
|
||||
).readText()
|
||||
val activity = projectFile(
|
||||
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt"
|
||||
).readText()
|
||||
|
||||
assertTrue(adapter.contains("private val donationEmptyButton: View?"))
|
||||
assertTrue(adapter.contains("private val onDonationClick: () -> Unit"))
|
||||
assertTrue(adapter.contains("val isDonationButtonVisible = item.donations.isNotEmpty() && !item.isOwner"))
|
||||
assertTrue(adapter.contains("val isDonationEmptyButtonVisible = !item.isOwner"))
|
||||
assertTrue(adapter.contains("donationButton?.isVisible = isDonationButtonVisible"))
|
||||
assertTrue(adapter.contains("donationEmptyButton?.isVisible = isDonationEmptyButtonVisible"))
|
||||
assertTrue(
|
||||
adapter.contains(
|
||||
"donationButton?.setOnClickListener(if (isDonationButtonVisible) View.OnClickListener { onDonationClick() } else null)"
|
||||
)
|
||||
)
|
||||
assertTrue(
|
||||
adapter.contains(
|
||||
"donationEmptyButton?.setOnClickListener(if (isDonationEmptyButtonVisible) View.OnClickListener { onDonationClick() } else null)"
|
||||
)
|
||||
)
|
||||
assertTrue(fragment.contains("override fun postChannelDonation(can: Int, isSecret: Boolean, message: String)"))
|
||||
assertTrue(fragment.contains("viewModel.postChannelDonation(can = can, isSecret = isSecret, message = message)"))
|
||||
assertTrue(fragment.contains("host.onCreatorChannelDonationClicked()"))
|
||||
assertTrue(activity.contains("LiveRoomDonationDialog"))
|
||||
assertTrue(activity.contains("isLiveDonation = true"))
|
||||
assertTrue(activity.contains("messageMaxLength = 100"))
|
||||
assertTrue(activity.contains("secretToggleLabelResId = R.string.screen_user_profile_channel_donation_secret"))
|
||||
assertTrue(activity.contains("applySecretMissionMessageHint = false"))
|
||||
assertTrue(activity.contains("homeActionDelegate?.postChannelDonation(can = can, isSecret = isSecret, message = message)"))
|
||||
assertTrue(activity.contains("dialog.show(screenWidth - 26.7f.dpToPx().toInt())"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `후원 can 수량은 요청된 배경색 resource 경계로 매핑한다`() {
|
||||
assertEquals(R.color.gray_200, calculateCreatorChannelDonationHeaderColorRes(1))
|
||||
@@ -684,6 +739,17 @@ class CreatorChannelActivitySourceTest {
|
||||
assertTrue(ja.contains("creator_channel_donation_fallback_message"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `후원 empty 안내 문구는 다국어 string resource로 제공한다`() {
|
||||
val ko = projectFile("app/src/main/res/values/strings.xml").readText()
|
||||
val en = projectFile("app/src/main/res/values-en/strings.xml").readText()
|
||||
val ja = projectFile("app/src/main/res/values-ja/strings.xml").readText()
|
||||
|
||||
assertTrue(ko.contains("name=\"creator_channel_donation_empty_title\">처음으로 크리에이터를\\n후원해 보세요!"))
|
||||
assertTrue(en.contains("creator_channel_donation_empty_title"))
|
||||
assertTrue(ja.contains("creator_channel_donation_empty_title"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `공지 섹션은 최대 3개 Figma feed card를 가로 row로 렌더링한다`() {
|
||||
val adapter = projectFile(
|
||||
@@ -727,7 +793,8 @@ class CreatorChannelActivitySourceTest {
|
||||
assertTrue(adapter.contains("noticeItems?.addView(row)"))
|
||||
assertTrue(adapter.contains("row.findViewById<ImageView>(R.id.iv_notice_profile).loadUrl"))
|
||||
assertTrue(adapter.contains("row.findViewById<TextView>(R.id.tv_notice_creator_name).text = notice.creatorNickname"))
|
||||
assertTrue(adapter.contains("row.findViewById<TextView>(R.id.tv_notice_created_at).text = notice.dateUtc"))
|
||||
assertTrue(adapter.contains("row.findViewById<TextView>(R.id.tv_notice_created_at).text ="))
|
||||
assertTrue(adapter.contains("formatUtcRelativeTimeText(itemView.context, notice.dateUtc)"))
|
||||
assertTrue(adapter.contains("row.findViewById<TextView>(R.id.tv_notice_content).text = notice.content"))
|
||||
assertTrue(adapter.contains("noticeThumbnail.isVisible = !notice.imageUrl.isNullOrBlank()"))
|
||||
assertTrue(adapter.contains("marginEnd = if (index == visibleNotices.lastIndex) 0 else 4.dp()"))
|
||||
@@ -759,6 +826,16 @@ class CreatorChannelActivitySourceTest {
|
||||
assertFalse(adapter.contains("schedule.type.code"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `커뮤니티 날짜는 dateUtc 원문 대신 상대 시간 formatter를 사용한다`() {
|
||||
val adapter = projectFile(
|
||||
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/ui/CreatorChannelHomeSectionAdapter.kt"
|
||||
).readText()
|
||||
|
||||
assertTrue(adapter.contains("formatUtcRelativeTimeText(itemView.context, dateUtc)"))
|
||||
assertFalse(adapter.contains("createdAtText = dateUtc,"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `일정 섹션은 Figma 전용 layout과 row bind로 최대 3개를 렌더링한다`() {
|
||||
val adapter = projectFile(
|
||||
@@ -828,7 +905,7 @@ class CreatorChannelActivitySourceTest {
|
||||
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeFragment.kt"
|
||||
).readText()
|
||||
|
||||
assertTrue(fragment.contains("CreatorChannelHomeSectionAdapter(::onScheduleClicked"))
|
||||
assertTrue(fragment.contains("onScheduleClick = ::onScheduleClicked"))
|
||||
assertTrue(fragment.contains("private fun onScheduleClicked(schedule: CreatorChannelScheduleResponse)"))
|
||||
assertTrue(fragment.contains("host.onCreatorChannelScheduleClicked(schedule)"))
|
||||
assertTrue(source.contains("private fun onScheduleClicked(schedule: CreatorChannelScheduleResponse)"))
|
||||
@@ -907,7 +984,7 @@ class CreatorChannelActivitySourceTest {
|
||||
"app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeFragment.kt"
|
||||
).readText()
|
||||
|
||||
assertTrue(fragment.contains("CreatorChannelHomeSectionAdapter(::onScheduleClicked, ::onAudioContentClicked)"))
|
||||
assertTrue(fragment.contains("onAudioContentClick = ::onAudioContentClicked"))
|
||||
assertTrue(fragment.contains("private fun onAudioContentClicked(audioContent: CreatorChannelAudioContentResponse)"))
|
||||
assertTrue(fragment.contains("host.onCreatorChannelAudioContentClicked(audioContent)"))
|
||||
assertTrue(source.contains("private fun onAudioContentClicked(audioContent: CreatorChannelAudioContentResponse)"))
|
||||
|
||||
Reference in New Issue
Block a user