|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +require 'rails_helper' |
| 4 | + |
| 5 | +RSpec.describe RecordingImporter do |
| 6 | + describe '.import' do |
| 7 | + let(:record_id) { "#{Digest::SHA256.hexdigest('meeting-1')}-1234567890123" } |
| 8 | + let(:work_dir) { Dir.mktmpdir } |
| 9 | + let(:publish_dir) { Dir.mktmpdir } |
| 10 | + |
| 11 | + before do |
| 12 | + allow(Rails.configuration.x).to receive_messages( |
| 13 | + recording_work_dir: work_dir, |
| 14 | + recording_publish_dir: publish_dir, |
| 15 | + recording_unpublish_dir: publish_dir |
| 16 | + ) |
| 17 | + allow(PostImporterScripts).to receive(:run) |
| 18 | + end |
| 19 | + |
| 20 | + after do |
| 21 | + FileUtils.rm_rf([work_dir, publish_dir]) |
| 22 | + end |
| 23 | + |
| 24 | + it 'imports the other formats even when one format fails to import' do |
| 25 | + tar = build_tar |
| 26 | + |
| 27 | + # Simulate the "video" format failing to import, without crafting broken metadata. |
| 28 | + allow(Recording).to receive(:create_from_metadata_xml).and_call_original |
| 29 | + allow(Recording).to receive(:create_from_metadata_xml) |
| 30 | + .with(a_string_including('<format>video</format>')) |
| 31 | + .and_raise(StandardError, 'simulated format failure') |
| 32 | + |
| 33 | + expect { described_class.import(tar) }.not_to raise_error |
| 34 | + |
| 35 | + recording = Recording.find_by(record_id: record_id) |
| 36 | + expect(recording).to be_present |
| 37 | + expect(recording.playback_formats.pluck(:format)).to contain_exactly('presentation') |
| 38 | + end |
| 39 | + |
| 40 | + private |
| 41 | + |
| 42 | + def metadata_xml(format:) |
| 43 | + <<~XML |
| 44 | + <?xml version="1.0" encoding="UTF-8"?> |
| 45 | + <recording> |
| 46 | + <id>#{record_id}</id> |
| 47 | + <state>published</state> |
| 48 | + <published>true</published> |
| 49 | + <meta> |
| 50 | + <meetingId>meeting-1</meetingId> |
| 51 | + <meetingName>Test Meeting</meetingName> |
| 52 | + </meta> |
| 53 | + <playback> |
| 54 | + <format>#{format}</format> |
| 55 | + <link>https://example.com/playback/#{format}/2.3/#{record_id}</link> |
| 56 | + </playback> |
| 57 | + </recording> |
| 58 | + XML |
| 59 | + end |
| 60 | + |
| 61 | + # Builds a tar containing two valid formats: "presentation" and "video". |
| 62 | + def build_tar |
| 63 | + src = Dir.mktmpdir |
| 64 | + FileUtils.mkdir_p(File.join(src, 'presentation', record_id)) |
| 65 | + File.write(File.join(src, 'presentation', record_id, 'metadata.xml'), metadata_xml(format: 'presentation')) |
| 66 | + |
| 67 | + FileUtils.mkdir_p(File.join(src, 'video', record_id)) |
| 68 | + File.write(File.join(src, 'video', record_id, 'metadata.xml'), metadata_xml(format: 'video')) |
| 69 | + |
| 70 | + tar_path = File.join(Dir.mktmpdir, "#{record_id}.tar") |
| 71 | + Dir.chdir(src) { system('tar', '--create', '--file', tar_path, 'presentation', 'video') } |
| 72 | + tar_path |
| 73 | + end |
| 74 | + end |
| 75 | +end |
0 commit comments