jam-cloud/ruby/spec/jam_ruby/resque/quick_mixer_spec.rb

122 lines
3.9 KiB
Ruby

require 'spec_helper'
require 'fileutils'
# these tests avoid the use of ActiveRecord and FactoryGirl to do blackbox, non test-instrumented tests
describe AudioMixer do
include UsesTempFiles
let(:quick_mix) { FactoryGirl.create(:quick_mix, started_at: nil, should_retry: false) }
before(:each) do
stub_const("APP_CONFIG", app_config)
module EM
@next_tick_queue = []
end
MQRouter.client_exchange = double("client_exchange")
MQRouter.user_exchange = double("user_exchange")
MQRouter.client_exchange.should_receive(:publish).any_number_of_times
MQRouter.user_exchange.should_receive(:publish).any_number_of_times
end
def assert_found_job_count(expected)
count = 0
QuickMixer.find_jobs_needing_retry do
count = count + 1
end
count.should == expected
end
describe "queue_jobs_needing_retry" do
it "won't find anything if no quick mixes" do
assert_found_job_count(0)
end
it "won't find a quick mix that hasn't been started" do
quick_mix.touch
assert_found_job_count(0)
end
it "won't find a quick mix that has should_retry flagged" do
quick_mix.should_retry = true
quick_mix.save!
assert_found_job_count(1)
end
it "won't find a quick mix that has should_retry flagged" do
quick_mix.should_retry = false
quick_mix.started_at = 2.hours.ago
quick_mix.save!
assert_found_job_count(1)
end
end
# these tests try to run the job with minimal faking. Here's what we still fake:
# we don't run audiomixer. audiomixer is tested already
# we don't run redis and actual resque, because that's tested by resque/resque-spec
describe "full", :aws => true do
sample_ogg='sample.ogg'
in_directory_with_file(sample_ogg)
before(:each) do
content_for_file("ogg goodness")
@user = FactoryGirl.create(:user)
@connection = FactoryGirl.create(:connection, :user => @user)
@instrument = FactoryGirl.create(:instrument, :description => 'a great instrument')
@track = FactoryGirl.create(:track, :connection => @connection, :instrument => @instrument)
@music_session = FactoryGirl.create(:active_music_session, :creator => @user, :musician_access => true)
# @music_session.connections << @connection
@music_session.save
@connection.join_the_session(@music_session, true, [@track], @user, 10)
@recording = Recording.start(@music_session, @user)
@recording.stop
@recording.claim(@user, "name", "description", Genre.first, true)
@recording.errors.any?.should be_false
@recording.quick_mixes.length.should == 1
@quick_mix = @recording.quick_mixes[0]
test_config = app_config
@s3_manager = S3Manager.new(test_config.aws_bucket, test_config.aws_access_key_id, test_config.aws_secret_access_key)
# put a file in s3
@s3_manager.upload(@quick_mix[:ogg_url], sample_ogg)
# create a signed url that the job will use to fetch it back down
@s3_sample = @s3_manager.sign_url(@quick_mix[:ogg_url], :secure => false)
QuickMixer.any_instance.stub(:create_mp3) do |input_file, output_file|
FileUtils.mv input_file, output_file
end
end
it "completes" do
with_resque do
#QuickMix.any_instance.stub(:manifest).and_return(s3_manifest)
@mix = @recording.quick_mixes[0]
@mix.enqueue
end
@mix.reload
@mix.completed.should be_true
@mix.mp3_length.should == "ogg goodness".length
@mix.mp3_md5.should == ::Digest::MD5.file(sample_ogg).hexdigest
# fetch back the mp3 file from s3, check that it's equivalent to the sample_ogg file (which we did a FileUtils.mv of to make a fake mp3)
mp3_fetched_from_s3 = Tempfile.new('foo')
@s3_manager.download(@quick_mix[:mp3_url], mp3_fetched_from_s3.path)
@mix.mp3_md5.should == ::Digest::MD5.file(mp3_fetched_from_s3).hexdigest
end
end
end