Files
MatchLiveTv/backend/spec/services/mediamtx/publisher_sync_spec.rb
eminuxandCursor 0702cb699c Rendi affidabile pausa con slate e conferma i controlli laterali.
Evita buchi HLS/YouTube in pausa (path slate ricreata, reload player, no patch recording inutili) e richiede conferma su tasti laterali app/regia.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-20 12:44:23 +02:00

86 lines
3.4 KiB
Ruby

require "rails_helper"
RSpec.describe Mediamtx::PublisherSync do
let(:user) { User.create!(email: "sync@test.com", name: "Sync", password: "Password123", role: "coach") }
let(:club) { Club.create!(name: "Sync Club", sport: "volleyball", primary_color: "#e53935", secondary_color: "#ffffff") }
let(:team) { club.teams.create!(name: "Under 16", sport: "volleyball") }
let!(:match) { team.matches.create!(opponent_name: "Avversario") }
let!(:session) do
StreamSession.create!(
match: match, user: user, status: "connecting", platform: "matchlivetv",
publish_token: "tok", started_at: Time.current
)
end
let(:client) { instance_double(Mediamtx::Client) }
let(:redis) { instance_double(Redis, get: nil, set: true, incr: 1, expire: true, del: 1) }
let(:path_info) do
{ "name" => session.mediamtx_path_name, "online" => true, "source" => { "type" => "rtmpConn" }, "record" => false }
end
before do
Billing::AssignPlan.call(club: club, plan_slug: "premium_full")
allow(Mediamtx::Client).to receive(:new).and_return(client)
allow(Mediamtx::Client).to receive(:for_session).and_return(client)
allow(Mediamtx::PublisherOnline).to receive(:path_info).and_return(path_info)
allow(Mediamtx::PublisherOnline).to receive(:active_path?).and_return(true)
allow(Mediamtx::PublisherOnline).to receive(:rtmp_publisher?).and_return(false)
allow(Mediamtx::PublisherOnline).to receive(:active?).and_return(true)
allow_any_instance_of(described_class).to receive(:redis).and_return(redis)
allow(client).to receive(:set_path_recording)
allow(client).to receive(:ensure_path_with_slate!)
allow(client).to receive(:set_always_available)
end
it "abilita la registrazione quando il publisher è online e la sessione è live" do
session.update!(status: "live")
described_class.new(session).call
expect(client).to have_received(:set_path_recording).with(session, enabled: true)
end
it "non abilita la registrazione in connecting senza publisher online" do
allow(Mediamtx::PublisherOnline).to receive(:active_path?).and_return(false)
allow(Mediamtx::PublisherOnline).to receive(:active?).and_return(false)
path_info["online"] = false
described_class.new(session).call
expect(client).not_to have_received(:set_path_recording)
end
it "abilita la registrazione quando connecting diventa live con publisher online" do
described_class.new(session).call
expect(session.reload.status).to eq("live")
expect(client).to have_received(:set_path_recording).with(session, enabled: true)
end
it "non disabilita la registrazione su reconnecting con publisher offline" do
session.update!(status: "reconnecting")
allow(Mediamtx::PublisherOnline).to receive(:active_path?).and_return(false)
allow(Mediamtx::PublisherOnline).to receive(:active?).and_return(false)
described_class.new(session).call
expect(client).not_to have_received(:set_path_recording)
end
it "non patcha la registrazione in pausa (gestita da Sessions::Pause)" do
session.update!(status: "paused")
described_class.new(session).call
expect(client).not_to have_received(:set_path_recording)
end
it "salta la patch se MediaMTX ha già lo stato record desiderato" do
session.update!(status: "live")
path_info["record"] = true
described_class.new(session).call
expect(client).not_to have_received(:set_path_recording)
end
end