Test match swaps in follower sync e2e

This commit is contained in:
Daniel Schädler 2026-04-22 16:42:58 +02:00
parent 99538a3343
commit 6f0ca455f7
1 changed files with 77 additions and 0 deletions

View File

@ -50,6 +50,65 @@ RSpec.describe 'Tournament follower sync HTTP E2E' do
expect(tournament_signature(follower)).to eq(tournament_signature(source))
expect(synced_team_id_pairs(source: source, follower: follower)).not_to be_empty
log_phase!('swap matches on leader and verify follower behavior')
source_group_stage = source.fetch(:stages).find { |stage| stage.fetch(:level) == -1 }
first_source_group = source_group_stage.fetch(:groups).sort_by { |group| group.fetch(:number) }.first
second_source_group = source_group_stage.fetch(:groups).sort_by { |group| group.fetch(:number) }[1]
first_group_matches = first_source_group.fetch(:matches).sort_by { |match| match.fetch(:position) }
first_position_match = first_group_matches.fetch(0)
fourth_position_match = first_group_matches.fetch(3)
wrong_group_match = second_source_group.fetch(:matches).sort_by { |match| match.fetch(:position) }.first
follower_group_stage = follower.fetch(:stages).find { |stage| stage.fetch(:level) == -1 }
first_follower_group = follower_group_stage.fetch(:groups).sort_by { |group| group.fetch(:number) }.first
follower_first_position_match = first_follower_group.fetch(:matches).find do |match|
match_team_names(match) == match_team_names(first_position_match)
end
follower_fourth_position_match = first_follower_group.fetch(:matches).find do |match|
match_team_names(match) == match_team_names(fourth_position_match)
end
leader_swap = source_owner_client.patch("/matches/#{first_position_match.fetch(:id)}/swap", body: {
other_match_id: fourth_position_match.fetch(:id)
})
expect(leader_swap[:status]).to eq(200)
expect(leader_swap[:json].map { |match| match.fetch(:position) }).to match_array([
first_position_match.fetch(:position),
fourth_position_match.fetch(:position)
])
source = fetch_tournament(client: source_anonymous_client, tournament_id: source.fetch(:id))
follower = wait_for_tournament_sync!(source_tournament_id: source.fetch(:id), follower_tournament_id: follower.fetch(:id))
expect(tournament_signature(follower)).to eq(tournament_signature(source))
expect(group_match_positions(source, group_number: first_source_group.fetch(:number))).to eq(
group_match_positions(follower, group_number: first_follower_group.fetch(:number))
)
expect(group_match_positions(source, group_number: first_source_group.fetch(:number)).fetch(match_team_names(first_position_match))).to eq(
fourth_position_match.fetch(:position)
)
expect(group_match_positions(source, group_number: first_source_group.fetch(:number)).fetch(match_team_names(fourth_position_match))).to eq(
first_position_match.fetch(:position)
)
follower_before_invalid_swap = tournament_signature(follower)
source_before_invalid_swap = tournament_signature(source)
wrong_group_swap = source_owner_client.patch("/matches/#{first_position_match.fetch(:id)}/swap", body: {
other_match_id: wrong_group_match.fetch(:id)
})
expect(wrong_group_swap[:status]).to eq(422)
expect(wrong_group_swap.dig(:json, :error)).to eq('Matches must be different group matches from the same group')
source_after_invalid_swap = fetch_tournament(client: source_anonymous_client, tournament_id: source.fetch(:id))
follower_after_invalid_swap = fetch_tournament(client: follower_anonymous_client, tournament_id: follower.fetch(:id))
expect(tournament_signature(source_after_invalid_swap)).to eq(source_before_invalid_swap)
expect(tournament_signature(follower_after_invalid_swap)).to eq(follower_before_invalid_swap)
follower_swap = follower_owner_client.patch("/matches/#{follower_first_position_match.fetch(:id)}/swap", body: {
other_match_id: follower_fourth_position_match.fetch(:id)
})
expect(follower_swap[:status]).to eq(423)
expect(follower_swap.dig(:json, :error)).to eq('Tournament is in read only follower mode')
follower_after_locked_swap = fetch_tournament(client: follower_anonymous_client, tournament_id: follower.fetch(:id))
expect(tournament_signature(follower_after_locked_swap)).to eq(follower_before_invalid_swap)
log_phase!('tighten playoff cutoff and rename teams')
update_cutoff = source_owner_client.patch("/tournaments/#{source.fetch(:id)}", body: {
playoff_teams_amount: 4,
@ -427,6 +486,24 @@ RSpec.describe 'Tournament follower sync HTTP E2E' do
}
end
def match_team_names(match)
match.fetch(:match_scores)
.map { |score| score.dig(:team, :name) }
.sort
.join(' vs ')
end
def group_match_positions(tournament, group_number:)
group = tournament.fetch(:stages)
.find { |stage| stage.fetch(:level) == -1 }
.fetch(:groups)
.find { |candidate| candidate.fetch(:number) == group_number }
group.fetch(:matches).each_with_object({}) do |match, positions|
positions[match_team_names(match)] = match.fetch(:position)
end
end
def unique_suffix
@unique_suffix_counter ||= 0
@unique_suffix_counter += 1