0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-08 17:53:55 +08:00
discourse/spec/services/video_conversion/base_adapter_spec.rb
Blake Erickson 390cfb7820
DEV: Update mediaconvert to use a subdirectory for output (#36049)
Configure the aws mediaconvert adapter to use a subdirectory for the
output of video conversions. This way mediaconvert doesn't need full
access to the uploads directory and only needs access to the
subdirectory.

This adds a new site setting for the media convert subdirectory to use.
2025-11-20 14:03:14 -07:00

101 lines
3 KiB
Ruby
Vendored

# frozen_string_literal: true
RSpec.describe VideoConversion::BaseAdapter do
before(:each) do
extensions = SiteSetting.authorized_extensions.split("|")
SiteSetting.authorized_extensions = (extensions | ["mp4"]).join("|")
end
let(:upload) { Fabricate(:video_upload) }
let(:options) { { quality: "high" } }
let(:adapter) { described_class.new(upload, options) }
describe "#initialize" do
it "sets the upload and options" do
expect(adapter.instance_variable_get(:@upload)).to eq(upload)
expect(adapter.instance_variable_get(:@options)).to eq(options)
end
end
describe "#convert" do
it "raises NotImplementedError" do
expect { adapter.convert }.to raise_error(
NotImplementedError,
"#{described_class} must implement #convert",
)
end
end
describe "#check_status" do
it "raises NotImplementedError" do
expect { adapter.check_status("job-123") }.to raise_error(
NotImplementedError,
"#{described_class} must implement #check_status",
)
end
end
describe "#handle_completion" do
it "raises NotImplementedError" do
expect { adapter.handle_completion("job-123", "new-sha1") }.to raise_error(
NotImplementedError,
"#{described_class} must implement #handle_completion",
)
end
end
describe "#create_optimized_video_record" do
let(:output_path) { "/path/to/output.mp4" }
let(:new_sha1) { "new-sha1-hash" }
let(:filesize) { 1024 }
let(:url) { "//bucket.s3.region.amazonaws.com/optimized/videos/new-sha1-hash.mp4" }
before { allow(OptimizedVideo).to receive(:create_for) }
context "with adapter that defines ADAPTER_NAME" do
let(:adapter_name) { "test_adapter_#{SecureRandom.hex(4)}" }
let(:test_adapter_class) do
adapter_name_const = adapter_name
Class.new(VideoConversion::BaseAdapter) do
const_set(:ADAPTER_NAME, adapter_name_const)
def self.name
"TestAdapter"
end
end
end
let(:adapter) { test_adapter_class.new(upload) }
it "creates an optimized video record with correct attributes" do
adapter.send(:create_optimized_video_record, output_path, new_sha1, filesize, url)
expect(OptimizedVideo).to have_received(:create_for).with(
upload,
"video_converted.mp4",
upload.user_id,
filesize: filesize,
sha1: new_sha1,
url: url,
extension: "mp4",
adapter: adapter_name,
)
end
it "handles filenames with multiple extensions" do
upload.update!(original_filename: "video.original.mp4")
adapter.send(:create_optimized_video_record, output_path, new_sha1, filesize, url)
expect(OptimizedVideo).to have_received(:create_for).with(
upload,
"video.original_converted.mp4",
upload.user_id,
filesize: filesize,
sha1: new_sha1,
url: url,
extension: "mp4",
adapter: adapter_name,
)
end
end
end
end