foursquared 0.0.4

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.
Files changed (57) hide show
  1. data/.gitignore +10 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +19 -0
  4. data/Guardfile +6 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +30 -0
  7. data/Rakefile +30 -0
  8. data/foursquared.gemspec +34 -0
  9. data/lib/core_ext/symbol.rb +7 -0
  10. data/lib/foursquared/badges.rb +12 -0
  11. data/lib/foursquared/checkins.rb +89 -0
  12. data/lib/foursquared/client.rb +58 -0
  13. data/lib/foursquared/error.rb +17 -0
  14. data/lib/foursquared/events.rb +18 -0
  15. data/lib/foursquared/lists.rb +97 -0
  16. data/lib/foursquared/oauth/client.rb +37 -0
  17. data/lib/foursquared/pages.rb +49 -0
  18. data/lib/foursquared/photos.rb +34 -0
  19. data/lib/foursquared/response/badge.rb +87 -0
  20. data/lib/foursquared/response/badge_group.rb +42 -0
  21. data/lib/foursquared/response/category.rb +53 -0
  22. data/lib/foursquared/response/checkin.rb +180 -0
  23. data/lib/foursquared/response/event.rb +52 -0
  24. data/lib/foursquared/response/list.rb +199 -0
  25. data/lib/foursquared/response/list_item.rb +63 -0
  26. data/lib/foursquared/response/photo.rb +102 -0
  27. data/lib/foursquared/response/special.rb +131 -0
  28. data/lib/foursquared/response/tip.rb +134 -0
  29. data/lib/foursquared/response/user.rb +246 -0
  30. data/lib/foursquared/response/venue.rb +252 -0
  31. data/lib/foursquared/settings.rb +28 -0
  32. data/lib/foursquared/specials.rb +25 -0
  33. data/lib/foursquared/tips.rb +113 -0
  34. data/lib/foursquared/users.rb +206 -0
  35. data/lib/foursquared/venues.rb +217 -0
  36. data/lib/foursquared/version.rb +4 -0
  37. data/lib/foursquared.rb +47 -0
  38. data/spec/foursquared/badges_spec.rb +82 -0
  39. data/spec/foursquared/checkins_spec.rb +0 -0
  40. data/spec/foursquared/events_spec.rb +50 -0
  41. data/spec/foursquared/oauth/client_spec.rb +24 -0
  42. data/spec/foursquared/pages_spec.rb +42 -0
  43. data/spec/foursquared/photos_spec.rb +41 -0
  44. data/spec/foursquared/response/badge_spec.rb +40 -0
  45. data/spec/foursquared/response/category_spec.rb +48 -0
  46. data/spec/foursquared/response/checkin_spec.rb +100 -0
  47. data/spec/foursquared/response/event_category_spec.rb +48 -0
  48. data/spec/foursquared/response/event_spec.rb +60 -0
  49. data/spec/foursquared/response/list_spec.rb +56 -0
  50. data/spec/foursquared/response/photo_spec.rb +70 -0
  51. data/spec/foursquared/response/special_spec.rb +0 -0
  52. data/spec/foursquared/response/user_spec.rb +124 -0
  53. data/spec/foursquared/response/venue_spec.rb +83 -0
  54. data/spec/foursquared/specials_spec.rb +4 -0
  55. data/spec/foursquared/users_spec.rb +241 -0
  56. data/spec/spec_helper.rb +27 -0
  57. metadata +344 -0
