require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')

describe Twitter::Client, "#favorites" do
  before(:each) do
    @uri = '/favorites.json'
    @request = mas_net_http_get(:basic_auth => nil)
    @twitter = client_context
    @default_header = @twitter.send(:http_header)
    @response = mas_net_http_response(:success)
    @connection = mas_net_http(@response)
    @options = { :page => 4 }
    Net::HTTP.stub!(:new).and_return(@connection)
    @favorites = []
    Twitter::Status.stub!(:unmarshal).and_return(@favorites)
  end
  
  it "should create expected HTTP GET request when not giving options" do
    @twitter.should_receive(:create_http_get_request).with(@uri).and_return(@request)
    @twitter.favorites
  end
  
  it "should create expected HTTP GET request when giving :page options" do
    @twitter.should_receive(:create_http_get_request).with("#{@uri}?#{@options.to_http_str}").and_return(@request)
    @twitter.favorites(@options)
  end
  
  it "should raise Twitter::RESTError when 401 HTTP response received without giving options" do
    @connection = mas_net_http(mas_net_http_response(:not_authorized))
    lambda {
      @twitter.favorites
    }.should raise_error(Twitter::RESTError)
  end
  
  it "should raise Twitter::RESTError when 401 HTTP response received when giving page options" do
    @connection = mas_net_http(mas_net_http_response(:not_authorized))
    lambda {
      @twitter.favorites(@options)
    }.should raise_error(Twitter::RESTError)
  end
  
  it "should raise Twitter::RESTError when 403 HTTP response received without giving options" do
    @connection = mas_net_http(mas_net_http_response(:forbidden))
    lambda {
      @twitter.favorites
    }.should raise_error(Twitter::RESTError)
  end
  
  it "should raise Twitter::RESTError when 403 HTTP response received when giving page options" do
    @connection = mas_net_http(mas_net_http_response(:forbidden))
    lambda {
      @twitter.favorites(@options)
    }.should raise_error(Twitter::RESTError)
  end
  
  it "should raise Twitter::RESTError when 500 HTTP response received without giving options" do
    @connection = mas_net_http(mas_net_http_response(:server_error))
    lambda {
      @twitter.favorites
    }.should raise_error(Twitter::RESTError)
  end
  
  it "should raise Twitter::RESTError when 500 HTTP response received when giving page options" do
    @connection = mas_net_http(mas_net_http_response(:server_error))
    lambda {
      @twitter.favorites(@options)
    }.should raise_error(Twitter::RESTError)
  end
  
  after(:each) do
    nilize(@uri, @request, @twitter, @default_header, @response, @error_response, @connection)
  end
end

module FavoriteSpecMixin
  def init
    @base_uri = '/favourings'
    @request = mas_net_http_get(:basic_auth => nil)
    @twitter = client_context
    @default_header = @twitter.send(:http_header)
    @response = mas_net_http_response(:success)
    @connection = mas_net_http(@response)
    Net::HTTP.stub!(:new).and_return(@connection)
    @id = 234923423
    @status = mas_twitter_status(:id => @id, :to_i => @id)
    Twitter::Status.stub!(:unmarshal).and_return(@status)
  end
  
  def create_uri(method, id)
    "#{@base_uri}/#{method.to_s}/#{id.to_i.to_s}.json"
  end
  
  def connection=(connection)
    @connection = connection
  end
  
  def finalize
    nilize(@uri, @request, @twitter, @default_header, @response, @error_response, @connection)
  end
end

describe "Twitter::Client#favorite error handling", :shared => true do
  it "should raise a Twitter::RESTError exception when a 401 HTTP response is received" do
    connection = mas_net_http(mas_net_http_response(:not_authorized))
    lambda {
      execute_method
    }.should raise_error(Twitter::RESTError)
  end  

  it "should raise a Twitter::RESTError exception when a 403 HTTP response is received" do
    connection = mas_net_http(mas_net_http_response(:forbidden))
    lambda {
      execute_method
    }.should raise_error(Twitter::RESTError)
  end  

  it "should raise a Twitter::RESTError exception when a 404 HTTP response is received" do
    connection = mas_net_http(mas_net_http_response(:file_not_found))
    lambda {
      execute_method
    }.should raise_error(Twitter::RESTError)
  end  

  it "should raise a Twitter::RESTError exception when a 500 HTTP response is received" do
    connection = mas_net_http(mas_net_http_response(:server_error))
    lambda {
      execute_method
    }.should raise_error(Twitter::RESTError)
  end  
end

describe Twitter::Client, "#favorite(:add, status)" do
  include FavoriteSpecMixin
  it_should_behave_like "Twitter::Client#favorite error handling"
  
  before(:each) do
    init
  end
  
  def execute_method
    @twitter.favorite(:add, @id)
  end
  
  it "should create expected POST request for :add action supplying integer id of status" do
    @twitter.should_receive(:create_http_post_request).with(create_uri(:create, @id)).and_return(@request)
    @twitter.favorite(:add, @id)
  end
  
  it "should create expected POST request for :add action supplying status object" do
    @twitter.should_receive(:create_http_post_request).with(create_uri(:create, @id)).and_return(@request)
    @twitter.favorite(:add, @status)
  end
  
  after(:each) do
    finalize
  end
end

describe Twitter::Client, "#favorite(:remove, status)" do
  include FavoriteSpecMixin
  it_should_behave_like "Twitter::Client#favorite error handling"

  before(:each) do
    init
  end
  
  def execute_method
    @twitter.favorite(:remove, @id)
  end
  
  it "should create expected DELETE request for :remove action supplying integer id of status" do
    @twitter.should_receive(:create_http_delete_request).with(create_uri(:destroy, @id)).and_return(@request)
    @twitter.favorite(:remove, @id)
  end
  
  it "should create expected DELETE request for :remove action supplying status object" do
    @twitter.should_receive(:create_http_delete_request).with(create_uri(:destroy, @id)).and_return(@request)
    @twitter.favorite(:remove, @status)
  end
  
  after(:each) do
    finalize
  end
end