diff --git a/.gitignore b/.gitignore index f49efccd..a19e2a87 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,7 @@ out/ ## fixture monkey .jqwik-database .mcp.json + +## local artifacts +/.gradle-user-home/ +.DS_Store diff --git a/build.gradle b/build.gradle index 91d80092..0348e123 100644 --- a/build.gradle +++ b/build.gradle @@ -89,6 +89,7 @@ ext { test { outputs.dir snippetsDir useJUnitPlatform() + jvmArgs '-Dnet.bytebuddy.experimental=true' testLogging { events "failed" // 실패한 테스트만 로그 출력 exceptionFormat "full" // Expected vs Actual 포함 diff --git a/src/main/java/com/sports/server/command/game/application/GameService.java b/src/main/java/com/sports/server/command/game/application/GameService.java index 11a407fd..745bf978 100644 --- a/src/main/java/com/sports/server/command/game/application/GameService.java +++ b/src/main/java/com/sports/server/command/game/application/GameService.java @@ -75,12 +75,15 @@ public void updateGame(Long leagueId, Long gameId, GameRequest.Update request, M league.validateRoundWithinLimit(request.round()); Game game = entityUtils.getEntity(gameId, Game.class); + GameState state = GameState.from(request.state()); + game.updateName(request.name()); game.updateStartTime(request.startTime()); game.updateVideoId(request.videoId()); game.updateGameQuarter(request.quarter()); - game.updateState(GameState.from(request.state())); + game.updateState(state); game.updateRound(Round.from(request.round())); + game.updateResult(); } @Transactional @@ -182,4 +185,4 @@ private void validateGameTeamsInLeague(League league, GameRequest.TeamLineupRequ } } -} \ No newline at end of file +} diff --git a/src/main/java/com/sports/server/command/game/domain/Game.java b/src/main/java/com/sports/server/command/game/domain/Game.java index 79c2274b..1251cb2b 100644 --- a/src/main/java/com/sports/server/command/game/domain/Game.java +++ b/src/main/java/com/sports/server/command/game/domain/Game.java @@ -240,6 +240,16 @@ public void determineResult() { markAsDraw(team1, team2); } + public void updateResult() { + if (!GameState.FINISHED.equals(this.state)) { + return; + } + if (gameTeams.size() != MINIMUM_TEAMS) { + return; + } + determineResult(); + } + private static void markAsDraw(GameTeam team1, GameTeam team2) { team1.markAsDraw(); team2.markAsDraw(); diff --git a/src/test/java/com/sports/server/command/game/application/GameServiceTest.java b/src/test/java/com/sports/server/command/game/application/GameServiceTest.java index d5b2729b..663f8037 100644 --- a/src/test/java/com/sports/server/command/game/application/GameServiceTest.java +++ b/src/test/java/com/sports/server/command/game/application/GameServiceTest.java @@ -6,6 +6,7 @@ import static org.mockito.Mockito.when; import com.sports.server.command.game.domain.Game; +import com.sports.server.command.game.domain.GameResult; import com.sports.server.command.game.domain.GameState; import com.sports.server.command.game.domain.GameTeam; import com.sports.server.command.game.domain.LineupPlayerState; @@ -206,6 +207,28 @@ void setUp() { () -> assertThat(game.getVideoId()).isEqualTo(updateDto.videoId())); } + @Test + void 게임을_직접_종료하면_결과가_저장된다() { + // given + GameRequest.Update finishRequest = new GameRequest.Update( + nameOfGame, 4, "경기후", "FINISHED", LocalDateTime.of(2024, 9, 11, 12, 0, 0), "videoId" + ); + + // when + gameService.updateGame(leagueId, gameId, finishRequest, manager); + + // then + Game game = entityUtils.getEntity(gameId, Game.class); + GameTeam firstGameTeam = entityUtils.getEntity(1L, GameTeam.class); + GameTeam secondGameTeam = entityUtils.getEntity(2L, GameTeam.class); + + assertAll( + () -> assertThat(game.getState()).isEqualTo(GameState.FINISHED), + () -> assertThat(firstGameTeam.getResult()).isEqualTo(GameResult.LOSE), + () -> assertThat(secondGameTeam.getResult()).isEqualTo(GameResult.WIN) + ); + } + @Test void 게임이_속한_리그의_매니저가_아닌_회원이_게임을_수정하려고_하면_예외가_발생한다() { // given diff --git a/src/test/java/com/sports/server/command/game/domain/GameTest.java b/src/test/java/com/sports/server/command/game/domain/GameTest.java index ee6a7c02..b06d32df 100644 --- a/src/test/java/com/sports/server/command/game/domain/GameTest.java +++ b/src/test/java/com/sports/server/command/game/domain/GameTest.java @@ -22,12 +22,12 @@ class GameTest { public void setUp() { game = entityBuilder(Game.class) .set("id", 1L) - .set("teams", new ArrayList<>()) + .set("gameTeams", new ArrayList<>()) .sample(); game2 = entityBuilder(Game.class) .set("id", 2L) - .set("teams", new ArrayList<>()) + .set("gameTeams", new ArrayList<>()) .sample(); team1 = entityBuilder(GameTeam.class) @@ -259,6 +259,59 @@ void setUp() { } } + @Nested + @DisplayName("결과를 갱신할 때") + class UpdateResultTest { + + @Test + void 종료된_경기에서만_결과를_계산한다() { + // given + team1.score(); + game.updateState(GameState.PLAYING); + GameResult initialTeam1Result = team1.getResult(); + GameResult initialTeam2Result = team2.getResult(); + + // when + game.updateResult(); + + // then + assertAll( + () -> assertThat(team1.getResult()).isEqualTo(initialTeam1Result), + () -> assertThat(team2.getResult()).isEqualTo(initialTeam2Result) + ); + + // when + game.updateState(GameState.FINISHED); + game.updateResult(); + + // then + assertAll( + () -> assertThat(team1.getResult()).isEqualTo(GameResult.WIN), + () -> assertThat(team2.getResult()).isEqualTo(GameResult.LOSE) + ); + } + + @Test + void 참가팀이_2팀이_아니면_결과를_계산하지_않는다() { + // given + GameTeam singleTeam = entityBuilder(GameTeam.class) + .set("id", 999L) + .set("game", game2) + .set("score", 1) + .set("pkScore", 0) + .sample(); + game2.addGameTeam(singleTeam); + game2.updateState(GameState.FINISHED); + GameResult initialResult = singleTeam.getResult(); + + // when + game2.updateResult(); + + // then + assertThat(singleTeam.getResult()).isEqualTo(initialResult); + } + } + @Test void 주장_상태를_변경할_때_게임에_속하지_않는_게임팀에_대한_요청인_경우_예외를_던진다() { // given diff --git a/src/test/java/com/sports/server/command/timeline/domain/GameProgressTimelineTest.java b/src/test/java/com/sports/server/command/timeline/domain/GameProgressTimelineTest.java index 039cce29..22bfbb35 100644 --- a/src/test/java/com/sports/server/command/timeline/domain/GameProgressTimelineTest.java +++ b/src/test/java/com/sports/server/command/timeline/domain/GameProgressTimelineTest.java @@ -19,10 +19,10 @@ class GameProgressTimelineTest { @BeforeEach void setUp() { game = entityBuilder(Game.class) - .set("teams", new ArrayList<>()) + .set("gameTeams", new ArrayList<>()) .set("gameQuarter", Quarter.PRE_GAME.getName()) .set("state", GameState.SCHEDULED) - .set("is_pk_taken", false) + .set("isPkTaken", false) .sample(); } @@ -290,4 +290,4 @@ class RollbackTest { GameProgressType.GAME_END ); } -} \ No newline at end of file +}