require 'helper' describe Twitter::API::Tweets do before do @client = Twitter::Client.new end describe "#retweets" do before do stub_get("/1.1/statuses/retweets/28561922516.json").to_return(:body => fixture("retweets.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "requests the correct resource" do @client.retweets(28561922516) expect(a_get("/1.1/statuses/retweets/28561922516.json")).to have_been_made end it "returns up to 100 of the first retweets of a given tweet" do tweets = @client.retweets(28561922516) expect(tweets).to be_an Array expect(tweets.first).to be_a Twitter::Tweet expect(tweets.first.text).to eq "RT @gruber: As for the Series, I'm for the Giants. Fuck Texas, fuck Nolan Ryan, fuck George Bush." end end describe "#retweeters_of" do context "with ids_only passed" do before do stub_get("/1.1/statuses/retweets/28561922516.json").to_return(:body => fixture("retweets.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "requests the correct resource" do @client.retweeters_of(28561922516, :ids_only => true) expect(a_get("/1.1/statuses/retweets/28561922516.json")).to have_been_made end it "returns an array of numeric user IDs of retweeters of a Tweet" do ids = @client.retweeters_of(28561922516, :ids_only => true) expect(ids).to be_an Array expect(ids.first).to eq 7505382 end end context "without ids_only passed" do before do stub_get("/1.1/statuses/retweets/28561922516.json").to_return(:body => fixture("retweets.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "requests the correct resource" do @client.retweeters_of(28561922516) expect(a_get("/1.1/statuses/retweets/28561922516.json")).to have_been_made end it "returns an array of user of retweeters of a Tweet" do users = @client.retweeters_of(28561922516) expect(users).to be_an Array expect(users.first).to be_a Twitter::User expect(users.first.id).to eq 7505382 end end end describe "#status" do before do stub_get("/1.1/statuses/show/25938088801.json").to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "requests the correct resource" do @client.status(25938088801) expect(a_get("/1.1/statuses/show/25938088801.json")).to have_been_made end it "returns a Tweet" do tweet = @client.status(25938088801) expect(tweet).to be_a Twitter::Tweet expect(tweet.text).to eq "The problem with your code is that it's doing exactly what you told it to do." end end describe "#statuses" do before do stub_get("/1.1/statuses/show/25938088801.json").to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "requests the correct resource" do @client.statuses(25938088801) expect(a_get("/1.1/statuses/show/25938088801.json")).to have_been_made end it "returns an array of Tweets" do tweets = @client.statuses(25938088801) expect(tweets).to be_an Array expect(tweets.first).to be_a Twitter::Tweet expect(tweets.first.text).to eq "The problem with your code is that it's doing exactly what you told it to do." end end describe "#status_destroy" do before do stub_post("/1.1/statuses/destroy/25938088801.json").to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "requests the correct resource" do @client.status_destroy(25938088801) expect(a_post("/1.1/statuses/destroy/25938088801.json")).to have_been_made end it "returns an array of Tweets" do tweets = @client.status_destroy(25938088801) expect(tweets).to be_an Array expect(tweets.first).to be_a Twitter::Tweet expect(tweets.first.text).to eq "The problem with your code is that it's doing exactly what you told it to do." end end describe "#tweet" do before do stub_post("/1.1/statuses/update.json").with(:body => {:status => "The problem with your code is that it's doing exactly what you told it to do."}).to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "requests the correct resource" do @client.update("The problem with your code is that it's doing exactly what you told it to do.") expect(a_post("/1.1/statuses/update.json").with(:body => {:status => "The problem with your code is that it's doing exactly what you told it to do."})).to have_been_made end it "returns a Tweet" do tweet = @client.update("The problem with your code is that it's doing exactly what you told it to do.") expect(tweet).to be_a Twitter::Tweet expect(tweet.text).to eq "The problem with your code is that it's doing exactly what you told it to do." end end describe "#retweet" do before do stub_post("/1.1/statuses/retweet/28561922516.json").to_return(:body => fixture("retweet.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "requests the correct resource" do @client.retweet(28561922516) expect(a_post("/1.1/statuses/retweet/28561922516.json")).to have_been_made end it "returns an array of Tweets with retweet details embedded" do tweets = @client.retweet(28561922516) expect(tweets).to be_an Array expect(tweets.first).to be_a Twitter::Tweet expect(tweets.first.text).to eq "As for the Series, I'm for the Giants. Fuck Texas, fuck Nolan Ryan, fuck George Bush." expect(tweets.first.retweeted_tweet.text).to eq "RT @gruber: As for the Series, I'm for the Giants. Fuck Texas, fuck Nolan Ryan, fuck George Bush." expect(tweets.first.retweeted_tweet.id).not_to eq tweets.first.id end context "already retweeted" do before do stub_post("/1.1/statuses/retweet/28561922516.json").to_return(:status => 403, :body => fixture("already_retweeted.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "does not raise an error" do expect{@client.retweet(28561922516)}.not_to raise_error end end end describe "#retweet!" do before do stub_post("/1.1/statuses/retweet/28561922516.json").to_return(:body => fixture("retweet.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "requests the correct resource" do @client.retweet!(28561922516) expect(a_post("/1.1/statuses/retweet/28561922516.json")).to have_been_made end it "returns an array of Tweets with retweet details embedded" do tweets = @client.retweet!(28561922516) expect(tweets).to be_an Array expect(tweets.first).to be_a Twitter::Tweet expect(tweets.first.text).to eq "As for the Series, I'm for the Giants. Fuck Texas, fuck Nolan Ryan, fuck George Bush." expect(tweets.first.retweeted_tweet.text).to eq "RT @gruber: As for the Series, I'm for the Giants. Fuck Texas, fuck Nolan Ryan, fuck George Bush." expect(tweets.first.retweeted_tweet.id).not_to eq tweets.first.id end context "fobidden" do before do stub_post("/1.1/statuses/retweet/28561922516.json").to_return(:status => 403, :headers => {:content_type => "application/json; charset=utf-8"}) end it "raises a Forbidden error" do expect{@client.retweet!(28561922516)}.to raise_error Twitter::Error::Forbidden end end context "already retweeted" do before do stub_post("/1.1/statuses/retweet/28561922516.json").to_return(:status => 403, :body => fixture("already_retweeted.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "raises an AlreadyRetweeted error" do expect{@client.retweet!(28561922516)}.to raise_error Twitter::Error::AlreadyRetweeted end end end describe "#update_with_media" do before do stub_post("/1.1/statuses/update_with_media.json").to_return(:body => fixture("status_with_media.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end context "a gif image" do it "requests the correct resource" do @client.update_with_media("You always have options", fixture("pbjt.gif")) expect(a_post("/1.1/statuses/update_with_media.json")).to have_been_made end it "returns a Tweet" do tweet = @client.update_with_media("You always have options", fixture("pbjt.gif")) expect(tweet).to be_a Twitter::Tweet expect(tweet.text).to eq "You always have options http://t.co/CBYa7Ri" end end context "a jpe image" do it "requests the correct resource" do @client.update_with_media("You always have options", fixture("wildcomet2.jpe")) expect(a_post("/1.1/statuses/update_with_media.json")).to have_been_made end end context "a jpeg image" do it "requests the correct resource" do @client.update_with_media("You always have options", fixture("me.jpeg")) expect(a_post("/1.1/statuses/update_with_media.json")).to have_been_made end end context "a png image" do it "requests the correct resource" do @client.update_with_media("You always have options", fixture("we_concept_bg2.png")) expect(a_post("/1.1/statuses/update_with_media.json")).to have_been_made end end context "a Tempfile" do it "requests the correct resource" do @client.update_with_media("You always have options", Tempfile.new("tmp")) expect(a_post("/1.1/statuses/update_with_media.json")).to have_been_made end end end describe "#oembed" do before do stub_get("/1.1/statuses/oembed.json").with(:query => {:id => "25938088801"}).to_return(:body => fixture("oembed.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "requests the correct resource" do @client.oembed(25938088801) expect(a_get("/1.1/statuses/oembed.json").with(:query => {:id => "25938088801"})).to have_been_made end it "returns an array of OEmbed instances" do oembed = @client.oembed(25938088801) expect(oembed).to be_a Twitter::OEmbed end end describe "#oembeds" do before do stub_get("/1.1/statuses/oembed.json").with(:query => {:id => "25938088801"}).to_return(:body => fixture("oembed.json"), :headers => {:content_type => "application/json; charset=utf-8"}) end it "requests the correct resource" do @client.oembeds(25938088801) expect(a_get("/1.1/statuses/oembed.json").with(:query => {:id => "25938088801"})).to have_been_made end it "returns an array of OEmbed instances" do oembeds = @client.oembeds(25938088801) expect(oembeds).to be_an Array expect(oembeds.first).to be_a Twitter::OEmbed end end end