-
Notifications
You must be signed in to change notification settings - Fork 0
[Fix] 1차 QA 수정사항 반영 (로그인/회원가입 · 홈 · 설정) #218
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
The head ref may contain hidden characters: "FLT-26-1\uCC28-qa-\uC218\uC815"
Changes from all commits
a45b91b
75f25a2
fa00e62
0d22600
71c29be
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -2,9 +2,11 @@ package com.flint.presentation.setting | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.foundation.Image | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.foundation.background | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.foundation.layout.Arrangement | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.foundation.layout.Box | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.foundation.layout.Column | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.foundation.layout.Row | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.foundation.layout.RowScope | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.foundation.layout.Spacer | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.foundation.layout.fillMaxSize | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.foundation.layout.fillMaxWidth | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -27,6 +29,7 @@ import androidx.compose.ui.Modifier | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.ui.platform.LocalContext | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.ui.res.painterResource | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.ui.text.style.TextDecoration | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.ui.text.style.TextOverflow | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.ui.tooling.preview.Preview | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.compose.ui.unit.dp | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import androidx.hilt.navigation.compose.hiltViewModel | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -111,7 +114,20 @@ private fun SettingScreen( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SettingMenuItem( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| label = "계정", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trailingContent = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Row(verticalAlignment = Alignment.CenterVertically) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Row( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| horizontalArrangement = Arrangement.spacedBy(8.dp), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| verticalAlignment = Alignment.CenterVertically, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uiState.email?.let { email -> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Text( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| text = email, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| style = FlintTheme.typography.body2R14, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| color = FlintTheme.colors.gray100, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| maxLines = 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| overflow = TextOverflow.Ellipsis, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| modifier = Modifier.weight(1f, fill = false), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+117
to
+130
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
# Inspect the relevant file around the reported lines and nearby layout code.
if [ -f "app/src/main/java/com/flint/presentation/setting/SettingScreen.kt" ]; then
echo "== file exists =="
wc -l app/src/main/java/com/flint/presentation/setting/SettingScreen.kt
echo "== relevant lines 100-140 =="
sed -n '100,140p' app/src/main/java/com/flint/presentation/setting/SettingScreen.kt | nl -ba -v100
echo "== relevant lines 220-285 =="
sed -n '220,285p' app/src/main/java/com/flint/presentation/setting/SettingScreen.kt | nl -ba -v220
else
echo "file not found"
fd -i 'SettingScreen.kt'
fiRepository: imflint/Flint-Android Length of output: 316 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== SettingScreen.kt file =="
wc -l app/src/main/java/com/flint/presentation/setting/SettingScreen.kt
echo "== lines 100-140 =="
sed -n '100,140p' app/src/main/java/com/flint/presentation/setting/SettingScreen.kt
echo "== lines 220-285 =="
sed -n '220,285p' app/src/main/java/com/flint/presentation/setting/SettingScreen.kt
echo "== occurrences of SettingMenuItem / main row usage =="
rg -n "SettingMenuItem|SettingScreenUiState|email|Composable|`@Preview`" app/src/main/java/com/flint/presentation/setting/SettingScreen.ktRepository: imflint/Flint-Android Length of output: 4275 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== compose dependencies referencing layout code =="
if [ -f "app/build.gradle.kts" ]; then
cat app/build.gradle.kts
elif [ -f "app/build.gradle" ]; then
cat app/build.gradle
fi
echo "== find settings-related test files =="
fd -i 'Setting.*Test.*|.*Setting.*Test.*' . || true
fd -i 'SettingScreen.*Test.*|.*SettingScreen.*Test.*' . || true
echo "== search for long/truncation/compose UI tests =="
rg -n "composeTestRule|createComposeRule|Long|long|overflow|EllipseEllipsis|TextOverflow.Ellipsis|setting|SettingScreen" app/src/test app/src/androidTest app/src/main/java/com/flint/presentation/setting || true
echo "== Compose weight semantics probe (source only if Gradle dependency unavailable) =="
python3 - <<'PY'
print("The code shows outer Row has label Modifier.weight(1f).")
print("The trailing Row has no modifier for its own width.")
print("The email Text has modifier Modifier.weight(1f, fill = false).")
print("In Compose, an unbounded weight in a nested Row with no width constraint cannot determine its measured width.")
print("This matches a potential truncation problem for long email values under fixed-width parent Row.")
PYRepository: imflint/Flint-Android Length of output: 6760 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== SettingUiState =="
cat app/src/main/java/com/flint/presentation/setting/SettingUiState.kt
echo "== root version catalog references =="
if [ -f "gradle/libs.versions.toml" ]; then
sed -n '1,180p' gradle/libs.versions.toml
fi
echo "== all SettingScreen references =="
rg -n "SettingScreen|SettingUiState\\(" .Repository: imflint/Flint-Android Length of output: 6549 긴 이메일도
중첩 예시 수정 Row(
+ modifier = Modifier.weight(1f, fill = false),
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalAlignment = Alignment.CenterVertically,
) {📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Image( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| painter = painterResource(R.drawable.ic_kakao_full), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| contentDescription = null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -226,7 +242,7 @@ private fun SettingMenuItem( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| modifier: Modifier = Modifier, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| verticalPadding: Dp = 18.dp, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| onClick: () -> Unit = {}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trailingContent: @Composable () -> Unit = {}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trailingContent: @Composable RowScope.() -> Unit = {}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Row( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| modifier = modifier | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -253,6 +269,7 @@ private fun SettingScreenPreview() { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uiState = SettingUiState( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| nickname = "한비두비세비", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| profileImageUrl = null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| email = "flint@kakao.com", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| onBackClick = {}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| onEditProfileClick = {}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,87 @@ | ||
| package com.flint.data.dto.ott | ||
|
|
||
| import com.flint.data.dto.base.BaseResponse | ||
| import com.flint.data.dto.ott.response.OttListResponseDto | ||
| import kotlinx.serialization.json.Json | ||
| import org.junit.Assert.assertEquals | ||
| import org.junit.Test | ||
|
|
||
| /** | ||
| * 콘텐츠별 OTT 목록 응답 역직렬화 테스트 | ||
| * | ||
| * QA TC 3-33, 3-34: 홈에서 콘텐츠 카드를 눌러도 바텀시트가 뜨지 않는 문제 | ||
| * | ||
| * GET /api/v1/contents/ott/{contentId} 의 서버 응답 스키마(GetOttResponse)는 | ||
| * { ottId, name, logoUrl } 세 필드뿐이고 contentUrl 은 존재하지 않는다. | ||
| * DTO 가 contentUrl 을 기본값 없는 필수 필드로 선언하면 역직렬화가 실패하고, | ||
| * 그 예외가 suspendRunCatching -> onFailure 로 흘러가 조용히 삼켜진다. | ||
| */ | ||
| class OttListResponseDtoTest { | ||
|
|
||
| // NetworkModule 의 Json 설정과 동일하게 맞춘다 | ||
| private val json = Json { | ||
| ignoreUnknownKeys = true | ||
| coerceInputValues = true | ||
| explicitNulls = false | ||
| prettyPrint = true | ||
| } | ||
|
|
||
| /** 스웨거 GetOttListRes 스키마 그대로 — contentUrl 없음 */ | ||
| private val serverResponse = """ | ||
| { | ||
| "status": 200, | ||
| "message": "OTT리스트 조회 성공", | ||
| "data": { | ||
| "otts": [ | ||
| { "ottId": "1", "name": "넷플릭스", "logoUrl": "https://cdn.flint/netflix.png" }, | ||
| { "ottId": "2", "name": "티빙", "logoUrl": "https://cdn.flint/tving.png" } | ||
| ] | ||
| } | ||
| } | ||
| """.trimIndent() | ||
|
|
||
| @Test | ||
| fun `contentUrl 이 없는 서버 응답을 역직렬화할 수 있다`() { | ||
| val response = json.decodeFromString<BaseResponse<OttListResponseDto>>(serverResponse) | ||
|
|
||
| assertEquals(2, response.data.otts.size) | ||
| assertEquals("넷플릭스", response.data.otts[0].name) | ||
| assertEquals("https://cdn.flint/tving.png", response.data.otts[1].logoUrl) | ||
| } | ||
|
|
||
| @Test | ||
| fun `contentUrl 이 없으면 빈 문자열로 채운다`() { | ||
| val response = json.decodeFromString<BaseResponse<OttListResponseDto>>(serverResponse) | ||
|
|
||
| assertEquals("", response.data.otts[0].contentUrl) | ||
| } | ||
|
|
||
| @Test | ||
| fun `서버가 contentUrl 을 내려주면 그 값을 사용한다`() { | ||
| val withContentUrl = """ | ||
| { | ||
| "otts": [ | ||
| { | ||
| "ottId": "1", | ||
| "name": "넷플릭스", | ||
| "logoUrl": "https://cdn.flint/netflix.png", | ||
| "contentUrl": "https://netflix.com/title/123" | ||
| } | ||
| ] | ||
| } | ||
| """.trimIndent() | ||
|
|
||
| val dto = json.decodeFromString<OttListResponseDto>(withContentUrl) | ||
|
|
||
| assertEquals("https://netflix.com/title/123", dto.otts[0].contentUrl) | ||
| } | ||
|
|
||
| @Test | ||
| fun `볼 수 있는 OTT 가 없으면 빈 목록으로 역직렬화된다`() { | ||
| val emptyResponse = """{ "otts": [] }""" | ||
|
|
||
| val dto = json.decodeFromString<OttListResponseDto>(emptyResponse) | ||
|
|
||
| assertEquals(0, dto.otts.size) | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
Repository: imflint/Flint-Android
Length of output: 50377
🏁 Script executed:
Repository: imflint/Flint-Android
Length of output: 2585
🏁 Script executed:
Repository: imflint/Flint-Android
Length of output: 50378
🏁 Script executed:
Repository: imflint/Flint-Android
Length of output: 3394
🏁 Script executed:
Repository: imflint/Flint-Android
Length of output: 1308
🏁 Script executed:
Repository: imflint/Flint-Android
Length of output: 2242
홈 저장 콘텐츠 목록 정렬 계약을 명시하거나
take()앞에서 정렬하세요.getContentBookmarkedContents(userId == null)은/api/v1/contents/bookmarks를 cursor로 페이지네이션하고taken순서로contents에 누적합니다. 저장 시간 필드가 응답 DTO에 없으므로take(MAX_SAVED_CONTENT_COUNT)순서가 최신 10건이 되지 않을 수 있습니다. 저장 시간 내림차순을 보장해주지 않으면getUserBookmarkedContents()에서 정렬이나 save-date 필드를 추가하세요.🤖 Prompt for AI Agents