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

describe Twitter::Client, "Timeline API" do
  before(:each) do
    @client = client_context
    @uris = Twitter::Client.class_eval("@@TIMELINE_URIS")
    @user = Twitter::User.new(:screen_name => 'mylogin')
    @status = Twitter::Status.new(:id => 23343443, :text => 'I love Lucy!', :user => @user)
    @timeline = [@status]
    @json = JSON.unparse([@status.to_hash])
    @request = mas_net_http_get(:basic_auth => nil)
    @response = mas_net_http_response(:success, @json)
    @connection = mas_net_http(@response)
    @params = {
      :public => {:since_id => 3249328},
			:friends => {:id => 'myfriend'},
			:user => {:id => 'auser'},
			:me => {},
    }
  end
  
  it "should respond to instance method #timeline_for" do
    @client.should respond_to(:timeline_for)
  end
  
  it "should call #http_get with expected parameters for :public case" do
    @client.should_receive(:rest_oauth_connect).and_return(mas_net_http_response(:success, @json))
    @client.timeline_for(:public)
  end
  
  it "should yield to block for each status in timeline" do
    @client.should_receive(:rest_oauth_connect).and_return(mas_net_http_response(:success, @json))
    Twitter::Status.should_receive(:unmarshal).and_return(@timeline)
    count = 0
    @client.timeline_for(:public) do |status|
      status.should eql(@status)
      count += 1
    end
    count.should eql(@timeline.size)
  end
  
  it "should generate expected HTTP GET request for generic :public case" do
    @client.should_receive(:rest_oauth_connect).with(:get, @uris[:public], {}).and_return(@response)
    timeline = @client.timeline_for(:public)
    timeline.should eql(@timeline)
  end
  
  it "should generate expected HTTP GET request for :public case with expected parameters" do
    @client.should_receive(:rest_oauth_connect).with(:get, @uris[:public], @params[:public]).and_return(@response)
    timeline = @client.timeline_for(:public, @params[:public])
    timeline.should eql(@timeline)
  end
  
  it "should generate expected HTTP GET request for generic :friends case" do
  	@client.should_receive(:rest_oauth_connect).with(:get, @uris[:friends], {}).and_return(@response)
  	timeline = @client.timeline_for(:friends)
  	timeline.should eql(@timeline)
  end
  
  it "should generate expected HTTP GET request for :friends case with expected parameters" do
    @client.should_receive(:rest_oauth_connect).with(:get, @uris[:friends], @params[:friends]).and_return(@response)
    timeline = @client.timeline_for(:friends, @params[:friends])
    timeline.should eql(@timeline)
  end
  
  it "should raise an ArgumentError if type given is not valid" do
    lambda {
      @client.timeline_for(:crap)
    }.should raise_error(ArgumentError)
    
    lambda { 
      @client.timeline_for(:crap, @params[:friends])
    }.should raise_error(ArgumentError)
  end
  
  after(:each) do
    nilize(@client)
  end
end