Updated on 2026-08-14
This commit is contained in:
parent
ff8f9c9b18
commit
6aab25427d
75 changed files with 2122 additions and 57 deletions
|
|
@ -43,6 +43,7 @@ dependencies {
|
|||
kapt(deps.hilt.kapt)
|
||||
|
||||
/** Other */
|
||||
implementation(deps.kotlin.datetime)
|
||||
|
||||
/** tests */
|
||||
testImplementation(projects.common.test)
|
||||
|
|
|
|||
|
|
@ -4,13 +4,18 @@ import com.tangem.core.analytics.api.AnalyticsExceptionHandler
|
|||
import com.tangem.data.yield.supply.DefaultYieldSupplyRepository
|
||||
import com.tangem.data.yield.supply.DefaultYieldSupplyErrorResolver
|
||||
import com.tangem.data.yield.supply.DefaultYieldSupplyTransactionRepository
|
||||
import com.tangem.data.yield.supply.promo.DefaultYieldPromoRepository
|
||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.api.tangemTech.YieldSupplyApi
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.yieldsupply.YieldMarketsStore
|
||||
import com.tangem.datasource.local.yieldsupply.promo.YieldBoostPromoStore
|
||||
import com.tangem.datasource.local.yieldsupply.promo.YieldBoostStatusStore
|
||||
import com.tangem.domain.walletmanager.WalletManagersFacade
|
||||
import com.tangem.domain.yield.supply.YieldSupplyRepository
|
||||
import com.tangem.domain.yield.supply.YieldSupplyErrorResolver
|
||||
import com.tangem.domain.yield.supply.YieldSupplyTransactionRepository
|
||||
import com.tangem.domain.yield.supply.promo.YieldPromoRepository
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
|
|
@ -59,4 +64,20 @@ internal object YieldSupplyDataModule {
|
|||
fun provideYieldSupplyErrorResolver(): YieldSupplyErrorResolver {
|
||||
return DefaultYieldSupplyErrorResolver
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideYieldPromoRepository(
|
||||
tangemApi: TangemTechApi,
|
||||
promoStore: YieldBoostPromoStore,
|
||||
statusStore: YieldBoostStatusStore,
|
||||
dispatchers: CoroutineDispatcherProvider,
|
||||
): YieldPromoRepository {
|
||||
return DefaultYieldPromoRepository(
|
||||
tangemApi = tangemApi,
|
||||
promoStore = promoStore,
|
||||
statusStore = statusStore,
|
||||
dispatchers = dispatchers,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
package com.tangem.data.yield.supply.promo
|
||||
|
||||
import com.tangem.data.yield.supply.promo.converter.YieldBoostPromoConverter
|
||||
import com.tangem.data.yield.supply.promo.converter.YieldBoostStatusConverter
|
||||
import com.tangem.datasource.api.common.response.getOrThrow
|
||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.local.yieldsupply.promo.YieldBoostPromoStore
|
||||
import com.tangem.datasource.local.yieldsupply.promo.YieldBoostStatusStore
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
import com.tangem.domain.yield.supply.models.YieldBoostPromo
|
||||
import com.tangem.domain.yield.supply.models.YieldBoostStatus
|
||||
import com.tangem.domain.yield.supply.promo.YieldPromoRepository
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
internal class DefaultYieldPromoRepository(
|
||||
private val tangemApi: TangemTechApi,
|
||||
private val promoStore: YieldBoostPromoStore,
|
||||
private val statusStore: YieldBoostStatusStore,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
) : YieldPromoRepository {
|
||||
|
||||
override suspend fun getYieldBoostPromo(userWalletId: UserWalletId, forceRefresh: Boolean): YieldBoostPromo {
|
||||
if (!forceRefresh) {
|
||||
promoStore.getSyncOrNull(userWalletId)?.let { return it }
|
||||
}
|
||||
return try {
|
||||
val fresh = fetchPromo(userWalletId)
|
||||
promoStore.store(userWalletId, fresh)
|
||||
fresh
|
||||
} catch (e: Exception) {
|
||||
promoStore.getSyncOrNull(userWalletId) ?: throw e
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun getYieldBoostStatus(userWalletId: UserWalletId, forceRefresh: Boolean): YieldBoostStatus {
|
||||
if (!forceRefresh) {
|
||||
statusStore.getSyncOrNull(userWalletId)?.let { return it }
|
||||
}
|
||||
return try {
|
||||
val fresh = fetchStatus(userWalletId)
|
||||
statusStore.store(userWalletId, fresh)
|
||||
fresh
|
||||
} catch (e: Exception) {
|
||||
statusStore.getSyncOrNull(userWalletId) ?: throw e
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun fetchPromo(userWalletId: UserWalletId): YieldBoostPromo = withContext(dispatchers.io) {
|
||||
val response = tangemApi.getPromotions(walletId = userWalletId.stringValue).getOrThrow()
|
||||
val dto = response.promotions.firstOrNull { it.name == PROMO_NAME } ?: return@withContext YieldBoostPromo.None
|
||||
YieldBoostPromoConverter.convert(dto)
|
||||
}
|
||||
|
||||
private suspend fun fetchStatus(userWalletId: UserWalletId): YieldBoostStatus = withContext(dispatchers.io) {
|
||||
val response = tangemApi.getYieldBoostStatus(walletId = userWalletId.stringValue).getOrThrow()
|
||||
YieldBoostStatusConverter.convert(response)
|
||||
}
|
||||
|
||||
private companion object {
|
||||
const val PROMO_NAME = "yield-apr-boost"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
package com.tangem.data.yield.supply.promo.converter
|
||||
|
||||
import com.tangem.datasource.api.promotion.models.PromotionsResponse
|
||||
import com.tangem.domain.yield.supply.models.YieldBoostPromo
|
||||
import kotlinx.datetime.Instant
|
||||
|
||||
internal object YieldBoostPromoConverter {
|
||||
|
||||
private const val ACTIVE_STATUS = "active"
|
||||
|
||||
fun convert(dto: PromotionsResponse.PromotionDto): YieldBoostPromo {
|
||||
val all = dto.all ?: return YieldBoostPromo.None
|
||||
if (!all.status.equals(ACTIVE_STATUS, ignoreCase = true)) return YieldBoostPromo.None
|
||||
|
||||
val start = runCatching { Instant.parse(all.timeline.start) }.getOrNull() ?: return YieldBoostPromo.None
|
||||
val end = runCatching { Instant.parse(all.timeline.end) }.getOrNull() ?: return YieldBoostPromo.None
|
||||
|
||||
val tokens = all.tokens.orEmpty().map { token ->
|
||||
YieldBoostPromo.Active.PromoToken(
|
||||
contractAddress = token.tokenAddress,
|
||||
tokenSymbol = token.tokenSymbol,
|
||||
tokenName = token.tokenName,
|
||||
networkId = token.networkId,
|
||||
)
|
||||
}
|
||||
if (tokens.isEmpty()) return YieldBoostPromo.None
|
||||
|
||||
return YieldBoostPromo.Active(
|
||||
tokens = tokens,
|
||||
timeline = YieldBoostPromo.Active.Timeline(start = start, end = end),
|
||||
link = all.link,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
package com.tangem.data.yield.supply.promo.converter
|
||||
|
||||
import com.tangem.datasource.api.promotion.models.YieldBoostStatusResponse
|
||||
import com.tangem.domain.yield.supply.models.YieldBoostStatus
|
||||
import kotlinx.datetime.Instant
|
||||
|
||||
internal object YieldBoostStatusConverter {
|
||||
|
||||
private const val STATUS_NOT_STARTED = "notstarted"
|
||||
private const val STATUS_ACTIVE = "active"
|
||||
private const val STATUS_COMPLETED = "completed"
|
||||
private const val STATUS_DISQUALIFIED = "disqualified"
|
||||
|
||||
private const val REASON_FROD = "frod"
|
||||
private const val REASON_LESS_THAN_1_USD = "less1usd"
|
||||
private const val REASON_CLOSED = "closed"
|
||||
|
||||
fun convert(dto: YieldBoostStatusResponse): YieldBoostStatus = when (dto.promoEnrollmentStatus.lowercase()) {
|
||||
STATUS_ACTIVE -> dto.toActive() ?: YieldBoostStatus.NotStarted
|
||||
STATUS_COMPLETED -> dto.toCompleted() ?: YieldBoostStatus.NotStarted
|
||||
STATUS_DISQUALIFIED -> YieldBoostStatus.Disqualified(reason = dto.disqualificationReason.toReason())
|
||||
STATUS_NOT_STARTED -> YieldBoostStatus.NotStarted
|
||||
else -> YieldBoostStatus.NotStarted // forward-compat: unknown status → treat as NotStarted
|
||||
}
|
||||
|
||||
/** Backend `"active"` → [YieldBoostStatus.Active]. Returns `null` if mandatory dates can't be parsed. */
|
||||
private fun YieldBoostStatusResponse.toActive(): YieldBoostStatus.Active? {
|
||||
val activation = activationDate?.let { runCatching { Instant.parse(it) }.getOrNull() } ?: return null
|
||||
val qualificationEnd =
|
||||
qualificationEndDate?.let { runCatching { Instant.parse(it) }.getOrNull() } ?: return null
|
||||
return YieldBoostStatus.Active(
|
||||
tokenName = tokenName.orEmpty(),
|
||||
networkId = networkId.orEmpty(),
|
||||
moduleAddress = moduleAddress.orEmpty(),
|
||||
userAddress = userAddress.orEmpty(),
|
||||
contractAddress = contractAddress.orEmpty(),
|
||||
activationDate = activation,
|
||||
qualificationEndDate = qualificationEnd,
|
||||
)
|
||||
}
|
||||
|
||||
private fun YieldBoostStatusResponse.toCompleted(): YieldBoostStatus.Completed? {
|
||||
val activation = activationDate?.let { runCatching { Instant.parse(it) }.getOrNull() } ?: return null
|
||||
val qualificationEnd =
|
||||
qualificationEndDate?.let { runCatching { Instant.parse(it) }.getOrNull() } ?: return null
|
||||
return YieldBoostStatus.Completed(
|
||||
tokenName = tokenName.orEmpty(),
|
||||
networkId = networkId.orEmpty(),
|
||||
moduleAddress = moduleAddress.orEmpty(),
|
||||
userAddress = userAddress.orEmpty(),
|
||||
contractAddress = contractAddress.orEmpty(),
|
||||
activationDate = activation,
|
||||
qualificationEndDate = qualificationEnd,
|
||||
)
|
||||
}
|
||||
|
||||
private fun String?.toReason(): YieldBoostStatus.Disqualified.Reason = when (this?.lowercase()) {
|
||||
REASON_FROD -> YieldBoostStatus.Disqualified.Reason.FROD
|
||||
REASON_LESS_THAN_1_USD -> YieldBoostStatus.Disqualified.Reason.LESS_THAN_1_USD
|
||||
REASON_CLOSED -> YieldBoostStatus.Disqualified.Reason.CLOSED
|
||||
else -> YieldBoostStatus.Disqualified.Reason.UNKNOWN
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,119 @@
|
|||
package com.tangem.data.yield.supply.promo.converter
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import com.tangem.datasource.api.promotion.models.PromotionsResponse
|
||||
import com.tangem.domain.yield.supply.models.YieldBoostPromo
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
class YieldBoostPromoConverterTest {
|
||||
|
||||
@Test
|
||||
fun `GIVEN active dto with tokens WHEN convert THEN returns Active`() {
|
||||
val dto = activeDto()
|
||||
|
||||
val result = YieldBoostPromoConverter.convert(dto)
|
||||
|
||||
assertThat(result).isInstanceOf(YieldBoostPromo.Active::class.java)
|
||||
val active = result as YieldBoostPromo.Active
|
||||
assertThat(active.tokens).hasSize(2)
|
||||
assertThat(active.tokens.first().contractAddress)
|
||||
.isEqualTo("0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48")
|
||||
assertThat(active.tokens.first().networkId).isEqualTo("ethereum")
|
||||
assertThat(active.link).isEqualTo("https://example.com/terms")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN dto with null all WHEN convert THEN returns None`() {
|
||||
val dto = PromotionsResponse.PromotionDto(name = "promo-yield-apr-boost", all = null)
|
||||
|
||||
val result = YieldBoostPromoConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(YieldBoostPromo.None)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN dto with non-active status WHEN convert THEN returns None`() {
|
||||
val dto = activeDto().copy(
|
||||
all = activeDto().all!!.copy(status = "expired"),
|
||||
)
|
||||
|
||||
val result = YieldBoostPromoConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(YieldBoostPromo.None)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN dto with empty tokens WHEN convert THEN returns None`() {
|
||||
val dto = activeDto().copy(
|
||||
all = activeDto().all!!.copy(tokens = emptyList()),
|
||||
)
|
||||
|
||||
val result = YieldBoostPromoConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(YieldBoostPromo.None)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN dto with null tokens WHEN convert THEN returns None`() {
|
||||
val dto = activeDto().copy(
|
||||
all = activeDto().all!!.copy(tokens = null),
|
||||
)
|
||||
|
||||
val result = YieldBoostPromoConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(YieldBoostPromo.None)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN dto with malformed start date WHEN convert THEN returns None`() {
|
||||
val dto = activeDto().copy(
|
||||
all = activeDto().all!!.copy(
|
||||
timeline = PromotionsResponse.PromotionDto.Timeline(
|
||||
start = "not-an-iso",
|
||||
end = "2027-06-15T22:00:00.000Z",
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
val result = YieldBoostPromoConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(YieldBoostPromo.None)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN status with uppercase casing WHEN convert THEN treats as active`() {
|
||||
val dto = activeDto().copy(
|
||||
all = activeDto().all!!.copy(status = "ACTIVE"),
|
||||
)
|
||||
|
||||
val result = YieldBoostPromoConverter.convert(dto)
|
||||
|
||||
assertThat(result).isInstanceOf(YieldBoostPromo.Active::class.java)
|
||||
}
|
||||
|
||||
private fun activeDto() = PromotionsResponse.PromotionDto(
|
||||
name = "promo-yield-apr-boost",
|
||||
all = PromotionsResponse.PromotionDto.All(
|
||||
timeline = PromotionsResponse.PromotionDto.Timeline(
|
||||
start = "2026-06-15T00:00:00.000Z",
|
||||
end = "2027-06-15T22:00:00.000Z",
|
||||
),
|
||||
tokens = listOf(
|
||||
PromotionsResponse.PromotionDto.PromoToken(
|
||||
tokenAddress = "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
|
||||
tokenSymbol = "USDC",
|
||||
tokenName = "USD Coin",
|
||||
networkId = "ethereum",
|
||||
),
|
||||
PromotionsResponse.PromotionDto.PromoToken(
|
||||
tokenAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7",
|
||||
tokenSymbol = "USDT",
|
||||
tokenName = "Tether USD",
|
||||
networkId = "ethereum",
|
||||
),
|
||||
),
|
||||
status = "active",
|
||||
link = "https://example.com/terms",
|
||||
),
|
||||
)
|
||||
}
|
||||
|
|
@ -0,0 +1,186 @@
|
|||
package com.tangem.data.yield.supply.promo.converter
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import com.tangem.datasource.api.promotion.models.YieldBoostStatusResponse
|
||||
import com.tangem.domain.yield.supply.models.YieldBoostStatus
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
class YieldBoostStatusConverterTest {
|
||||
|
||||
private val activation = "2026-05-01T00:00:00Z"
|
||||
private val qualificationEnd = "2026-06-01T00:00:00Z"
|
||||
|
||||
@Test
|
||||
fun `GIVEN promoEnrollmentStatus notStarted WHEN convert THEN returns NotStarted`() {
|
||||
val dto = dto(promoEnrollmentStatus = "notStarted")
|
||||
|
||||
val result = YieldBoostStatusConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(YieldBoostStatus.NotStarted)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN active backend status with valid dates WHEN convert THEN returns Active`() {
|
||||
val dto = dto(
|
||||
promoEnrollmentStatus = "active",
|
||||
tokenName = "USD Coin",
|
||||
networkId = "ethereum",
|
||||
moduleAddress = "0xmodule",
|
||||
userAddress = "0xuser",
|
||||
contractAddress = "0xcontract",
|
||||
activationDate = activation,
|
||||
qualificationEndDate = qualificationEnd,
|
||||
)
|
||||
|
||||
val result = YieldBoostStatusConverter.convert(dto)
|
||||
|
||||
assertThat(result).isInstanceOf(YieldBoostStatus.Active::class.java)
|
||||
val active = result as YieldBoostStatus.Active
|
||||
assertThat(active.tokenName).isEqualTo("USD Coin")
|
||||
assertThat(active.networkId).isEqualTo("ethereum")
|
||||
assertThat(active.contractAddress).isEqualTo("0xcontract")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN active status missing activationDate WHEN convert THEN falls back to NotStarted`() {
|
||||
val dto = dto(
|
||||
promoEnrollmentStatus = "active",
|
||||
activationDate = null,
|
||||
qualificationEndDate = qualificationEnd,
|
||||
)
|
||||
|
||||
val result = YieldBoostStatusConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(YieldBoostStatus.NotStarted)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN active status with malformed activationDate WHEN convert THEN falls back to NotStarted`() {
|
||||
val dto = dto(
|
||||
promoEnrollmentStatus = "active",
|
||||
activationDate = "not-an-iso",
|
||||
qualificationEndDate = qualificationEnd,
|
||||
)
|
||||
|
||||
val result = YieldBoostStatusConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(YieldBoostStatus.NotStarted)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN completed status with valid dates WHEN convert THEN returns Completed`() {
|
||||
val dto = dto(
|
||||
promoEnrollmentStatus = "completed",
|
||||
tokenName = "USDT",
|
||||
networkId = "ethereum",
|
||||
moduleAddress = "0xmodule",
|
||||
userAddress = "0xuser",
|
||||
contractAddress = "0xcontract",
|
||||
activationDate = "2026-04-01T00:00:00Z",
|
||||
qualificationEndDate = "2026-05-01T00:00:00Z",
|
||||
)
|
||||
|
||||
val result = YieldBoostStatusConverter.convert(dto)
|
||||
|
||||
assertThat(result).isInstanceOf(YieldBoostStatus.Completed::class.java)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN disqualified frod reason WHEN convert THEN returns Disqualified with FROD reason`() {
|
||||
val dto = dto(
|
||||
promoEnrollmentStatus = "disqualified",
|
||||
disqualificationReason = "frod",
|
||||
)
|
||||
|
||||
val result = YieldBoostStatusConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(YieldBoostStatus.Disqualified(YieldBoostStatus.Disqualified.Reason.FROD))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN disqualified less1usd reason WHEN convert THEN returns Disqualified with LESS_THAN_1_USD reason`() {
|
||||
val dto = dto(
|
||||
promoEnrollmentStatus = "disqualified",
|
||||
disqualificationReason = "less1usd",
|
||||
)
|
||||
|
||||
val result = YieldBoostStatusConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(
|
||||
YieldBoostStatus.Disqualified(YieldBoostStatus.Disqualified.Reason.LESS_THAN_1_USD),
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN disqualified closed reason WHEN convert THEN returns Disqualified with CLOSED reason`() {
|
||||
val dto = dto(
|
||||
promoEnrollmentStatus = "disqualified",
|
||||
disqualificationReason = "closed",
|
||||
)
|
||||
|
||||
val result = YieldBoostStatusConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(YieldBoostStatus.Disqualified(YieldBoostStatus.Disqualified.Reason.CLOSED))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN disqualified unknown reason WHEN convert THEN returns Disqualified with UNKNOWN reason`() {
|
||||
val dto = dto(
|
||||
promoEnrollmentStatus = "disqualified",
|
||||
disqualificationReason = "alien_invasion",
|
||||
)
|
||||
|
||||
val result = YieldBoostStatusConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(YieldBoostStatus.Disqualified(YieldBoostStatus.Disqualified.Reason.UNKNOWN))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN unknown promoEnrollmentStatus WHEN convert THEN returns NotStarted`() {
|
||||
val dto = dto(promoEnrollmentStatus = "futureBackendStatus")
|
||||
|
||||
val result = YieldBoostStatusConverter.convert(dto)
|
||||
|
||||
assertThat(result).isEqualTo(YieldBoostStatus.NotStarted)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN status with uppercase casing WHEN convert THEN normalizes correctly`() {
|
||||
val dto = dto(
|
||||
promoEnrollmentStatus = "ACTIVE",
|
||||
tokenName = "USDT",
|
||||
networkId = "ethereum",
|
||||
moduleAddress = "0xmodule",
|
||||
userAddress = "0xuser",
|
||||
contractAddress = "0xcontract",
|
||||
activationDate = activation,
|
||||
qualificationEndDate = qualificationEnd,
|
||||
)
|
||||
|
||||
val result = YieldBoostStatusConverter.convert(dto)
|
||||
|
||||
assertThat(result).isInstanceOf(YieldBoostStatus.Active::class.java)
|
||||
}
|
||||
|
||||
private fun dto(
|
||||
promoEnrollmentStatus: String,
|
||||
tokenName: String? = null,
|
||||
networkId: String? = null,
|
||||
moduleAddress: String? = null,
|
||||
userAddress: String? = null,
|
||||
contractAddress: String? = null,
|
||||
activationDate: String? = null,
|
||||
qualificationEndDate: String? = null,
|
||||
disqualificationReason: String? = null,
|
||||
) = YieldBoostStatusResponse(
|
||||
tokenName = tokenName,
|
||||
networkId = networkId,
|
||||
moduleAddress = moduleAddress,
|
||||
userAddress = userAddress,
|
||||
contractAddress = contractAddress,
|
||||
promoEnrollmentStatus = promoEnrollmentStatus,
|
||||
activationDate = activationDate,
|
||||
qualificationEndDate = qualificationEndDate,
|
||||
disqualificationReason = disqualificationReason,
|
||||
)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue