From 3f3a098f21c0b5872acf2ee711ccd21d2c90afe8 Mon Sep 17 00:00:00 2001 From: Yu Jin Date: Fri, 27 Mar 2026 16:12:24 +0900 Subject: [PATCH 1/9] =?UTF-8?q?refactor:=20=ED=86=A0=ED=81=B0=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20API=EC=99=80=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=ED=95=B4=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=EC=9D=98=20=EC=9E=98=EB=AA=BB?= =?UTF-8?q?=EB=90=9C=20=EC=9D=98=EC=A1=B4=EC=84=B1=EC=9D=84=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=ED=95=A9=EB=8B=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/remote/repository/OauthRepositoryImpl.kt | 6 +++--- .../eatssu/android/domain/repository/OauthRepository.kt | 3 +-- .../domain/usecase/auth/GetIsAccessTokenValidUseCase.kt | 5 ++--- .../remote/repository/OauthRepositoryImplBehaviorSpec.kt | 4 ++-- .../usecase/auth/AuthDelegatingUseCasesBehaviorSpec.kt | 9 +++------ 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/data/remote/repository/OauthRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/remote/repository/OauthRepositoryImpl.kt index f1ecf63aa..b54f2b255 100644 --- a/app/src/main/java/com/eatssu/android/data/remote/repository/OauthRepositoryImpl.kt +++ b/app/src/main/java/com/eatssu/android/data/remote/repository/OauthRepositoryImpl.kt @@ -1,7 +1,6 @@ package com.eatssu.android.data.remote.repository import com.eatssu.android.data.model.ApiResult -import com.eatssu.android.domain.model.ReissueTokenResult import com.eatssu.android.data.model.map import com.eatssu.android.data.model.orElse import com.eatssu.android.data.model.orNull @@ -9,6 +8,7 @@ import com.eatssu.android.data.remote.dto.request.CheckValidTokenRequest import com.eatssu.android.data.remote.dto.request.LoginWithKakaoRequest import com.eatssu.android.data.remote.dto.response.toDomain import com.eatssu.android.data.remote.service.OauthService +import com.eatssu.android.domain.model.ReissueTokenResult import com.eatssu.android.domain.model.Token import com.eatssu.android.domain.repository.OauthRepository import com.eatssu.common.enums.DeviceType @@ -43,8 +43,8 @@ class OauthRepositoryImpl @Inject constructor(private val oauthService: OauthSer ) ).map { it.toDomain() }.orNull() - override suspend fun checkValidToken(body: CheckValidTokenRequest): Boolean = - oauthService.checkValidToken(body).orElse(false) + override suspend fun checkValidToken(token: String): Boolean = + oauthService.checkValidToken(CheckValidTokenRequest(token)).orElse(false) } private fun String.asAuthorizationHeaderValue(): String = diff --git a/app/src/main/java/com/eatssu/android/domain/repository/OauthRepository.kt b/app/src/main/java/com/eatssu/android/domain/repository/OauthRepository.kt index b9ceff93b..43266c147 100644 --- a/app/src/main/java/com/eatssu/android/domain/repository/OauthRepository.kt +++ b/app/src/main/java/com/eatssu/android/domain/repository/OauthRepository.kt @@ -1,7 +1,6 @@ package com.eatssu.android.domain.repository import com.eatssu.android.domain.model.ReissueTokenResult -import com.eatssu.android.data.remote.dto.request.CheckValidTokenRequest import com.eatssu.android.domain.model.Token import com.eatssu.common.enums.DeviceType @@ -16,5 +15,5 @@ interface OauthRepository { deviceType: DeviceType, ): Token? - suspend fun checkValidToken(body: CheckValidTokenRequest): Boolean + suspend fun checkValidToken(token: String): Boolean } diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetIsAccessTokenValidUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetIsAccessTokenValidUseCase.kt index 6b8b0d872..a02ca48af 100644 --- a/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetIsAccessTokenValidUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetIsAccessTokenValidUseCase.kt @@ -1,6 +1,5 @@ package com.eatssu.android.domain.usecase.auth -import com.eatssu.android.data.remote.dto.request.CheckValidTokenRequest import com.eatssu.android.domain.repository.OauthRepository import javax.inject.Inject @@ -8,5 +7,5 @@ class GetIsAccessTokenValidUseCase @Inject constructor( private val oauthRepository: OauthRepository ) { suspend operator fun invoke(userAccessToken: String): Boolean = - oauthRepository.checkValidToken(CheckValidTokenRequest(userAccessToken)) -} \ No newline at end of file + oauthRepository.checkValidToken(userAccessToken) +} diff --git a/app/src/test/java/com/eatssu/android/data/remote/repository/OauthRepositoryImplBehaviorSpec.kt b/app/src/test/java/com/eatssu/android/data/remote/repository/OauthRepositoryImplBehaviorSpec.kt index 45d241fa8..64d879f4a 100644 --- a/app/src/test/java/com/eatssu/android/data/remote/repository/OauthRepositoryImplBehaviorSpec.kt +++ b/app/src/test/java/com/eatssu/android/data/remote/repository/OauthRepositoryImplBehaviorSpec.kt @@ -88,7 +88,7 @@ class OauthRepositoryImplBehaviorSpec : AppBehaviorSpec({ then("성공값을 그대로 반환한다") { runTest { - repository.checkValidToken(body) shouldBe true + repository.checkValidToken("access") shouldBe true } } } @@ -99,7 +99,7 @@ class OauthRepositoryImplBehaviorSpec : AppBehaviorSpec({ then("기본값 false를 반환한다") { runTest { - repository.checkValidToken(body) shouldBe false + repository.checkValidToken("access") shouldBe false } } } diff --git a/app/src/test/java/com/eatssu/android/domain/usecase/auth/AuthDelegatingUseCasesBehaviorSpec.kt b/app/src/test/java/com/eatssu/android/domain/usecase/auth/AuthDelegatingUseCasesBehaviorSpec.kt index fc704b3be..db0dd2209 100644 --- a/app/src/test/java/com/eatssu/android/domain/usecase/auth/AuthDelegatingUseCasesBehaviorSpec.kt +++ b/app/src/test/java/com/eatssu/android/domain/usecase/auth/AuthDelegatingUseCasesBehaviorSpec.kt @@ -3,7 +3,6 @@ package com.eatssu.android.domain.usecase.auth import com.eatssu.android.data.local.AccountDataStore import com.eatssu.android.data.local.SettingDataStore import com.eatssu.android.data.local.TokenStore -import com.eatssu.android.data.remote.dto.request.CheckValidTokenRequest import com.eatssu.android.domain.model.ReissueTokenResult import com.eatssu.android.domain.repository.OauthRepository import com.eatssu.android.domain.repository.UserRepository @@ -20,7 +19,6 @@ import io.mockk.coVerifyOrder import io.mockk.every import io.mockk.just import io.mockk.mockk -import io.mockk.slot import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest @@ -163,13 +161,12 @@ class AuthDelegatingUseCasesBehaviorSpec : AppBehaviorSpec({ val useCase = GetIsAccessTokenValidUseCase(oauthRepository) `when`("토큰 유효성 검사를 요청하면") { - val bodySlot = slot() - coEvery { oauthRepository.checkValidToken(capture(bodySlot)) } returns true + coEvery { oauthRepository.checkValidToken("user-access-token") } returns true - then("CheckValidTokenRequest(token)으로 위임하고 결과를 반환한다") { + then("token으로 위임하고 결과를 반환한다") { runTest { useCase("user-access-token") shouldBe true - bodySlot.captured.token shouldBe "user-access-token" + coVerify(exactly = 1) { oauthRepository.checkValidToken("user-access-token") } } } } From 777e708159e1cb26dfe5e628b321da7dae513186 Mon Sep 17 00:00:00 2001 From: Yu Jin Date: Fri, 27 Mar 2026 16:12:42 +0900 Subject: [PATCH 2/9] =?UTF-8?q?refactor:=20=EC=8B=A0=EA=B3=A0=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20API=EC=99=80=20=EA=B4=80=EB=A0=A8=ED=95=B4=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=A0=88=EC=9D=B4=EC=96=B4?= =?UTF-8?q?=EC=9D=98=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=EC=9D=84=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= =?UTF-8?q?=ED=95=A9=EB=8B=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote/repository/ReportRepositoryImpl.kt | 14 ++++++++++++-- .../domain/repository/ReportRepository.kt | 8 +++----- .../domain/usecase/review/PostReportUseCase.kt | 15 +++++++++++---- .../cafeteria/review/report/ReportViewModel.kt | 3 +-- .../ReportRepositoryImplBehaviorSpec.kt | 12 ++++++++++-- .../ReviewDelegatingUseCasesBehaviorSpec.kt | 17 +++++++---------- .../report/ReportViewModelBehaviorSpec.kt | 7 +++---- 7 files changed, 47 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/data/remote/repository/ReportRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/remote/repository/ReportRepositoryImpl.kt index 9b15b6860..da223a8c8 100644 --- a/app/src/main/java/com/eatssu/android/data/remote/repository/ReportRepositoryImpl.kt +++ b/app/src/main/java/com/eatssu/android/data/remote/repository/ReportRepositoryImpl.kt @@ -9,7 +9,17 @@ import javax.inject.Inject class ReportRepositoryImpl @Inject constructor(private val reportService: ReportService) : ReportRepository { - override suspend fun reportReview(body: ReportRequest): Boolean = - reportService.reportReview(body).isSuccess() + override suspend fun reportReview( + reviewId: Long, + reportType: String, + content: String, + ): Boolean = + reportService.reportReview( + ReportRequest( + reviewId, + reportType, + content + ) + ).isSuccess() } diff --git a/app/src/main/java/com/eatssu/android/domain/repository/ReportRepository.kt b/app/src/main/java/com/eatssu/android/domain/repository/ReportRepository.kt index df7ebd8b4..3750a577b 100644 --- a/app/src/main/java/com/eatssu/android/domain/repository/ReportRepository.kt +++ b/app/src/main/java/com/eatssu/android/domain/repository/ReportRepository.kt @@ -1,11 +1,9 @@ package com.eatssu.android.domain.repository -import com.eatssu.android.data.remote.dto.request.ReportRequest -import kotlinx.coroutines.flow.Flow - interface ReportRepository { suspend fun reportReview( - body: ReportRequest, + reviewId: Long, + reportType: String, + content: String, ): Boolean } - diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/review/PostReportUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/review/PostReportUseCase.kt index c2ca75c01..d2eb462b3 100644 --- a/app/src/main/java/com/eatssu/android/domain/usecase/review/PostReportUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/review/PostReportUseCase.kt @@ -1,12 +1,19 @@ package com.eatssu.android.domain.usecase.review -import com.eatssu.android.data.remote.dto.request.ReportRequest import com.eatssu.android.domain.repository.ReportRepository import javax.inject.Inject class PostReportUseCase @Inject constructor( private val reportRepository: ReportRepository, ) { - suspend operator fun invoke(body: ReportRequest): Boolean = - reportRepository.reportReview(body) -} \ No newline at end of file + suspend operator fun invoke( + reviewId: Long, + reportType: String, + content: String + ): Boolean = + reportRepository.reportReview( + reviewId = reviewId, + reportType = reportType, + content = content, + ) +} diff --git a/app/src/main/java/com/eatssu/android/presentation/cafeteria/review/report/ReportViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/cafeteria/review/report/ReportViewModel.kt index c5d8f3f5a..020d325ab 100644 --- a/app/src/main/java/com/eatssu/android/presentation/cafeteria/review/report/ReportViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/cafeteria/review/report/ReportViewModel.kt @@ -3,7 +3,6 @@ package com.eatssu.android.presentation.cafeteria.review.report import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.eatssu.android.R -import com.eatssu.android.data.remote.dto.request.ReportRequest import com.eatssu.android.domain.usecase.review.PostReportUseCase import com.eatssu.common.UiText import dagger.hilt.android.lifecycle.HiltViewModel @@ -29,7 +28,7 @@ class ReportViewModel viewModelScope.launch { _uiState.update { it.copy(loading = true) } - val success = postReportUseCase(ReportRequest(reviewId, reportType, content)) + val success = postReportUseCase(reviewId, reportType, content) if (!success) { _uiState.update { it.copy( diff --git a/app/src/test/java/com/eatssu/android/data/remote/repository/ReportRepositoryImplBehaviorSpec.kt b/app/src/test/java/com/eatssu/android/data/remote/repository/ReportRepositoryImplBehaviorSpec.kt index bbec35b21..878ecfa6f 100644 --- a/app/src/test/java/com/eatssu/android/data/remote/repository/ReportRepositoryImplBehaviorSpec.kt +++ b/app/src/test/java/com/eatssu/android/data/remote/repository/ReportRepositoryImplBehaviorSpec.kt @@ -27,7 +27,11 @@ class ReportRepositoryImplBehaviorSpec : AppBehaviorSpec({ then("true를 반환한다") { runTest { - repository.reportReview(request) shouldBe true + repository.reportReview( + reviewId = request.reviewId, + reportType = request.reportType, + content = request.content, + ) shouldBe true } } } @@ -37,7 +41,11 @@ class ReportRepositoryImplBehaviorSpec : AppBehaviorSpec({ then("false를 반환한다") { runTest { - repository.reportReview(request) shouldBe false + repository.reportReview( + reviewId = request.reviewId, + reportType = request.reportType, + content = request.content, + ) shouldBe false } } } diff --git a/app/src/test/java/com/eatssu/android/domain/usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt b/app/src/test/java/com/eatssu/android/domain/usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt index 7e5be983e..394da338c 100644 --- a/app/src/test/java/com/eatssu/android/domain/usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt +++ b/app/src/test/java/com/eatssu/android/domain/usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt @@ -1,7 +1,6 @@ package com.eatssu.android.domain.usecase.review import androidx.paging.PagingData -import com.eatssu.android.data.remote.dto.request.ReportRequest import com.eatssu.android.domain.model.Review import com.eatssu.android.domain.repository.ReportRepository import com.eatssu.android.domain.repository.ReviewRepository @@ -140,28 +139,26 @@ class ReviewDelegatingUseCasesBehaviorSpec : AppBehaviorSpec({ given("PostReportUseCase") { val reportRepository = mockk() val useCase = PostReportUseCase(reportRepository) - val body = ReportRequest( - reviewId = 3L, - reportType = "SPAM", - content = "신고 사유", - ) + val reviewId = 3L + val reportType = "SPAM" + val content = "신고 사유" `when`("신고가 성공하면") { - coEvery { reportRepository.reportReview(body) } returns true + coEvery { reportRepository.reportReview(reviewId, reportType, content) } returns true then("true를 반환한다") { runTest { - useCase(body) shouldBe true + useCase(reviewId, reportType, content) shouldBe true } } } `when`("신고가 실패하면") { - coEvery { reportRepository.reportReview(body) } returns false + coEvery { reportRepository.reportReview(reviewId, reportType, content) } returns false then("false를 반환한다") { runTest { - useCase(body) shouldBe false + useCase(reviewId, reportType, content) shouldBe false } } } diff --git a/app/src/test/java/com/eatssu/android/presentation/cafeteria/review/report/ReportViewModelBehaviorSpec.kt b/app/src/test/java/com/eatssu/android/presentation/cafeteria/review/report/ReportViewModelBehaviorSpec.kt index 1dfc4a2fc..91cb52d28 100644 --- a/app/src/test/java/com/eatssu/android/presentation/cafeteria/review/report/ReportViewModelBehaviorSpec.kt +++ b/app/src/test/java/com/eatssu/android/presentation/cafeteria/review/report/ReportViewModelBehaviorSpec.kt @@ -1,7 +1,6 @@ package com.eatssu.android.presentation.cafeteria.review.report import com.eatssu.android.R -import com.eatssu.android.data.remote.dto.request.ReportRequest import com.eatssu.android.domain.usecase.review.PostReportUseCase import com.eatssu.android.test.AppBehaviorSpec import com.eatssu.android.test.asStringResIdOrNull @@ -20,7 +19,7 @@ class ReportViewModelBehaviorSpec : AppBehaviorSpec({ val postReportUseCase = mockk() `when`("신고가 실패하면") { - coEvery { postReportUseCase(any()) } returns false + coEvery { postReportUseCase(any(), any(), any()) } returns false val viewModel = ReportViewModel(postReportUseCase) then("error=true와 실패 토스트를 설정한다") { @@ -33,13 +32,13 @@ class ReportViewModelBehaviorSpec : AppBehaviorSpec({ viewModel.uiState.value.toastMessage.asStringResIdOrNull() shouldBe R.string.toast_report_failed viewModel.uiState.value.isDone shouldBe false - coVerify { postReportUseCase(ReportRequest(1L, "COPY", "bad")) } + coVerify { postReportUseCase(1L, "COPY", "bad") } } } } `when`("신고가 성공하면") { - coEvery { postReportUseCase(any()) } returns true + coEvery { postReportUseCase(any(), any(), any()) } returns true val viewModel = ReportViewModel(postReportUseCase) then("isDone=true와 성공 토스트를 설정한다") { From 63995338508ad1ca2d8f87ebbdaf3dd6e883b221 Mon Sep 17 00:00:00 2001 From: Yu Jin Date: Fri, 27 Mar 2026 16:13:09 +0900 Subject: [PATCH 3/9] =?UTF-8?q?refactor:=20=EB=8B=89=EB=84=A4=EC=9E=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20API=EC=99=80=20=EA=B4=80=EB=A0=A8=ED=95=B4?= =?UTF-8?q?=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=A0=88=EC=9D=B4=EC=96=B4?= =?UTF-8?q?=EC=9D=98=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=EC=9D=84=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= =?UTF-8?q?=ED=95=A9=EB=8B=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/remote/repository/UserRepositoryImpl.kt | 4 ++-- .../android/domain/repository/UserRepository.kt | 3 +-- .../domain/usecase/user/SetUserNicknameUseCase.kt | 15 +-------------- .../repository/UserRepositoryImplBehaviorSpec.kt | 8 ++++---- .../user/UserDelegatingUseCasesBehaviorSpec.kt | 12 ++++++------ 5 files changed, 14 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/data/remote/repository/UserRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/remote/repository/UserRepositoryImpl.kt index e66feee17..3197fd7d6 100644 --- a/app/src/main/java/com/eatssu/android/data/remote/repository/UserRepositoryImpl.kt +++ b/app/src/main/java/com/eatssu/android/data/remote/repository/UserRepositoryImpl.kt @@ -19,8 +19,8 @@ class UserRepositoryImpl @Inject constructor( private val userService: UserService ) : UserRepository { - override suspend fun updateUserName(body: ChangeNicknameRequest): Result = - when (val result = userService.changeNickname(body)) { + override suspend fun updateUserName(nickname: String): Result = + when (val result = userService.changeNickname(ChangeNicknameRequest(nickname))) { is ApiResult.Success -> Result.success(Unit) is ApiResult.Failure -> Result.failure(Exception(result.message ?: "닉네임 변경에 실패했어요.")) else -> Result.failure(Exception("닉네임 변경에 실패했어요.")) diff --git a/app/src/main/java/com/eatssu/android/domain/repository/UserRepository.kt b/app/src/main/java/com/eatssu/android/domain/repository/UserRepository.kt index 4423038cf..881b7c150 100644 --- a/app/src/main/java/com/eatssu/android/domain/repository/UserRepository.kt +++ b/app/src/main/java/com/eatssu/android/domain/repository/UserRepository.kt @@ -1,6 +1,5 @@ package com.eatssu.android.domain.repository -import com.eatssu.android.data.remote.dto.request.ChangeNicknameRequest import com.eatssu.android.domain.model.College import com.eatssu.android.domain.model.Department @@ -8,7 +7,7 @@ interface UserRepository { // 닉네임 변경 suspend fun updateUserName( - body: ChangeNicknameRequest, + nickname: String, ): Result // 유저 닉네임 중복 검사 diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/user/SetUserNicknameUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/user/SetUserNicknameUseCase.kt index 9a7b6810f..1a18f7821 100644 --- a/app/src/main/java/com/eatssu/android/domain/usecase/user/SetUserNicknameUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/user/SetUserNicknameUseCase.kt @@ -1,28 +1,15 @@ package com.eatssu.android.domain.usecase.user import com.eatssu.android.data.local.AccountDataStore -import com.eatssu.android.data.remote.dto.request.ChangeNicknameRequest import com.eatssu.android.domain.repository.UserRepository import javax.inject.Inject -//class SetUserNameUseCase @Inject constructor( -// private val userRepository: UserRepository, -// @ApplicationContext private val context: Context -//) { -// suspend operator fun invoke(name: String): Flow> { -// MySharedPreferences.setUserName(context, name) -// //Todo 이게 최선일까? 로컬에 이름 Set과 리모트의 이름 change를 usecase를 따로 만들어야하나? -// -// return userRepository.updateUserName(ChangeNicknameRequest(name)) -// } -//} - class SetUserNicknameUseCase @Inject constructor( private val userRepository: UserRepository, private val accountDataStore: AccountDataStore ) { suspend operator fun invoke(nickname: String): Result { - val result = userRepository.updateUserName(ChangeNicknameRequest(nickname)) + val result = userRepository.updateUserName(nickname) if (result.isSuccess) { // 서버 닉네임 변경이 성공한 경우에만 로컬 닉네임 변경 accountDataStore.setName(nickname) diff --git a/app/src/test/java/com/eatssu/android/data/remote/repository/UserRepositoryImplBehaviorSpec.kt b/app/src/test/java/com/eatssu/android/data/remote/repository/UserRepositoryImplBehaviorSpec.kt index 74c4268e3..70966b02c 100644 --- a/app/src/test/java/com/eatssu/android/data/remote/repository/UserRepositoryImplBehaviorSpec.kt +++ b/app/src/test/java/com/eatssu/android/data/remote/repository/UserRepositoryImplBehaviorSpec.kt @@ -28,7 +28,7 @@ class UserRepositoryImplBehaviorSpec : AppBehaviorSpec({ then("Result.success를 반환한다") { runTest { - repository.updateUserName(ChangeNicknameRequest("new")).isSuccess shouldBe true + repository.updateUserName("new").isSuccess shouldBe true } } } @@ -40,7 +40,7 @@ class UserRepositoryImplBehaviorSpec : AppBehaviorSpec({ then("서버 메시지를 포함한 실패 Result를 반환한다") { runTest { - val result = repository.updateUserName(ChangeNicknameRequest("new")) + val result = repository.updateUserName("new") result.isFailure shouldBe true result.exceptionOrNull()?.message shouldBe "bad nickname" } @@ -54,7 +54,7 @@ class UserRepositoryImplBehaviorSpec : AppBehaviorSpec({ then("기본 실패 메시지를 반환한다") { runTest { - val result = repository.updateUserName(ChangeNicknameRequest("new")) + val result = repository.updateUserName("new") result.isFailure shouldBe true result.exceptionOrNull()?.message shouldBe "닉네임 변경에 실패했어요." } @@ -68,7 +68,7 @@ class UserRepositoryImplBehaviorSpec : AppBehaviorSpec({ then("기본 실패 메시지를 반환한다") { runTest { - val result = repository.updateUserName(ChangeNicknameRequest("new")) + val result = repository.updateUserName("new") result.isFailure shouldBe true result.exceptionOrNull()?.message shouldBe "닉네임 변경에 실패했어요." } diff --git a/app/src/test/java/com/eatssu/android/domain/usecase/user/UserDelegatingUseCasesBehaviorSpec.kt b/app/src/test/java/com/eatssu/android/domain/usecase/user/UserDelegatingUseCasesBehaviorSpec.kt index f3a4fe2de..41c15ccbb 100644 --- a/app/src/test/java/com/eatssu/android/domain/usecase/user/UserDelegatingUseCasesBehaviorSpec.kt +++ b/app/src/test/java/com/eatssu/android/domain/usecase/user/UserDelegatingUseCasesBehaviorSpec.kt @@ -1,7 +1,6 @@ package com.eatssu.android.domain.usecase.user import com.eatssu.android.data.local.AccountDataStore -import com.eatssu.android.data.remote.dto.request.ChangeNicknameRequest import com.eatssu.android.domain.repository.UserRepository import com.eatssu.android.test.AppBehaviorSpec import com.eatssu.android.test.sampleCollege @@ -130,19 +129,18 @@ class UserDelegatingUseCasesBehaviorSpec : AppBehaviorSpec({ val accountDataStore = mockk() val useCase = SetUserNicknameUseCase(userRepository, accountDataStore) val nickname = "new-nick" - val request = ChangeNicknameRequest(nickname) coJustRun { accountDataStore.setName(nickname) } `when`("원격 닉네임 변경이 성공하면") { - coEvery { userRepository.updateUserName(request) } returns Result.success(Unit) + coEvery { userRepository.updateUserName(nickname) } returns Result.success(Unit) then("성공 결과를 반환하고 원격 성공 후 로컬 닉네임을 저장한다") { runTest { val result = useCase(nickname) result.isSuccess shouldBe true coVerifyOrder { - userRepository.updateUserName(request) + userRepository.updateUserName(nickname) accountDataStore.setName(nickname) } } @@ -150,13 +148,15 @@ class UserDelegatingUseCasesBehaviorSpec : AppBehaviorSpec({ } `when`("원격 닉네임 변경이 실패하면") { - coEvery { userRepository.updateUserName(request) } returns Result.failure(IllegalStateException("fail")) + coEvery { userRepository.updateUserName(nickname) } returns Result.failure( + IllegalStateException("fail") + ) then("실패 결과를 반환하고 로컬 닉네임은 변경하지 않는다") { runTest { val result = useCase(nickname) result.isFailure shouldBe true - coVerify(exactly = 1) { userRepository.updateUserName(request) } + coVerify(exactly = 1) { userRepository.updateUserName(nickname) } coVerify(exactly = 0) { accountDataStore.setName(any()) } } } From 50b6933c67877477fa737feae9aa28fabdc2f7d8 Mon Sep 17 00:00:00 2001 From: Yu Jin Date: Fri, 27 Mar 2026 22:39:07 +0900 Subject: [PATCH 4/9] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/com/eatssu/android/domain/usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt b/app/src/test/java/com/eatssu/android/domain/usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt index 394da338c..17dea0454 100644 --- a/app/src/test/java/com/eatssu/android/domain/usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt +++ b/app/src/test/java/com/eatssu/android/domain/usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt @@ -148,7 +148,7 @@ class ReviewDelegatingUseCasesBehaviorSpec : AppBehaviorSpec({ then("true를 반환한다") { runTest { - useCase(reviewId, reportType, content) shouldBe true + useCase(reviewId = reviewId, reportType = reportType, content = content) shouldBe true } } } From f77e22b409155b01dab69bf9e58aec5c56dd4e37 Mon Sep 17 00:00:00 2001 From: Yu Jin Date: Fri, 27 Mar 2026 22:39:15 +0900 Subject: [PATCH 5/9] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../android/data/remote/repository/ReportRepositoryImpl.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/data/remote/repository/ReportRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/remote/repository/ReportRepositoryImpl.kt index da223a8c8..440924b13 100644 --- a/app/src/main/java/com/eatssu/android/data/remote/repository/ReportRepositoryImpl.kt +++ b/app/src/main/java/com/eatssu/android/data/remote/repository/ReportRepositoryImpl.kt @@ -16,9 +16,9 @@ class ReportRepositoryImpl @Inject constructor(private val reportService: Report ): Boolean = reportService.reportReview( ReportRequest( - reviewId, - reportType, - content + reviewId = reviewId, + reportType = reportType, + content = content ) ).isSuccess() From cc6cfd57ba3e4a7f65cdbc33aa284c14afddb8c1 Mon Sep 17 00:00:00 2001 From: Yu Jin Date: Fri, 27 Mar 2026 22:39:25 +0900 Subject: [PATCH 6/9] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../eatssu/android/domain/usecase/review/PostReportUseCase.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/review/PostReportUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/review/PostReportUseCase.kt index d2eb462b3..524894087 100644 --- a/app/src/main/java/com/eatssu/android/domain/usecase/review/PostReportUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/review/PostReportUseCase.kt @@ -9,7 +9,7 @@ class PostReportUseCase @Inject constructor( suspend operator fun invoke( reviewId: Long, reportType: String, - content: String + content: String, ): Boolean = reportRepository.reportReview( reviewId = reviewId, From 9f249227f98ab2eb71a11cc26b1812962f1390b1 Mon Sep 17 00:00:00 2001 From: Yu Jin Date: Fri, 27 Mar 2026 22:39:34 +0900 Subject: [PATCH 7/9] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../cafeteria/review/report/ReportViewModelBehaviorSpec.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/com/eatssu/android/presentation/cafeteria/review/report/ReportViewModelBehaviorSpec.kt b/app/src/test/java/com/eatssu/android/presentation/cafeteria/review/report/ReportViewModelBehaviorSpec.kt index 91cb52d28..11bef24eb 100644 --- a/app/src/test/java/com/eatssu/android/presentation/cafeteria/review/report/ReportViewModelBehaviorSpec.kt +++ b/app/src/test/java/com/eatssu/android/presentation/cafeteria/review/report/ReportViewModelBehaviorSpec.kt @@ -32,7 +32,7 @@ class ReportViewModelBehaviorSpec : AppBehaviorSpec({ viewModel.uiState.value.toastMessage.asStringResIdOrNull() shouldBe R.string.toast_report_failed viewModel.uiState.value.isDone shouldBe false - coVerify { postReportUseCase(1L, "COPY", "bad") } + coVerify { postReportUseCase(reviewId = 1L, reportType = "COPY", content = "bad") } } } } From 624b22c97dd4e9b7837896e8a0c1ab70c51a0347 Mon Sep 17 00:00:00 2001 From: Yu Jin Date: Fri, 27 Mar 2026 22:39:48 +0900 Subject: [PATCH 8/9] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/com/eatssu/android/domain/usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt b/app/src/test/java/com/eatssu/android/domain/usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt index 17dea0454..7ef86c5f3 100644 --- a/app/src/test/java/com/eatssu/android/domain/usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt +++ b/app/src/test/java/com/eatssu/android/domain/usecase/review/ReviewDelegatingUseCasesBehaviorSpec.kt @@ -158,7 +158,7 @@ class ReviewDelegatingUseCasesBehaviorSpec : AppBehaviorSpec({ then("false를 반환한다") { runTest { - useCase(reviewId, reportType, content) shouldBe false + useCase(reviewId = reviewId, reportType = reportType, content = content) shouldBe false } } } From 646881992993e2ce501821bfa7578a7088b38042 Mon Sep 17 00:00:00 2001 From: Yu Jin Date: Mon, 30 Mar 2026 01:12:50 +0900 Subject: [PATCH 9/9] =?UTF-8?q?chore:=20exception=EC=9D=84=20=EA=B7=B8?= =?UTF-8?q?=EB=8C=80=EB=A1=9C=20=EB=8B=B4=EC=9D=80=20=EC=8B=A4=ED=8C=A8=20?= =?UTF-8?q?Result=EB=A5=BC=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/data/remote/repository/UserRepositoryImpl.kt | 3 ++- .../data/remote/repository/UserRepositoryImplBehaviorSpec.kt | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/eatssu/android/data/remote/repository/UserRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/remote/repository/UserRepositoryImpl.kt index 3197fd7d6..2f5bb5686 100644 --- a/app/src/main/java/com/eatssu/android/data/remote/repository/UserRepositoryImpl.kt +++ b/app/src/main/java/com/eatssu/android/data/remote/repository/UserRepositoryImpl.kt @@ -23,7 +23,8 @@ class UserRepositoryImpl @Inject constructor( when (val result = userService.changeNickname(ChangeNicknameRequest(nickname))) { is ApiResult.Success -> Result.success(Unit) is ApiResult.Failure -> Result.failure(Exception(result.message ?: "닉네임 변경에 실패했어요.")) - else -> Result.failure(Exception("닉네임 변경에 실패했어요.")) + is ApiResult.NetworkError -> Result.failure(result.exception) + is ApiResult.UnknownError -> Result.failure(result.exception) } override suspend fun checkUserNameValidation(nickname: String): Result { diff --git a/app/src/test/java/com/eatssu/android/data/remote/repository/UserRepositoryImplBehaviorSpec.kt b/app/src/test/java/com/eatssu/android/data/remote/repository/UserRepositoryImplBehaviorSpec.kt index 70966b02c..b02c0f18b 100644 --- a/app/src/test/java/com/eatssu/android/data/remote/repository/UserRepositoryImplBehaviorSpec.kt +++ b/app/src/test/java/com/eatssu/android/data/remote/repository/UserRepositoryImplBehaviorSpec.kt @@ -66,11 +66,11 @@ class UserRepositoryImplBehaviorSpec : AppBehaviorSpec({ userService.changeNickname(ChangeNicknameRequest("new")) } returns ApiResult.UnknownError(IllegalStateException("boom")) - then("기본 실패 메시지를 반환한다") { + then("exception을 그대로 담은 실패 Result를 반환한다") { runTest { val result = repository.updateUserName("new") result.isFailure shouldBe true - result.exceptionOrNull()?.message shouldBe "닉네임 변경에 실패했어요." + result.exceptionOrNull()?.message shouldBe "boom" } } }