Added v 0.2.1 snapshot.
[twitter4r-core.git] / spec / twitter / client / base_spec.rb
blobb2e2b10c53aeef625626b5d62261bea62176872a
1 require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
3 describe "Twitter::Client" do
4   before(:each) do
5     @init_hash = { :login => 'user', :password => 'pass' }
6   end
8   it ".new should accept login and password as initializer hash keys and set the values to instance values" do
9     client = nil
10     lambda do
11       client = Twitter::Client.new(@init_hash)
12     end.should_not raise_error
13     client.send(:login).should eql(@init_hash[:login])
14     client.send(:password).should eql(@init_hash[:password])
15   end  
16 end
18 describe Twitter::Client, "#http_header" do
19   before(:each) do
20     @user_agent = 'myapp'
21     @application_name = @user_agent
22     @application_version = '1.2.3'
23     @application_url = 'http://myapp.url'
24     Twitter::Client.configure do |conf|
25       conf.user_agent = @user_agent
26       conf.application_name = @application_name
27       conf.application_version = @application_version
28       conf.application_url = @application_url
29     end
30     @expected_headers = {
31       'Accept' => 'text/x-json',
32       'X-Twitter-Client' => @application_name,
33       'X-Twitter-Client-Version' => @application_version,
34       'X-Twitter-Client-URL' => @application_url,
35       'User-Agent' => "Twitter4R v#{Twitter::Version.to_version} [#{@user_agent}]",
36     }
37     @twitter = client_context
38     # resent @@http_header class variable in Twitter::Client class
39     Twitter::Client.class_eval("@@http_header = nil")
40   end
41   
42   it "should always return expected HTTP headers" do
43     headers = @twitter.send(:http_header)
44     headers.should eql(@expected_headers)
45   end
46   
47   it "should cache HTTP headers Hash in class variable after first invocation" do
48     cache = Twitter::Client.class_eval("@@http_header")
49     cache.should be_nil
50     @twitter.send(:http_header)
51     cache = Twitter::Client.class_eval("@@http_header")
52     cache.should_not be_nil
53     cache.should eql(@expected_headers)
54   end
55   
56   after(:each) do
57     nilize(@user_agent, @application_name, @application_version, @application_url, @twitter, @expected_headers)
58   end
59 end
61 describe Twitter::Client, "#create_http_get_request" do
62   before(:each) do
63         @uri = '/some/path'
64         @expected_get_request = mock(Net::HTTP::Get)
65     @twitter = client_context
66         @default_header = @twitter.send(:http_header)
67   end
68   
69   it "should create new Net::HTTP::Get object with expected initialization arguments" do
70         Net::HTTP::Get.should_receive(:new).with(@uri, @default_header).and_return(@expected_get_request)
71                 @twitter.send(:create_http_get_request, @uri)
72   end
73   
74   after(:each) do
75     nilize(@twitter, @uri, @expected_get_request, @default_header)
76   end
77 end
79 describe Twitter::Client, "#create_http_post_request" do
80   before(:each) do
81         @uri = '/some/path'
82         @expected_post_request = mock(Net::HTTP::Post)
83         @twitter = client_context
84         @default_header = @twitter.send(:http_header)
85   end
86     
87   it "should create new Net::HTTP::Post object with expected initialization arguments" do
88         Net::HTTP::Post.should_receive(:new).with(@uri, @default_header).and_return(@expected_post_request)
89     @twitter.send(:create_http_post_request, @uri)
90   end
91   
92   after(:each) do
93     nilize(@twitter, @uri, @expected_post_request, @default_header)    
94   end
95 end
97 describe Twitter::Client, "#create_http_delete_request" do
98   before(:each) do
99     @uri = '/a/stupid/path/that/is/not/restful/since/twitter.com/cannot/do/consistent/restful/apis'
100     @expected_delete_request = mock(Net::HTTP::Delete)
101     @twitter = client_context
102     @default_header = @twitter.send(:http_header)
103   end
104   
105   it "should create new Net::HTTP::Delete object with expected initialization arguments" do
106     Net::HTTP::Delete.should_receive(:new).with(@uri, @default_header).and_return(@expected_delete_request)
107     @twitter.send(:create_http_delete_request, @uri)
108   end
109   
110   after(:each) do
111     nilize(@twitter, @uri, @expected_delete_request, @default_header)
112   end
115 describe Twitter::Client, "#http_connect" do
116   before(:each) do
117     @request = mas_net_http_get(:basic_auth => nil)
118     @good_response = mas_net_http_response(:success)
119     @bad_response = mas_net_http_response(:server_error)
120     @http_stubs = {:is_a? => true}
121     @block = Proc.new do |conn|
122       conn.is_a?(Net::HTTP).should be(true)
123       @has_yielded = true
124       @request
125     end
126     @twitter = client_context
127     @has_yielded = false
128   end
129   
130   def generate_bad_response
131     @http = mas_net_http(@bad_response, @http_stubs)
132     Net::HTTP.stub!(:new).and_return(@http)
133   end
134   
135   def generate_good_response
136     @http = mas_net_http(@good_response, @http_stubs)
137     Net::HTTP.stub!(:new).and_return(@http)
138   end
139   
140   it "should yield HTTP connection when response is good" do
141     generate_good_response
142     @http.should_receive(:is_a?).with(Net::HTTP).and_return(true)
143     lambda do
144       @twitter.send(:http_connect, &@block)
145     end.should_not raise_error
146     @has_yielded.should be(true)
147   end
148   
149   it "should yield HTTP connection when response is bad" do
150     generate_bad_response
151     @http.should_receive(:is_a?).with(Net::HTTP).and_return(true)
152     lambda {
153       @twitter.send(:http_connect, &@block)
154     }.should raise_error(Twitter::RESTError)
155     @has_yielded.should be(true)
156   end
157   
158   after(:each) do
159     nilize(@good_response, @bad_response, @http)
160   end
163 describe Twitter::Client, "#bless_model" do
164   before(:each) do
165     @twitter = client_context
166     @model = Twitter::User.new
167   end
168   
169   it "should recieve #client= message on given model to self" do
170         @model.should_receive(:client=).with(@twitter)
171     model = @twitter.send(:bless_model, @model)
172   end
173   
174   it "should set client attribute on given model to self" do
175     model = @twitter.send(:bless_model, @model)
176     model.client.should eql(@twitter)
177   end
179   # if model is nil, it doesn't not necessarily signify an exceptional case for this method's usage.
180   it "should return nil when receiving nil and not raise any exceptions" do
181     model = @twitter.send(:bless_model, nil)
182     model.should be_nil
183   end
184   
185   # needed to alert developer that the model needs to respond to #client= messages appropriately.
186   it "should raise an error if passing in a non-nil object that doesn't not respond to the :client= message" do
187     lambda {
188       @twitter.send(:bless_model, Object.new)      
189     }.should raise_error(NoMethodError)
190   end
191   
192   after(:each) do
193     nilize(@twitter)
194   end
197 describe Twitter::Client, "#bless_models" do
198   before(:each) do
199     @twitter = client_context
200     @models = [
201         Twitter::Status.new(:text => 'message #1'),
202         Twitter::Status.new(:text => 'message #2'),
203     ]
204   end
206   it "should set client attributes for each model in given Array to self" do
207     models = @twitter.send(:bless_models, @models)
208     models.each {|model| model.client.should eql(@twitter) }
209   end
210   
211   it "should set client attribute for singular model given to self" do
212     model = @twitter.send(:bless_models, @models[0])
213     model.client.should eql(@twitter)
214   end
215   
216   it "should delegate to bless_model for singular model case" do
217     model = @models[0]
218     @twitter.should_receive(:bless_model).with(model).and_return(model)
219     @twitter.send(:bless_models, model)
220   end
221   
222   it "should return nil when receiving nil and not raise any exceptions" do
223     lambda {
224       value = @twitter.send(:bless_models, nil)
225       value.should be_nil
226     }.should_not raise_error
227   end
228   
229   after(:each) do
230     nilize(@twitter, @models)
231   end