infinity money bug :D

This is here to show a small miss with big problems.

- add missing test to
  - TransactionEndpoints
  - TransactionControllerTest
- update Transfer with validation for sender receiver
- add SenderReceiverValidator
- add SenderReceiver
This commit is contained in:
2025-09-13 19:56:25 +02:00
parent e9bbac8296
commit 4f95265872
5 changed files with 68 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
package ltd.lulz.annotation
import jakarta.validation.Constraint
import jakarta.validation.Payload
import kotlin.reflect.KClass
import ltd.lulz.annotation.validator.SenderReceiverValidator
@Constraint(validatedBy = [SenderReceiverValidator::class])
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class SenderReceiver(
val message: String = "Receiver and Sender cant be the same account",
val groups: Array<KClass<*>> = [],
val payload: Array<KClass<out Payload>> = [],
)

View File

@@ -0,0 +1,14 @@
package ltd.lulz.annotation.validator
import jakarta.validation.ConstraintValidator
import jakarta.validation.ConstraintValidatorContext
import ltd.lulz.annotation.SenderReceiver
import ltd.lulz.model.Transfer.Request
class SenderReceiverValidator : ConstraintValidator<SenderReceiver, Request> {
override fun isValid(
request: Request,
context: ConstraintValidatorContext,
): Boolean = request.receiver != request.account
}

View File

@@ -3,9 +3,11 @@ package ltd.lulz.model
import jakarta.validation.constraints.DecimalMin import jakarta.validation.constraints.DecimalMin
import java.math.BigDecimal import java.math.BigDecimal
import java.util.UUID import java.util.UUID
import ltd.lulz.annotation.SenderReceiver
object Transfer { object Transfer {
@SenderReceiver
data class Request( data class Request(
val account: UUID, val account: UUID,
val receiver: UUID, val receiver: UUID,

View File

@@ -195,6 +195,25 @@ class TransactionEndpoints {
result.expectStatus().isEqualTo(CREATED) result.expectStatus().isEqualTo(CREATED)
} }
@Test
fun `deposit - fail same account`() {
// given
val request = Transfer.Request(
account = UUID.fromString("00000000-0000-7000-0000-000000000001"),
receiver = UUID.fromString("00000000-0000-7000-0000-000000000001"),
amount = BigDecimal.valueOf(1.00),
)
// when
val result = webClient.post()
.uri("/transfer")
.bodyValue(request)
.exchange()
// then
result.expectStatus().isEqualTo(BAD_REQUEST)
}
@Test @Test
fun `deposit - fail amount to small`() { fun `deposit - fail amount to small`() {
// given // given

View File

@@ -215,6 +215,24 @@ class TransactionControllerTest {
result.expectStatus().isCreated result.expectStatus().isCreated
} }
@Test
fun `transfer fail same accounts`() {
// given
val request = Transfer.Request(uuid, uuid, amount)
every { transactionService.transfer(any(), any(), any()) } returns Mono.empty()
// when
val result = webTestClient.post()
.uri("/transfer")
.contentType(APPLICATION_JSON)
.bodyValue(request)
.exchange()
// then
result.expectStatus().isBadRequest
}
@Test @Test
fun `transfer fail amount to small`() { fun `transfer fail amount to small`() {
// given // given