1 require File.expand_path(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, "#friends" do
199 @twitter = Twitter::Client.from_config('config/twitter.yml')
201 @user = Twitter::User.new(:id => @id, :screen_name => 'twitter4r')
202 @user.bless(@twitter)
205 it "should delegate to @client.user(@id, :friends)" do
206 @twitter.should_receive(:user).with(@id, :friends)
211 nilize(@twitter, @id, @user)
215 describe Twitter::User, "#followers" do
217 @twitter = Twitter::Client.from_config('config/twitter.yml')
219 @user = Twitter::User.new(:id => @id, :screen_name => 'twitter4r')
220 @user.bless(@twitter)
223 it "should delegate to @client.my(:followers)" do
224 @twitter.should_receive(:my).with(:followers, {})
229 nilize(@twitter, @id, @user)
233 describe Test::Model, "#to_i" do
239 @model = Test::Model.new(:id => @id)
242 it "should return @id attribute" do
243 @model.to_i.should eql(@id)
251 describe Test::Model, "#to_s" do
256 @text = 'Some text for the message body here'
257 @model = Test::Model.new(:text => @text)
260 it "should return expected text when a @text attribute exists for the model" do
261 @model.to_s.should eql(@text)
269 describe Twitter::Message, ".find" do
270 it "should raise NotImplementedError due to Twitter (as opposed to Twitter4R) API limitation" do
272 Twitter::Message.find(123, nil)
273 }.should raise_error(NotImplementedError)
277 describe Twitter::Status, ".create" do
279 @twitter = client_context
280 @text = 'My status update'
281 @status = Twitter::Status.new(:text => @text, :client => @twitter)
284 it "should invoke #status(:post, text) on client context given" do
285 @twitter.should_receive(:status).with(:post, @text).and_return(@status)
286 Twitter::Status.create(:text => @text, :client => @twitter)
289 it "should raise an ArgumentError when no client is given in params" do
291 Twitter::Status.create(:text => @text)
292 }.should raise_error(ArgumentError)
295 it "should raise an ArgumentError when no text is given in params" do
296 @twitter.should_receive(:is_a?).with(Twitter::Client)
298 Twitter::Status.create(:client => @twitter)
299 }.should raise_error(ArgumentError)
302 it "should raise an ArgumentError when text given in params is not a String" do
304 Twitter::Status.create(:client => @twitter, :text => 234493)
305 }.should raise_error(ArgumentError)
308 it "should raise an ArgumentError when client context given in params is not a Twitter::Client object" do
310 Twitter::Status.create(:client => 'a string instead of a Twitter::Client', :text => @text)
311 }.should raise_error(ArgumentError)
315 nilize(@twitter, @text, @status)
319 describe Twitter::Message, ".create" do
321 @twitter = client_context
322 @text = 'Just between you and I, Lantana and Gosford Park are two of my favorite movies'
323 @recipient = Twitter::User.new(:id => 234958)
324 @message = Twitter::Message.new(:text => @text, :recipient => @recipient)
327 it "should invoke #message(:post, text, recipient) on client context given" do
328 @twitter.should_receive(:message).with(:post, @text, @recipient).and_return(@message)
329 Twitter::Message.create(:client => @twitter, :text => @text, :recipient => @recipient)
332 it "should raise an ArgumentError if no client context is given in params" do
334 Twitter::Message.create(:text => @text, :recipient => @recipient)
335 }.should raise_error(ArgumentError)
338 it "should raise an ArgumentError if client conext given in params is not a Twitter::Client object" do
340 Twitter::Message.create(
343 :recipient => @recipient)
344 }.should raise_error(ArgumentError)
347 it "should raise an ArgumentError if no text is given in params" do
348 @twitter.should_receive(:is_a?).with(Twitter::Client)
350 Twitter::Message.create(
352 :recipient => @recipient)
353 }.should raise_error(ArgumentError)
356 it "should raise an ArgumentError if text given in params is not a String" do
357 @twitter.should_receive(:is_a?).with(Twitter::Client)
359 Twitter::Message.create(
362 :recipient => @recipient)
363 }.should raise_error(ArgumentError)
366 it "should raise an ArgumentError if no recipient is given in params" do
367 @text.should_receive(:is_a?).with(String)
369 Twitter::Message.create(
372 }.should raise_error(ArgumentError)
375 it "should raise an ArgumentError if recipient given in params is not a Twitter::User, Integer or String object" do
376 @text.should_receive(:is_a?).with(String)
378 Twitter::Message.create(
381 :recipient => 3.14159)
382 }.should raise_error(ArgumentError)
386 nilize(@twitter, @text, @recipient, @message)
390 describe Twitter::User, "#befriend" do
392 @twitter = client_context
393 @user = Twitter::User.new(
395 :screen_name => 'mylogin',
397 @friend = Twitter::User.new(
399 :screen_name => 'friend',
403 it "should invoke #friend(:add, user) on client context" do
404 @twitter.should_receive(:friend).with(:add, @friend).and_return(@friend)
405 @user.befriend(@friend)
409 nilize(@twitter, @user, @friend)
413 describe Twitter::User, "#defriend" do
415 @twitter = client_context
416 @user = Twitter::User.new(
418 :screen_name => 'mylogin',
420 @friend = Twitter::User.new(
422 :screen_name => 'friend',
426 it "should invoke #friend(:remove, user) on client context" do
427 @twitter.should_receive(:friend).with(:remove, @friend).and_return(@friend)
428 @user.defriend(@friend)
432 nilize(@twitter, @user, @friend)
436 describe Twitter::Status, "#reply?" do
438 @status = Twitter::Status.new(
441 :user => mock(Twitter::User)
443 @reply = Twitter::Status.new(
444 :text => "No much bro. You?",
445 :user => mock(Twitter::User),
446 :in_reply_to_status_id => @status.id
450 it "should return false for the original status" do
451 @status.reply?.should be(false)
454 it "should return true for the reply to the original status" do
455 @reply.reply?.should be(true)
459 describe Twitter::Status, "#reply(status_text)" do
461 @twitter = client_context
462 @status = Twitter::Status.new(
464 :text => "The status text",
466 @reply_text = "Reply text goes here"
467 @reply_status = Twitter::Status.new()
470 it "should invoke #status(:reply, :status => ..., :in_reply_to_status_id => ...) on client context" do
471 @twitter.should_receive(:status).with(:reply, :status => @reply_text, :in_reply_to_status_id => @status.id).and_return(@reply_status)
472 @status.reply(@reply_text)
476 nilize(@twitter, @status)
480 describe Twitter::Status, "#to_s" do
483 @status = Twitter::Status.new(:text => @text)
486 it "should render text attribute" do
487 @status.to_s.should be(@text)
491 nilize(@text, @status)
495 describe Twitter::Message, "#to_s" do
498 @message = Twitter::Message.new(:text => @text)
501 it "should render text attribute" do
502 @message.to_s.should be(@text)
506 nilize(@text, @message)