diff --git a/src/main/kotlin/ltd/lulz/util/AccountUtil.kt b/src/main/kotlin/ltd/lulz/util/AccountUtil.kt new file mode 100644 index 0000000..a0db61d --- /dev/null +++ b/src/main/kotlin/ltd/lulz/util/AccountUtil.kt @@ -0,0 +1,18 @@ +package ltd.lulz.util + +import java.math.RoundingMode.DOWN +import ltd.lulz.model.Account +import ltd.lulz.model.AccountEntity +import org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR +import org.springframework.web.server.ResponseStatusException + +fun Account.Request.toEntity(): AccountEntity = AccountEntity( + name = name, + amount = amount.setScale(2, DOWN), +) + +fun AccountEntity.toResponse(): Account.Response = Account.Response( + id = id ?: throw ResponseStatusException(INTERNAL_SERVER_ERROR), + name = name, + amount = amount, +) diff --git a/src/test/kotlin/ltd/lulz/util/AccountUtilKtTest.kt b/src/test/kotlin/ltd/lulz/util/AccountUtilKtTest.kt new file mode 100644 index 0000000..84e761d --- /dev/null +++ b/src/test/kotlin/ltd/lulz/util/AccountUtilKtTest.kt @@ -0,0 +1,75 @@ +package ltd.lulz.util + +import java.math.BigDecimal +import java.util.UUID +import kotlin.test.Test +import ltd.lulz.model.Account +import ltd.lulz.model.AccountEntity +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.assertThrows +import org.springframework.web.server.ResponseStatusException + +@Suppress("MayBeConstant") +class AccountUtilKtTest { + + companion object { + val name: String = "some name" + val amount: BigDecimal = BigDecimal.valueOf(0.01) + val uuid: UUID = UUID.fromString("00000000-0000-0000-0000-000000000000") + } + + @Test + fun `account request to account entity`() { + // given + val request = Account.Request(name, amount) + + // when + val result = request.toEntity() + + // then + assertThat(result.id).isNull() + assertThat(result.name).isEqualTo(name) + assertThat(result.amount).isEqualTo(amount) + } + + @Test + fun `account request to account entity cut decimals`() { + // given + val request = Account.Request(name, BigDecimal.valueOf(0.0099)) + + // when + val result = request.toEntity() + + // then + assertThat(result.id).isNull() + assertThat(result.name).isEqualTo(name) + assertThat(result.amount.toString()).isEqualTo("0.00") + } + + @Test + fun `account entity to account response`() { + // given + val entity = AccountEntity(uuid, name, amount) + + // when + val result = entity.toResponse() + + // then + assertThat(result.id).isEqualTo(uuid) + assertThat(result.name).isEqualTo(name) + } + + @Test + fun `account entity to account response - fail`() { + // given + val entity = AccountEntity(null, name, amount) + + // when + val exception = assertThrows { + entity.toResponse() + } + + // then + assertThat(exception.message).isEqualTo("500 INTERNAL_SERVER_ERROR") + } +}