access 2.0.15 → 2.0.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/lib/access.rb +1 -0
  3. data/lib/access/api.rb +25 -0
  4. data/lib/access/favorite.rb +72 -0
  5. data/lib/access/request.rb +15 -0
  6. data/lib/access/response.rb +6 -1
  7. data/lib/access/spot.rb +3 -3
  8. data/lib/access/version.rb +1 -1
  9. data/test/access/favorite_test.rb +181 -0
  10. data/test/access/member_test.rb +57 -0
  11. data/test/access/oauth_application_test.rb +4 -4
  12. data/test/vcr/cassettes/favorite_create_location.yml +108 -0
  13. data/test/vcr/cassettes/favorite_create_offer.yml +48 -0
  14. data/test/vcr/cassettes/favorite_create_store.yml +54 -0
  15. data/test/vcr/cassettes/favorite_delete_location.yml +213 -0
  16. data/test/vcr/cassettes/favorite_delete_offer.yml +93 -0
  17. data/test/vcr/cassettes/favorite_delete_store.yml +105 -0
  18. data/test/vcr/cassettes/favorite_find_location.yml +213 -0
  19. data/test/vcr/cassettes/favorite_find_offer.yml +93 -0
  20. data/test/vcr/cassettes/favorite_find_store.yml +105 -0
  21. data/test/vcr/cassettes/favorite_one_of_everything.yml +1145 -0
  22. data/test/vcr/cassettes/favorite_search.yml +138 -0
  23. data/test/vcr/cassettes/favorite_search_bad_member.yml +49 -0
  24. data/test/vcr/cassettes/favorite_search_locations.yml +214 -0
  25. data/test/vcr/cassettes/favorite_search_no_favorites.yml +49 -0
  26. data/test/vcr/cassettes/favorite_search_offers.yml +170 -0
  27. data/test/vcr/cassettes/favorite_search_stores.yml +54 -0
  28. data/test/vcr/cassettes/member_authenticate_failure.yml +48 -0
  29. data/test/vcr/cassettes/member_authenticate_success.yml +50 -0
  30. data/test/vcr/cassettes/member_register_failure.yml +138 -0
  31. data/test/vcr/cassettes/member_register_success.yml +50 -0
  32. metadata +45 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 76f8101646132407a45dce5cb4879ce4e152251d
4
- data.tar.gz: 5606f03d1dfbb338f83807ff5301a4913df2f681
3
+ metadata.gz: c0a44d1813d284be301a7fa6fca93de4d8ef4c2c
4
+ data.tar.gz: 512e5ee78e609bb65db7c52997fcaab19f375433
5
5
  SHA512:
6
- metadata.gz: d2889e260231f3c6ef2f2cde036e51e0b63ca8011a3700898ba6c39e4b4dc8f2a345ad4b84ac54f1d31b4d6db6e17997e144f44f5f33face66ab070f23438d81
7
- data.tar.gz: 980a0c9afd21bd4b5bcf95da601525bf9f6574b7d14f919e5fbbf194617ea54386fa0dc7e6f758801e527c30992261287905e77f7ccbdcb444e76e639f723750
6
+ metadata.gz: a22a8593a0caebcbb234c693d5ecd2bdec8c7da232f80654315eef52ec8f3b7d396538297c09eb1ea1420c522469a8e1975d9412e7554d237706c49e231983c9
7
+ data.tar.gz: e63cd07b6505b6281aec0fa93917f4b6cb6c65f58671b8b7be6d3313c46729b50bd539910da96cf785d0a45e1fa46b3397e829e912beae6aa4244441c69abc92
data/lib/access.rb CHANGED
@@ -11,6 +11,7 @@ require "access/category"
11
11
  require "access/channel"
12
12
  require "access/city_savings"
13
13
  require "access/error"
14
+ require "access/favorite"
14
15
  require "access/filter"
15
16
  require "access/geolocation"
