2
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-03-03 23:54:20 +08:00
discourse/spec/models/optimized_video_spec.rb
Blake Erickson e4dc604f00
DEV: Ensure optimized videos have the correct acl (#36364)
Ensure optimized_upload inherits the secure flag from the original
upload
when created. This prevents ACL mismatches that cause 403 errors when
accessing converted videos, especially when video conversion completes
before the post is published.
2025-12-01 19:50:08 -07:00

104 lines
3.5 KiB
Ruby

# frozen_string_literal: true
RSpec.describe OptimizedVideo do
before(:each) do
# Add video extensions to authorized extensions
extensions = SiteSetting.authorized_extensions.split("|")
SiteSetting.authorized_extensions = (extensions | %w[mp4 mov avi mkv]).join("|")
end
describe ".create_for" do
let(:options) do
{
filesize: 1024,
sha1: "test-sha1-hash",
url: "//bucket.s3.region.amazonaws.com/original/1X/test.mp4",
extension: "mp4",
adapter: "aws_mediaconvert",
}
end
it "returns nil if upload is blank" do
expect(OptimizedVideo.create_for(nil, "test.mp4", 1, options)).to be_nil
end
it "creates an optimized video record with associated upload" do
# Create upload manually without fabricators
user = User.create!(username: "testuser", email: "test@example.com")
upload =
Upload.create!(
user: user,
original_filename: "original.mp4",
filesize: 2048,
sha1: "original-sha1",
extension: "mp4",
url: "//bucket.s3.region.amazonaws.com/original.mp4",
)
expect { OptimizedVideo.create_for(upload, "test.mp4", upload.user_id, options) }.to change {
Upload.count
}.by(1).and change { OptimizedVideo.count }.by(1)
optimized_video = OptimizedVideo.last
optimized_upload = optimized_video.optimized_upload
expect(optimized_video.upload).to eq(upload)
expect(optimized_video.adapter).to eq("aws_mediaconvert")
expect(optimized_upload.filesize).to eq(1024)
expect(optimized_upload.sha1).to eq("test-sha1-hash")
expect(optimized_upload.url).to eq("//bucket.s3.region.amazonaws.com/original/1X/test.mp4")
expect(optimized_upload.extension).to eq("mp4")
end
it "inherits the secure flag from the original upload" do
user = User.create!(username: "testuser", email: "test@example.com")
secure_upload =
Upload.create!(
user: user,
original_filename: "original.mp4",
filesize: 2048,
sha1: "original-sha1",
extension: "mp4",
url: "//bucket.s3.region.amazonaws.com/original.mp4",
secure: true,
)
secure_options =
options.merge(
sha1: "optimized-sha1-secure",
url: "//bucket.s3.region.amazonaws.com/original/1X/secure.mp4",
)
optimized_video =
OptimizedVideo.create_for(secure_upload, "test.mp4", secure_upload.user_id, secure_options)
expect(optimized_video.optimized_upload.secure).to eq(true)
public_upload =
Upload.create!(
user: user,
original_filename: "original2.mp4",
filesize: 2048,
sha1: "original-sha1-2",
extension: "mp4",
url: "//bucket.s3.region.amazonaws.com/original2.mp4",
secure: false,
)
public_options =
options.merge(
sha1: "optimized-sha1-public",
url: "//bucket.s3.region.amazonaws.com/original/1X/public.mp4",
)
optimized_video2 =
OptimizedVideo.create_for(public_upload, "test2.mp4", public_upload.user_id, public_options)
expect(optimized_video2.optimized_upload.secure).to eq(false)
end
end
describe "#destroy" do
it "should destroy the optimized video and its associated upload" do
optimized_video = Fabricate(:optimized_video)
expect { optimized_video.destroy }.to change(OptimizedVideo, :count).by(-1)
expect(Upload.exists?(optimized_video.optimized_upload_id)).to be(false)
end
end
end