require File.expand_path('../../test_helper', __FILE__)

module Rainforest
  class RequesterTest < ::Test::Unit::TestCase
    setup do
    end

    context '#prepare_params' do
      setup do
        @url = "test_url"
        @params = { :a => 1, :b => [2, 3] }
      end

      should 'convert :get params to a query string' do
        url, params = Requester.prepare_params(:get, @url, @params)
        assert(url != @url)
        assert(params.nil?)
      end

      should 'convert :delete params to a query string' do
        url, params = Requester.prepare_params(:delete, @url, @params)
        assert(url != @url)
        assert(params.nil?)
      end

      should 'convert :head params to a query string' do
        url, params = Requester.prepare_params(:head, @url, @params)
        assert(url != @url)
        assert(params.nil?)
      end

      context 'method = :post' do
        setup do
          @method = :post
        end

        should 'not convert params to a query string if a file is in them' do
          expected = { file: File.new(__FILE__) }
          url, params = Requester.prepare_params(@method, @url, expected)
          assert_equal(expected, params)
        end

        should 'convert params to a query string if a file is not present' do
          url, params = Requester.prepare_params(@method, @url, @params)
          assert(params.is_a?(String))
        end
      end
    end

    context '#query_string' do
      should 'join #query_array results with an "&"' do
        start = { :a => 1, :b => [2, 3] }
        expected = ["a=1", "b[]=2", "b[]=3"]

        actual = Requester.query_string(start).split('&')
        actual.each do |str|
          assert(expected.include?(str))
        end
      end
    end

    context '#query_array' do
      should 'convert { :a => "value" } to ["a=value"]' do
        start = { :a => "value" }
        finish = ["a=value"]

        assert_equal(finish, Requester.query_array(start))
      end

      should 'convert { :a => { :b => { :c => "cvalue" } } } to ["a[b][c]=cvalue"]' do
        start = { :a => { :b => { :c => "cvalue" } } }
        finish = ["a[b][c]=cvalue"]

        assert_equal(finish, Requester.query_array(start))
      end

      should 'convert { :a => [1, 2] } to ["a[]=1", "a[]=2"]' do
        start = { :a => [1, 2] }
        finish = ["a[]=1", "a[]=2"]

        assert_equal(finish, Requester.query_array(start))
      end
    end

  end
end