require 'spec_helper'
require 'cloudinary'

describe Cloudinary::Api do
  PREDEFINED_PROFILES = %w(4k full_hd hd sd full_hd_wifi full_hd_lean hd_lean)
  break puts('Please setup environment for api test to run') if Cloudinary.config.api_secret.blank?
  include_context 'cleanup', TIMESTAMP_TAG

  prefix = TEST_TAG + "_#{Time.now.to_i}"
  test_id_1 = "#{prefix}_1"
  test_id_2 = "#{prefix}_2"
  test_id_3 = "#{prefix}_3"
  before(:all) do

    @api = Cloudinary::Api
  end

  describe 'create_streaming_profile' do
    it 'should create a streaming profile with representations' do
      result = @api.create_streaming_profile test_id_1, :representations =>
          [{:transformation => {:crop => 'scale', :width => '1200', :height => '1200', :bit_rate => '5m'}}]
      expect(result).not_to be_blank
    end
    it 'should create a streaming profile with an array of transformation' do
      result = @api.create_streaming_profile test_id_1 + 'a', :representations =>
          [{:transformation => [{:crop => 'scale', :width => '1200', :height => '1200', :bit_rate => '5m'}]}]
      expect(result).not_to be_blank
    end
  end

  describe 'list_streaming_profile' do
    it 'should list streaming profile' do
      result = @api.list_streaming_profiles
      expect(result).to have_key('data')
      expect(result['data'].map{|p| p['name']}).to include(*PREDEFINED_PROFILES)
    end
  end

  describe 'delete_streaming_profile' do
    it 'should delete a streaming profile' do
      result = @api.create_streaming_profile test_id_2, :representations =>
          [{:transformation => {:crop => 'scale', :width => '1200', :height => '1200', :bit_rate => '5m'}}]
      expect(result).not_to be_blank
      result = @api.delete_streaming_profile test_id_2
      expect(result).to have_key('message')
      expect(result['message']).to eq('deleted')
      result = @api.list_streaming_profiles
      expect(result['data'].map{|p| p['name']}).not_to include(test_id_2)
    end
  end

  describe 'get_streaming_profile' do
    it 'should get a specific streaming profile' do
      result = @api.get_streaming_profile(PREDEFINED_PROFILES[1])
      expect(result['data'].keys).to include('name', 'display_name', 'representations')
    end
  end

  describe 'update_streaming_profile' do
    it 'should create a streaming profile with representations' do
      result = @api.create_streaming_profile test_id_3, :representations =>
          [{:transformation => {:crop => 'scale', :width => '1200', :height => '1200', :bit_rate => '5m'}}]
      expect(result).not_to be_blank
      result = @api.update_streaming_profile test_id_3, :representations =>
          [{:transformation => {:crop => 'scale', :width => '1000', :height => '1000', :bit_rate => '4m'}}]
      expect(result).not_to be_blank
      result = @api.get_streaming_profile(test_id_3)
      result = result['data']
      expect(result['representations'].length).to eq(1)
      # Notice transformation is always returned as an array; numeric values represented as numbers, not strings
      expect(result['representations'][0]).to eq({'transformation' => ['crop' => 'scale', 'width' => 1000, 'height' => 1000, 'bit_rate' => '4m']})
    end
  end
end