@@ -0,0 +1,217 @@
1
+ # Foursquared module
2
+ module Foursquared
3
+ # Venues module
4
+ module Venues
5
+
6
+ # Venue detail
7
+ # @param [String] venue_id ID of venue to retrieve
8
+ # @return [Foursquared::Response::Venue]
9
+ def venue venue_id
10
+ response = get("/venues/#{venue_id}")["response"]
11
+ @venue = Foursquared::Response::Venue.new(self, response["venue"])
12
+ end
13
+
14
+ # Add a venue
15
+ # @param [Hash] options
16
+ # @option options [String] :name required The name of the venue
17
+ # @option options [String] :address The address of the venue
18
+ # @option options [String] :crossStreet The nearest intersecting street or streets.
19
+ # @option options [String] :city The city name where this venue is.
20
+ # @option options [String] :state The nearest state or province to the venue.
21
+ # @option options [String] :zip The zip or postal code for the venue.
22
+ # @option options [String] :phone The phone number of the venue.
23
+ # @option options [String] :twitter The twitter handle of the venue.
24
+ # @option options [String] :ll required Latitude and longitude of the venue, as accurate as is known.
25
+ # @option options [String] :primaryCategoryId The ID of the category to which you want to assign this venue.
26
+ # @option options [String] :description A freeform description of the venue, up to 300 characters.
27
+ # @option options [String] :url The url of the homepage of the venue.
28
+ # @option options [Boolean] :ignoreDuplicates A boolean flag telling the server to ignore duplicates and force the addition of this venue.
29
+ # @option options [String] :ignoreDuplicatesKey Required if ignoreDuplicates is true. This key will be available in the response of the HTTP 409 error of the first (failed) attempt to add venue.
30
+ def add_venue options={}
31
+ response = post("/venues/add", options)["response"]
32
+ Foursquared::Response::Venue.new(self, response["venue"])
33
+ end
34
+
35
+ # Returns a hierarchical list of categories applied to venues.
36
+ # @return [Array<Foursquared::Response::Category>]
37
+ def venue_categories
38
+ response = get("/venues/categories")["response"]
39
+ response["categories"].collect{|category| Foursquared::Response::Category.new(self, category) }
40
+ end
41
+
42
+ # Explore Recommended and Popular Venues
43
+ # @param [Hash] options
44
+ # @option options [String] :ll required unless :near is provided. Latitude and longitude of the user's location.
45
+ # @option options [String] :near required unless :ll is provided. A string naming a place in the world
46
+ # @option options [String] :llAcc Accuracy of latitude and longitude, in meters.
47
+ # @option options [String] :alt Altitude of the user's location, in meters.
48
+ # @option options [String] :altAcc Accuracy of the user's altitude, in meters.
49
+ # @option options [String] :radius Radius to search within, in meters.
50
+ # @option options [String] :section One of food, drinks, coffee, shops, arts, outdoors, sights, trending or specials, nextVenues or topPicks
51
+ # @option options [String] :query A term to be searched against a venue's tips, category, etc.
52
+ # @option options [Integer] :limit Number of results to return, up to 50.
53
+ # @option options [Integer] :offset Used to page through results.
54
+ # @option options [String] :novelty Pass new or old to limit results to places the acting user hasn't been or has been, respectively.
55
+ # @option options [String] :friendVisits Pass visited or notvisited to limit results to places the acting user's friends have or haven't been, respectively.
56
+ # @option options [String] :venuePhotos Boolean flag to include a photo in the response for each venue, if one is available (1/0)
57
+ # @option options [String] :lastVenue A venue ID to use in combination with the intent=nextVenues parameter, which returns venues users often visit after a given venue.
58
+ def explore_venues options={}
59
+ response = get("/venues/explore", options)["response"]
60
+ response["groups"].each do |group|
61
+ response["items"].each do |item|
62
+ item["venue"] = Foursquared::Response::Venue.new(self, item["venue"])
63
+ item["tips"].map!{|tip| Foursquared::Response::List.new(self, tip)}
64
+ end
65
+ end
66
+ response
67
+ end
68
+
69
+ # Get a list of venues the current user manages.
70
+ # @return [Array<Foursquared::Response::Venue>] An array of compact venues the user manages.
71
+ def managed_venues
72
+ response = get("/venues/managed")["response"]
73
+ @venues = response["venues"].collect{|venue| Foursquared::Response::Venue.new(self, venue)}
74
+ end
75
+
76
+ # Returns a list of venues near the current location, optionally matching a search term.
77
+ # @param [Hash] options
78
+ # @option options [String] :ll required unless :near is provided. Latitude and longitude of the user's location.
79
+ # @option options [String] :near required unless :ll is provided. A string naming a place in the world
80
+ # @option options [String] :llAcc Accuracy of latitude and longitude, in meters.
81
+ # @option options [String] :alt Altitude of the user's location, in meters.
82
+ # @option options [String] :altAcc Accuracy of the user's altitude, in meters.
83
+ # @option options [String] :radius Radius to search within, in meters.
84
+ # @option options [String] :query A search term to be applied against venue names.
85
+ # @option options [Integer] :limit Number of results to return, up to 50.
86
+ # @option options [String] :intent Checkout https://developer.foursquare.com/docs/venues/search for the possible values
87
+ # @option options [String] :sw Checkout https://developer.foursquare.com/docs/venues/search for details
88
+ # @option options [String] :ne Checkout https://developer.foursquare.com/docs/venues/search for details
89
+ # @option options [String] :categoryId A comma separated list of categories to limit results to
90
+ # @option options [String] :url A third-party URL which we will attempt to match against our map of venues to URLs
91
+ # @option options [String] :providerId Identifier for a known third party that is part of our map of venues to URLs
92
+ # @option options [String] :linkedId Identifier used by third party specified in providerId, which we will attempt to match against our map of venues to URLs
93
+ # @return [Array] An array of compact venues.
94
+ def search_venues options={}
95
+ response = get("/venues/search", options)["response"]
96
+ @venues = response["venues"].collect{|venue| Foursquared::Response::Venue.new(self, venue)}
97
+ end
98
+
99
+ # Returns a list of venues near the current location with the most people currently checked in.
100
+ # @param [Hash] options
101
+ # @option options [String] :ll required Latitude and longitude of the user's location.
102
+ # @option options [Integer] :limit Number of results to return, up to 50.
103
+ # @option options [Integer] :radius Radius in meters, up to approximately 2000 meters.
104
+ # @return [Array] An array of venues that are currently trending, with their hereNow populated.
105
+ def trending_venues options={}
106
+ response = get("/venues/trending", options)["response"]
107
+ @venues = response["venues"].collect{|venue| Foursquared::Response::Venue.new(self, venue)}
108
+ end
109
+
110
+ # Gives information about the current events at a place.
111
+ # @param [String] venue_id required The venue id for which events are being requested.
112
+ # @return [Hash] A count and items of event items. Also includes a "summary" string describing the set of events at the venue.
113
+ def venue_events venue_id
114
+ response = get("/venues/#{venue_id}/events")["response"]
115
+ @events = response["events"]
116
+ @events["items"].map!{|item| Foursquared::Response::Event.new(self, item)}
117
+ @events
118
+ end
119
+
120
+ # Returns hours for a venue.
121
+ # @param [String] venue_id required The venue id for which hours are being requested.
122
+ # @return [Array] An array of timeframes of hours.
123
+ def venue_hours venue_id
124
+ response = get("/venues/#{venue_id}/hours")["response"]["hours"]
125
+ end
126
+
127
+ # Users who have liked a venue
128
+ # @param [String] venue_id required The venue id for which hours are being requested.
129
+ # @return [Hash] A count and groups of users who like this venue
130
+ def venue_likes venue_id
131
+ response = get("/venues/#{venue_id}/likes")["response"]["likes"]
132
+ response["groups"].each do |group|
133
+ response["items"].map!{|item| Foursquared::Response::User.new(self, item)}
134
+ end
135
+ response
136
+ end
137
+
138
+ # The lists that this venue appears on.
139
+ # @param [String] venue_id required The venue id for which hours are being requested.
140
+ # @param [Hash] options
141
+ # @option options [String] :group Can be created, edited, followed, friends, other.
142
+ # @option options [Integer] :limit Number of results to return, up to 200.
143
+ # @option options [Integer] :offset Used to page through results. Must specify a group
144
+ # @return [Hash]
145
+ def venue_lists venue_id, options={}
146
+ response = get("/venues/#{venue_id}/lists", options)["response"]["lists"]
147
+ if response["groups"]
148
+ response["groups"].each do |group|
149
+ group["items"].map!{|item| Foursquared::Response::Lists.new(self, item)} if group["items"]
150
+ end
151
+ else
152
+ response["items"].map!{|item| Foursquared::Response::Lists.new(self, item)}
153
+ end
154
+ response
155
+ end
156
+
157
+ # Returns photos for a venue.
158
+ # @param [String] venue_id required The venue id for which hours are being requested.
159
+ # @param [Hash] options
160
+ # @option options [String] :group required Pass checkin for photos added by friends (including on their recent checkins). Pass venue for public photos added to the venue by non-friends. Use multi to fetch both.
161
+ # @option options [Integer] :limit Number of results to return, up to 200.
162
+ # @option options [Integer] :offset Used to page through results
163
+ # @return [Hash] A count and items of photos
164
+ def venue_photos venue_id, options={}
165
+ response = get("/venues/#{venue_id}/photos", options)["response"]["photos"]
166
+ response["items"].map!{|item| Foursquared::Response::Photo.new(self, item)}
167
+ response
168
+ end
169
+
170
+ # Returns a list of venues similar to the specified venue.
171
+ # @param [String] venue_id required The venue you want similar venues for.
172
+ # @return [Hash] A count and items of similar venues.
173
+ def venue_likes venue_id
174
+ response = get("/venues/#{venue_id}/similar")["response"]["similarVenues"]
175
+ response["items"].map!{|item| Foursquared::Response::Venue.new(self, item)}
176
+ response
177
+ end
178
+
179
+ # Flag a Venue
180
+ # @param [String] venue_id required The venue id for which hours are being requested.
181
+ # @param [Hash] options
182
+ # @option options [String] :problem required One of mislocated, closed, duplicate, inappropriate, doesnt_exist, event_over
183
+ # @option options [String] :venueId ID of the duplicated venue (for problem duplicate)
184
+ def flag_venue venue_id, options={}
185
+ response = post("/venues/#{venue_id}/flag", options)
186
+ end
187
+
188
+ # Like or unlike a venue
189
+ # @param [String] venue_id required The venue id for which hours are being requested.
190
+ # @param [Hash] options
191
+ # @option options [Integer] :set If 1, like this venue. If 0 unlike (un-do a previous like) it. Default value is 1.
192
+ # @return [Hash] Updated count and groups of users who like this venue
193
+ def like_venue venue_id, options={}
194
+ response = post("/venues/#{venue_id}/like", options)["response"]["likes"]
195
+ response["groups"].each do |group|
196
+ response["items"].map!{|item| Foursquared::Response::User.new(self, item)}
197
+ end
198
+ response
199
+ end
200
+
201
+ # Propose an Edit to a Venue
202
+ # @param [Hash] options
203
+ # @option options [String] :name The name of the venue
204
+ # @option options [String] :address The address of the venue
205
+ # @option options [String] :crossStreet The nearest intersecting street or streets.
206
+ # @option options [String] :city The city name where this venue is.
207
+ # @option options [String] :state The nearest state or province to the venue.
208
+ # @option options [String] :zip The zip or postal code for the venue.
209
+ # @option options [String] :phone The phone number of the venue.
210
+ # @option options [String] :ll Latitude and longitude of the venue, as accurate as is known.
211
+ # @option options [String] :primaryCategoryId The ID of the category to which you want to assign this venue.
212
+ # @option options [String] :hours The hours for the venue, as a semi-colon separated list of open segments and named segments
213
+ def propose_venue_edit venue_id, options={}
214
+ response = post("/venues/#{venue_id}", options)
215
+ end
216
+ end
217
+ end
@@ -0,0 +1,4 @@
1
+ module Foursquared
2
+ # The gem version
3
+ VERSION = "0.0.4"
4
+ end
@@ -0,0 +1,47 @@
1
+ require 'httmultiparty'
2
+ require 'json'
3
+ directory = File.expand_path(File.dirname(__FILE__))
4
+ require 'core_ext/symbol'
5
+ module Foursquared
6
+ class << self
7
+
8
+
9
+ attr_accessor :client_id, :client_secret, :api_version, :ssl, :access_token, :locale
10
+
11
+
12
+ def configure
13
+ yield self
14
+ true
15
+ end
16
+ end
17
+
18
+ # require 'foursquare2/campaigns'
19
+ require 'foursquared/users'
20
+ require 'foursquared/photos'
21
+ require 'foursquared/lists'
22
+ require 'foursquared/checkins'
23
+ require 'foursquared/venues'
24
+ require 'foursquared/badges'
25
+ require 'foursquared/events'
26
+ require 'foursquared/pages'
27
+ require 'foursquared/specials'
28
+ require 'foursquared/tips'
29
+ require 'foursquared/oauth/client'
30
+ require 'foursquared/client'
31
+ require 'foursquared/response/user'
32
+ require 'foursquared/response/list'
33
+ require 'foursquared/response/list_item'
34
+ require 'foursquared/response/photo'
35
+ require 'foursquared/response/venue'
36
+ require 'foursquared/response/checkin'
37
+ require 'foursquared/response/badge'
38
+ require 'foursquared/response/badge_group'
39
+ require 'foursquared/response/event'
40
+ require 'foursquared/response/category'
41
+ require 'foursquared/response/special'
42
+ require 'foursquared/response/tip'
43
+ require 'foursquared/error'
44
+
45
+ end
46
+
47
+ include Foursquared::Response
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+ require 'foursquared/badges'
3
+
4
+ describe Foursquared::Badges do
5
+
6
+ let(:user_badges) do
7
+ YAML.load(%{
8
+ meta:
9
+ code: 200
10
+ response:
11
+ sets:
12
+ groups:
13
+ - type: "all"
14
+ name: "All Badges"
15
+ image:
16
+ prefix: "https://foursquare.com/img/badge/"
17
+ sizes:
18
+ - 24
19
+ - 32
20
+ name: "/allbadges.png"
21
+ items:
22
+ - "508b859de4b01167eaad0476"
23
+ - "5066d689e4b0ca8b1f1c1804"
24
+ badges:
25
+ 4f7a7d3ae4b02f1b2c869efb:
26
+ id: "4f7a7d3ae4b02f1b2c869efb"
27
+ badgeId: "4c4f08667a0803bbaa202ab7"
28
+ defaultSetType: "foursquare"
29
+ }
30
+ )
31
+ end
32
+
33
+ let(:badge) do
34
+ YAML.load(%{
35
+ meta:
36
+ code: 200
37
+ response:
38
+ badge:
39
+ id: "4f7a7d3ae4b02f1b2c869efb"
40
+ badgeId: "4c4f08667a0803bbaa202ab7"
41
+ name: "Newbie"
42
+ unlockMessage: "You unlocked the Newbie badge!"
43
+ description: "Your first check-in!"
44
+ badgeText: "Your first check-in!"
45
+ image:
46
+ prefix: "https://playfoursquare.s3.amazonaws.com/badge/"
47
+ sizes:
48
+ - 57
49
+ 114
50
+ name: "/newbie.png"
51
+ unlocks:
52
+ - checkins:
53
+ - id: "4f7a7d3ae4b02f1b2c869eef"
54
+ }
55
+ )
56
+ end
57
+
58
+ subject { foursquared_test_client }
59
+
60
+ before(:each) do
61
+ stub_request(:get, "https://api.foursquare.com/v2/users/self/badges?oauth_token=TestToken&v=#{Time.now.strftime("%Y%m%d")}").to_return(:status => 200, :body => user_badges.to_json, :headers => {})
62
+ stub_request(:get, "https://api.foursquare.com/v2/badges/4f7a7d3ae4b02f1b2c869efb?oauth_token=TestToken&v=#{Time.now.strftime("%Y%m%d")}").
63
+ to_return(:status => 200, :body => badge.to_json, :headers => {})
64
+ @user_badges = subject.user_badges("self")
65
+ end
66
+ describe "#user_badges" do
67
+ describe "sets" do
68
+ it "should give the sets of badge types" do
69
+ @user_badges["sets"]["groups"].should each { |group|
70
+ group.should be_a(Foursquared::Response::BadgeGroup)
71
+ }
72
+ end
73
+ end
74
+ describe "badges" do
75
+ it "should give the badges' details" do
76
+ @user_badges["badges"].keys.should each {|badge_id|
77
+ @user_badges["badges"][badge_id].should be_a(Foursquared::Response::Badge)
78
+ }
79
+ end
80
+ end
81
+ end
82
+ end
File without changes
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+ require 'foursquared/events'
3
+
4
+ describe Foursquared::Events do
5
+ let(:event) do
6
+ YAML.load(%{
7
+ meta:
8
+ code: 200
9
+ response:
10
+ event:
11
+ venueId: "40afe980f964a5203bf31ee3"
12
+ id: "5093492991d4a3bd84c82646"
13
+ name: "Skyfall: The IMAX Experience"
14
+ foreignIds:
15
+ count: 1
16
+ items:
17
+ - domain: "fandango.com"
18
+ id: "5826-153164"
19
+ hereNow:
20
+ count: 0
21
+ groups:
22
+ - type: "friends"
23
+ name: "Friends here"
24
+ count: 0
25
+ items: []
26
+ - type: "others"
27
+ name: "Other people here"
28
+ count: 0
29
+ items: []
30
+ allDay: true
31
+ date: 1355115600
32
+ timeZone: "America/New_York"
33
+ stats:
34
+ checkinsCount: 9
35
+ usersCount: 9
36
+ url: "https://foursquare.com/events/movies?theater=AAORE&movie=153164&wired=true"
37
+ }
38
+ )
39
+ end
40
+ subject { foursquared_test_client }
41
+
42
+ before :each do
43
+ stub_request(:get, "https://api.foursquare.com/v2/events/5093492991d4a3bd84c82646?oauth_token=TestToken&v=#{Time.now.strftime("%Y%m%d")}").to_return(:status => 200, :body => event.to_json, :headers => {})
44
+ end
45
+
46
+ it "should return the event with the given id" do
47
+ subject.event("5093492991d4a3bd84c82646").should be_a Foursquared::Response::Event
48
+ end
49
+
50
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'foursquared/oauth/client'
3
+ require 'pp'
4
+ require 'httparty'
5
+ describe Foursquared::OAuth::Client do
6
+ before :each do
7
+ @client = Foursquared::OAuth::Client.new("abc", "S2TJO3KFFXZSXS44WKVGWGKH204U455MI3P0JUV0ADTWRORZ","http://localhost")
8
+ end
9
+
10
+ describe "#authorize_url" do
11
+ it "includes the client_id" do
12
+ expect(@client.authorize_url).to include('client_id=abc')
13
+ end
14
+
15
+ it "includes the type" do
16
+ expect(@client.authorize_url).to include('response_type=code')
17
+ end
18
+
19
+ it "includes the redirect_uri" do
20
+ cb = 'http://localhost'
21
+ expect(@client.authorize_url).to include("redirect_uri=#{Rack::Utils.escape(cb)}")
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+ require 'foursquared/pages'
3
+
4
+ describe Foursquared::Pages do
5
+
6
+ let(:page) do
7
+ YAML.load(%{
8
+ meta:
9
+ code: 200
10
+ response:
11
+ user:
12
+ id: "1070527"
13
+ firstName: "Starbucks"
14
+ type: "chain"
15
+ followers:
16
+ groups:
17
+ - type: "friends"
18
+ name: "Liked by 2 friends"
19
+ items:
20
+ - id: "36332988"
21
+ firstName: "Sree"
22
+ lastName: "Ram"
23
+ relationship: "friend"
24
+ - id: "38283243"
25
+ firstName: "Vineeth"
26
+ lastName: "Nix"
27
+ relationship: "friend"
28
+ }
29
+ )
30
+ end
31
+
32
+ subject { foursquared_test_client }
33
+
34
+ before :each do
35
+ stub_request(:get, "https://api.foursquare.com/v2/pages/1070527?oauth_token=TestToken&v=#{Time.now.strftime("%Y%m%d")}").to_return(:body => page.to_json)
36
+ end
37
+
38
+ it "should return the page with the id" do
39
+ subject.page(1070527).should be_a(Foursquared::Response::User)
40
+ end
41
+
42
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+ require 'foursquared/response/user'
3
+ require 'foursquared/response/photo'
4
+ require 'foursquared/client'
5
+ require 'foursquared/photos'
6
+
7
+ describe Foursquared::Photos do
8
+ let(:photo) do
9
+ YAML.load(%{
10
+ meta:
11
+ code: 200
12
+ response:
13
+ photo:
14
+ id: "4d0fb8162d39a340637dc42b"
15
+ createdAt: 1292875798
16
+ source:
17
+ name: "foursquare for iPhone"
18
+ url: "https://foursquare.com/download/#/iphone"
19
+ prefix: "https://irs0.4sqi.net/img/general/"
20
+ suffix: "/UYU54GYOCURPAUYXH5V2U3EOM4DCX4VZPT3YOMN43H555KU2.jpg"
21
+ width: 540
22
+ height: 720
23
+ user:
24
+ id: "2102"
25
+ firstName: "Kushal"
26
+ lastName: "D."
27
+ photo:
28
+ prefix: "https://irs1.4sqi.net/img/user/"
29
+ suffix: "/2102_1242573242.jpg"
30
+ visibility: "public"
31
+ }
32
+ )
33
+ end
34
+
35
+ before :each do
36
+ stub_request(:get, "https://api.foursquare.com/v2/photos/12345?oauth_token=TestToken&v=#{Time.now.strftime("%Y%m%d")}").
37
+ to_return(:status => 200, :body => photo.to_json, :headers => {})
38
+ end
39
+
40
+
41
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+ require 'foursquared/response/badge'
3
+
4
+ describe Foursquared::Response::Badge do
5
+
6
+ let(:badge) do
7
+ YAML.load(%{
8
+ meta:
9
+ code: 200
10
+ response:
11
+ badge:
12
+ id: "4f7a7d3ae4b02f1b2c869efb"
13
+ badgeId: "4c4f08667a0803bbaa202ab7"
14
+ name: "Newbie"
15
+ unlockMessage: "You unlocked the Newbie badge!"
16
+ description: "Your first check-in!"
17
+ badgeText: "Your first check-in!"
18
+ image:
19
+ prefix: "https://playfoursquare.s3.amazonaws.com/badge/"
20
+ sizes:
21
+ - 57
22
+ 114
23
+ name: "/newbie.png"
24
+ unlocks:
25
+ - checkins:
26
+ - id: "4f7a7d3ae4b02f1b2c869eef"
27
+ }
28
+ )
29
+ end
30
+ subject {foursquared_test_client.badge("4f7a7d3ae4b02f1b2c869efb")}
31
+
32
+ before :each do
33
+ stub_request(:get, "https://api.foursquare.com/v2/badges/4f7a7d3ae4b02f1b2c869efb?oauth_token=TestToken&v=#{Time.now.strftime("%Y%m%d")}").to_return(:status => 200, :body => badge.to_json, :headers => {})
34
+ end
35
+
36
+ it "should return the badge's id" do
37
+ subject.id.should == "4f7a7d3ae4b02f1b2c869efb"
38
+ end
39
+
40
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+ require 'foursquared/response/category'
3
+
4
+ describe Foursquared::Response::Category do
5
+
6
+ let(:event_category) do
7
+ YAML.load(%{
8
+ id: "4dfb90c6bd413dd705e8f897"
9
+ name: "Movies"
10
+ pluralName: "Movies"
11
+ shortName: "Movie"
12
+ icon:
13
+ prefix: "https://foursquare.com/img/categories_v2/arts_entertainment/movietheater_"
14
+ suffix: ".png"
15
+ categories:
16
+ - id: "4e132f48bd41026cd50e8f8e"
17
+ name: "Baseball Games"
18
+ pluralName: "Baseball Games"
19
+ shortName: "Baseball"
20
+ icon:
21
+ prefix: "https://foursquare.com/img/categories_v2/arts_entertainment/stadium_baseball_"
22
+ suffix: ".png"
23
+ categories: []
24
+ }
25
+ )
26
+ end
27
+
28
+ subject {Foursquared::Response::Category.new(event_category)}
29
+
30
+ describe "#icon" do
31
+ it "should have prefix, suffix and urls" do
32
+ subject.icon.keys.should ~ ["urls", "prefix", "suffix", ]
33
+ end
34
+
35
+ describe "urls" do
36
+ it "should have urls for 32x32, 64x64 and 256x256 icons" do
37
+ subject.icon["urls"].keys.should ~ ["32x32", "64x64", "256x256"]
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ it "should give the sub categories of the category" do
44
+ subject.categories.should each { |category|
45
+ category.should be_a(Foursquared::Response::Category)
46
+ }
47
+ end
48
+ end