require 'rubygems'
require "test/unit"
require "zencoder"
require 'shoulda'
require 'mocha'
require 'ruby-debug'

class TestZencoder < Test::Unit::TestCase

  context "the zn lib" do 
    setup do
      @src='s3://test_development/spark.avi'
      @api = 'https://app.zencoder.com'
      @apikey = ENV['ZC_APIKEY']
      @base_url = 's3://test_development/zencoder_asset'
      @recipe = ZencoderAPI::Recipes.iphone('base_url' =>@base_url)
      @recipe2 = ZencoderAPI::Recipes.web('base_url' =>@base_url,
        :thumbnails => {
          :number => 1,
          :size => "75x75"})
      assert_not_nil @apikey, "export ZC_APIKEY before you run the tests"
    end
    context "posting a new job" do
      setup do
        @resp  =<<-EOS
        {"id":36119,"outputs":[{"url":"s3://test_development/zencoder_asset/cf398a309f648f99c41a2c0573f40baf.mp4","label":"iphone","id":36174},{"url":"s3://test_development/zencoder_asset/253fae410b1262ef3a76296cbfdb8b44.mp4","label":"web","id":36175}]}
        EOS
      end

      should "return jobid" do 
        RestClient.expects(:post).returns(@resp)
        h = Zencoder.submit_job(@apikey, @src, [@recipe, @recipe2])
        assert_equal Hash, h.class
      end

      should "be able to submit a job" do
        RestClient.expects(:post).with(kind_of(String), kind_of(String), kind_of(Hash)){|x,y,z| 
          assert_equal x, 'https://app.zencoder.com/api/jobs'
          body =  JSON.parse(y)
          assert_equal body['input'], @src
          assert_equal body['output'][0]['base_url'], @base_url
          assert_equal body['output'][1]['base_url'], @base_url
          assert_equal body['output'][1]['label'], 'web'
          assert_equal body['output'][0]['label'], 'iphone'
          assert_equal body['api_key'], @apikey
          assert_equal z[:content_type], :json
          assert_equal z[:accept], :json
          true
        }.returns(@resp)
        Zencoder.submit_job(@apikey, @src, [@recipe, @recipe2])
      end
      should "be able to muck the config " do
        RestClient.expects(:post).with(kind_of(String), kind_of(String), kind_of(Hash)){|x,y,z|
          body = JSON.parse(y)
          assert_equal body['foo'],'bar'
          true
        }.returns(@resp)
        Zencoder.submit_job(@apikey, @src, @recipe) do |config|
          config[:foo]='bar'
          assert config[:output].first.is_a? Hash
        end
      end
      should "be able to submit a job with 1 recipe" do
        RestClient.expects(:post).with(kind_of(String), kind_of(String), kind_of(Hash)){|x,y,z| 
          assert_equal x, 'https://app.zencoder.com/api/jobs'
          body =  JSON.parse(y)
          assert_equal body['input'], @src
          assert_equal body['output'][0]['base_url'], @base_url
          assert_equal body['output'][0]['label'], 'iphone'
          assert_equal body['api_key'], @apikey
          assert_equal z[:content_type], :json
          assert_equal z[:accept], :json
          true
        }.returns(@resp)
        Zencoder.submit_job(@apikey, @src, @recipe)
      end
    end
    should "raise error when given bad data" do
      assert_raise ZencoderAPI::RecipeError do
        ZencoderAPI::Recipes.web('base_url' =>@base_url, :bad_key => 'wtf?')
      end
      assert_raise ZencoderAPI::RecipeError do
        ZencoderAPI::Recipes.web('base_url' =>@base_url, :thumbnails => {:bad_key => 'wtf?'})
      end
    end
  end
end