deedubs-twitter 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History +206 -0
- data/License +20 -0
- data/Notes +33 -0
- data/README.rdoc +19 -0
- data/Rakefile +103 -0
- data/VERSION.yml +4 -0
- data/examples/connect.rb +30 -0
- data/examples/friendship_existance.rb +13 -0
- data/examples/helpers/config_store.rb +38 -0
- data/examples/httpauth.rb +11 -0
- data/examples/ids.rb +13 -0
- data/examples/search.rb +15 -0
- data/examples/timeline.rb +19 -0
- data/examples/unauthorized.rb +16 -0
- data/examples/update.rb +11 -0
- data/examples/user.rb +5 -0
- data/lib/twitter/base.rb +165 -0
- data/lib/twitter/httpauth.rb +27 -0
- data/lib/twitter/oauth.rb +41 -0
- data/lib/twitter/request.rb +102 -0
- data/lib/twitter/search.rb +106 -0
- data/lib/twitter/trends.rb +29 -0
- data/lib/twitter.rb +63 -0
- data/test/fixtures/firehose.json +1 -0
- data/test/fixtures/follower_ids.json +1 -0
- data/test/fixtures/friend_ids.json +1 -0
- data/test/fixtures/friends_timeline.json +1 -0
- data/test/fixtures/rate_limit_exceeded.json +1 -0
- data/test/fixtures/replies.json +1 -0
- data/test/fixtures/search.json +1 -0
- data/test/fixtures/search_from_jnunemaker.json +1 -0
- data/test/fixtures/status.json +1 -0
- data/test/fixtures/status_show.json +1 -0
- data/test/fixtures/trends_current.json +1 -0
- data/test/fixtures/trends_current_exclude.json +1 -0
- data/test/fixtures/trends_daily.json +1 -0
- data/test/fixtures/trends_daily_date.json +1 -0
- data/test/fixtures/trends_daily_exclude.json +1 -0
- data/test/fixtures/trends_weekly.json +1 -0
- data/test/fixtures/trends_weekly_date.json +1 -0
- data/test/fixtures/trends_weekly_exclude.json +1 -0
- data/test/fixtures/user.json +1 -0
- data/test/fixtures/user_timeline.json +1 -0
- data/test/test_helper.rb +36 -0
- data/test/twitter/base_test.rb +95 -0
- data/test/twitter/httpauth_test.rb +76 -0
- data/test/twitter/oauth_test.rb +81 -0
- data/test/twitter/request_test.rb +217 -0
- data/test/twitter/search_test.rb +144 -0
- data/test/twitter/trends_test.rb +95 -0
- data/test/twitter_test.rb +38 -0
- metadata +200 -0
@@ -0,0 +1 @@
|
|
1
|
+
{"profile_background_tile":false,"friends_count":159,"description":"Loves his wife, ruby, notre dame football and iu basketball","utc_offset":-18000,"notifications":null,"favourites_count":79,"profile_background_color":"1A1B1F","following":null,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","statuses_count":4752,"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","profile_text_color":"666666","url":"http:\/\/railstips.org\/about","name":"John Nunemaker","time_zone":"Indiana (East)","protected":false,"screen_name":"jnunemaker","status":{"in_reply_to_status_id":null,"in_reply_to_user_id":null,"text":"224! http:\/\/flightcontrolled.com\/ Holy crap. There are some really high flight control scorers out there. *gives up* :D","favorited":false,"in_reply_to_screen_name":null,"created_at":"Tue Apr 14 20:38:49 +0000 2009","truncated":false,"id":1519558635,"source":"<a href=\"http:\/\/twitter.rubyforge.org\">Twitter App<\/a>"},"profile_link_color":"2FC2EF","created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_sidebar_fill_color":"252429","followers_count":1248,"location":"Mishawaka, Indiana","id":4243,"profile_sidebar_border_color":"181A1E"}
|
@@ -0,0 +1 @@
|
|
1
|
+
[{"in_reply_to_screen_name":null,"user":{"description":"Loves his wife, ruby, notre dame football and iu basketball","time_zone":"Indiana (East)","utc_offset":-18000,"profile_sidebar_border_color":"181A1E","notifications":false,"profile_background_tile":false,"friends_count":160,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","following":true,"favourites_count":74,"profile_background_color":"1A1B1F","url":"http:\/\/railstips.org\/about","screen_name":"jnunemaker","name":"John Nunemaker","statuses_count":4666,"protected":false,"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","profile_text_color":"666666","created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_link_color":"2FC2EF","location":"Mishawaka, Indiana","id":4243,"profile_sidebar_fill_color":"252429","followers_count":1234},"text":"Colder out today than expected. Headed to the Beanery for some morning wakeup drink. Latte or coffee...hmmm...","truncated":false,"in_reply_to_status_id":null,"in_reply_to_user_id":null,"created_at":"Fri Apr 03 15:42:24 +0000 2009","favorited":false,"id":1445986256,"source":"<a href=\"http:\/\/www.atebits.com\/software\/tweetie\/\">Tweetie<\/a>"},{"in_reply_to_screen_name":"jerry","user":{"notifications":false,"profile_background_tile":false,"friends_count":160,"description":"Loves his wife, ruby, notre dame football and iu basketball","time_zone":"Indiana (East)","utc_offset":-18000,"favourites_count":73,"profile_background_color":"1A1B1F","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","following":true,"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","profile_text_color":"666666","url":"http:\/\/railstips.org\/about","screen_name":"jnunemaker","name":"John Nunemaker","statuses_count":4665,"protected":false,"profile_link_color":"2FC2EF","created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_sidebar_fill_color":"252429","location":"Mishawaka, Indiana","id":4243,"profile_sidebar_border_color":"181A1E","followers_count":1231},"text":"@jerry haha. @erunyon said he didn't think it was unique enough for google searches. :)","truncated":false,"in_reply_to_status_id":1442399154,"in_reply_to_user_id":613,"created_at":"Fri Apr 03 03:34:26 +0000 2009","favorited":false,"id":1443087283,"source":"web"},{"in_reply_to_screen_name":null,"user":{"profile_sidebar_border_color":"181A1E","description":"Loves his wife, ruby, notre dame football and iu basketball","time_zone":"Indiana (East)","utc_offset":-18000,"friends_count":161,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","following":true,"notifications":false,"profile_background_color":"1A1B1F","url":"http:\/\/railstips.org\/about","screen_name":"jnunemaker","name":"John Nunemaker","profile_background_tile":false,"profile_text_color":"666666","followers_count":1231,"protected":false,"favourites_count":73,"created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_link_color":"2FC2EF","statuses_count":4664,"profile_sidebar_fill_color":"252429","location":"Mishawaka, Indiana","id":4243,"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif"},"text":"Rob Dyrdek is the funniest man alive. That is all.","truncated":false,"in_reply_to_status_id":null,"in_reply_to_user_id":null,"created_at":"Thu Apr 02 22:57:00 +0000 2009","favorited":false,"id":1441588944,"source":"<a href=\"http:\/\/www.atebits.com\/software\/tweetie\/\">Tweetie<\/a>"},{"favorited":false,"user":{"profile_sidebar_fill_color":"252429","description":"Loves his wife, ruby, notre dame football and iu basketball","utc_offset":-18000,"profile_sidebar_border_color":"181A1E","followers_count":1228,"following":true,"notifications":false,"profile_background_tile":false,"friends_count":161,"time_zone":"Indiana (East)","url":"http:\/\/railstips.org\/about","name":"John Nunemaker","favourites_count":73,"profile_background_color":"1A1B1F","protected":false,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","profile_text_color":"666666","screen_name":"jnunemaker","statuses_count":4663,"profile_link_color":"2FC2EF","location":"Mishawaka, Indiana","id":4243,"created_at":"Sun Aug 13 22:56:06 +0000 2006"},"text":"Dang, forgot about CAN http:\/\/calendaraboutnothing.com\/~jnunemaker yesterday and broke my streak of 5 days in a row.","in_reply_to_screen_name":null,"truncated":false,"in_reply_to_status_id":null,"id":1438916463,"in_reply_to_user_id":null,"source":"web","created_at":"Thu Apr 02 15:24:17 +0000 2009"},{"favorited":false,"user":{"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","friends_count":161,"description":"Loves his wife, ruby, notre dame football and iu basketball","utc_offset":-18000,"profile_background_color":"1A1B1F","following":true,"time_zone":"Indiana (East)","profile_text_color":"666666","followers_count":1228,"url":"http:\/\/railstips.org\/about","name":"John Nunemaker","protected":false,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","notifications":false,"profile_background_tile":false,"favourites_count":73,"profile_link_color":"2FC2EF","screen_name":"jnunemaker","statuses_count":4662,"profile_sidebar_fill_color":"252429","location":"Mishawaka, Indiana","id":4243,"created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_sidebar_border_color":"181A1E"},"text":"@bryckbost yep. I haven't used dash much but it seems cool. Give it a try.","in_reply_to_screen_name":"bryckbost","truncated":false,"in_reply_to_status_id":1438082787,"id":1438754546,"in_reply_to_user_id":8494682,"source":"<a href=\"http:\/\/www.atebits.com\/software\/tweetie\/\">Tweetie<\/a>","created_at":"Thu Apr 02 14:57:49 +0000 2009"},{"favorited":false,"user":{"profile_sidebar_fill_color":"252429","description":"Loves his wife, ruby, notre dame football and iu basketball","utc_offset":-18000,"profile_sidebar_border_color":"181A1E","followers_count":1228,"following":true,"notifications":false,"profile_background_tile":false,"friends_count":161,"time_zone":"Indiana (East)","url":"http:\/\/railstips.org\/about","name":"John Nunemaker","favourites_count":73,"profile_background_color":"1A1B1F","protected":false,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","profile_text_color":"666666","screen_name":"jnunemaker","statuses_count":4661,"profile_link_color":"2FC2EF","location":"Mishawaka, Indiana","id":4243,"created_at":"Sun Aug 13 22:56:06 +0000 2006"},"text":"@nateklaiber dive into python is free online.","in_reply_to_screen_name":"nateklaiber","truncated":false,"in_reply_to_status_id":1438415604,"id":1438718326,"in_reply_to_user_id":13722,"source":"<a href=\"http:\/\/www.atebits.com\/software\/tweetie\/\">Tweetie<\/a>","created_at":"Thu Apr 02 14:51:47 +0000 2009"},{"in_reply_to_screen_name":null,"user":{"friends_count":161,"profile_background_color":"1A1B1F","description":"Loves his wife, ruby, notre dame football and iu basketball","time_zone":"Indiana (East)","utc_offset":-18000,"favourites_count":72,"profile_text_color":"666666","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","following":true,"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","profile_link_color":"2FC2EF","url":"http:\/\/railstips.org\/about","screen_name":"jnunemaker","name":"John Nunemaker","protected":false,"statuses_count":4660,"profile_sidebar_fill_color":"252429","notifications":false,"created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_sidebar_border_color":"181A1E","followers_count":1228,"profile_background_tile":false,"location":"Mishawaka, Indiana","id":4243},"text":"@kebabsylan yes. I'll be there at noon.","truncated":false,"in_reply_to_status_id":null,"in_reply_to_user_id":null,"created_at":"Thu Apr 02 14:38:03 +0000 2009","favorited":false,"id":1438637063,"source":"<a href=\"http:\/\/help.twitter.com\/index.php?pg=kb.page&id=75\">txt<\/a>"},{"in_reply_to_screen_name":null,"user":{"notifications":false,"profile_background_tile":false,"friends_count":161,"description":"Loves his wife, ruby, notre dame football and iu basketball","time_zone":"Indiana (East)","utc_offset":-18000,"favourites_count":72,"profile_background_color":"1A1B1F","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","following":true,"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","profile_text_color":"666666","url":"http:\/\/railstips.org\/about","screen_name":"jnunemaker","name":"John Nunemaker","statuses_count":4659,"protected":false,"profile_link_color":"2FC2EF","created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_sidebar_fill_color":"252429","location":"Mishawaka, Indiana","id":4243,"profile_sidebar_border_color":"181A1E","followers_count":1228},"text":"http:\/\/twitpic.com\/2pwjy - The books I'm reading right now. Wish I had more time.","truncated":false,"in_reply_to_status_id":null,"in_reply_to_user_id":null,"created_at":"Thu Apr 02 14:34:10 +0000 2009","favorited":false,"id":1438613754,"source":"<a href=\"http:\/\/twitpic.com\/\">TwitPic<\/a>"},{"favorited":false,"user":{"statuses_count":4658,"profile_background_color":"1A1B1F","description":"Loves his wife, ruby, notre dame football and iu basketball","utc_offset":-18000,"followers_count":1226,"profile_text_color":"666666","following":true,"favourites_count":72,"time_zone":"Indiana (East)","profile_link_color":"2FC2EF","url":"http:\/\/railstips.org\/about","name":"John Nunemaker","protected":false,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","notifications":false,"profile_sidebar_fill_color":"252429","friends_count":161,"screen_name":"jnunemaker","profile_sidebar_border_color":"181A1E","profile_background_tile":false,"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","location":"Mishawaka, Indiana","id":4243,"created_at":"Sun Aug 13 22:56:06 +0000 2006"},"text":"Reading a couple hokey named books of late, but really enjoying them. \"I Will Teach You To Be Rich\" and \"Get Anyone To Do Anything\".","in_reply_to_screen_name":null,"truncated":false,"in_reply_to_status_id":null,"id":1436286949,"in_reply_to_user_id":null,"source":"web","created_at":"Thu Apr 02 03:52:02 +0000 2009"},{"favorited":false,"user":{"profile_link_color":"2FC2EF","description":"Loves his wife, ruby, notre dame football and iu basketball","utc_offset":-18000,"profile_sidebar_fill_color":"252429","followers_count":1226,"following":true,"time_zone":"Indiana (East)","profile_sidebar_border_color":"181A1E","url":"http:\/\/railstips.org\/about","name":"John Nunemaker","notifications":false,"profile_background_tile":false,"friends_count":161,"protected":false,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","favourites_count":72,"profile_background_color":"1A1B1F","screen_name":"jnunemaker","statuses_count":4657,"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","profile_text_color":"666666","location":"Mishawaka, Indiana","id":4243,"created_at":"Sun Aug 13 22:56:06 +0000 2006"},"text":"Megan Joy turned into a train wreck tonight.","in_reply_to_screen_name":null,"truncated":false,"in_reply_to_status_id":null,"id":1435963959,"in_reply_to_user_id":null,"source":"<a href=\"http:\/\/help.twitter.com\/index.php?pg=kb.page&id=75\">txt<\/a>","created_at":"Thu Apr 02 02:51:01 +0000 2009"},{"in_reply_to_screen_name":null,"user":{"notifications":false,"profile_background_tile":false,"friends_count":161,"description":"Loves his wife, ruby, notre dame football and iu basketball","time_zone":"Indiana (East)","utc_offset":-18000,"favourites_count":72,"profile_background_color":"1A1B1F","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","following":true,"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","profile_text_color":"666666","url":"http:\/\/railstips.org\/about","screen_name":"jnunemaker","name":"John Nunemaker","statuses_count":4656,"protected":false,"profile_link_color":"2FC2EF","created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_sidebar_fill_color":"252429","location":"Mishawaka, Indiana","id":4243,"profile_sidebar_border_color":"181A1E","followers_count":1226},"text":"Watching latest House. Cool idea.","truncated":false,"in_reply_to_status_id":null,"in_reply_to_user_id":null,"created_at":"Thu Apr 02 01:25:46 +0000 2009","favorited":false,"id":1435502494,"source":"<a href=\"http:\/\/www.atebits.com\/software\/tweetie\/\">Tweetie<\/a>"},{"favorited":false,"user":{"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","friends_count":161,"description":"Loves his wife, ruby, notre dame football and iu basketball","utc_offset":-18000,"profile_sidebar_border_color":"181A1E","following":true,"time_zone":"Indiana (East)","profile_background_color":"1A1B1F","followers_count":1226,"url":"http:\/\/railstips.org\/about","name":"John Nunemaker","protected":false,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","notifications":false,"profile_background_tile":false,"favourites_count":72,"profile_text_color":"666666","screen_name":"jnunemaker","statuses_count":4655,"profile_link_color":"2FC2EF","location":"Mishawaka, Indiana","id":4243,"created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_sidebar_fill_color":"252429"},"text":"@rwdaigle not a motorcycle man?","in_reply_to_screen_name":"rwdaigle","truncated":false,"in_reply_to_status_id":1435366505,"id":1435443029,"in_reply_to_user_id":658343,"source":"<a href=\"http:\/\/www.atebits.com\/software\/tweetie\/\">Tweetie<\/a>","created_at":"Thu Apr 02 01:14:52 +0000 2009"},{"favorited":false,"user":{"profile_sidebar_border_color":"181A1E","followers_count":1226,"description":"Loves his wife, ruby, notre dame football and iu basketball","profile_background_tile":false,"utc_offset":-18000,"following":true,"friends_count":161,"profile_background_color":"1A1B1F","time_zone":"Indiana (East)","url":"http:\/\/railstips.org\/about","name":"John Nunemaker","favourites_count":72,"profile_text_color":"666666","protected":false,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","profile_link_color":"2FC2EF","screen_name":"jnunemaker","statuses_count":4654,"profile_sidebar_fill_color":"252429","location":"Mishawaka, Indiana","id":4243,"notifications":false,"created_at":"Sun Aug 13 22:56:06 +0000 2006"},"text":"@bradleyktaylor I did some ruby wufoo a few months back. It's on github.","in_reply_to_screen_name":"bradleyktaylor","truncated":false,"in_reply_to_status_id":1435320189,"id":1435440065,"in_reply_to_user_id":13782402,"source":"<a href=\"http:\/\/www.atebits.com\/software\/tweetie\/\">Tweetie<\/a>","created_at":"Thu Apr 02 01:14:19 +0000 2009"},{"in_reply_to_screen_name":"stickel","user":{"notifications":true,"profile_background_tile":false,"friends_count":161,"description":"Loves his wife, ruby, notre dame football and iu basketball","time_zone":"Indiana (East)","utc_offset":-18000,"favourites_count":72,"profile_background_color":"1A1B1F","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","following":true,"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","profile_text_color":"666666","url":"http:\/\/railstips.org\/about","screen_name":"jnunemaker","name":"John Nunemaker","statuses_count":4653,"protected":false,"profile_link_color":"2FC2EF","created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_sidebar_fill_color":"252429","location":"Mishawaka, Indiana","id":4243,"profile_sidebar_border_color":"181A1E","followers_count":1226},"text":"@stickel riding bitch on motorcycle. Bike died once on trip and had to ride on back of my dad's.","truncated":false,"in_reply_to_status_id":1435238296,"in_reply_to_user_id":15403,"created_at":"Thu Apr 02 01:12:46 +0000 2009","favorited":false,"id":1435431849,"source":"<a href=\"http:\/\/www.atebits.com\/software\/tweetie\/\">Tweetie<\/a>"},{"in_reply_to_screen_name":"stickel","user":{"description":"Loves his wife, ruby, notre dame football and iu basketball","time_zone":"Indiana (East)","utc_offset":-18000,"profile_background_color":"1A1B1F","followers_count":1226,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","following":true,"notifications":true,"profile_background_tile":false,"favourites_count":72,"profile_text_color":"666666","url":"http:\/\/railstips.org\/about","screen_name":"jnunemaker","name":"John Nunemaker","statuses_count":4652,"profile_link_color":"2FC2EF","protected":false,"created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_sidebar_fill_color":"252429","profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","friends_count":161,"profile_sidebar_border_color":"181A1E","location":"Mishawaka, Indiana","id":4243},"text":"@stickel haha. Having done that twice I wouldn't wish it on anyone. :)","truncated":false,"in_reply_to_status_id":1435063394,"in_reply_to_user_id":15403,"created_at":"Thu Apr 02 00:31:52 +0000 2009","favorited":false,"id":1435217155,"source":"<a href=\"http:\/\/www.atebits.com\/software\/tweetie\/\">Tweetie<\/a>"},{"favorited":false,"user":{"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","friends_count":161,"description":"Loves his wife, ruby, notre dame football and iu basketball","utc_offset":-18000,"profile_sidebar_border_color":"181A1E","following":true,"time_zone":"Indiana (East)","profile_background_color":"1A1B1F","followers_count":1225,"url":"http:\/\/railstips.org\/about","name":"John Nunemaker","protected":false,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","notifications":false,"profile_background_tile":false,"favourites_count":72,"profile_text_color":"666666","screen_name":"jnunemaker","statuses_count":4651,"profile_link_color":"2FC2EF","location":"Mishawaka, Indiana","id":4243,"created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_sidebar_fill_color":"252429"},"text":"@stickel Dude. We would roll in and be like \"LISTEN UP! WE ARE WEB DEVELOPERS!\" Heads would turn.","in_reply_to_screen_name":"stickel","truncated":false,"in_reply_to_status_id":1434706104,"id":1434998057,"in_reply_to_user_id":15403,"source":"web","created_at":"Wed Apr 01 23:46:00 +0000 2009"},{"in_reply_to_screen_name":null,"user":{"notifications":false,"profile_background_tile":false,"friends_count":179,"description":"Loves his wife, ruby, notre dame football and iu basketball","time_zone":"Indiana (East)","utc_offset":-18000,"favourites_count":72,"profile_background_color":"1A1B1F","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","following":true,"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","profile_text_color":"666666","url":"http:\/\/railstips.org\/about","screen_name":"jnunemaker","name":"John Nunemaker","statuses_count":4650,"protected":false,"profile_link_color":"2FC2EF","created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_sidebar_fill_color":"252429","location":"Mishawaka, Indiana","id":4243,"profile_sidebar_border_color":"181A1E","followers_count":1226},"text":"Sat on a fat bob today. Want! http:\/\/tr.im\/i7ha Love the flat black. Wish I could get a used one for less money, but they are too new.","truncated":false,"in_reply_to_status_id":null,"in_reply_to_user_id":null,"created_at":"Wed Apr 01 23:16:13 +0000 2009","favorited":false,"id":1434842036,"source":"web"},{"favorited":false,"user":{"profile_background_image_url":"http:\/\/static.twitter.com\/images\/themes\/theme9\/bg.gif","friends_count":179,"description":"Loves his wife, ruby, notre dame football and iu basketball","utc_offset":-18000,"profile_background_color":"1A1B1F","following":true,"time_zone":"Indiana (East)","profile_text_color":"666666","followers_count":1226,"url":"http:\/\/railstips.org\/about","name":"John Nunemaker","protected":false,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","notifications":false,"profile_background_tile":false,"favourites_count":72,"profile_link_color":"2FC2EF","screen_name":"jnunemaker","statuses_count":4649,"profile_sidebar_fill_color":"252429","location":"Mishawaka, Indiana","id":4243,"created_at":"Sun Aug 13 22:56:06 +0000 2006","profile_sidebar_border_color":"181A1E"},"text":"@Carrie I agree with @orderedlist. Taco Bell is better than Hacienda.","in_reply_to_screen_name":"Carrie","truncated":false,"in_reply_to_status_id":1434732331,"id":1434741725,"in_reply_to_user_id":15323,"source":"<a href=\"http:\/\/loungeapp.com\">Lounge<\/a>","created_at":"Wed Apr 01 22:57:45 +0000 2009"},{"truncated":false,"user":{"description":"Loves his wife, ruby, notre dame football and iu basketball","url":"http:\/\/railstips.org\/about","name":"John Nunemaker","protected":false,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","location":"Mishawaka, Indiana","id":4243,"followers_count":1226,"screen_name":"jnunemaker"},"in_reply_to_status_id":null,"text":"Just test drove an Escape with @nunieswife and visited the Harley Store. Johnny want a Harley...BAD!","in_reply_to_user_id":null,"favorited":false,"created_at":"Wed Apr 01 22:31:04 +0000 2009","in_reply_to_screen_name":null,"id":1434591491,"source":"web"},{"truncated":false,"user":{"description":"Loves his wife, ruby, notre dame football and iu basketball","url":"http:\/\/railstips.org\/about","name":"John Nunemaker","protected":false,"profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/61024905\/black250_normal.jpg","location":"Mishawaka, Indiana","id":4243,"followers_count":1222,"screen_name":"jnunemaker"},"in_reply_to_status_id":1431726310,"text":"@acornoAk Consider yourself unfollowed for that prank.","in_reply_to_user_id":18173702,"favorited":false,"created_at":"Wed Apr 01 14:52:45 +0000 2009","in_reply_to_screen_name":"acornoAk","id":1431763938,"source":"web"}]
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'shoulda'
|
4
|
+
require 'matchy'
|
5
|
+
require 'mocha'
|
6
|
+
require 'fakeweb'
|
7
|
+
|
8
|
+
FakeWeb.allow_net_connect = false
|
9
|
+
|
10
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
11
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
12
|
+
require 'twitter'
|
13
|
+
|
14
|
+
class Test::Unit::TestCase
|
15
|
+
end
|
16
|
+
|
17
|
+
def fixture_file(filename)
|
18
|
+
return '' if filename == ''
|
19
|
+
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/' + filename)
|
20
|
+
File.read(file_path)
|
21
|
+
end
|
22
|
+
|
23
|
+
def twitter_url(url)
|
24
|
+
url =~ /^http/ ? url : "http://twitter.com:80#{url}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def stub_get(url, filename, status=nil)
|
28
|
+
options = {:string => fixture_file(filename)}
|
29
|
+
options.merge!({:status => status}) unless status.nil?
|
30
|
+
|
31
|
+
FakeWeb.register_uri(:get, twitter_url(url), options)
|
32
|
+
end
|
33
|
+
|
34
|
+
def stub_post(url, filename)
|
35
|
+
FakeWeb.register_uri(:post, twitter_url(url), :string => fixture_file(filename))
|
36
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class BaseTest < Test::Unit::TestCase
|
4
|
+
context "base" do
|
5
|
+
setup do
|
6
|
+
oauth = Twitter::OAuth.new('token', 'secret')
|
7
|
+
@access_token = OAuth::AccessToken.new(oauth.consumer, 'atoken', 'asecret')
|
8
|
+
oauth.stubs(:access_token).returns(@access_token)
|
9
|
+
@twitter = Twitter::Base.new(oauth)
|
10
|
+
end
|
11
|
+
|
12
|
+
context "initialize" do
|
13
|
+
should "require a client" do
|
14
|
+
@twitter.client.should respond_to(:get)
|
15
|
+
@twitter.client.should respond_to(:post)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
should "delegate get to the client" do
|
20
|
+
@access_token.expects(:get).with('/foo').returns(nil)
|
21
|
+
@twitter.get('/foo')
|
22
|
+
end
|
23
|
+
|
24
|
+
should "delegate post to the client" do
|
25
|
+
@access_token.expects(:post).with('/foo', {:bar => 'baz'}).returns(nil)
|
26
|
+
@twitter.post('/foo', {:bar => 'baz'})
|
27
|
+
end
|
28
|
+
|
29
|
+
context "hitting the api" do
|
30
|
+
should "be able to get friends timeline" do
|
31
|
+
stub_get('/statuses/friends_timeline.json', 'friends_timeline.json')
|
32
|
+
timeline = @twitter.friends_timeline
|
33
|
+
timeline.size.should == 20
|
34
|
+
first = timeline.first
|
35
|
+
first.source.should == '<a href="http://www.atebits.com/software/tweetie/">Tweetie</a>'
|
36
|
+
first.user.name.should == 'John Nunemaker'
|
37
|
+
first.user.url.should == 'http://railstips.org/about'
|
38
|
+
first.id.should == 1441588944
|
39
|
+
first.favorited.should be(false)
|
40
|
+
end
|
41
|
+
|
42
|
+
should "be able to get user timeline" do
|
43
|
+
stub_get('/statuses/user_timeline.json', 'user_timeline.json')
|
44
|
+
timeline = @twitter.user_timeline
|
45
|
+
timeline.size.should == 20
|
46
|
+
first = timeline.first
|
47
|
+
first.text.should == 'Colder out today than expected. Headed to the Beanery for some morning wakeup drink. Latte or coffee...hmmm...'
|
48
|
+
first.user.name.should == 'John Nunemaker'
|
49
|
+
end
|
50
|
+
|
51
|
+
should "be able to get a status" do
|
52
|
+
stub_get('/statuses/show/1441588944.json', 'status.json')
|
53
|
+
status = @twitter.status(1441588944)
|
54
|
+
status.user.name.should == 'John Nunemaker'
|
55
|
+
status.id.should == 1441588944
|
56
|
+
end
|
57
|
+
|
58
|
+
should "be able to update status" do
|
59
|
+
stub_post('/statuses/update.json', 'status.json')
|
60
|
+
status = @twitter.update('Rob Dyrdek is the funniest man alive. That is all.')
|
61
|
+
status.user.name.should == 'John Nunemaker'
|
62
|
+
status.text.should == 'Rob Dyrdek is the funniest man alive. That is all.'
|
63
|
+
end
|
64
|
+
|
65
|
+
should "be able to get replies" do
|
66
|
+
stub_get('/statuses/replies.json', 'replies.json')
|
67
|
+
replies = @twitter.replies
|
68
|
+
replies.size.should == 19
|
69
|
+
first = replies.first
|
70
|
+
first.user.name.should == '-oAk-'
|
71
|
+
first.text.should == '@jnunemaker cold out today. cold yesterday. even colder today.'
|
72
|
+
end
|
73
|
+
|
74
|
+
should "be able to get follower ids" do
|
75
|
+
stub_get('/followers/ids.json', 'follower_ids.json')
|
76
|
+
follower_ids = @twitter.follower_ids
|
77
|
+
follower_ids.size.should == 1252
|
78
|
+
follower_ids.first.should == 613
|
79
|
+
end
|
80
|
+
|
81
|
+
should "be able to get friend ids" do
|
82
|
+
stub_get('/friends/ids.json', 'friend_ids.json')
|
83
|
+
friend_ids = @twitter.friend_ids
|
84
|
+
friend_ids.size.should == 161
|
85
|
+
friend_ids.first.should == 15323
|
86
|
+
end
|
87
|
+
|
88
|
+
should "correctly hash statuses" do
|
89
|
+
stub_get('/statuses/friends_timeline.json', 'friends_timeline.json')
|
90
|
+
hashes = @twitter.friends_timeline.map{ |s| s.hash }
|
91
|
+
hashes.should == @twitter.friends_timeline.map{ |s| s.hash }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class HTTPAuthTest < Test::Unit::TestCase
|
4
|
+
context "Creating new instance" do
|
5
|
+
should "should take user and password" do
|
6
|
+
twitter = Twitter::HTTPAuth.new('username', 'password')
|
7
|
+
twitter.username.should == 'username'
|
8
|
+
twitter.password.should == 'password'
|
9
|
+
end
|
10
|
+
|
11
|
+
should "accept options" do
|
12
|
+
twitter = Twitter::HTTPAuth.new('username', 'password', :ssl => true)
|
13
|
+
twitter.options.should == {:ssl => true}
|
14
|
+
end
|
15
|
+
|
16
|
+
should "default ssl to false" do
|
17
|
+
twitter = Twitter::HTTPAuth.new('username', 'password')
|
18
|
+
twitter.options[:ssl].should be(false)
|
19
|
+
end
|
20
|
+
|
21
|
+
should "use https if ssl is true" do
|
22
|
+
Twitter::HTTPAuth.expects(:base_uri).with('https://twitter.com')
|
23
|
+
twitter = Twitter::HTTPAuth.new('username', 'password', :ssl => true)
|
24
|
+
end
|
25
|
+
|
26
|
+
should "use http if ssl is false" do
|
27
|
+
Twitter::HTTPAuth.expects(:base_uri).with('http://twitter.com')
|
28
|
+
twitter = Twitter::HTTPAuth.new('username', 'password', :ssl => false)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "Client methods" do
|
33
|
+
setup do
|
34
|
+
@twitter = Twitter::HTTPAuth.new('username', 'password')
|
35
|
+
end
|
36
|
+
|
37
|
+
should "not throw error when accessing response message" do
|
38
|
+
stub_get('http://twitter.com:80/statuses/user_timeline.json', 'user_timeline.json')
|
39
|
+
response = @twitter.get('/statuses/user_timeline.json')
|
40
|
+
response.message.should == 'OK'
|
41
|
+
end
|
42
|
+
|
43
|
+
should "be able to get" do
|
44
|
+
stub_get('http://twitter.com:80/statuses/user_timeline.json', 'user_timeline.json')
|
45
|
+
response = @twitter.get('/statuses/user_timeline.json')
|
46
|
+
response.should == fixture_file('user_timeline.json')
|
47
|
+
end
|
48
|
+
|
49
|
+
should "be able to get with headers" do
|
50
|
+
@twitter.class.expects(:get).with(
|
51
|
+
'/statuses/user_timeline.json', {
|
52
|
+
:basic_auth => {:username => 'username', :password => 'password'},
|
53
|
+
:headers => {'Foo' => 'Bar'}
|
54
|
+
}
|
55
|
+
).returns(fixture_file('user_timeline.json'))
|
56
|
+
@twitter.get('/statuses/user_timeline.json', {'Foo' => 'Bar'})
|
57
|
+
end
|
58
|
+
|
59
|
+
should "be able to post" do
|
60
|
+
stub_post('http://twitter.com:80/statuses/update.json', 'status.json')
|
61
|
+
response = @twitter.post('/statuses/update.json', :text => 'My update.')
|
62
|
+
response.should == fixture_file('status.json')
|
63
|
+
end
|
64
|
+
|
65
|
+
should "be able to post with headers" do
|
66
|
+
@twitter.class.expects(:post).with(
|
67
|
+
'/statuses/update.json', {
|
68
|
+
:headers => {'Foo' => 'Bar'},
|
69
|
+
:body => {:text => 'My update.'},
|
70
|
+
:basic_auth => {:username => 'username', :password => 'password'}
|
71
|
+
}
|
72
|
+
).returns(fixture_file('status.json'))
|
73
|
+
@twitter.post('/statuses/update.json', {:text => 'My update.'}, {'Foo' => 'Bar'})
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class OAuthTest < Test::Unit::TestCase
|
4
|
+
should "initialize with consumer token and secret" do
|
5
|
+
twitter = Twitter::OAuth.new('token', 'secret')
|
6
|
+
|
7
|
+
twitter.ctoken.should == 'token'
|
8
|
+
twitter.csecret.should == 'secret'
|
9
|
+
end
|
10
|
+
|
11
|
+
should "set autorization path to '/oauth/authorize' by default" do
|
12
|
+
twitter = Twitter::OAuth.new('token', 'secret')
|
13
|
+
twitter.consumer.options[:authorize_path].should == '/oauth/authorize'
|
14
|
+
end
|
15
|
+
|
16
|
+
should "set autorization path to '/oauth/authenticate' if sign_in_with_twitter" do
|
17
|
+
twitter = Twitter::OAuth.new('token', 'secret', :sign_in => true)
|
18
|
+
twitter.consumer.options[:authorize_path].should == '/oauth/authenticate'
|
19
|
+
end
|
20
|
+
|
21
|
+
should "have a consumer" do
|
22
|
+
consumer = mock('oauth consumer')
|
23
|
+
OAuth::Consumer.expects(:new).with('token', 'secret', {:site => 'http://twitter.com'}).returns(consumer)
|
24
|
+
twitter = Twitter::OAuth.new('token', 'secret')
|
25
|
+
|
26
|
+
twitter.consumer.should == consumer
|
27
|
+
end
|
28
|
+
|
29
|
+
should "have a request token from the consumer" do
|
30
|
+
consumer = mock('oauth consumer')
|
31
|
+
request_token = mock('request token')
|
32
|
+
consumer.expects(:get_request_token).returns(request_token)
|
33
|
+
OAuth::Consumer.expects(:new).with('token', 'secret', {:site => 'http://twitter.com'}).returns(consumer)
|
34
|
+
twitter = Twitter::OAuth.new('token', 'secret')
|
35
|
+
|
36
|
+
twitter.request_token.should == request_token
|
37
|
+
end
|
38
|
+
|
39
|
+
should "be able to create access token from request token and secret" do
|
40
|
+
twitter = Twitter::OAuth.new('token', 'secret')
|
41
|
+
consumer = OAuth::Consumer.new('token', 'secret', {:site => 'http://twitter.com'})
|
42
|
+
twitter.stubs(:consumer).returns(consumer)
|
43
|
+
|
44
|
+
access_token = mock('access token', :token => 'atoken', :secret => 'asecret')
|
45
|
+
request_token = mock('request token')
|
46
|
+
request_token.expects(:get_access_token).returns(access_token)
|
47
|
+
OAuth::RequestToken.expects(:new).with(consumer, 'rtoken', 'rsecret').returns(request_token)
|
48
|
+
|
49
|
+
twitter.authorize_from_request('rtoken', 'rsecret')
|
50
|
+
twitter.access_token.class.should be(OAuth::AccessToken)
|
51
|
+
twitter.access_token.token.should == 'atoken'
|
52
|
+
twitter.access_token.secret.should == 'asecret'
|
53
|
+
end
|
54
|
+
|
55
|
+
should "be able to create access token from access token and secret" do
|
56
|
+
twitter = Twitter::OAuth.new('token', 'secret')
|
57
|
+
consumer = OAuth::Consumer.new('token', 'secret', {:site => 'http://twitter.com'})
|
58
|
+
twitter.stubs(:consumer).returns(consumer)
|
59
|
+
|
60
|
+
twitter.authorize_from_access('atoken', 'asecret')
|
61
|
+
twitter.access_token.class.should be(OAuth::AccessToken)
|
62
|
+
twitter.access_token.token.should == 'atoken'
|
63
|
+
twitter.access_token.secret.should == 'asecret'
|
64
|
+
end
|
65
|
+
|
66
|
+
should "delegate get to access token" do
|
67
|
+
access_token = mock('access token')
|
68
|
+
twitter = Twitter::OAuth.new('token', 'secret')
|
69
|
+
twitter.stubs(:access_token).returns(access_token)
|
70
|
+
access_token.expects(:get).returns(nil)
|
71
|
+
twitter.get('/foo')
|
72
|
+
end
|
73
|
+
|
74
|
+
should "delegate post to access token" do
|
75
|
+
access_token = mock('access token')
|
76
|
+
twitter = Twitter::OAuth.new('token', 'secret')
|
77
|
+
twitter.stubs(:access_token).returns(access_token)
|
78
|
+
access_token.expects(:post).returns(nil)
|
79
|
+
twitter.post('/foo')
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,217 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class RequestTest < Test::Unit::TestCase
|
4
|
+
context "new get request" do
|
5
|
+
setup do
|
6
|
+
@client = mock('twitter client')
|
7
|
+
@request = Twitter::Request.new(@client, :get, '/statuses/user_timeline.json', {:query => {:since_id => 1234}})
|
8
|
+
end
|
9
|
+
|
10
|
+
should "have client" do
|
11
|
+
@request.client.should == @client
|
12
|
+
end
|
13
|
+
|
14
|
+
should "have method" do
|
15
|
+
@request.method.should == :get
|
16
|
+
end
|
17
|
+
|
18
|
+
should "have path" do
|
19
|
+
@request.path.should == '/statuses/user_timeline.json'
|
20
|
+
end
|
21
|
+
|
22
|
+
should "have options" do
|
23
|
+
@request.options[:query].should == {:since_id => 1234}
|
24
|
+
end
|
25
|
+
|
26
|
+
should "have uri" do
|
27
|
+
@request.uri.should == '/statuses/user_timeline.json?since_id=1234'
|
28
|
+
end
|
29
|
+
|
30
|
+
context "performing request for collection" do
|
31
|
+
setup do
|
32
|
+
response = mock('response') do
|
33
|
+
stubs(:body).returns(fixture_file('user_timeline.json'))
|
34
|
+
stubs(:code).returns('200')
|
35
|
+
end
|
36
|
+
|
37
|
+
@client.expects(:get).returns(response)
|
38
|
+
@object = @request.perform
|
39
|
+
end
|
40
|
+
|
41
|
+
should "return array of mashes" do
|
42
|
+
@object.size.should == 20
|
43
|
+
@object.each { |obj| obj.class.should be(Mhash) }
|
44
|
+
@object.first.text.should == 'Colder out today than expected. Headed to the Beanery for some morning wakeup drink. Latte or coffee...hmmm...'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "performing a request for a single object" do
|
49
|
+
setup do
|
50
|
+
response = mock('response') do
|
51
|
+
stubs(:body).returns(fixture_file('status.json'))
|
52
|
+
stubs(:code).returns('200')
|
53
|
+
end
|
54
|
+
|
55
|
+
@client.expects(:get).returns(response)
|
56
|
+
@object = @request.perform
|
57
|
+
end
|
58
|
+
|
59
|
+
should "return a single mash" do
|
60
|
+
@object.class.should be(Mhash)
|
61
|
+
@object.text.should == 'Rob Dyrdek is the funniest man alive. That is all.'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "with no query string" do
|
66
|
+
should "not have any query string" do
|
67
|
+
request = Twitter::Request.new(@client, :get, '/statuses/user_timeline.json')
|
68
|
+
request.uri.should == '/statuses/user_timeline.json'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "with blank query string" do
|
73
|
+
should "not have any query string" do
|
74
|
+
request = Twitter::Request.new(@client, :get, '/statuses/user_timeline.json', :query => {})
|
75
|
+
request.uri.should == '/statuses/user_timeline.json'
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
should "have get shortcut to initialize and perform all in one" do
|
80
|
+
Twitter::Request.any_instance.expects(:perform).returns(nil)
|
81
|
+
Twitter::Request.get(@client, '/foo')
|
82
|
+
end
|
83
|
+
|
84
|
+
should "allow setting query string and headers" do
|
85
|
+
response = mock('response') do
|
86
|
+
stubs(:body).returns('')
|
87
|
+
stubs(:code).returns('200')
|
88
|
+
end
|
89
|
+
|
90
|
+
@client.expects(:get).with('/statuses/friends_timeline.json?since_id=1234', {'Foo' => 'Bar'}).returns(response)
|
91
|
+
Twitter::Request.get(@client, '/statuses/friends_timeline.json?since_id=1234', :headers => {'Foo' => 'Bar'})
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "new post request" do
|
96
|
+
setup do
|
97
|
+
@client = mock('twitter client')
|
98
|
+
@request = Twitter::Request.new(@client, :post, '/statuses/update.json', {:body => {:status => 'Woohoo!'}})
|
99
|
+
end
|
100
|
+
|
101
|
+
should "allow setting body and headers" do
|
102
|
+
response = mock('response') do
|
103
|
+
stubs(:body).returns('')
|
104
|
+
stubs(:code).returns('200')
|
105
|
+
end
|
106
|
+
|
107
|
+
@client.expects(:post).with('/statuses/update.json', {:status => 'Woohoo!'}, {'Foo' => 'Bar'}).returns(response)
|
108
|
+
Twitter::Request.post(@client, '/statuses/update.json', :body => {:status => 'Woohoo!'}, :headers => {'Foo' => 'Bar'})
|
109
|
+
end
|
110
|
+
|
111
|
+
context "performing request" do
|
112
|
+
setup do
|
113
|
+
response = mock('response') do
|
114
|
+
stubs(:body).returns(fixture_file('status.json'))
|
115
|
+
stubs(:code).returns('200')
|
116
|
+
end
|
117
|
+
|
118
|
+
@client.expects(:post).returns(response)
|
119
|
+
@object = @request.perform
|
120
|
+
end
|
121
|
+
|
122
|
+
should "return a mash of the object" do
|
123
|
+
@object.text.should == 'Rob Dyrdek is the funniest man alive. That is all.'
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
should "have post shortcut to initialize and perform all in one" do
|
128
|
+
Twitter::Request.any_instance.expects(:perform).returns(nil)
|
129
|
+
Twitter::Request.post(@client, '/foo')
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context "error raising" do
|
134
|
+
setup do
|
135
|
+
oauth = Twitter::OAuth.new('token', 'secret')
|
136
|
+
oauth.authorize_from_access('atoken', 'asecret')
|
137
|
+
@client = Twitter::Base.new(oauth)
|
138
|
+
end
|
139
|
+
|
140
|
+
should "not raise error for 200" do
|
141
|
+
stub_get('http://twitter.com:80/foo', '', ['200'])
|
142
|
+
lambda {
|
143
|
+
Twitter::Request.get(@client, '/foo')
|
144
|
+
}.should_not raise_error
|
145
|
+
end
|
146
|
+
|
147
|
+
should "not raise error for 304" do
|
148
|
+
stub_get('http://twitter.com:80/foo', '', ['304'])
|
149
|
+
lambda {
|
150
|
+
Twitter::Request.get(@client, '/foo')
|
151
|
+
}.should_not raise_error
|
152
|
+
end
|
153
|
+
|
154
|
+
should "raise RateLimitExceeded for 400" do
|
155
|
+
stub_get('http://twitter.com:80/foo', 'rate_limit_exceeded.json', ['400'])
|
156
|
+
lambda {
|
157
|
+
Twitter::Request.get(@client, '/foo')
|
158
|
+
}.should raise_error(Twitter::RateLimitExceeded)
|
159
|
+
end
|
160
|
+
|
161
|
+
should "raise Unauthorized for 401" do
|
162
|
+
stub_get('http://twitter.com:80/foo', '', ['401'])
|
163
|
+
lambda {
|
164
|
+
Twitter::Request.get(@client, '/foo')
|
165
|
+
}.should raise_error(Twitter::Unauthorized)
|
166
|
+
end
|
167
|
+
|
168
|
+
should "raise General for 403" do
|
169
|
+
stub_get('http://twitter.com:80/foo', '', ['403'])
|
170
|
+
lambda {
|
171
|
+
Twitter::Request.get(@client, '/foo')
|
172
|
+
}.should raise_error(Twitter::General)
|
173
|
+
end
|
174
|
+
|
175
|
+
should "raise NotFound for 404" do
|
176
|
+
stub_get('http://twitter.com:80/foo', '', ['404'])
|
177
|
+
lambda {
|
178
|
+
Twitter::Request.get(@client, '/foo')
|
179
|
+
}.should raise_error(Twitter::NotFound)
|
180
|
+
end
|
181
|
+
|
182
|
+
should "raise InformTwitter for 500" do
|
183
|
+
stub_get('http://twitter.com:80/foo', '', ['500'])
|
184
|
+
lambda {
|
185
|
+
Twitter::Request.get(@client, '/foo')
|
186
|
+
}.should raise_error(Twitter::InformTwitter)
|
187
|
+
end
|
188
|
+
|
189
|
+
should "raise Unavailable for 502" do
|
190
|
+
stub_get('http://twitter.com:80/foo', '', ['502'])
|
191
|
+
lambda {
|
192
|
+
Twitter::Request.get(@client, '/foo')
|
193
|
+
}.should raise_error(Twitter::Unavailable)
|
194
|
+
end
|
195
|
+
|
196
|
+
should "raise Unavailable for 503" do
|
197
|
+
stub_get('http://twitter.com:80/foo', '', ['503'])
|
198
|
+
lambda {
|
199
|
+
Twitter::Request.get(@client, '/foo')
|
200
|
+
}.should raise_error(Twitter::Unavailable)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
context "Making request with mash option set to false" do
|
205
|
+
setup do
|
206
|
+
oauth = Twitter::OAuth.new('token', 'secret')
|
207
|
+
oauth.authorize_from_access('atoken', 'asecret')
|
208
|
+
@client = Twitter::Base.new(oauth)
|
209
|
+
end
|
210
|
+
|
211
|
+
should "not attempt to create mash of return object" do
|
212
|
+
stub_get('http://twitter.com:80/foo', 'friend_ids.json')
|
213
|
+
object = Twitter::Request.get(@client, '/foo', :mash => false)
|
214
|
+
object.class.should_not be(Mhash)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|