1 require File.join(File.dirname(__FILE__), '..', 'spec_helper')
5 include Twitter::ModelMixin
9 describe Twitter::Status, "unmarshaling" do
11 @json_hash = { "text" => "Thinking Zipcar is lame...",
13 "user" => {"name" => "Angie",
14 "description" => "TV junkie...",
16 "profile_image_url" => "http:\/\/assets0.twitter.com\/system\/user\/profile_image\/5483072\/normal\/eye.jpg?1177462492",
20 "screen_name" => "ang_410"},
21 "created_at" => "Wed May 02 03:04:54 +0000 2007"}
22 @user = Twitter::User.new @json_hash["user"]
23 @status = Twitter::Status.new @json_hash
27 it "should respond to unmarshal class method" do
28 Twitter::Status.should respond_to(:unmarshal)
31 it "should return expected Twitter::Status object for singular case" do
32 status = Twitter::Status.unmarshal(JSON.unparse(@json_hash))
33 status.should_not be(nil)
34 status.should eql(@status)
37 it "should return expected array of Twitter::Status objects for plural case" do
38 statuses = Twitter::Status.unmarshal(JSON.unparse([@json_hash]))
39 statuses.should_not be(nil)
40 statuses.should have(1).entries
41 statuses.first.should eql(@status)
45 describe Twitter::User, "unmarshaling" do
47 @json_hash = { "name" => "Lucy Snowe",
48 "description" => "School Mistress Entrepreneur",
49 "location" => "Villette",
50 "url" => "http://villetteschoolforgirls.com",
53 "screen_name" => "LucyDominatrix", }
54 @user = Twitter::User.new @json_hash
57 it "should respond to unmarshal class method" do
58 Twitter::User.should respond_to(:unmarshal)
61 it "should return expected arry of Twitter::User objects for plural case" do
62 users = Twitter::User.unmarshal(JSON.unparse([@json_hash]))
63 users.should have(1).entries
64 users.first.should eql(@user)
67 it "should return expected Twitter::User object for singular case" do
68 user = Twitter::User.unmarshal(JSON.unparse(@json_hash))
69 user.should_not be(nil)
70 user.should eql(@user)
74 describe "Twitter::ModelMixin#to_hash" do
77 include Twitter::ModelMixin
78 @@ATTRIBUTES = [:id, :name, :value, :unused_attr]
79 attr_accessor *@@ATTRIBUTES
80 def self.attributes; @@ATTRIBUTES; end
85 return false unless other # trivial nil case.
86 return false unless self.keys.eql?(other.keys)
87 self.each do |key,val|
88 return false unless self[key].eql?(other[key])
96 @attributes = {:id => 14, :name => 'State', :value => 'Illinois'}
97 @model = Model.new(@attributes)
100 it "should return expected hash representation of given model object" do
101 @model.to_hash.should eql(@attributes)
105 nilize(@attributes, @model)
109 describe Twitter::User, ".find" do
111 @twitter = Twitter::Client.from_config 'config/twitter.yml'
113 @screen_name = 'ascreenname'
114 @expected_user = Twitter::User.new(:id => @id, :screen_name => @screen_name)
117 it "should invoke given Twitter::Client's #user method with expected arguments" do
118 # case where id => @id
119 @twitter.should_receive(:user).with(@id).and_return(@expected_user)
120 user = Twitter::User.find(@id, @twitter)
121 user.should eql(@expected_user)
123 # case where id => @screen_name, which is also valid
124 @twitter.should_receive(:user).with(@screen_name).and_return(@expected_user)
125 user = Twitter::User.find(@screen_name, @twitter)
126 user.should eql(@expected_user)
130 nilize(@twitter, @id, @screen_name, @expected_user)
134 describe Twitter::Status, ".find" do
136 @twitter = Twitter::Client.from_config 'config/twitter.yml'
138 @text = 'My crummy status message'
139 @user = Twitter::User.new(:id => @id, :screen_name => @screen_name)
140 @expected_status = Twitter::Status.new(:id => @id, :text => @text, :user => @user)
143 it "should invoke given Twitter::Client's #status method with expected arguments" do
144 @twitter.should_receive(:status).with(:get, @id).and_return(@expected_status)
145 status = Twitter::Status.find(@id, @twitter)
146 status.should eql(@expected_status)
150 nilize(@twitter, @id, @text, @user, @expected_status)
154 describe Test::Model, "#bless" do
156 @twitter = Twitter::Client.from_config('config/twitter.yml')
157 @model = Test::Model.new
160 it "should delegate to #basic_bless" do
161 @model.should_receive(:basic_bless).and_return(@twitter)
162 @model.bless(@twitter)
165 it "should set client attribute of self" do
166 @model.should_receive(:client=).once
167 @model.bless(@twitter)
171 nilize(@model, @twitter)
175 describe Twitter::User, "#is_me?" do
177 @twitter = Twitter::Client.from_config('config/twitter.yml')
178 @user_not_me = Twitter::User.new(:screen_name => 'notmylogin')
179 @user_me = Twitter::User.new(:screen_name => @twitter.instance_eval("@login"))
180 @user_not_me.bless(@twitter)
181 @user_me.bless(@twitter)
184 it "should return true when Twitter::User object represents authenticated user of client context" do
185 @user_me.is_me?.should be_true
188 it "should return false when Twitter::User object does not represent authenticated user of client context" do
189 @user_not_me.is_me?.should be_false
193 nilize(@twitter, @user_not_me, @user_me)
197 describe Twitter::User, "#bless(client)" do
199 @twitter = Twitter::Client.from_config('config/twitter.yml')
200 @user_not_me = Twitter::User.new(:screen_name => 'notmylogin')
201 @user_me = Twitter::User.new(:screen_name => @twitter.instance_eval("@login"))
204 it "should add a followers method" do
205 @user_me.should_not respond_to?(:followers)
206 @user_me.bless(@twitter)
207 @user_me.should respond_to?(:followers)
210 it "should not add a followers method" do
211 @user_not_me.should_not respond_to?(:followers)
212 @user_not_me.bless(@twitter)
213 @user_not_me.should_not respond_to?(:followers)
217 nilize(@twitter, @user_not_me, @user_me)
221 describe Twitter::User, "#friends" do
223 @twitter = Twitter::Client.from_config('config/twitter.yml')
225 @user = Twitter::User.new(:id => @id, :screen_name => 'twitter4r')
226 @user.bless(@twitter)
229 it "should delegate to @client.user(@id, :friends)" do
230 @twitter.should_receive(:user).with(@id, :friends)
235 nilize(@twitter, @id, @user)
239 describe Twitter::User, "#followers" do
241 @twitter = Twitter::Client.from_config('config/twitter.yml')
243 @user = Twitter::User.new(:id => @id, :screen_name => 'twitter4r')
244 @user.bless(@twitter)
247 it "should delegate to @client.user(@id, :followers)" do
248 @twitter.should_receive(:user).with(@id, :followers)
253 nilize(@twitter, @id, @user)
257 describe Test::Model, "#to_i" do
263 @model = Test::Model.new(:id => @id)
266 it "should return @id attribute" do
267 @model.to_i.should eql(@id)
275 describe Test::Model, "#to_s" do
280 @text = 'Some text for the message body here'
281 @model = Test::Model.new(:text => @text)
284 it "should return expected text when a @text attribute exists for the model" do
285 @model.to_s.should eql(@text)
293 describe Twitter::Message, ".find" do
294 it "should raise NotImplementedError due to Twitter (as opposed to Twitter4R) API limitation" do
296 Twitter::Message.find(123, nil)
297 }.should raise_error(NotImplementedError)
301 describe Twitter::Status, ".create" do
303 @twitter = client_context
304 @text = 'My status update'
305 @status = Twitter::Status.new(:text => @text, :client => @twitter)
308 it "should invoke #status(:post, text) on client context given" do
309 @twitter.should_receive(:status).with(:post, @text).and_return(@status)
310 Twitter::Status.create(:text => @text, :client => @twitter)
313 it "should raise an ArgumentError when no client is given in params" do
315 Twitter::Status.create(:text => @text)
316 }.should raise_error(ArgumentError)
319 it "should raise an ArgumentError when no text is given in params" do
320 @twitter.should_receive(:is_a?).with(Twitter::Client)
322 Twitter::Status.create(:client => @twitter)
323 }.should raise_error(ArgumentError)
326 it "should raise an ArgumentError when text given in params is not a String" do
328 Twitter::Status.create(:client => @twitter, :text => 234493)
329 }.should raise_error(ArgumentError)
332 it "should raise an ArgumentError when client context given in params is not a Twitter::Client object" do
334 Twitter::Status.create(:client => 'a string instead of a Twitter::Client', :text => @text)
335 }.should raise_error(ArgumentError)
339 nilize(@twitter, @text, @status)
343 describe Twitter::Message, ".create" do
345 @twitter = client_context
346 @text = 'Just between you and I, Lantana and Gosford Park are two of my favorite movies'
347 @recipient = Twitter::User.new(:id => 234958)
348 @message = Twitter::Message.new(:text => @text, :recipient => @recipient)
351 it "should invoke #message(:post, text, recipient) on client context given" do
352 @twitter.should_receive(:message).with(:post, @text, @recipient).and_return(@message)
353 Twitter::Message.create(:client => @twitter, :text => @text, :recipient => @recipient)
356 it "should raise an ArgumentError if no client context is given in params" do
358 Twitter::Message.create(:text => @text, :recipient => @recipient)
359 }.should raise_error(ArgumentError)
362 it "should raise an ArgumentError if client conext given in params is not a Twitter::Client object" do
364 Twitter::Message.create(
367 :recipient => @recipient)
368 }.should raise_error(ArgumentError)
371 it "should raise an ArgumentError if no text is given in params" do
372 @twitter.should_receive(:is_a?).with(Twitter::Client)
374 Twitter::Message.create(
376 :recipient => @recipient)
377 }.should raise_error(ArgumentError)
380 it "should raise an ArgumentError if text given in params is not a String" do
381 @twitter.should_receive(:is_a?).with(Twitter::Client)
383 Twitter::Message.create(
386 :recipient => @recipient)
387 }.should raise_error(ArgumentError)
390 it "should raise an ArgumentError if no recipient is given in params" do
391 @text.should_receive(:is_a?).with(String)
393 Twitter::Message.create(
396 }.should raise_error(ArgumentError)
399 it "should raise an ArgumentError if recipient given in params is not a Twitter::User, Integer or String object" do
400 @text.should_receive(:is_a?).with(String)
402 Twitter::Message.create(
405 :recipient => 3.14159)
406 }.should raise_error(ArgumentError)
410 nilize(@twitter, @text, @recipient, @message)
414 describe Twitter::User, "#befriend" do
416 @twitter = client_context
417 @user = Twitter::User.new(
419 :screen_name => 'mylogin',
421 @friend = Twitter::User.new(
423 :screen_name => 'friend',
427 it "should invoke #friend(:add, user) on client context" do
428 @twitter.should_receive(:friend).with(:add, @friend).and_return(@friend)
429 @user.befriend(@friend)
433 nilize(@twitter, @user, @friend)
437 describe Twitter::User, "#defriend" do
439 @twitter = client_context
440 @user = Twitter::User.new(
442 :screen_name => 'mylogin',
444 @friend = Twitter::User.new(
446 :screen_name => 'friend',
450 it "should invoke #friend(:remove, user) on client context" do
451 @twitter.should_receive(:friend).with(:remove, @friend).and_return(@friend)
452 @user.defriend(@friend)
456 nilize(@twitter, @user, @friend)