Skip to content

Commit

Permalink
Refactor: Adds generic error title to errors
Browse files Browse the repository at this point in the history
-   Adds a generic error title to the `EudiRQESUiError` class.
-   Updates error handling in `TestRqesController`, `TestOptionsSelectionViewModel`, `TestOptionsSelectionInteractor`, `TestSuccessInteractor`, and `TestSuccessViewModel` to include the error title.
-   Adds `mockedGenericErrorTitle` to the resource provider and related tests.
-   Fixes a subTitle issue in `ContentError` composable.
  • Loading branch information
stzouvaras committed Feb 24, 2025
1 parent 3aa2da3 commit b61bae3
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import org.koin.compose.koinInject

internal data class ContentErrorConfig(
val errorTitle: String,
val errorSubTitle: String? = null,
val errorSubTitle: String,
val onCancel: () -> Unit,
val onRetry: (() -> Unit)? = null
)
Expand All @@ -55,10 +55,6 @@ internal fun ContentError(
subTitleMaxLines: Int = Int.MAX_VALUE
) {

val subtitle = config.errorSubTitle ?: resourceProvider.getLocalizedString(
LocalizableKey.GenericErrorDescription
)

Column(
Modifier
.fillMaxSize()
Expand All @@ -67,7 +63,7 @@ internal fun ContentError(

Text(
modifier = Modifier.fillMaxWidth(),
text = subtitle,
text = config.errorSubTitle,
style = subtitleStyle,
maxLines = subTitleMaxLines,
overflow = TextOverflow.Ellipsis
Expand Down Expand Up @@ -100,6 +96,7 @@ private fun PreviewContentErrorScreen() {
ContentError(
config = ContentErrorConfig(
errorTitle = "Error Title",
errorSubTitle = "Error Message",
onCancel = {}
),
paddingValues = PaddingValues(SIZE_MEDIUM.dp)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import eu.europa.ec.eudi.rqesui.util.mockedDocumentNotFoundMessage
import eu.europa.ec.eudi.rqesui.util.mockedExceptionWithMessage
import eu.europa.ec.eudi.rqesui.util.mockedExceptionWithNoMessage
import eu.europa.ec.eudi.rqesui.util.mockedGenericErrorMessage
import eu.europa.ec.eudi.rqesui.util.mockedGenericErrorTitle
import eu.europa.ec.eudi.rqesui.util.mockedGenericServiceErrorMessage
import eu.europa.ec.eudi.rqesui.util.mockedQtspEndpoint
import eu.europa.ec.eudi.rqesui.util.mockedQtspName
Expand Down Expand Up @@ -128,6 +129,8 @@ class TestRqesController {
.thenReturn(mockedGenericErrorMessage)
whenever(resourceProvider.genericServiceErrorMessage())
.thenReturn(mockedGenericServiceErrorMessage)
whenever(resourceProvider.genericErrorTitle())
.thenReturn(mockedGenericErrorTitle)
}

@After
Expand Down Expand Up @@ -261,7 +264,8 @@ class TestRqesController {
val result = rqesController.getQtsps()

// Assert
val expectedError = EudiRQESUiError(message = mockedGenericErrorMessage)
val expectedError =
EudiRQESUiError(title = mockedGenericErrorTitle, message = mockedGenericErrorMessage)
assertEquals(
expectedError.message,
(result as EudiRqesGetQtspsPartialState.Failure).error.message,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import eu.europa.ec.eudi.rqesui.util.CoroutineTestRule
import eu.europa.ec.eudi.rqesui.util.mockedAuthorizationUrl
import eu.europa.ec.eudi.rqesui.util.mockedExceptionWithMessage
import eu.europa.ec.eudi.rqesui.util.mockedGenericErrorMessage
import eu.europa.ec.eudi.rqesui.util.mockedGenericErrorTitle
import eu.europa.ec.eudi.rqesui.util.mockedPlainFailureMessage
import eu.europa.ec.eudi.rqesui.util.runTest
import junit.framework.TestCase.assertEquals
Expand Down Expand Up @@ -90,6 +91,8 @@ class TestOptionsSelectionInteractor {
)
whenever(resourceProvider.genericErrorMessage())
.thenReturn(mockedGenericErrorMessage)
whenever(resourceProvider.genericErrorTitle())
.thenReturn(mockedGenericErrorTitle)
}

@After
Expand Down Expand Up @@ -175,7 +178,10 @@ class TestOptionsSelectionInteractor {
fun `Given that service authorization fails, When authorizeServiceAndFetchCertificates is called, Then return Failure`() =
coroutineRule.runTest {
// Arrange
val error = EudiRQESUiError(message = mockedPlainFailureMessage)
val error = EudiRQESUiError(
title = mockedGenericErrorTitle,
message = mockedPlainFailureMessage
)
mockAuthorizeServiceCall(
EudiRqesAuthorizeServicePartialState.Failure(error)
)
Expand Down Expand Up @@ -213,7 +219,10 @@ class TestOptionsSelectionInteractor {
fun `Given service authorization succeeds but certificate fetch fails, When authorizeServiceAndFetchCertificates is called, Then return Failure`() =
coroutineRule.runTest {
// Arrange
val error = EudiRQESUiError(message = mockedPlainFailureMessage)
val error = EudiRQESUiError(
title = mockedGenericErrorTitle,
message = mockedPlainFailureMessage
)
mockAuthorizeServiceCall(
EudiRqesAuthorizeServicePartialState.Success(authorizedService = rqesServiceAuthorized)
)
Expand Down Expand Up @@ -255,7 +264,8 @@ class TestOptionsSelectionInteractor {
@Test
fun `Given selected file retrieval fails, When getSelectedFileAndQtsp is called, Then return Failure`() {
// Arrange
val error = EudiRQESUiError(message = mockedGenericErrorMessage)
val error =
EudiRQESUiError(title = mockedGenericErrorTitle, message = mockedGenericErrorMessage)
whenever(eudiController.getSelectedFile())
.thenReturn(EudiRqesGetSelectedFilePartialState.Failure(error))

Expand All @@ -275,7 +285,8 @@ class TestOptionsSelectionInteractor {
// Arrange
whenever(eudiController.getSelectedFile())
.thenReturn(EudiRqesGetSelectedFilePartialState.Success(file = documentData))
val failureError = EudiRQESUiError(message = mockedPlainFailureMessage)
val failureError =
EudiRQESUiError(title = mockedGenericErrorTitle, message = mockedPlainFailureMessage)
whenever(eudiController.getSelectedQtsp())
.thenReturn(EudiRqesGetSelectedQtspPartialState.Failure(error = failureError))

Expand Down Expand Up @@ -333,7 +344,10 @@ class TestOptionsSelectionInteractor {
fun `Given getCredentialAuthorizationUrl returns Failure, When getCredentialAuthorizationUrl is called, Then Failure state is returned`() =
coroutineRule.runTest {
// Arrange
val expectedError = EudiRQESUiError(message = mockedPlainFailureMessage)
val expectedError = EudiRQESUiError(
title = mockedGenericErrorTitle,
message = mockedPlainFailureMessage
)
val failureResponse = EudiRqesGetCredentialAuthorizationUrlPartialState.Failure(
error = expectedError
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import eu.europa.ec.eudi.rqesui.util.mockedDocumentName
import eu.europa.ec.eudi.rqesui.util.mockedExceptionWithMessage
import eu.europa.ec.eudi.rqesui.util.mockedExceptionWithNoMessage
import eu.europa.ec.eudi.rqesui.util.mockedGenericErrorMessage
import eu.europa.ec.eudi.rqesui.util.mockedGenericErrorTitle
import eu.europa.ec.eudi.rqesui.util.mockedPlainFailureMessage
import eu.europa.ec.eudi.rqesui.util.runTest
import junit.framework.TestCase.assertEquals
Expand Down Expand Up @@ -100,6 +101,8 @@ class TestSuccessInteractor {
whenever(resourceProvider.genericErrorMessage())
.thenReturn(mockedGenericErrorMessage)
whenever(resourceProvider.provideContext()).thenReturn(context)
whenever(resourceProvider.genericErrorTitle())
.thenReturn(mockedGenericErrorTitle)
}

@After
Expand Down Expand Up @@ -138,7 +141,8 @@ class TestSuccessInteractor {
@Test
fun `Given Case 2, When getSelectedFileAndQtsp is called, Then Case 2 expected result is returned`() {
// Arrange
val error = EudiRQESUiError(message = mockedPlainFailureMessage)
val error =
EudiRQESUiError(title = mockedGenericErrorTitle, message = mockedPlainFailureMessage)
mockGetSelectedFileCall(event = EudiRqesGetSelectedFilePartialState.Failure(error = error))

// Act
Expand All @@ -162,7 +166,8 @@ class TestSuccessInteractor {
@Test
fun `Given Case 3, When getSelectedFileAndQtsp is called, Then Case 3 expected result is returned`() {
// Arrange
val error = EudiRQESUiError(message = mockedPlainFailureMessage)
val error =
EudiRQESUiError(title = mockedGenericErrorTitle, message = mockedPlainFailureMessage)
mockGetSelectedFileCall(event = EudiRqesGetSelectedFilePartialState.Success(file = documentData))
mockGetSelectedQtspCall(event = EudiRqesGetSelectedQtspPartialState.Failure(error = error))

Expand Down Expand Up @@ -270,7 +275,10 @@ class TestSuccessInteractor {
fun `Given Case 2, When signAndSaveDocument is called, Then Case 2 expected result is returned`() =
coroutineRule.runTest {
// Arrange
val error = EudiRQESUiError(message = mockedPlainFailureMessage)
val error = EudiRQESUiError(
title = mockedGenericErrorTitle,
message = mockedPlainFailureMessage
)
mockAuthorizeCredentialCall(
response = EudiRqesAuthorizeCredentialPartialState.Failure(
error = error
Expand Down Expand Up @@ -299,7 +307,10 @@ class TestSuccessInteractor {
fun `Given Case 3, When signAndSaveDocument is called, Then Case 3 expected result is returned`() =
coroutineRule.runTest {
// Arrange
val error = EudiRQESUiError(message = mockedPlainFailureMessage)
val error = EudiRQESUiError(
title = mockedGenericErrorTitle,
message = mockedPlainFailureMessage
)
mockAuthorizeCredentialCall(
response = EudiRqesAuthorizeCredentialPartialState.Success(
credentialAuthorized
Expand Down Expand Up @@ -331,7 +342,10 @@ class TestSuccessInteractor {
fun `Given Case 4, When signAndSaveDocument is called, Then Case 4 expected result is returned`() =
coroutineRule.runTest {
// Arrange
val error = EudiRQESUiError(message = mockedPlainFailureMessage)
val error = EudiRQESUiError(
title = mockedGenericErrorTitle,
message = mockedPlainFailureMessage
)
mockAuthorizeCredentialCall(
response = EudiRqesAuthorizeCredentialPartialState.Success(
authorizedCredential = credentialAuthorized
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import eu.europa.ec.eudi.rqesui.util.mockedAuthorizationUrl
import eu.europa.ec.eudi.rqesui.util.mockedCertificateName
import eu.europa.ec.eudi.rqesui.util.mockedDocumentName
import eu.europa.ec.eudi.rqesui.util.mockedFetchCertificatesFailureMessage
import eu.europa.ec.eudi.rqesui.util.mockedGenericErrorTitle
import eu.europa.ec.eudi.rqesui.util.mockedLocalFileUri
import eu.europa.ec.eudi.rqesui.util.mockedPlainFailureMessage
import eu.europa.ec.eudi.rqesui.util.mockedQtspName
Expand Down Expand Up @@ -362,7 +363,10 @@ class TestOptionsSelectionViewModel {
whenever(optionsSelectionInteractor.getSelectedFile())
.thenReturn(
EudiRqesGetSelectedFilePartialState.Failure(
error = EudiRQESUiError(message = errorMessage)
error = EudiRQESUiError(
title = mockedGenericErrorTitle,
message = errorMessage
)
)
)

Expand Down Expand Up @@ -416,7 +420,10 @@ class TestOptionsSelectionViewModel {
whenever(optionsSelectionInteractor.getSelectedQtsp())
.thenReturn(
OptionsSelectionInteractorGetSelectedQtspPartialState.Failure(
error = EudiRQESUiError(message = errorMessage)
error = EudiRQESUiError(
title = mockedGenericErrorTitle,
message = errorMessage
)
)
)

Expand Down Expand Up @@ -530,7 +537,7 @@ class TestOptionsSelectionViewModel {
// Arrange
val errorMessage = mockedPlainFailureMessage
val failureState = EudiRqesGetQtspsPartialState.Failure(
error = EudiRQESUiError(message = errorMessage)
error = EudiRQESUiError(title = mockedGenericErrorTitle, message = errorMessage)
)
whenever(optionsSelectionInteractor.getQtsps())
.thenReturn(failureState)
Expand Down Expand Up @@ -785,7 +792,10 @@ class TestOptionsSelectionViewModel {
coroutineRule.runTest {
// Arrange
val failureState = EudiRqesSetSelectedQtspPartialState.Failure(
error = EudiRQESUiError(message = mockedPlainFailureMessage)
error = EudiRQESUiError(
title = mockedGenericErrorTitle,
message = mockedPlainFailureMessage
)
)
whenever(optionsSelectionInteractor.updateQtspUserSelection(qtspData)).thenReturn(
failureState
Expand Down Expand Up @@ -1003,7 +1013,10 @@ class TestOptionsSelectionViewModel {
whenever(optionsSelectionInteractor.getCredentialAuthorizationUrl(certificateData))
.thenReturn(
EudiRqesGetCredentialAuthorizationUrlPartialState.Failure(
error = EudiRQESUiError(message = errorMessage)
error = EudiRQESUiError(
title = mockedGenericErrorTitle,
message = errorMessage
)
)
)

Expand Down Expand Up @@ -1151,7 +1164,10 @@ class TestOptionsSelectionViewModel {
// Arrange
val response =
OptionsSelectionInteractorAuthorizeServiceAndFetchCertificatesPartialState.Failure(
EudiRQESUiError(message = mockedFetchCertificatesFailureMessage)
EudiRQESUiError(
title = mockedGenericErrorTitle,
message = mockedFetchCertificatesFailureMessage
)
)
mockAuthorizeServiceAndFetchCertificatesCall(response = response)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import eu.europa.ec.eudi.rqesui.presentation.ui.component.content.ContentHeaderC
import eu.europa.ec.eudi.rqesui.presentation.ui.component.wrap.BottomSheetTextData
import eu.europa.ec.eudi.rqesui.util.CoroutineTestRule
import eu.europa.ec.eudi.rqesui.util.mockedDocumentName
import eu.europa.ec.eudi.rqesui.util.mockedGenericErrorTitle
import eu.europa.ec.eudi.rqesui.util.mockedLocalFileUri
import eu.europa.ec.eudi.rqesui.util.mockedPlainFailureMessage
import eu.europa.ec.eudi.rqesui.util.mockedQtspEndpoint
Expand Down Expand Up @@ -246,7 +247,10 @@ class TestSuccessViewModel {
// Arrange
val event = Event.SignAndSaveDocument(mockedDocumentName, mockedQtspName)
val errorResponse = SuccessInteractorSignAndSaveDocumentPartialState.Failure(
error = EudiRQESUiError(mockedPlainFailureMessage)
error = EudiRQESUiError(
title = mockedGenericErrorTitle,
message = mockedPlainFailureMessage
)
)
mockSignAndSaveDocumentCall(documentName = mockedDocumentName, response = errorResponse)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package eu.europa.ec.eudi.rqesui.util

const val mockedPlainFailureMessage = "Failure message"
const val mockedGenericErrorTitle = "resourceProvider's genericErrorTitle"
const val mockedGenericErrorMessage = "resourceProvider's genericErrorMessage"
const val mockedGenericServiceErrorMessage = "resourceProvider's genericServiceErrorMessage"
const val mockedAuthorizationUrl = "https://endpoint.com/mockedAuthorizationUrl"
Expand Down

0 comments on commit b61bae3

Please sign in to comment.