Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Added test-data module that contains generic test data and test exten…
…sion.
  • Loading branch information
WingEraser committed Mar 6, 2025
commit 02393515eaf7d1bd1ae2a427b39d7f50f47ec1ad
1 change: 1 addition & 0 deletions accounts-journey/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ android {
}
dependencies {
implementation(libs.bundles.navigation)
testImplementation(projects.testData)

androidTestImplementation(libs.navigation.testing)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.backbase.accounts_journey.generator

import com.backbase.accounts_journey.domain.model.account_detail.AccountDetail
import com.backbase.android.test_data.StringGenerator

/**
* A random AccountDetail generator. It is not fully implemented, but it gives you an idea how to randomize the data.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import com.backbase.accounts_journey.domain.model.account_summary.UserPreference
import com.backbase.accounts_journey.domain.model.account_summary.current_accounts.CurrentAccount
import com.backbase.accounts_journey.domain.model.account_summary.current_accounts.CurrentAccounts
import com.backbase.accounts_journey.domain.model.common.ProductState
import com.backbase.accounts_journey.generator.NumberGenerator.randomFloat
import com.backbase.accounts_journey.generator.StringGenerator.generateRandomBBAN
import com.backbase.accounts_journey.generator.StringGenerator.generateRandomBIC
import com.backbase.accounts_journey.generator.StringGenerator.generateRandomCurrency
import com.backbase.accounts_journey.generator.StringGenerator.randomString
import com.backbase.android.test_data.NumberGenerator.randomFloat
import com.backbase.android.test_data.StringGenerator.generateRandomBBAN
import com.backbase.android.test_data.StringGenerator.generateRandomBIC
import com.backbase.android.test_data.StringGenerator.generateRandomCurrency
import com.backbase.android.test_data.StringGenerator.randomString
import java.math.BigDecimal
import java.time.OffsetDateTime
import java.time.ZoneOffset
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package com.backbase.accounts_journey.presentation.accountdetail.ui

import com.backbase.accounts_journey.CoroutineTest
import com.backbase.accounts_journey.common.FailedGetDataException
import com.backbase.accounts_journey.data.usecase.AccountDetailUseCase
import com.backbase.accounts_journey.data.usecase.Params
import com.backbase.accounts_journey.generator.AccountDetailGenerator.generateAccountDetail
import com.backbase.accounts_journey.generator.StringGenerator
import com.backbase.accounts_journey.presentation.accountdetail.mapper.AccountDetailUiMapper
import com.backbase.android.test_data.CoroutineTest
import com.backbase.android.test_data.StringGenerator
import io.mockk.coEvery
import io.mockk.mockk
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.assertj.core.api.BDDAssertions.then
Expand All @@ -20,14 +20,15 @@ import org.junit.jupiter.api.Test
class AccountDetailViewModelTest : CoroutineTest {

override lateinit var testScope: TestScope
override lateinit var testDispatcherProvider: TestDispatcher

private val accountDetailUseCase: AccountDetailUseCase = mockk()

private val viewModel by lazy {
AccountDetailViewModel(
useCase = accountDetailUseCase,
mapper = AccountDetailUiMapper(mockk(relaxed = true)),
defaultDispatcher = Dispatchers.Unconfined
defaultDispatcher = testDispatcherProvider
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.backbase.accounts_journey.presentation.accountlist.ui

import com.backbase.accounts_journey.CoroutineTest
import com.backbase.accounts_journey.common.FailedGetDataException
import com.backbase.accounts_journey.data.usecase.AccountsUseCase
import com.backbase.accounts_journey.generator.AccountSummaryGenerator
import com.backbase.accounts_journey.presentation.accountlist.mapper.AccountUiMapper
import com.backbase.android.test_data.CoroutineTest
import io.mockk.coEvery
import io.mockk.mockk
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.assertj.core.api.BDDAssertions.then
Expand All @@ -18,14 +18,15 @@ import org.junit.jupiter.api.Test
class AccountListViewModelTest : CoroutineTest {

override lateinit var testScope: TestScope
override lateinit var testDispatcherProvider: TestDispatcher

private val accountsUseCase: AccountsUseCase = mockk()

private val viewModel by lazy {
AccountListViewModel(
useCase = accountsUseCase,
mapper = AccountUiMapper(mockk(relaxed = true)),
defaultDispatcher = Dispatchers.Unconfined
defaultDispatcher = testDispatcherProvider
)
}

Expand Down
2 changes: 2 additions & 0 deletions accounts-use-case/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ android {

dependencies {
implementation(projects.accountsJourney)
testImplementation(projects.testData)

// Backbase libraries
implementation(platform(backbase.bom))
implementation(backbase.gen.arrangements.client)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package com.backbase.accounts_use_case

import com.backbase.accounts_journey.common.FailedGetDataException
import com.backbase.accounts_journey.common.NoInternetException
import com.backbase.accounts_journey.common.NoResponseException
import com.backbase.accounts_journey.data.usecase.Params
import com.backbase.accounts_use_case.generator.AccountArrangementItemGenerator
import com.backbase.android.client.gen2.arrangementclient2.api.ArrangementsApi
import com.backbase.android.client.gen2.arrangementclient2.api.ArrangementsApiParams
import com.backbase.android.client.gen2.arrangementclient2.model.AccountArrangementItem
import com.backbase.android.clients.common.CallResult
import com.backbase.android.core.errorhandling.ErrorCodes
import com.backbase.android.test_data.CoroutineTest
import com.backbase.android.test_data.StringGenerator.randomString
import com.backbase.android.utils.net.response.Response
import io.mockk.every
import io.mockk.mockk
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.assertj.core.api.BDDAssertions.then
import org.junit.jupiter.api.Test

@OptIn(ExperimentalCoroutinesApi::class)
class AccountDetailUseCaseTest : CoroutineTest {

override lateinit var testScope: TestScope
override lateinit var testDispatcherProvider: TestDispatcher

@Test
fun `should get AccountDetail when success`() = runTest {
val id = randomString()
val arrangementsApi = mockk<ArrangementsApi>()
val callResult = CallResult.Success(
data = AccountArrangementItemGenerator.generateAccountArrangement(id = id)
)
val useCase = AccountDetailUseCaseImpl(arrangementsApi, testDispatcherProvider)

every {
arrangementsApi.getArrangementById(
ArrangementsApiParams.GetArrangementById {
this.arrangementId = id
}
).parseExecute()
} returns callResult

val actual = useCase.getAccountDetail(Params { this.id = id })

then(actual.isSuccess).isTrue
actual.onSuccess { accountDetail ->
then(accountDetail.id).isEqualTo(id)
}
}

@Test
fun `should get FailedGetDataException when error code is 500`() = runTest {
val id = randomString()
val arrangementsApi = mockk<ArrangementsApi>()
val callResult = CallResult.Error<AccountArrangementItem>(
errorResponse = Response(500, "Internal Server Error")
)
val useCase = AccountDetailUseCaseImpl(arrangementsApi, testDispatcherProvider)

every {
arrangementsApi.getArrangementById(
ArrangementsApiParams.GetArrangementById {
this.arrangementId = id
}
).parseExecute()
} returns callResult

val actual = useCase.getAccountDetail(Params { this.id = id })

then(actual.isFailure).isTrue
actual.onFailure { exception ->
then(exception).isInstanceOf(FailedGetDataException::class.java)
}
}

@Test
fun `should get NoInternetException when there is no internet`() = runTest {
val id = randomString()
val arrangementsApi = mockk<ArrangementsApi>()
val callResult = CallResult.Error<AccountArrangementItem>(
errorResponse = Response(ErrorCodes.NO_INTERNET.code, "No internet")
)
val useCase = AccountDetailUseCaseImpl(arrangementsApi, testDispatcherProvider)

every {
arrangementsApi.getArrangementById(
ArrangementsApiParams.GetArrangementById {
this.arrangementId = id
}
).parseExecute()
} returns callResult

val actual = useCase.getAccountDetail(Params { this.id = id })

then(actual.isFailure).isTrue
actual.onFailure { exception ->
then(exception).isInstanceOf(NoInternetException::class.java)
}
}

@Test
fun `should get NoResponseException when there is no internet`() = runTest {
val id = randomString()
val arrangementsApi = mockk<ArrangementsApi>()
val callResult = CallResult.None<AccountArrangementItem>()
val useCase = AccountDetailUseCaseImpl(arrangementsApi, testDispatcherProvider)

every {
arrangementsApi.getArrangementById(
ArrangementsApiParams.GetArrangementById {
this.arrangementId = id
}
).parseExecute()
} returns callResult

val actual = useCase.getAccountDetail(Params { this.id = id })

then(actual.isFailure).isTrue
actual.onFailure { exception ->
then(exception).isInstanceOf(NoResponseException::class.java)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,32 @@ import com.backbase.android.client.gen2.arrangementclient2.api.ProductSummaryApi
import com.backbase.android.client.gen2.arrangementclient2.model.ProductSummary
import com.backbase.android.clients.common.CallResult
import com.backbase.android.core.errorhandling.ErrorCodes
import com.backbase.android.test_data.CoroutineTest
import com.backbase.android.utils.net.response.Response
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.assertj.core.api.BDDAssertions.then
import org.junit.jupiter.api.Test

class AccountSummaryUseCaseTest {
@OptIn(ExperimentalCoroutinesApi::class)
class AccountSummaryUseCaseTest : CoroutineTest {

override lateinit var testScope: TestScope
override lateinit var testDispatcherProvider: TestDispatcher

@Test
fun `should get AccountSummary when success`() = runTest {
val productSummaryApi = mockk<ProductSummaryApi>()
val callResult = CallResult.Success(
data = ProductSummaryGenerator.generateProductSummary()
)
val useCase = AccountSummaryUseCaseImpl(productSummaryApi, Dispatchers.Unconfined)
val useCase = AccountSummaryUseCaseImpl(productSummaryApi, testDispatcherProvider)

every {
productSummaryApi.getProductSummary(ProductSummaryApiParams.GetProductSummary { })
.parseExecute()
Expand All @@ -35,8 +43,8 @@ class AccountSummaryUseCaseTest {
val actual = useCase.getAccountSummary(false)

then(actual.isSuccess).isTrue
actual.onSuccess { domain ->
then(domain).isNotNull
actual.onSuccess { accountSummary ->
then(accountSummary).isNotNull
}
}

Expand All @@ -46,7 +54,7 @@ class AccountSummaryUseCaseTest {
val callResult = CallResult.Success(
data = ProductSummaryGenerator.generateProductSummary()
)
val useCase = AccountSummaryUseCaseImpl(productSummaryApi, Dispatchers.Unconfined)
val useCase = AccountSummaryUseCaseImpl(productSummaryApi, testDispatcherProvider)

every {
productSummaryApi.getProductSummary(ProductSummaryApiParams.GetProductSummary { })
Expand All @@ -65,7 +73,7 @@ class AccountSummaryUseCaseTest {
val callResult = CallResult.Error<ProductSummary>(
errorResponse = Response(500, "Internal Server Error")
)
val useCase = AccountSummaryUseCaseImpl(productSummaryApi, Dispatchers.Unconfined)
val useCase = AccountSummaryUseCaseImpl(productSummaryApi, testDispatcherProvider)

every {
productSummaryApi.getProductSummary(ProductSummaryApiParams.GetProductSummary { })
Expand All @@ -86,7 +94,7 @@ class AccountSummaryUseCaseTest {
val callResult = CallResult.Error<ProductSummary>(
errorResponse = Response(ErrorCodes.NO_INTERNET.code, "No internet")
)
val useCase = AccountSummaryUseCaseImpl(productSummaryApi, Dispatchers.Unconfined)
val useCase = AccountSummaryUseCaseImpl(productSummaryApi, testDispatcherProvider)

every {
productSummaryApi.getProductSummary(ProductSummaryApiParams.GetProductSummary { })
Expand All @@ -105,7 +113,7 @@ class AccountSummaryUseCaseTest {
fun `should get NoResponseException when there is nothing happens`() = runTest {
val productSummaryApi = mockk<ProductSummaryApi>()
val callResult = CallResult.None<ProductSummary>()
val useCase = AccountSummaryUseCaseImpl(productSummaryApi, Dispatchers.Unconfined)
val useCase = AccountSummaryUseCaseImpl(productSummaryApi, testDispatcherProvider)

every {
productSummaryApi.getProductSummary(ProductSummaryApiParams.GetProductSummary { })
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.backbase.accounts_use_case.generator

import com.backbase.android.client.gen2.arrangementclient2.model.AccountArrangementItem

object AccountArrangementItemGenerator {

fun generateAccountArrangement(
id: String = "",
currency: String = "",
productId: String = ""
): AccountArrangementItem {
return AccountArrangementItem {
this.id = id
this.currency = currency
this.productId = productId
}
}
}
5 changes: 5 additions & 0 deletions app-common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ plugins {

android {
namespace = "com.backbase.app_common"
compileOptions {
isCoreLibraryDesugaringEnabled = true
}
}

dependencies {
Expand All @@ -13,6 +16,8 @@ dependencies {
implementation(projects.accountsUseCase)
implementation(libs.bundles.navigation)

coreLibraryDesugaring(libs.desugar.jdk.libs)

// Backbase libraries
implementation(platform(backbase.bom))
implementation(backbase.bundles.clients)
Expand Down
6 changes: 4 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
## A
agp = "8.6.1"
archCore = "2.2.0"
assertJ = "3.26.3"

## D
desugar_jdk_libs = "2.1.3"
Expand All @@ -26,6 +27,7 @@ koin = "3.5.6"
kotlin = "1.9.24"

## N
mockk = "1.13.17"
navigation-component = "2.7.7"

## P
Expand All @@ -42,7 +44,7 @@ truth = "1.4.4"
## A
appcompat = { group = "androidx.appcompat", name = "appcompat", version = "" }
archCore = { module = "androidx.arch.core:core-testing", name = "archCore", version.ref = "archCore"}
assertj-core = { module = "org.assertj:assertj-core", version = "" }
assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertJ" }

## C
coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version = ""}
Expand Down Expand Up @@ -84,7 +86,7 @@ lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", v

## M
material = { module = "com.google.android.material:material", version = "" }
mockK = { module = "io.mockk:mockk", version = "" }
mockK = { module = "io.mockk:mockk", version.ref = "mockk" }
mockK-android = { module = "io.mockk:mockk-android", version = "" }

## N
Expand Down
Loading