Fix avanzamento quarto basket e regia senza cronometro.
Normalizza il periodo nel backend quando l'app invia "Q1" via cable, così advance_period aggiorna regia e overlay; rimuove i controlli cronometro dalla regia e rende più tollerante il decode iOS al resume sessione. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -62,6 +62,72 @@ RSpec.describe "Public regia", type: :request do
|
||||
expect(response.parsed_body.dig("score", "board_type")).to eq("basket")
|
||||
end
|
||||
|
||||
it "avanza il quarto basket via API" do
|
||||
basket_team = club.teams.create!(name: "U13 Basket", sport_key: "basket")
|
||||
basket_match = basket_team.matches.create!(opponent_name: "Avversario", sport: "basket")
|
||||
basket_session = StreamSession.create!(match: basket_match, user: user, platform: "matchlivetv", status: "live")
|
||||
basket_session.create_score_state!(
|
||||
board_type: "basket",
|
||||
home_sets: 0,
|
||||
away_sets: 0,
|
||||
home_points: 0,
|
||||
away_points: 0,
|
||||
current_set: 1,
|
||||
data: {
|
||||
"period" => 1,
|
||||
"clock_secs" => 600,
|
||||
"clock_running" => false,
|
||||
"home_score" => 0,
|
||||
"away_score" => 4,
|
||||
"overtime" => false
|
||||
}
|
||||
)
|
||||
token = Sessions::RegiaAccess.new(basket_session).issue_token!
|
||||
|
||||
patch public_regia_score_path(token), params: { cmd: "advance_period" }, as: :json
|
||||
expect(response).to have_http_status(:ok)
|
||||
body = response.parsed_body
|
||||
expect(body.dig("score", "period")).to eq("Q2")
|
||||
expect(body.dig("score", "data", "period")).to eq(2)
|
||||
expect(basket_session.score_state.reload.data["period"]).to eq(2)
|
||||
end
|
||||
|
||||
it "avanza il quarto basket anche con periodo Q1 corrotto in data" do
|
||||
basket_team = club.teams.create!(name: "U13 Basket", sport_key: "basket")
|
||||
basket_match = basket_team.matches.create!(opponent_name: "Avversario", sport: "basket")
|
||||
basket_session = StreamSession.create!(match: basket_match, user: user, platform: "matchlivetv", status: "live")
|
||||
basket_session.create_score_state!(
|
||||
board_type: "basket",
|
||||
data: {
|
||||
"period" => "Q1",
|
||||
"home_score" => 0,
|
||||
"away_score" => 4,
|
||||
"clock_secs" => 600,
|
||||
"clock_running" => false,
|
||||
"overtime" => false
|
||||
}
|
||||
)
|
||||
token = Sessions::RegiaAccess.new(basket_session).issue_token!
|
||||
|
||||
patch public_regia_score_path(token), params: { cmd: "advance_period" }, as: :json
|
||||
expect(response).to have_http_status(:ok)
|
||||
expect(response.parsed_body.dig("score", "period")).to eq("Q2")
|
||||
end
|
||||
|
||||
it "non mostra controlli cronometro sulla regia basket" do
|
||||
basket_team = club.teams.create!(name: "U13 Basket", sport_key: "basket")
|
||||
basket_match = basket_team.matches.create!(opponent_name: "Avversario", sport: "basket")
|
||||
basket_session = StreamSession.create!(match: basket_match, user: user, platform: "matchlivetv", status: "live")
|
||||
basket_session.create_score_state!(board_type: "basket", data: { "period" => 1, "home_score" => 0, "away_score" => 0 })
|
||||
token = Sessions::RegiaAccess.new(basket_session).issue_token!
|
||||
|
||||
get public_regia_path(token)
|
||||
expect(response).to have_http_status(:ok)
|
||||
expect(response.body).to include("Prossimo quarto")
|
||||
expect(response.body).not_to include("cronometro")
|
||||
expect(response.body).not_to include("Cronometro:")
|
||||
end
|
||||
|
||||
it "mette in pausa e riprende la diretta" do
|
||||
mtx = instance_double(
|
||||
Mediamtx::Client,
|
||||
|
||||
66
backend/spec/services/scoring/period_data_spec.rb
Normal file
66
backend/spec/services/scoring/period_data_spec.rb
Normal file
@@ -0,0 +1,66 @@
|
||||
require "rails_helper"
|
||||
|
||||
RSpec.describe Scoring::PeriodData do
|
||||
describe ".number_from" do
|
||||
it "legge interi e etichette basket/timed" do
|
||||
expect(described_class.number_from(2)).to eq(2)
|
||||
expect(described_class.number_from("Q3")).to eq(3)
|
||||
expect(described_class.number_from("2° tempo")).to eq(2)
|
||||
expect(described_class.number_from("Q1")).to eq(1)
|
||||
expect(described_class.number_from("")).to be_nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
RSpec.describe "Basket advance_period con periodo corrotto" do
|
||||
let!(:user) { User.create!(email: "period@test.it", name: "U", password: "password123", role: "coach") }
|
||||
let!(:club) { Club.create!(name: "C", sport: "basket", primary_color: "#e53935", secondary_color: "#ffffff") }
|
||||
let!(:team) { club.teams.create!(name: "U13", sport_key: "basket") }
|
||||
let!(:match) { team.matches.create!(opponent_name: "Opp", sport: "basket") }
|
||||
let!(:session) { StreamSession.create!(match: match, user: user, platform: "matchlivetv", status: "live") }
|
||||
|
||||
it "avanza il quarto anche se data.period è la stringa Q1 (sync app mobile)" do
|
||||
session.create_score_state!(
|
||||
board_type: "basket",
|
||||
home_points: 0,
|
||||
away_points: 4,
|
||||
data: {
|
||||
"period" => "Q1",
|
||||
"home_score" => 0,
|
||||
"away_score" => 4,
|
||||
"clock_secs" => 600,
|
||||
"clock_running" => false,
|
||||
"overtime" => false
|
||||
}
|
||||
)
|
||||
|
||||
Scoring::ApplyAction.new(session: session, action: "advance_period").call
|
||||
score = session.score_state.reload
|
||||
|
||||
expect(score.data["period"]).to eq(2)
|
||||
expect(score.current_period_label).to eq("Q2")
|
||||
expect(score.as_cable_payload[:period]).to eq("Q2")
|
||||
end
|
||||
|
||||
it "normalizza period in sync Action Cable" do
|
||||
session.create_score_state!(
|
||||
board_type: "basket",
|
||||
data: { "period" => 1, "home_score" => 0, "away_score" => 0 }
|
||||
)
|
||||
|
||||
Scoring::SyncState.new(
|
||||
session: session,
|
||||
payload: {
|
||||
"type" => "score_update",
|
||||
"board_type" => "basket",
|
||||
"period" => "Q1",
|
||||
"home_score" => 2,
|
||||
"away_score" => 1
|
||||
}
|
||||
).call
|
||||
|
||||
score = session.score_state.reload
|
||||
expect(score.data["period"]).to eq(1)
|
||||
expect(score.data["home_score"]).to eq(2)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user