16
17
  require "access/info"
data/lib/access/api.rb CHANGED
@@ -309,6 +309,31 @@ module Access
309
309
  end
310
310
  end
311
311
 
312
+ ## Favorites
313
+
314
+ def favorites_search(options = {})
315
+ request.get("/members/#{options[:member_key]}/favorites/#{options[:favorite_type]}", "mms", options) do |response|
316
+ FavoriteResponse.new(response)
317
+ end
318
+ end
319
+
320
+ def favorites_find(resource_id, options = {})
321
+ request.get("/members/#{options[:member_key]}/favorites/#{options[:favorite_type]}/#{resource_id}", "mms", options) do |response|
322
+ FavoriteResponse.new(response)
323
+ end
324
+ end
325
+
326
+ def favorites_create(resource_id, options = {})
327
+ request.post("/members/#{options[:member_key]}/favorites/#{options[:favorite_type]}/#{resource_id}", "mms", options) do |response|
328
+ FavoriteResponse.new(response)
329
+ end
330
+ end
331
+
332
+ def favorites_delete(resource_id, options = {})
333
+ request.delete("/members/#{options[:member_key]}/favorites/#{options[:favorite_type]}/#{resource_id}", "mms", options) do |response|
334
+ FavoriteResponse.new(response)
335
+ end
336
+ end
312
337
  private
313
338
 
314
339
  def request
@@ -0,0 +1,72 @@
1
+ module Access
2
+ class Favorite
3
+
4
+ def self.process_batch(chunk)
5
+ chunk.map { |favorite| new(favorite) }
6
+ end
7
+
8
+ def initialize(values)
9
+ self.class.class_eval {attr_reader *values.keys }
10
+ values.each do |attribute_name, attribute_value|
11
+ self.instance_variable_set("@#{attribute_name}", attribute_value)
12
+ end
13
+ end
14
+
15
+ def resource
16
+ self.send(self.favoriteType)
17
+ end
18
+
19
+ def self.search(options = {})
20
+ Access::Api.new.favorites_search options
21
+ end
22
+
23
+ def self.search_offers(options = {})
24
+ Access::Api.new.favorites_search options.merge(favorite_type: 'offers')
25
+ end
26
+
27
+ def self.search_locations(options = {})
28
+ Access::Api.new.favorites_search options.merge(favorite_type: 'locations')
29
+ end
30
+
31
+ def self.search_stores(options = {})
32
+ Access::Api.new.favorites_search options.merge(favorite_type: 'stores')
33
+ end
34
+
35
+ def self.find_offer(offer_key, options = {})
36
+ Access::Api.new.favorites_find offer_key, options.merge(favorite_type: 'offers')
37
+ end
38
+
39
+ def self.find_location(location_key, options = {})
40
+ Access::Api.new.favorites_find location_key, options.merge(favorite_type: 'locations')
41
+ end
42
+
43
+ def self.find_store(store_key, options = {})
44
+ Access::Api.new.favorites_find store_key, options.merge(favorite_type: 'stores')
45
+ end
46
+
47
+ def self.create_offer(offer_key, options = {})
48
+ Access::Api.new.favorites_create offer_key, options.merge(favorite_type: 'offers')
49
+ end
50
+
51
+ def self.create_location(location_key, options = {})
52
+ Access::Api.new.favorites_create location_key, options.merge(favorite_type: 'locations')
53
+ end
54
+
55
+ def self.create_store(store_key, options = {})
56
+ Access::Api.new.favorites_create store_key, options.merge(favorite_type: 'stores')
57
+ end
58
+
59
+ def self.delete_offer(offer_key, options = {})
60
+ Access::Api.new.favorites_delete offer_key, options.merge(favorite_type: 'offers')
61
+ end
62
+
63
+ def self.delete_location(location_key, options = {})
64
+ Access::Api.new.favorites_delete location_key, options.merge(favorite_type: 'locations')
65
+ end
66
+
67
+ def self.delete_store(store_key, options = {})
68
+ Access::Api.new.favorites_delete store_key, options.merge(favorite_type: 'stores')
69
+ end
70
+
71
+ end
72
+ end
@@ -31,6 +31,21 @@ module Access
31
31
  raise Access::Error::NoData
