Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,17 @@ class LiquibasePostgresSmokeTest {
@Test
void liquibase_실제_postgresql_스키마에서_rooms_변경을_검증한다() {
assertThat(countTable("rooms")).isEqualTo(1);
assertThat(countColumn("template", "game_type")).isEqualTo(1);
assertThat(isNullable("template", "game_type")).isTrue();
assertThat(countColumn("template", "position_limit")).isZero();
assertThat(countColumn("template_player", "position")).isEqualTo(1);
assertThat(isNullable("template_player", "position")).isTrue();
assertThat(countColumn("rooms", "created_at")).isEqualTo(1);
assertThat(countColumn("rooms", "game_type")).isEqualTo(1);
assertThat(isNullable("rooms", "game_type")).isTrue();
assertThat(countColumn("rooms", "min_bid_unit")).isEqualTo(1);
assertThat(isNullable("rooms", "min_bid_unit")).isTrue();
assertThat(countColumn("rooms", "position_limit")).isEqualTo(1);
assertThat(isNullable("rooms", "position_limit")).isTrue();
assertThat(countColumn("rooms", "position_limit")).isZero();
assertThat(countColumn("rooms", "started_game_id")).isEqualTo(1);
assertThat(countColumn("rooms", "started_at")).isEqualTo(1);
assertThat(countColumn("rooms", "current_turn_index")).isZero();
Expand All @@ -47,6 +53,11 @@ class LiquibasePostgresSmokeTest {
assertThat(countTable("room_team_member")).isZero();
assertThat(countTable("room_bid")).isZero();
assertThat(countTable("game_draft_member")).isEqualTo(1);
assertThat(countColumn("games", "game_type")).isEqualTo(1);
assertThat(isNullable("games", "game_type")).isTrue();
assertThat(countColumn("games", "position_limit")).isZero();
assertThat(countColumn("game_player", "position")).isEqualTo(1);
assertThat(isNullable("game_player", "position")).isTrue();
assertThat(countColumn("game_draft_member", "members_game_id")).isEqualTo(1);
assertThat(countColumn("game_draft_member", "member_order")).isEqualTo(1);
assertThat(countColumn("game_draft_member", "team_leader_id")).isEqualTo(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,19 @@ class LiquibaseSmokeTest {
@Test
void liquibase_초기_스키마로_자바_jpa_구조를_검증하며_부팅한다() {
assertThat(countTable("template")).isEqualTo(1);
assertThat(countColumn("template", "game_type")).isEqualTo(1);
assertThat(isNullable("template", "game_type")).isTrue();
assertThat(countColumn("template", "position_limit")).isZero();
assertThat(countTable("template_player")).isEqualTo(1);
assertThat(countColumn("template_player", "position")).isEqualTo(1);
assertThat(isNullable("template_player", "position")).isTrue();
assertThat(countTable("rooms")).isEqualTo(1);
assertThat(countColumn("rooms", "created_at")).isEqualTo(1);
assertThat(countColumn("rooms", "game_type")).isEqualTo(1);
assertThat(isNullable("rooms", "game_type")).isTrue();
assertThat(countColumn("rooms", "min_bid_unit")).isEqualTo(1);
assertThat(isNullable("rooms", "min_bid_unit")).isTrue();
assertThat(countColumn("rooms", "position_limit")).isEqualTo(1);
assertThat(isNullable("rooms", "position_limit")).isTrue();
assertThat(countColumn("rooms", "position_limit")).isZero();
assertThat(countColumn("rooms", "started_game_id")).isEqualTo(1);
assertThat(countColumn("rooms", "started_at")).isEqualTo(1);
assertThat(countColumn("rooms", "current_turn_index")).isZero();
Expand All @@ -57,6 +63,11 @@ class LiquibaseSmokeTest {
assertThat(countTable("room_team_member")).isZero();
assertThat(countTable("room_bid")).isZero();
assertThat(countTable("game_draft_member")).isEqualTo(1);
assertThat(countColumn("games", "game_type")).isEqualTo(1);
assertThat(isNullable("games", "game_type")).isTrue();
assertThat(countColumn("games", "position_limit")).isZero();
assertThat(countColumn("game_player", "position")).isEqualTo(1);
assertThat(isNullable("game_player", "position")).isTrue();
assertThat(countColumn("game_draft_member", "members_game_id")).isEqualTo(1);
assertThat(countColumn("game_draft_member", "member_order")).isEqualTo(1);
assertThat(countColumn("game_draft_member", "team_leader_id")).isEqualTo(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ private Room existingRoom(String code) {
"선점호스트",
"existing-token",
new RoomTemplateSpec(
"LEAGUE_OF_LEGENDS",
RoomMode.AUCTION,
2,
2,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import com.naminhyeok.fantazzk.CoreException;
import com.naminhyeok.fantazzk.room.application.CreateRoom;
import com.naminhyeok.fantazzk.room.application.JoinRoom;
import com.naminhyeok.fantazzk.room.application.PlaceBid;
Expand Down Expand Up @@ -154,7 +153,7 @@ void clearScheduledTasks() {
}

@Test
void 같은_포지션_제한에_걸리는_선수에게는_재조회_후에도_입찰할_수_없다() {
void 같은_포지션이어도_메타데이터일뿐이라_재조회_후에도_입찰할_수_있다() {
UUID template =
templateFixture.createAuctionTemplateId(
"포지션제한경매전",
Expand All @@ -178,13 +177,9 @@ void clearScheduledTasks() {
settleAuctionAttempt.settleIfDue(created.room().getCode());

Room reloaded = rooms.findByCode(created.room().getCode()).orElseThrow();
AuctionBid secondPositionBid = placeBid.place(reloaded.getStartedGameId().gameId(), guest.getActionToken(), 140);

assertThatThrownBy(() -> placeBid.place(reloaded.getStartedGameId().gameId(), guest.getActionToken(), 160))
.isInstanceOf(CoreException.class)
.isInstanceOfSatisfying(
CoreException.class,
ex -> assertThat(ex.getError().getCode()).isEqualTo("ROOM_AUCTION_POSITION_LIMIT_EXCEEDED")
);
assertThat(secondPositionBid.amount()).isEqualTo(140);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,27 @@ class RoomGameCleanupMigrationIntegrationTest {
);
}

@Test
void 레거시_null_position도_cleanup과_demotion을_거친다() {
JdbcTemplate jdbcTemplate = jdbcTemplate();
applyLegacySchema(jdbcTemplate);
insertLegacyAuctionRoomWithNullPosition(jdbcTemplate);

new ResourceDatabasePopulator(
new ClassPathResource("db/changelog/db.changelog-room-game-cleanup.sql"),
new ClassPathResource("db/changelog/db.changelog-metadata-demotion.sql")
).execute(jdbcTemplate.getDataSource());

Map<String, Object> migratedPlayer =
jdbcTemplate.queryForMap(
"select position from game_player where player_pool_game_id = ? and player_id = ?",
uuid("00000000-0000-0000-0000-0000000000b1"),
0
);

assertThat(migratedPlayer.get("POSITION")).isEqualTo("");
}

private JdbcTemplate jdbcTemplate() {
String databaseName = "room-game-cleanup-" + UUID.randomUUID();
DriverManagerDataSource dataSource = new DriverManagerDataSource();
Expand Down Expand Up @@ -231,6 +252,51 @@ insert into rooms (
);
}

private void insertLegacyAuctionRoomWithNullPosition(JdbcTemplate jdbcTemplate) {
jdbcTemplate.update(
"""
insert into rooms (
room_id, code, created_at, host_id, status, mode, team_count, team_size, budget,
draft_order_strategy, current_turn_index, current_auction_round, pick_ban_time,
min_bid_unit, position_limit, current_auction_round_ends_at, started_game_id, started_at
) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""",
uuid("00000000-0000-0000-0000-0000000000b1"),
"AUC902",
Instant.parse("2026-04-12T00:00:00Z").toString(),
"host-b",
"IN_PROGRESS",
"AUCTION",
2,
2,
300,
null,
null,
1,
45,
10,
null,
Instant.parse("2026-04-12T00:05:00Z").toString(),
null,
null
);

jdbcTemplate.batchUpdate(
"insert into room_player (players_room_id, room_player_id, name, display_order, status, position) values (?, ?, ?, ?, ?, ?)",
List.of(
new Object[] { uuid("00000000-0000-0000-0000-0000000000b1"), 0, "선수X", 0, "AVAILABLE", null },
new Object[] { uuid("00000000-0000-0000-0000-0000000000b1"), 1, "선수Y", 1, "AVAILABLE", "JUNGLE" }
)
);
jdbcTemplate.batchUpdate(
"insert into room_team_leader (leaders_room_id, team_leader_id, nickname, remaining_budget, action_token, draft_position) values (?, ?, ?, ?, ?, ?)",
List.of(
new Object[] { uuid("00000000-0000-0000-0000-0000000000b1"), "host-b", "호스트B", 300, "host-token-b", null },
new Object[] { uuid("00000000-0000-0000-0000-0000000000b1"), "guest-b", "게스트B", 300, "guest-token-b", null }
)
);
}

private UUID uuid(String value) {
return UUID.fromString(value);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ private Room waitingRoom(String code, Instant createdAt) {
"호스트-" + code,
"token-" + code,
new RoomTemplateSpec(
"LEAGUE_OF_LEGENDS",
RoomMode.AUCTION,
2,
2,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,9 @@ class GameRepositoryIntegrationTest {
room.getCode(),
new GameId(UUID.fromString("00000000-0000-0000-0000-000000000101")),
STARTED_AT,
room.getGameType(),
RoomMode.AUCTION,
GameRules.auction(2, 2, 300, 45, 10, 1),
GameRules.auction(2, 2, 300, 45, 10),
List.of(
GameParticipant.auction(new TeamLeaderId("host-1"), "호스트", 300),
GameParticipant.auction(new TeamLeaderId("guest-1"), "게스트", 300)
Expand All @@ -88,9 +89,10 @@ class GameRepositoryIntegrationTest {
assertThat(reloaded.getId()).isEqualTo(saved.getId());
assertThat(reloaded.getRoomId()).isEqualTo(room.getId());
assertThat(reloaded.getRoomCode()).isEqualTo("ROOM01");
assertThat(reloaded.getGameType()).isEqualTo(room.getGameType());
assertThat(reloaded.getStatus()).isEqualTo(GameStatus.IN_PROGRESS);
assertThat(reloaded.getStartedAt()).isEqualTo(STARTED_AT);
assertThat(reloaded.getRules()).isEqualTo(GameRules.auction(2, 2, 300, 45, 10, 1));
assertThat(reloaded.getRules()).isEqualTo(GameRules.auction(2, 2, 300, 45, 10));
assertThat(reloaded.getParticipants())
.containsExactly(
GameParticipant.auction(new TeamLeaderId("host-1"), "호스트", 300),
Expand Down Expand Up @@ -121,8 +123,9 @@ class GameRepositoryIntegrationTest {
room.getCode(),
new GameId(UUID.fromString("00000000-0000-0000-0000-000000000103")),
STARTED_AT,
room.getGameType(),
RoomMode.AUCTION,
GameRules.auction(2, 2, 300, 45, 10, 1),
GameRules.auction(2, 2, 300, 45, 10),
List.of(
GameParticipant.auction(new TeamLeaderId("host-1"), "호스트", 300),
GameParticipant.auction(new TeamLeaderId("guest-1"), "게스트", 300)
Expand Down Expand Up @@ -166,6 +169,7 @@ class GameRepositoryIntegrationTest {
room.getCode(),
new GameId(UUID.fromString("00000000-0000-0000-0000-000000000102")),
STARTED_AT,
room.getGameType(),
RoomMode.DRAFT,
GameRules.draft(2, 2, 30, DraftOrderStrategy.SNAKE),
List.of(
Expand Down Expand Up @@ -220,6 +224,7 @@ class GameRepositoryIntegrationTest {
room.getCode(),
new GameId(UUID.fromString("00000000-0000-0000-0000-000000000104")),
STARTED_AT,
room.getGameType(),
RoomMode.DRAFT,
GameRules.draft(2, 2, 30, DraftOrderStrategy.SNAKE),
List.of(
Expand Down Expand Up @@ -254,13 +259,13 @@ private static Room auctionRoom(String code, Instant createdAt) {
"호스트",
"host-action-token",
new RoomTemplateSpec(
"LEAGUE_OF_LEGENDS",
RoomMode.AUCTION,
2,
2,
300,
45,
10,
1,
null,
List.of(
new RoomTemplateSpec.Player(new RoomPlayerId(0), "선수1", "TOP", 0),
Expand All @@ -278,6 +283,7 @@ private static Room draftRoom(String code, Instant createdAt) {
"호스트",
"host-action-token",
new RoomTemplateSpec(
"LEAGUE_OF_LEGENDS",
RoomMode.DRAFT,
2,
2,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ class RoomRepositoryIntegrationTest {
"호스트",
"host-action-token",
new RoomTemplateSpec(
"LEAGUE_OF_LEGENDS",
RoomMode.DRAFT,
2,
2,
Expand Down Expand Up @@ -104,6 +105,7 @@ class RoomRepositoryIntegrationTest {
"호스트",
"host-action-token",
new RoomTemplateSpec(
"LEAGUE_OF_LEGENDS",
RoomMode.DRAFT,
2,
2,
Expand All @@ -130,21 +132,21 @@ class RoomRepositoryIntegrationTest {

@Test
@Transactional
void 경매_방의_minBidUnit과_positionLimit을_저장하고_다시_읽는다() {
void 경매_방의_minBidUnit과_gameType을_저장하고_다시_읽는다() {
Room room =
Room.createFromTemplate(
"ROOM04",
new TeamLeaderId("host-1"),
"호스트",
"host-action-token",
new RoomTemplateSpec(
"LEAGUE_OF_LEGENDS",
RoomMode.AUCTION,
2,
2,
300,
30,
10,
1,
null,
List.of(
new RoomTemplateSpec.Player(new RoomPlayerId(0), "선수1", "TOP", 0),
Expand All @@ -160,8 +162,8 @@ class RoomRepositoryIntegrationTest {

Room reloaded = rooms.findById(saved.getId()).orElseThrow();

assertThat(reloaded.getGameType()).isEqualTo("LEAGUE_OF_LEGENDS");
assertThat(reloaded.getMinBidUnit()).isEqualTo(10);
assertThat(reloaded.getPositionLimit()).isEqualTo(1);
}

@Test
Expand Down Expand Up @@ -193,6 +195,7 @@ class RoomRepositoryIntegrationTest {
"호스트",
"host-action-token",
new RoomTemplateSpec(
"LEAGUE_OF_LEGENDS",
RoomMode.DRAFT,
2,
2,
Expand All @@ -217,6 +220,7 @@ private Room auctionRoomForStartPersistence() {
"호스트",
"host-action-token",
new RoomTemplateSpec(
"LEAGUE_OF_LEGENDS",
RoomMode.AUCTION,
2,
2,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ class RoomApiIntegrationTest {
assertThat(body.resultType()).isEqualTo("SUCCESS");
assertThat(body.success()).hasSize(2);
assertThat(body.success()).extracting(JoinableRoomResponse::code).containsExactly("ROOM99", "ROOM01");
assertThat(body.success()).extracting(JoinableRoomResponse::gameType).containsOnly("LEAGUE_OF_LEGENDS");
}

@Test
Expand Down Expand Up @@ -115,6 +116,7 @@ class RoomApiIntegrationTest {
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(body.at("/resultType").asText()).isEqualTo("SUCCESS");
assertThat(body.at("/success/roomCode").asText()).isEqualTo("ROOM11");
assertThat(body.at("/success/gameType").asText()).isEqualTo("LEAGUE_OF_LEGENDS");
assertThat(body.at("/success/status").asText()).isEqualTo("STARTED");
assertThat(body.at("/success/startedGameId").asText()).isEqualTo(room.getStartedGameId().gameId().toString());
assertThat(body.at("/success/auctionProgress").isMissingNode()).isTrue();
Expand Down Expand Up @@ -148,6 +150,7 @@ class RoomApiIntegrationTest {
assertThat(body.at("/resultType").asText()).isEqualTo("SUCCESS");
assertThat(body.at("/success/gameId").asText()).isEqualTo(room.getStartedGameId().gameId().toString());
assertThat(body.at("/success/roomCode").asText()).isEqualTo("ROOM12");
assertThat(body.at("/success/gameType").asText()).isEqualTo("LEAGUE_OF_LEGENDS");
assertThat(body.at("/success/status").asText()).isEqualTo("IN_PROGRESS");
assertThat(body.at("/success/auctionProgress/currentRound").asInt()).isEqualTo(1);
assertThat(body.at("/success/auctionProgress/currentAuctionTarget/name").asText()).isEqualTo("선수1");
Expand Down Expand Up @@ -181,6 +184,7 @@ class RoomApiIntegrationTest {
JsonNode body = readBody(response);

assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(body.at("/success/gameType").asText()).isEqualTo("LEAGUE_OF_LEGENDS");
assertThat(body.at("/success/status").asText()).isEqualTo("IN_PROGRESS");
assertThat(body.at("/success/roster/0/teamLeaderId").asText()).isEqualTo("host-ROOM14");
assertThat(body.at("/success/roster/0/playerName").asText()).isEqualTo("선수1");
Expand All @@ -200,6 +204,7 @@ private Room startedAuctionRoom(String code, Instant createdAt) {
"호스트-" + code,
"host-action-token-" + code,
new RoomTemplateSpec(
"LEAGUE_OF_LEGENDS",
RoomMode.AUCTION,
2,
2,
Expand Down Expand Up @@ -239,6 +244,7 @@ private Room joinableAuctionRoom(String code, Instant createdAt) {
"호스트-" + code,
"host-action-token-" + code,
new RoomTemplateSpec(
"LEAGUE_OF_LEGENDS",
RoomMode.AUCTION,
2,
2,
Expand Down Expand Up @@ -274,6 +280,7 @@ private Room joinableDraftRoom(String code, Instant createdAt) {
"호스트-" + code,
"host-action-token-" + code,
new RoomTemplateSpec(
"LEAGUE_OF_LEGENDS",
RoomMode.DRAFT,
2,
2,
Expand Down
Loading
Loading