From ce444c5e596ebdd6ab52aff645da0945dc2547b1 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 28 May 2025 09:21:03 +0200
Subject: [PATCH] test: coinflip service
---
.../de/szut/casino/coinflip/CoinflipDto.java | 3 +
.../szut/casino/coinflip/CoinflipService.java | 5 +-
.../java/de/szut/casino/config/AppConfig.java | 15 +++++
.../casino/coinflip/CoinflipServiceTest.java | 64 +++++++++++++++++++
4 files changed, 85 insertions(+), 2 deletions(-)
create mode 100644 backend/src/main/java/de/szut/casino/config/AppConfig.java
create mode 100644 backend/src/test/java/de/szut/casino/coinflip/CoinflipServiceTest.java
diff --git a/backend/src/main/java/de/szut/casino/coinflip/CoinflipDto.java b/backend/src/main/java/de/szut/casino/coinflip/CoinflipDto.java
index 8d5a47b..a7f9adb 100644
--- a/backend/src/main/java/de/szut/casino/coinflip/CoinflipDto.java
+++ b/backend/src/main/java/de/szut/casino/coinflip/CoinflipDto.java
@@ -2,13 +2,16 @@ package de.szut.casino.coinflip;
import de.szut.casino.shared.dto.BetDto;
import jakarta.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.Setter;
import java.math.BigDecimal;
@Getter
@Setter
+@NoArgsConstructor
public class CoinflipDto extends BetDto {
@NotNull(message = "chosen side cannot be null")
private CoinSide coinSide;
diff --git a/backend/src/main/java/de/szut/casino/coinflip/CoinflipService.java b/backend/src/main/java/de/szut/casino/coinflip/CoinflipService.java
index c706ffa..c6c39d7 100644
--- a/backend/src/main/java/de/szut/casino/coinflip/CoinflipService.java
+++ b/backend/src/main/java/de/szut/casino/coinflip/CoinflipService.java
@@ -9,11 +9,12 @@ import java.util.Random;
@Service
public class CoinflipService {
- private final Random random = new Random();
+ private final Random random;
private final BalanceService balanceService;
- public CoinflipService(BalanceService balanceService) {
+ public CoinflipService(BalanceService balanceService, Random random) {
this.balanceService = balanceService;
+ this.random = random;
}
public CoinflipResult play(UserEntity user, CoinflipDto coinflipDto) {
diff --git a/backend/src/main/java/de/szut/casino/config/AppConfig.java b/backend/src/main/java/de/szut/casino/config/AppConfig.java
new file mode 100644
index 0000000..9d9c869
--- /dev/null
+++ b/backend/src/main/java/de/szut/casino/config/AppConfig.java
@@ -0,0 +1,15 @@
+package de.szut.casino.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Random;
+
+@Configuration
+public class AppConfig {
+
+ @Bean
+ public Random random() {
+ return new Random();
+ }
+}
diff --git a/backend/src/test/java/de/szut/casino/coinflip/CoinflipServiceTest.java b/backend/src/test/java/de/szut/casino/coinflip/CoinflipServiceTest.java
new file mode 100644
index 0000000..2b15ba0
--- /dev/null
+++ b/backend/src/test/java/de/szut/casino/coinflip/CoinflipServiceTest.java
@@ -0,0 +1,64 @@
+package de.szut.casino.coinflip;
+
+import de.szut.casino.shared.service.BalanceService;
+import de.szut.casino.user.UserEntity;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.math.BigDecimal;
+import java.util.Random;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+class CoinflipServiceTest {
+
+ @Mock
+ private BalanceService balanceService;
+
+ @Mock
+ private Random random;
+
+ @InjectMocks
+ private CoinflipService coinflipService;
+
+ private UserEntity user;
+ private CoinflipDto coinflipDto;
+
+ @BeforeEach
+ void setUp() {
+ MockitoAnnotations.openMocks(this);
+ user = new UserEntity();
+ user.setBalance(BigDecimal.valueOf(100));
+ coinflipDto = new CoinflipDto(BigDecimal.valueOf(10), CoinSide.HEAD);
+ }
+
+ @Test
+ void testPlay_userWins() {
+ when(random.nextBoolean()).thenReturn(true);
+
+ CoinflipResult result = coinflipService.play(user, coinflipDto);
+
+ assertTrue(result.isWin());
+ assertEquals(BigDecimal.valueOf(20), result.getPayout());
+ assertEquals(CoinSide.HEAD, result.getCoinSide());
+ verify(balanceService, times(1)).subtractFunds(user, BigDecimal.valueOf(10));
+ verify(balanceService, times(1)).addFunds(user, BigDecimal.valueOf(20));
+ }
+
+ @Test
+ void testPlay_userLoses() {
+ when(random.nextBoolean()).thenReturn(false);
+
+ CoinflipResult result = coinflipService.play(user, coinflipDto);
+
+ assertFalse(result.isWin());
+ assertEquals(BigDecimal.ZERO, result.getPayout());
+ assertEquals(CoinSide.TAILS, result.getCoinSide());
+ verify(balanceService, times(1)).subtractFunds(user, BigDecimal.valueOf(10));
+ verify(balanceService, never()).addFunds(any(), any());
+ }
+}