32
32
  end
33
33
 
34
+ def delete(path, api_type, options={}, &block)
35
+ url = set_base(api_type, path)
36
+ results = self.class.delete(url, headers: headers(options[:access_token]), body: options.to_json, timeout: (options[:access_timeout] || 10))
37
+ if should_return_json?(options[:return_json])
38
+ hashify_results?(options[:hashify]) ? results.hashify : results
39
+ else
40
+ block.call results
41
+ end
42
+ rescue Net::ReadTimeout, Net::OpenTimeout
43
+ # block.call({"message"=>"Request Timeout Error", "status"=>408})
44
+ raise Access::Error::Timeout
45
+ rescue EOFError
46
+ raise Access::Error::NoData
47
+ end
48
+
34
49
  def post_for_filter(path, api_type, filter, options={}, &block)
35
50
  url = set_base(api_type, path)
36
51
  results = self.class.post(url, headers: headers(options[:access_token]), body: filter, timeout: (options[:access_timeout] || 3))
@@ -1,7 +1,7 @@
1
1
  module Access
2
2
  class Response
3
3
 
4
- attr_accessor :info, :offers, :stores, :locations, :categories, :suggestions, :oauth_applications, :access_tokens, :oauth_tokens, :oauth_token, :verify, :reports, :members, :filters, :links, :dev_node, :message, :status, :success, :error, :response_status, :content_type, :redemption_method, :details, :oauth_access_token, :api_calls_over_time, :member_usage, :offer_count_in_categories, :offer_count_by_redemption_method, :offer_count_by_facet, :custom_aggregation, :internal_details, :users, :response, :offer_redemptions
4
+ attr_accessor :info, :offers, :stores, :locations, :categories, :suggestions, :oauth_applications, :access_tokens, :oauth_tokens, :oauth_token, :verify, :reports, :members, :filters, :links, :dev_node, :message, :status, :success, :error, :response_status, :content_type, :redemption_method, :details, :oauth_access_token, :api_calls_over_time, :member_usage, :offer_count_in_categories, :offer_count_by_redemption_method, :offer_count_by_facet, :custom_aggregation, :internal_details, :users, :response, :offer_redemptions, :favorites
5
5
 
6
6
  def initialize(response)
7
7
  @response = response # Setting this temporarily so i can have a working member reg call, since it doesn't follow the resource [] best practices
@@ -159,4 +159,9 @@ module Access
159
159
  end
160
160
  end
161
161
 
162
+ class FavoriteResponse < Response
163
+ def process_data
164
+ @favorites = Access::Favorite.process_batch(@favorites) if @favorites
165
+ end
166
+ end
162
167
  end
data/lib/access/spot.rb CHANGED
@@ -2,15 +2,15 @@ module Access
2
2
  class Spot
3
3
 
4
4
  def self.search_by_channel(channel_key, options = {})
5
- Access::api.new.search_spots_by_channel channel_key, options
5
+ Access::Api.new.search_spots_by_channel channel_key, options
6
6
  end
7
7
 
8
8
  def self.search_by_campaign(campaign_key, options = {})
9
- Access::api.new.search_spots_by_campaign campaign_key, options
9
+ Access::Api.new.search_spots_by_campaign campaign_key, options
10
10
  end
11
11
 
12
12
  def self.find(spot_key, options = {})
13
- Access::api.new.find_spot spot_key, options
13
+ Access::Api.new.find_spot spot_key, options
14
14
  end
15
15
 
16
16
  def self.process_batch(chunk)
