access 2.0.15 → 2.0.17

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 (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