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:
Emiliano Frascaro
2026-06-20 16:15:44 +02:00
parent c92099a41b
commit 793cfaaaf1
18 changed files with 861 additions and 452 deletions

View 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