@@ -1,4 +1,4 @@
1
1
  module Access
2
- VERSION = "2.0.15"
2
+ VERSION = "2.0.17"
3
3
  end
4
4
 
@@ -0,0 +1,181 @@
1
+ require './test/test_helper'
2
+
3
+ class FavoriteTest < Minitest::Test
4
+
5
+ def self.setup_favorites
6
+ VCR.use_cassette('favorite one of everything') do
7
+ @offer = Access::Offer.search(member_key: 'API_TEST', access_token: 'token_without_filters_with_program_offers', query: '_exists_:program_keys', all_offers: 'true').offers.first
8
+ # make sure there is a member that exists first
9
+ Access::Redeem.redeem_offer(@offer.offer_key, @offer.redemption_methods.first, member_key: "API_TEST", access_timeout: 10)
10
+ # make sure there is an offer favorited first
11
+ Access::Favorite.create_offer @offer.offer_key, member_key: 'API_TEST'
12
+ Access::Favorite.create_location @offer.location.location_key, member_key: 'API_TEST'
13
+ Access::Favorite.create_store @offer.store.store_key, member_key: 'API_TEST'
14
+ end
15
+ @offer
16
+ end
17
+
18
+ @@offer = FavoriteTest.setup_favorites
19
+
20
+ def test_favorite_search
21
+ VCR.use_cassette('favorite search') do
22
+ request = Access::Favorite.search member_key: 'API_TEST'
23
+ assert request.success
24
+ assert_kind_of Access::FavoriteResponse, request
25
+ assert_kind_of Array, request.favorites
26
+ assert request.favorites.map(&:favoriteType).uniq.count > 1, 'it should have more than one favorite type (offers/stores/locations)'
27
+ assert_kind_of Access::Favorite, request.favorites.first
28
+ end
29
+ end
30
+
31
+ def test_favorite_resource_links_to_the_object
32
+ favorite = Access::Favorite.new favoriteType: 'location', favorited_date: Time.now, location: {location_key: 123}
33
+ assert_equal favorite.resource, favorite.location
34
+ end
35
+
36
+ def test_favorite_search_with_bad_member
37
+ VCR.use_cassette('favorite search bad member') do
38
+ request = Access::Favorite.search member_key: 'API_TEST_FAVORITE_BAD_MEMBER'
39
+ refute request.success
40
+ assert_equal 400, request.status
41
+ assert_kind_of Access::FavoriteResponse, request
42
+ refute_nil request.error
43
+ assert_kind_of Access::Error, request.error
44
+ end
45
+ end
46
+
47
+ def test_favorite_search_with_no_favorites
48
+ # TODO refactor after fav api update
49
+ VCR.use_cassette('favorite search no favorites') do
50
+ request = Access::Favorite.search member_key: 'API_TEST_FAVORITE_NO_FAVORITES'
51
+ refute request.success
52
+ assert_kind_of Access::FavoriteResponse, request
53
+ refute_nil request.error
54
+ assert_kind_of Access::Error, request.error
55
+ end
56
+ end
57
+
58
+ def test_favorite_search_offers
59
+ VCR.use_cassette('favorite search offers') do
60
+ request = Access::Favorite.search_offers member_key: 'ALD12345'
61
+ assert_good_favorite_offer_response(request)
62
+ end
63
+ end
64
+
65
+ def test_favorite_search_locations
66
+ VCR.use_cassette('favorite search locations') do
67
+ request = Access::Favorite.search_locations member_key: 'ALD12345'
68
+ assert_good_favorite_location_response(request)
69
+ end
70
+ end
71
+
72
+ def test_favorite_search_stores
73
+ VCR.use_cassette('favorite search stores') do
74
+ request = Access::Favorite.search_stores member_key: 'ALD12345'
75
+ assert_good_favorite_store_response(request)
76
+ end
77
+ end
78
+
79
+ def test_favorite_find_offer
80
+ VCR.use_cassette('favorite find offer') do
81
+ Access::Favorite.create_offer @@offer.offer_key, member_key: 'API_TEST' # create it first, in case it was deleted
82
+ request = Access::Favorite.find_offer @@offer.offer_key, member_key: 'API_TEST'
83
+ assert_good_favorite_offer_response(request)
84
+ end
85
+ end
86
+
87
+ def test_favorite_find_location
88
+ VCR.use_cassette('favorite find location') do
89
+ Access::Favorite.create_location @@offer.location.location_key, member_key: 'API_TEST' # create it first, in case it was deleted
90
+ request = Access::Favorite.find_location @@offer.location.location_key, member_key: 'API_TEST'
91
+ assert_good_favorite_location_response(request)
92
+ end
93
+ end
94
+
95
+ def test_favorite_find_store
96
+ VCR.use_cassette('favorite find store') do
97
+ Access::Favorite.create_store @@offer.store.store_key, member_key: 'API_TEST' # create it first, in case it was deleted
98
+ request = Access::Favorite.find_store @@offer.store.store_key, member_key: 'API_TEST'
99
+ assert_good_favorite_store_response(request)
100
+ end
101
+ end
102
+
103
+ def test_favorite_create_offer
104
+ VCR.use_cassette('favorite create offer') do
105
+ request = Access::Favorite.create_offer @@offer.offer_key, member_key: 'API_TEST'
106
+ assert_good_favorite_offer_response(request)
107
+ end
108
+ end
109
+
110
+
111
+ def test_favorite_create_location
112
+ VCR.use_cassette('favorite create location') do
113
+ request = Access::Favorite.create_location @@offer.location.location_key, member_key: 'API_TEST'
114
+ assert_good_favorite_location_response(request)
115
+ end
116
+ end
117
+
118
+ def test_favorite_create_store
119
+ VCR.use_cassette('favorite create store') do
120
+ request = Access::Favorite.create_store @@offer.store.store_key, member_key: 'API_TEST'
121
+ assert_good_favorite_store_response(request)
122
+ end
123
+ end
124
+
125
+ def test_favorite_delete_offer
126
+ VCR.use_cassette('favorite delete offer') do
127
+ Access::Favorite.create_offer @@offer.offer_key, member_key: 'API_TEST' # create it first, in case it was deleted
128
+ request = Access::Favorite.delete_offer @@offer.offer_key, member_key: 'API_TEST'
129
+ assert request.success
130
+ assert_kind_of Access::FavoriteResponse, request
131
+ end
132
+ end
133
+
134
+ def test_favorite_delete_location
135
+ VCR.use_cassette('favorite delete location') do
136
+ Access::Favorite.delete_location @@offer.location.location_key, member_key: 'API_TEST' # create it first, in case it was deleted
137
+ request = Access::Favorite.find_location @@offer.location.location_key, member_key: 'API_TEST'
138
+ assert request.success
139
+ assert_kind_of Access::FavoriteResponse, request
140
+ end
141
+ end
142
+
143
+ def test_favorite_delete_store
144
+ VCR.use_cassette('favorite delete store') do
145
+ Access::Favorite.delete_store @@offer.store.store_key, member_key: 'API_TEST' # create it first, in case it was deleted
146
+ request = Access::Favorite.find_store @@offer.store.store_key, member_key: 'API_TEST'
147
+ assert request.success
148
+ assert_kind_of Access::FavoriteResponse, request
149
+ end
150
+ end
151
+
152
+
153
+ def assert_good_favorite_offer_response(request)
154
+ assert request.success
155
+ assert_kind_of Access::FavoriteResponse, request
156
+ assert_kind_of Array, request.favorites
157
+ assert_equal 1, request.favorites.map(&:favoriteType).uniq.count
158
+ assert_equal 'offer', request.favorites.map(&:favoriteType).uniq.first
159
+ assert_kind_of Access::Favorite, request.favorites.first
160
+ end
161
+
162
+ def assert_good_favorite_location_response(request)
163
+ assert request.success
164
+ assert_kind_of Access::FavoriteResponse, request
165
+ assert_kind_of Array, request.favorites
166
+ assert_equal 1, request.favorites.map(&:favoriteType).uniq.count
167
+ assert_equal 'location', request.favorites.map(&:favoriteType).uniq.first
168
+ assert_kind_of Access::Favorite, request.favorites.first
169
+ end
170
+
171
+ def assert_good_favorite_store_response(request)
172
+ assert request.success
173
+ assert_kind_of Access::FavoriteResponse, request
174
+ assert_kind_of Array, request.favorites
175
+ assert_equal 1, request.favorites.map(&:favoriteType).uniq.count
176
+ assert_equal 'store', request.favorites.map(&:favoriteType).uniq.first
177
+ assert_kind_of Access::Favorite, request.favorites.first
178
+ end
179
+
180
+ end
181
+
@@ -2,4 +2,61 @@ require './test/test_helper'
2
2
 
