diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt index dd0d483f..7fa028f2 100644 --- a/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt @@ -46,26 +46,122 @@ class CreatorChannelActivitySourceTest { } @Test - fun `follow notify source는 미팔로우 직접 팔로우와 팔로우 중 알림 sheet를 연결한다`() { + fun `follow notify source는 Phase 11 직접 팔로우 알림 액션을 연결한다`() { val source = projectFile( "app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt" ).readText() + val layout = projectFile("app/src/main/res/layout/activity_creator_channel.xml").readText() - assertTrue(source.contains("CreatorFollowNotifyFragment")) + assertFalse(source.contains("CreatorFollowNotifyFragment")) + assertTrue(layout.contains("android:id=\"@+id/layout_follow_capsule\"")) + assertTrue(layout.contains("android:visibility=\"gone\"")) assertTrue(source.contains("binding.layoutFollowCapsule.setOnClickListener")) assertTrue(source.contains("binding.ivBell.setOnClickListener")) - assertTrue(source.contains("private fun onFollowActionClicked")) + assertTrue(source.contains("private fun onFollowCapsuleClicked")) + assertTrue(source.contains("private fun onBellClicked")) assertTrue(source.contains("if (!header.isFollow)")) assertTrue(source.contains("homeActionDelegate?.follow(follow = true, notify = true)")) - assertTrue(source.contains("showFollowNotifyFragment")) - assertTrue(source.contains("onClickNotifyAll = { homeActionDelegate?.follow(follow = true, notify = true) }")) - assertTrue(source.contains("onClickNotifyNone = { homeActionDelegate?.follow(follow = true, notify = false) }")) - assertTrue(source.contains("onClickUnFollow = { homeActionDelegate?.follow(follow = false, notify = false) }")) + assertTrue(source.contains("homeActionDelegate?.follow(follow = true, notify = !header.isNotify)")) + assertTrue(source.contains("homeActionDelegate?.follow(follow = false, notify = false)")) + assertFalse(source.contains("showFollowNotifyFragment")) assertTrue(source.contains("onCreatorChannelFollowProgressChanged")) assertTrue(source.contains("binding.layoutFollowCapsule.isEnabled = titleBarState.isActionEnabled")) assertTrue(source.contains("binding.ivBell.isEnabled = titleBarState.isActionEnabled")) } + @Test + fun `Phase 11 more source는 기존 프로필 메뉴 의미를 BottomSheet로 연결한다`() { + val source = projectFile( + "app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt" + ).readText() + val sheet = projectFile( + "app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelMoreBottomSheet.kt" + ).readText() + val layout = projectFile("app/src/main/res/layout/dialog_creator_channel_more.xml").readText() + + assertTrue(source.contains("CreatorChannelMoreBottomSheet.newInstance")) + assertTrue(source.contains("showUserReportDialog")) + assertTrue(source.contains("showProfileReportDialog")) + assertTrue(source.contains("homeActionDelegate?.blockUser")) + assertFalse(source.contains("creator_channel_more_ready")) + assertTrue(sheet.contains("BottomSheetDialogFragment")) + assertTrue(sheet.contains("onClickBlock")) + assertFalse(sheet.contains("onClickUnblock")) + assertFalse(sheet.contains("isBlocked")) + assertTrue(sheet.contains("onClickUserReport")) + assertTrue(sheet.contains("onClickProfileReport")) + assertTrue(layout.contains("@+id/tv_user_block")) + assertTrue(layout.contains("@string/menu_user_block")) + assertTrue(layout.contains("@+id/tv_user_report")) + assertTrue(layout.contains("@string/menu_user_report")) + assertTrue(layout.contains("@+id/tv_profile_report")) + assertTrue(layout.contains("@string/menu_profile_report")) + } + + @Test + fun `Phase 11 owner source는 본인 페이지 상단 타인 액션을 숨긴다`() { + val source = projectFile( + "app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt" + ).readText() + val dto = projectFile( + "app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeModels.kt" + ).readText() + val uiModel = projectFile( + "app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelHomeUiModels.kt" + ).readText() + val mapper = projectFile( + "app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelHomeMappers.kt" + ).readText() + + assertFalse(dto.contains("@SerializedName(\"isOwner\")")) + assertFalse(dto.contains("@SerializedName(\"isBlock\")")) + assertTrue(uiModel.contains("val isOwner: Boolean")) + assertFalse(uiModel.contains("val isBlock: Boolean")) + assertTrue(mapper.contains("fun CreatorChannelHomeResponse.toUiContent(currentMemberId: Long)")) + assertTrue(mapper.contains("isOwner = creator.creatorId == currentMemberId")) + assertTrue(source.contains("if (header.isOwner)")) + assertTrue(source.contains("binding.layoutFollowCapsule.visibility = View.GONE")) + assertTrue(source.contains("binding.ivBell.visibility = View.GONE")) + assertTrue(source.contains("binding.ivMore.visibility = View.GONE")) + assertTrue(source.contains("isChatVisible = !header.isOwner")) + assertTrue(source.contains("CreatorChannelMoreBottomSheet.newInstance()")) + assertFalse(source.contains("onClickUnblock")) + } + + @Test + fun `Phase 11 owner DM source는 MainV2 채팅 DM 필터로 진입한다`() { + val source = projectFile( + "app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt" + ).readText() + val layout = projectFile("app/src/main/res/layout/activity_creator_channel.xml").readText() + val main = projectFile("app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2Activity.kt").readText() + val chat = projectFile("app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragment.kt").readText() + val filter = projectFile("app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/model/ChatRoomFilter.kt").readText() + val strings = projectFile("app/src/main/res/values/strings.xml").readText() + + assertTrue(strings.contains("name=\"creator_channel_dm_check_button\">DM 확인하기")) + assertTrue(layout.contains("android:id=\"@+id/tv_chat_button\"")) + assertTrue(layout.contains("android:id=\"@+id/tv_dm_button\"")) + assertTrue(layout.contains("tools:visibility=\"visible\"")) + assertTrue(source.contains("MainV2Activity.newChatDmIntent(this)")) + assertTrue( + source.contains( + "if (header.isOwner) R.string.creator_channel_dm_check_button else R.string.creator_channel_dm_button" + ) + ) + assertTrue(source.contains("isDmVisible = header.isOwner || header.isDmAvailable")) + assertTrue(main.contains("fun newChatDmIntent(context: Context): Intent")) + assertTrue(main.contains("Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP")) + assertTrue(main.contains("putExtra(EXTRA_CHAT_FILTER, ChatRoomFilter.DM.name)")) + assertTrue(main.contains("openChatWithInitialFilter")) + assertTrue(main.contains("ChatMainFragment.newInstance(initialChatFilter)")) + assertTrue(chat.contains("fun newInstance(initialFilter: ChatRoomFilter? = null): ChatMainFragment")) + assertTrue(chat.contains("selectedIndex = initialFilter.tabIndex")) + assertTrue(chat.contains("fun selectFilter(filter: ChatRoomFilter)")) + assertTrue(filter.contains("DM(\"DM\", 2)")) + assertTrue(source.contains("DmChatRoomActivity.newIntentByCreatorId(this, creatorId)")) + } + @Test fun `Phase 10 컨테이너 layout은 TabLayout과 ViewPager2를 가진다`() { val layout = projectFile("app/src/main/res/layout/activity_creator_channel.xml").readText() @@ -190,6 +286,37 @@ class CreatorChannelActivitySourceTest { assertTrue(source.contains("Color.TRANSPARENT")) } + @Test + fun `Phase 11 title bar는 sticky black 상태에서 닉네임을 표시한다`() { + val source = projectFile( + "app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt" + ).readText() + val layout = projectFile("app/src/main/res/layout/activity_creator_channel.xml").readText() + + assertTrue(layout.contains("@+id/tv_title_nickname")) + assertTrue(layout.contains("style=\"@style/Typography.Heading2\"")) + assertTrue(layout.contains("android:ellipsize=\"end\"")) + assertTrue(layout.contains("android:maxLines=\"1\"")) + assertTrue(layout.contains("app:layout_constraintStart_toEndOf=\"@id/iv_back\"")) + assertTrue(layout.contains("app:layout_constraintEnd_toStartOf=\"@id/title_action_container\"")) + assertTrue(source.contains("binding.tvTitleNickname.text = header.nickname")) + assertTrue(source.contains("binding.tvTitleNickname.isVisible = shouldUseBlackTitleBar")) + } + + @Test + fun `Phase 11 tab bar typography는 선택 비선택 모두 16sp medium을 사용한다`() { + val layout = projectFile("app/src/main/res/layout/activity_creator_channel.xml").readText() + val typography = projectFile("app/src/main/res/values/typography.xml").readText() + + assertTrue(layout.contains("app:tabTextAppearance=\"@style/CreatorChannelTabText\"")) + assertTrue(typography.contains("