require 'spec_helper_unit'

describe "Assets API" do

  before(:each) do
    @user = create(:valid_user)

    delete_user_data @user
    host! "#{@user.username}.localhost.lan"
  end

  after(:each) do
    @user.destroy
  end

  let(:params) { { :api_key => @user.api_key } }

  it 'creates a new asset' do
    Asset.any_instance.stubs('use_s3?').returns(false)

    file_path = Rails.root.join('spec', 'support', 'data', 'cartofante_blue.png')
    if File.exist?(file_path) && File.file?(file_path)
      uploaded_file = Rack::Test::UploadedFile.new(file_path, 'image/png')

      post_json(
        api_v1_users_assets_create_url(user_id: @user),
        params.merge(kind: 'wadus', filename: uploaded_file.path)
      ) do |response|
        response.status.should be_success
        response.body[:public_url].should =~ /\/test\/#{@user.username}\/assets\/\d+cartofante_blue/
        URI(response.body[:public_url]).should be_absolute
        response.body[:kind].should == 'wadus'
        @user.reload
        @user.assets.count.should == 1
        asset = @user.assets.first
        asset.public_url.should =~ /\/test\/#{@user.username}\/assets\/\d+cartofante_blue/
        asset.kind.should == 'wadus'
      end
    else
      pending("Required spec asset '#{file_path}' not found, test can't properly execute")
    end
  end

  it 'creates a new asset with spaces in name' do
    Asset.any_instance.stubs('use_s3?').returns(false)

    file_path = Rails.root.join('spec', 'support', 'data', 'cartofante blue.png')
    if File.exist?(file_path) && File.file?(file_path)
      uploaded_file = Rack::Test::UploadedFile.new(file_path, 'image/png')

      post_json(
        api_v1_users_assets_create_url(user_id: @user),
        params.merge(kind: 'wadus', filename: uploaded_file.path)
      ) do |response|
        response.status.should be_success
        response.body[:public_url].should =~ /\/test\/#{@user.username}\/assets\/\d+cartofante%20blue/
        URI(response.body[:public_url]).should be_absolute
        response.body[:kind].should == 'wadus'
        @user.reload
        @user.assets.count.should == 1
        asset = @user.assets.first
        asset.public_url.should =~ /\/test\/#{@user.username}\/assets\/\d+cartofante%20blue/
        asset.kind.should == 'wadus'
      end
    else
      pending("Required spec asset '#{file_path}' not found, test can't properly execute")
    end
  end

  it "returns some error message when the asset creation fails" do
    pending "Fix this test, sometimes fails"
    Asset.any_instance.stubs(:s3_bucket).raises("AWS exception")
    post_json(api_v1_users_assets_create_url(user_id: @user), params.merge(
      :filename => Rack::Test::UploadedFile.new(Rails.root.join('spec/support/data/cartofante_blue.png'), 'image/png').path)
    ) do |response|
      response.status.should == 400
      response.body[:error].should == ["AWS exception"]
    end
  end

  it "finds image file extension" do
    asset = create(:asset, user_id: @user.id)

    Asset::VALID_EXTENSIONS.each do |extension|
      asset_name = "cartofante" + extension
      asset.stubs(:asset_file).returns(asset_name)
      asset.asset_file_extension.should == extension
    end
  end

  it "detects incorrect image file extension" do
    asset = create(:asset, user_id: @user.id)
    asset.stubs(:asset_file).returns("cartofante.gifv")
    asset.asset_file_extension.should == nil
  end

  it "deletes an asset" do
    Asset.any_instance.stubs('use_s3?').returns(false)

    create(:asset, user_id: @user.id)
    @user.reload
    delete_json(api_v1_users_assets_destroy_url(user_id: @user.id, id: @user.assets.first.id), params) do |response|
      response.body.should == {}
      response.status.should be_success
      @user.reload
      @user.assets.count.should == 0
    end
  end

end