3
3
  class MemberTest < Minitest::Test
4
4
 
5
+ def test_register_success
6
+ VCR.use_cassette('member register success') do
7
+ request = Access::Member.register registration_params
8
+ assert request.success
9
+ assert_kind_of Access::MemberResponse, request
10
+ assert_kind_of Array, request.users
11
+ assert_equal 1, request.users.count
12
+ assert_kind_of Access::Member, request.users.first
13
+ end
14
+ end
15
+
16
+ def test_register_failure
17
+ VCR.use_cassette('member register failure') do
18
+ request = Access::Member.register registration_params.merge(email: nil)
19
+ refute request.success
20
+ assert_equal 400, request.status
21
+ assert_kind_of Access::MemberResponse, request
22
+ refute_nil request.error
23
+ assert_kind_of Access::Error, request.error
24
+ end
25
+ end
26
+
27
+ def test_authenticate_success
28
+ VCR.use_cassette('member authenticate success') do
29
+ request = Access::Member.authenticate email: 'ben@test.com', password: 'password'
30
+ assert request.success
31
+ assert_kind_of Access::MemberResponse, request
32
+ assert_kind_of Array, request.users
33
+ assert_equal 1, request.users.count
34
+ assert_kind_of Access::Member, request.users.first
35
+ end
36
+ end
37
+
38
+ def test_authenticate_failure
39
+ VCR.use_cassette('member authenticate failure') do
40
+ request = Access::Member.authenticate email: 'ben@test.com', password: 'bad'
41
+ refute request.success
42
+ assert_equal 401, request.status
43
+ assert_kind_of Access::MemberResponse, request
44
+ refute_nil request.error
45
+ assert_kind_of Access::Error, request.error
46
+ end
47
+ end
48
+
49
+ def registration_params
50
+ {
51
+ program_id: 2412,
52
+ first_name: 'RubyGem',
53
+ last_name: 'Test',
54
+ postal_code: 84047,
55
+ email: "rubygemtest-3@accessdevelopment.com",
56
+ password: 'test1234',
57
+ shared_secret: 'thanks',
58
+ program_url: "saversclub.accessdevelopment.com",
59
+ access_timeout: 180
60
+ }
61
+ end
5
62
  end
@@ -74,18 +74,18 @@ class OauthApplicationTest < Minitest::Test
74
74
  end
75
75
 
76
76
  def test_oauth_applications_create_token
77
-
77
+ skip
78
78
  end
79
79
 
80
80
  def test_oauth_applications_create
81
-
81
+ skip
82
82
  end
83
83
 
84
84
  def test_oauth_applications_update
85
-
85
+ skip
86
86
  end
87
87
 
88
88
  def test_oauth_applications_delete
89
-
89
+ skip
90
90
  end
91
91
  end