Aggiunge pulizia ciclica segmenti locali e doc tabelloni/overlay.

Evita il riempimento disco da segmenti MediaMTX post-sessione con cron orario;
documenta come board, overlay e regolamenti sportivi si relazionano nel sistema.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-10 22:08:05 +02:00
parent 2b7e8b9e36
commit ce8939fffb
6 changed files with 558 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
require "rails_helper"
RSpec.describe Recordings::CleanupLocal 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(:recordings_root) { Rails.root.join("tmp/recordings_spec").to_s }
let(:live_root) { File.join(recordings_root, "live") }
around do |example|
FileUtils.mkdir_p(live_root)
original = ENV["RECORDINGS_PATH"]
ENV["RECORDINGS_PATH"] = recordings_root
example.run
ensure
ENV["RECORDINGS_PATH"] = original
FileUtils.rm_rf(recordings_root)
end
def write_segment(session_id)
dir = File.join(live_root, "match_#{session_id}")
FileUtils.mkdir_p(dir)
File.write(File.join(dir, "segment.mp4"), "x" * 1024)
dir
end
it "rimuove segmenti di sessioni terminate con replay pronto" do
session = StreamSession.create!(
match: match, user: user, platform: "matchlivetv", status: "ended", ended_at: 1.hour.ago
)
write_segment(session.id)
Recording.create!(
stream_session: session, team: team, status: "ready", privacy_status: "public",
storage_key: "teams/#{team.id}/sessions/#{session.id}/replay.mp4"
)
result = described_class.new(online_paths: []).call
expect(result.removed).to eq(1)
expect(Dir.exist?(File.join(live_root, "match_#{session.id}"))).to be(false)
end
it "non rimuove segmenti di sessioni ancora in onda" do
session = StreamSession.create!(
match: match, user: user, platform: "matchlivetv", status: "live"
)
write_segment(session.id)
result = described_class.new(online_paths: [session.mediamtx_path_name]).call
expect(result.removed).to eq(0)
expect(result.skipped).to eq(1)
expect(Dir.exist?(File.join(live_root, "match_#{session.id}"))).to be(true)
end
it "non rimuove segmenti di sessioni terminate di recente in elaborazione" do
session = StreamSession.create!(
match: match, user: user, platform: "matchlivetv", status: "ended", ended_at: 30.minutes.ago
)
write_segment(session.id)
Recording.create!(
stream_session: session, team: team, status: "processing", privacy_status: "public"
)
result = described_class.new(online_paths: []).call
expect(result.removed).to eq(0)
expect(Dir.exist?(File.join(live_root, "match_#{session.id}"))).to be(true)
end
it "rimuove cartelle orfane senza sessione nel database" do
orphan_id = SecureRandom.uuid
write_segment(orphan_id)
result = described_class.new(online_paths: []).call
expect(result.removed).to eq(1)
expect(Dir.exist?(File.join(live_root, "match_#{orphan_id}"))).to be(false)
end
end