Files
MatchLiveTv/backend/spec/services/mediamtx/cleanup_orphan_paths_spec.rb
Emiliano Frascaro 827abf80cb Elimina i path MediaMTX orfani dopo ogni diretta.
Corregge il cleanup dei path live/match_{uuid}, rimuove sempre il path a fine sessione e lo esegue ogni ora via cron.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-16 20:42:40 +02:00

106 lines
3.6 KiB
Ruby

require "rails_helper"
RSpec.describe Mediamtx::CleanupOrphanPaths do
let!(:club) { Club.create!(name: "Club", sport: "volleyball", primary_color: "#e53935", secondary_color: "#ffffff") }
let!(:team) { club.teams.create!(name: "Team", sport: "volleyball") }
let!(:user) { User.create!(email: "coach@test.com", name: "Coach", password: "password123", role: "coach") }
let!(:match) { team.matches.create!(opponent_name: "Rival", scheduled_at: 1.day.from_now) }
let(:client) { instance_double(Mediamtx::Client) }
def path_item(name, online: false, ready: true)
{ "name" => name, "online" => online, "ready" => ready }
end
before do
allow(client).to receive(:online_path_names).and_return(Set.new)
allow(client).to receive(:delete_path)
allow(client).to receive(:delete_path_name)
end
it "rimuove path live/match_{uuid} di sessioni terminate" do
session = StreamSession.create!(
match: match, user: user, platform: "matchlivetv", status: "ended", ended_at: 1.hour.ago
)
allow(client).to receive(:list_paths).and_return([
path_item(session.mediamtx_path_name)
])
result = described_class.new(client: client).call
expect(result.removed).to eq(1)
expect(client).to have_received(:delete_path).with(session)
end
it "rimuove path orfani senza sessione nel database" do
orphan_id = SecureRandom.uuid
allow(client).to receive(:list_paths).and_return([
path_item("live/match_#{orphan_id}")
])
result = described_class.new(client: client).call
expect(result.removed).to eq(1)
expect(client).to have_received(:delete_path_name).with("live/match_#{orphan_id}")
expect(client).to have_received(:delete_path_name).with("live/match_#{orphan_id}_air")
end
it "non rimuove path con publisher online" do
session = StreamSession.create!(
match: match, user: user, platform: "matchlivetv", status: "ended", ended_at: 1.hour.ago
)
allow(client).to receive(:online_path_names).and_return(Set.new([session.mediamtx_path_name]))
allow(client).to receive(:list_paths).and_return([
path_item(session.mediamtx_path_name, online: true)
])
result = described_class.new(client: client).call
expect(result.removed).to eq(0)
expect(client).not_to have_received(:delete_path)
end
it "non rimuove path di sessioni ancora live" do
session = StreamSession.create!(
match: match, user: user, platform: "matchlivetv", status: "live"
)
allow(client).to receive(:list_paths).and_return([
path_item(session.mediamtx_path_name)
])
result = described_class.new(client: client).call
expect(result.removed).to eq(0)
expect(client).not_to have_received(:delete_path)
end
it "non rimuove path con replay in elaborazione recente" do
session = StreamSession.create!(
match: match, user: user, platform: "matchlivetv", status: "ended", ended_at: 30.minutes.ago
)
Recording.create!(
stream_session: session, team: team, status: "processing", privacy_status: "public"
)
allow(client).to receive(:list_paths).and_return([
path_item(session.mediamtx_path_name)
])
result = described_class.new(client: client).call
expect(result.removed).to eq(0)
expect(client).not_to have_received(:delete_path)
end
it "ignora path che non sono live/match_{uuid}" do
allow(client).to receive(:list_paths).and_return([
path_item("all_others"),
path_item("match_legacy_without_live_prefix")
])
result = described_class.new(client: client).call
expect(result.removed).to eq(0)
expect(result.skipped).to eq(2)
end
end