require 'test_helper'
class FlixCloud::JobTest < Test::Unit::TestCase
context "When validating a job object with no attributes set" do
setup do
@job = FlixCloud::Job.new
@job.valid?
end
should "require an api key" do
assert_match /api_key is required/, @job.errors.to_s
end
should "require file_locations" do
assert_match /file_locations is required/, @job.errors.to_s
end
should "require recipe_id or recipe_name" do
assert_match /recipe_id or recipe_name is required/, @job.errors.to_s
end
end
context "When validating a job object with both recipe_id and recipe_name are set" do
setup do
@job = FlixCloud::Job.new(:recipe_name => 'recipe-name', :recipe_id => 1)
@job.valid?
end
should "require that both recipe_id and recipe_name cannot be used" do
assert_match /recipe_id and recipe_name cannot both be used/, @job.errors.to_s
end
end
context "When validating a job object with a file_locations object that is invalid" do
setup do
@job = FlixCloud::Job.new(:file_locations => {})
@job.valid?
end
should "inherit the file_locations object's errors" do
assert @job.errors.any?{|error|
error.is_a?(Hash) && error[:file_locations] && !error[:file_locations].empty?
}, "Did not inherit file_locations object's errors"
end
end
context "When validating a job object with errors on the deepest nested object possible (parameters)" do
setup do
@job = FlixCloud::Job.new(:file_locations => {:input => {:parameters => {}}})
@job.valid?
end
should "inherit the errors of the deepest nested object possible (parameters)" do
first_level_errors = @job.errors.find{|error| error.is_a?(Hash) && error[:file_locations] && !error[:file_locations].empty? }[:file_locations]
second_level_errors = first_level_errors.find{|error| error.is_a?(Hash) && error[:input] && !error[:input].empty? }[:input]
assert second_level_errors.any?{|error|
error.is_a?(Hash) && error[:parameters] && !error[:parameters].empty?
}, "Did not inherit the errors of the deepest nested object possible (parameters)"
end
end
context "A job with no attributes set" do
setup do
@job = FlixCloud::Job.new
end
should "serialize to xml, excluding everything but api-key and recipe-id" do
assert_equal %{}, @job.to_xml
end
end
context "A job with file_locations set" do
setup do
@job = FlixCloud::Job.new(:file_locations => {})
end
should "serialize to xml, excluding everything but api-key, recipe-id, and file-locations" do
assert_equal %{}, @job.to_xml
end
end
context "A job with file_locations and input set" do
setup do
@job = FlixCloud::Job.new(:file_locations => {:input => {}})
end
should "serialize to xml, excluding everything but api-key, recipe-id, file-locations, and input" do
assert_equal %{}, @job.to_xml
end
end
context "A job with file-locations, input, and input-parameters set" do
setup do
@job = FlixCloud::Job.new(:file_locations => {:input => {:parameters => {}}})
end
should "serialize to xml, excluding everything but api-key, recipe-id, file-locations, input, and input-parameters" do
assert_equal %{}, @job.to_xml
end
end
context "A job with recipe_id set" do
setup do
@job = FlixCloud::Job.new(:recipe_id => 1)
end
should "serialize to xml and include the recipe_id, not the recipe_name" do
assert_equal %{1}, @job.to_xml
end
end
context "A job with a recipe_name set" do
setup do
@job = FlixCloud::Job.new(:recipe_name => 'recipe-name')
end
should "serialize to xml and include the recipe_name, not the recipe_id" do
assert_equal %{recipe-name}, @job.to_xml
end
end
context "A job with all attributes set" do
setup do
@job = FlixCloud::Job.new(:recipe_id => 1,
:api_key => 'this_is_an_api_key',
:file_locations => { :input => { :url => 'http://flixcloud.com/somefile.mp4',
:parameters => { :user => 'user',
:password => 'password'}},
:output => { :url => 'ftp://flixcloud.com/somefile.mp4',
:parameters => { :user => 'user',
:password => 'password'}},
:watermark => { :url => 'http://flixcloud.com/somefile.mp4',
:parameters => { :user => 'user',
:password => 'password'}}})
end
should "serialize everything to xml" do
assert_equal %{this_is_an_api_key1http://flixcloud.com/somefile.mp4userpasswordhttp://flixcloud.com/somefile.mp4userpassword}, @job.to_xml
end
end
context "An invalid job when attempting to save" do
setup do
@job = FlixCloud::Job.new
@result = @job.save
end
should "return false" do
assert_equal false, @result
end
should "set errors on the job" do
assert @job.errors.is_a?(Array)
assert_not_equal [], @job.errors
end
end
context "A valid job when attempting to save" do
setup do
FakeWeb.allow_net_connect = false
@job = FlixCloud::Job.new(:recipe_id => 1,
:api_key => 'this_is_an_api_key',
:file_locations => { :input => { :url => 'http://flixcloud.com/somefile.mp4',
:parameters => { :user => 'user',
:password => 'password'}},
:output => { :url => 'ftp://flixcloud.com/somefile.mp4',
:parameters => { :user => 'user',
:password => 'password'}},
:watermark => { :url => 'http://flixcloud.com/somefile.mp4',
:parameters => { :user => 'user',
:password => 'password'}}})
end
teardown do
FakeWeb.clean_registry
FakeWeb.allow_net_connect = true
end
context "when saving with malformed xml (should really never happen, but what if?)" do
setup do
FakeWeb.register_uri(:post, 'https://flixcloud.com/jobs', :string => %{Malformed XML},
:status => ['400', 'Bad Request'])
end
should "not be successful" do
assert !@job.save
end
should "have a 400 response code" do
@job.save
assert_equal 400, @job.response.code
end
should "store the errors on the job" do
@job.save
assert_equal ['Malformed XML'], @job.errors
end
end
context "when saving with an invalid schema (should really never happen, but what if?)" do
setup do
FakeWeb.register_uri(:post, 'https://flixcloud.com/jobs', :string => %{Schema is invalid},
:status => ['400', 'Bad Request'])
end
should "not be successful" do
assert !@job.save
end
should "have a 400 response code" do
@job.save
assert_equal 400, @job.response.code
end
should "store the errors on the job" do
@job.save
assert_equal ['Schema is invalid'], @job.errors
end
end
context "when saving and the api-key is not valid" do
setup do
FakeWeb.register_uri(:post, 'https://flixcloud.com/jobs', :status => ['401', 'Unauthorized'])
end
should "not be successful" do
assert !@job.save
end
should "have a 401 response code" do
@job.save
assert_equal 401, @job.response.code
end
end
context "when saving and there are errors on the job so it can't be saved" do
setup do
FakeWeb.register_uri(:post, 'https://flixcloud.com/jobs', :string => %{You are missing this thing and that thing},
:status => ['200', 'OK'])
end
should "return false" do
assert_equal false, @job.save
end
should "set the jobs errors to the response body's errors" do
@job.save
assert_equal ["You are missing this thing and that thing"], @job.errors
end
end
context "when saving was successful" do
setup do
FakeWeb.register_uri(:post, 'https://flixcloud.com/jobs', :string => %{12009-04-07T23:15:33+02:00},
:status => ['201', 'Created'])
end
should "return true" do
assert_equal true, @job.save
end
should "save the id from the response on the job" do
@job.save
assert_equal 1, @job.id
end
should "save the initialization time from the response on the job" do
@job.save
assert_equal "Tue Apr 07 21:15:33 UTC 2009", @job.initialized_at.to_s
end
end
end
context "When using shortcut attributes for job initialization" do
setup do
@job = FlixCloud::Job.new(:api_key => 'your-api-key',
:recipe_id => 2,
:input_url => 'your-input-url',
:input_user => 'your-input-user',
:input_password => 'your-input-password',
:output_url => 'your-output-url',
:output_user => 'your-output-user',
:output_password => 'your-output-password',
:watermark_url => 'your-watermark-url',
:watermark_user => 'your-watermark-user',
:watermark_password => 'your-watermark-password')
end
should "set the urls" do
assert_equal 'your-input-url', @job.file_locations.input.url
assert_equal 'your-output-url', @job.file_locations.output.url
assert_equal 'your-watermark-url', @job.file_locations.watermark.url
end
should "set the users" do
assert_equal 'your-input-user', @job.file_locations.input.parameters.user
assert_equal 'your-output-user', @job.file_locations.output.parameters.user
assert_equal 'your-watermark-user', @job.file_locations.watermark.parameters.user
end
should "set the passwords" do
assert_equal 'your-input-password', @job.file_locations.input.parameters.password
assert_equal 'your-output-password', @job.file_locations.output.parameters.password
assert_equal 'your-watermark-password', @job.file_locations.watermark.parameters.password
end
end
context "When calling save! on an invalid job" do
setup do
@job = FlixCloud::Job.new
end
should "raise a FlixCloud::SaveError" do
assert_raises FlixCloud::SaveError do
@job.save!
end
end
end
context "When calling save! on a valid job" do
setup do
FakeWeb.allow_net_connect = false
FakeWeb.register_uri(:post, 'https://flixcloud.com/jobs', :string => %{12009-04-07T23:15:33+02:00},
:status => ['201', 'Created'])
@job = FlixCloud::Job.new(:api_key => 'your-api-key',
:recipe_id => 2,
:input_url => 'your-input-url',
:input_user => 'your-input-user',
:input_password => 'your-input-password',
:output_url => 'your-output-url',
:output_user => 'your-output-user',
:output_password => 'your-output-password',
:watermark_url => 'your-watermark-url',
:watermark_user => 'your-watermark-user',
:watermark_password => 'your-watermark-password')
end
teardown do
FakeWeb.clean_registry
FakeWeb.allow_net_connect = true
end
should "return true" do
assert_equal true, @job.save!
end
end
context "When creating an invalid job" do
setup do
@job = FlixCloud::Job.create
end
should "return a FlixCloud::Job" do
assert @job.is_a?(FlixCloud::Job)
end
should "have errors on the job" do
assert !@job.errors.empty?
end
end
context "When creating a valid job" do
setup do
FakeWeb.allow_net_connect = false
FakeWeb.register_uri(:post, 'https://flixcloud.com/jobs', :string => %{12009-04-07T23:15:33+02:00},
:status => ['201', 'Created'])
@job = FlixCloud::Job.create(:api_key => 'your-api-key',
:recipe_id => 2,
:input_url => 'your-input-url',
:input_user => 'your-input-user',
:input_password => 'your-input-password',
:output_url => 'your-output-url',
:output_user => 'your-output-user',
:output_password => 'your-output-password',
:watermark_url => 'your-watermark-url',
:watermark_user => 'your-watermark-user',
:watermark_password => 'your-watermark-password')
end
teardown do
FakeWeb.clean_registry
FakeWeb.allow_net_connect = true
end
should "return a FlixCloud::Job" do
assert @job.is_a?(FlixCloud::Job)
end
should "not have errors on the job" do
assert @job.errors.empty?
end
should "have an id set" do
assert_not_nil @job.id
end
end
context "When using create! to create an invalid job" do
should "raise a FlixCloud::CreationError exception" do
assert_raises FlixCloud::CreateError do
@job = FlixCloud::Job.create!
end
end
end
context "When using create! to create a valid job" do
setup do
FakeWeb.allow_net_connect = false
FakeWeb.register_uri(:post, 'https://flixcloud.com/jobs', :string => %{12009-04-07T23:15:33+02:00},
:status => ['201', 'Created'])
@job = FlixCloud::Job.create!(:api_key => 'your-api-key',
:recipe_id => 2,
:input_url => 'your-input-url',
:input_user => 'your-input-user',
:input_password => 'your-input-password',
:output_url => 'your-output-url',
:output_user => 'your-output-user',
:output_password => 'your-output-password',
:watermark_url => 'your-watermark-url',
:watermark_user => 'your-watermark-user',
:watermark_password => 'your-watermark-password')
end
teardown do
FakeWeb.clean_registry
FakeWeb.allow_net_connect = true
end
should "return a job" do
assert @job.is_a?(FlixCloud::Job)
end
should "return a job with an id" do
assert_not_nil @job.id
end
end
context "When calling save on a valid job and the server connection gets interrupted" do
setup do
HttpClient::Resource.expects(:new).raises(HttpClient::ServerBrokeConnection)
@job = FlixCloud::Job.new(:api_key => 'your-api-key',
:recipe_id => 2,
:input_url => 'your-input-url',
:input_user => 'your-input-user',
:input_password => 'your-input-password',
:output_url => 'your-output-url',
:output_user => 'your-output-user',
:output_password => 'your-output-password',
:watermark_url => 'your-watermark-url',
:watermark_user => 'your-watermark-user',
:watermark_password => 'your-watermark-password')
end
should "railse a FlixCloud::ServerBrokeConnection exception" do
assert_raises FlixCloud::ServerBrokeConnection do
@job.save
end
end
end
context "When calling save on a valid job and the connection times out" do
setup do
HttpClient::Resource.expects(:new).raises(HttpClient::RequestTimeout)
@job = FlixCloud::Job.new(:api_key => 'your-api-key',
:recipe_id => 2,
:input_url => 'your-input-url',
:input_user => 'your-input-user',
:input_password => 'your-input-password',
:output_url => 'your-output-url',
:output_user => 'your-output-user',
:output_password => 'your-output-password',
:watermark_url => 'your-watermark-url',
:watermark_user => 'your-watermark-user',
:watermark_password => 'your-watermark-password')
end
should "railse a FlixCloud::RequestTimeout exception" do
assert_raises FlixCloud::RequestTimeout do
@job.save
end
end
end
context "When calling save on a valid job and the connection is refused" do
setup do
HttpClient::Resource.expects(:new).raises(HttpClient::ConnectionRefused)
@job = FlixCloud::Job.new(:api_key => 'your-api-key',
:recipe_id => 2,
:input_url => 'your-input-url',
:input_user => 'your-input-user',
:input_password => 'your-input-password',
:output_url => 'your-output-url',
:output_user => 'your-output-user',
:output_password => 'your-output-password',
:watermark_url => 'your-watermark-url',
:watermark_user => 'your-watermark-user',
:watermark_password => 'your-watermark-password')
end
should "railse a FlixCloud::ConnectionRefused exception" do
assert_raises FlixCloud::ConnectionRefused do
@job.save
end
end
end
end