7digital 0.0.7 → 0.1.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.
Files changed (211) hide show
  1. data/README.rdoc +8 -1
  2. data/lib/sevendigital.rb +4 -2
  3. data/lib/sevendigital/api_operator.rb +92 -94
  4. data/lib/sevendigital/api_operator_cached.rb +55 -33
  5. data/lib/sevendigital/api_request.rb +50 -54
  6. data/lib/sevendigital/client.rb +15 -6
  7. data/lib/sevendigital/client_configuration.rb +0 -3
  8. data/lib/sevendigital/client_digestors.rb +15 -0
  9. data/lib/sevendigital/client_managers.rb +11 -1
  10. data/lib/sevendigital/digestion_tract/api_response_digestor.rb +31 -40
  11. data/lib/sevendigital/digestion_tract/artist_digestor.rb +16 -13
  12. data/lib/sevendigital/digestion_tract/basket_digestor.rb +5 -5
  13. data/lib/sevendigital/digestion_tract/basket_item_digestor.rb +12 -12
  14. data/lib/sevendigital/digestion_tract/chart_item_digestor.rb +17 -11
  15. data/lib/sevendigital/digestion_tract/country_digestor.rb +16 -0
  16. data/lib/sevendigital/digestion_tract/digestor.rb +82 -28
  17. data/lib/sevendigital/digestion_tract/download_url_digestor.rb +10 -7
  18. data/lib/sevendigital/digestion_tract/format_digestor.rb +11 -9
  19. data/lib/sevendigital/digestion_tract/label_digestor.rb +8 -7
  20. data/lib/sevendigital/digestion_tract/list_digestor.rb +24 -0
  21. data/lib/sevendigital/digestion_tract/list_item_digestor.rb +26 -0
  22. data/lib/sevendigital/digestion_tract/locker_digestor.rb +9 -5
  23. data/lib/sevendigital/digestion_tract/locker_release_digestor.rb +13 -7
  24. data/lib/sevendigital/digestion_tract/locker_track_digestor.rb +13 -9
  25. data/lib/sevendigital/digestion_tract/oauth_access_token_digestor.rb +7 -3
  26. data/lib/sevendigital/digestion_tract/oauth_request_token_digestor.rb +7 -3
  27. data/lib/sevendigital/digestion_tract/pager_digestor.rb +13 -9
  28. data/lib/sevendigital/digestion_tract/price_digestor.rb +15 -12
  29. data/lib/sevendigital/digestion_tract/release_digestor.rb +26 -34
  30. data/lib/sevendigital/digestion_tract/tag_digestor.rb +8 -7
  31. data/lib/sevendigital/digestion_tract/track_digestor.rb +27 -28
  32. data/lib/sevendigital/digestion_tract/user_card_digestor.rb +9 -8
  33. data/lib/sevendigital/digestion_tract/user_digestor.rb +8 -7
  34. data/lib/sevendigital/management/artist_manager.rb +9 -11
  35. data/lib/sevendigital/management/basket_manager.rb +4 -4
  36. data/lib/sevendigital/management/country_manager.rb +11 -0
  37. data/lib/sevendigital/management/list_manager.rb +18 -0
  38. data/lib/sevendigital/management/oauth_manager.rb +2 -2
  39. data/lib/sevendigital/management/release_manager.rb +9 -11
  40. data/lib/sevendigital/management/tag_manager.rb +1 -1
  41. data/lib/sevendigital/management/track_manager.rb +4 -5
  42. data/lib/sevendigital/management/user_card_manager.rb +2 -2
  43. data/lib/sevendigital/management/user_manager.rb +9 -4
  44. data/lib/sevendigital/model/api_response.rb +12 -4
  45. data/lib/sevendigital/model/artist.rb +5 -0
  46. data/lib/sevendigital/model/list.rb +5 -0
  47. data/lib/sevendigital/model/list_item.rb +9 -0
  48. data/lib/sevendigital/model/release.rb +2 -2
  49. data/lib/sevendigital/model/sevendigital_object.rb +1 -1
  50. data/lib/sevendigital/model/user.rb +12 -1
  51. data/lib/sevendigital/pager.rb +2 -6
  52. data/lib/sevendigital/version.rb +1 -1
  53. data/spec/api_operator_cached_spec.rb +14 -14
  54. data/spec/api_operator_spec.rb +18 -34
  55. data/spec/digestion_tract/api_response_digestor_spec.rb +26 -25
  56. data/spec/digestion_tract/artist_digestor_spec.rb +9 -9
  57. data/spec/digestion_tract/basket_digestor_spec.rb +2 -2
  58. data/spec/digestion_tract/basket_item_digestor_spec.rb +4 -4
  59. data/spec/digestion_tract/chart_digestor_spec.rb +4 -4
  60. data/spec/digestion_tract/country_digestor_spec.rb +33 -0
  61. data/spec/digestion_tract/digestor_spec.rb +34 -0
  62. data/spec/digestion_tract/download_url_digestor_spec.rb +2 -2
  63. data/spec/digestion_tract/format_digestor_spec.rb +2 -2
  64. data/spec/digestion_tract/label_digestor_spec.rb +2 -2
  65. data/spec/digestion_tract/list_digestor_spec.rb +32 -0
  66. data/spec/digestion_tract/list_item_digestor_spec.rb +80 -0
  67. data/spec/digestion_tract/locker_digestor_spec.rb +2 -2
  68. data/spec/digestion_tract/locker_release_digestor_spec.rb +5 -5
  69. data/spec/digestion_tract/locker_track_digestor_spec.rb +4 -4
  70. data/spec/digestion_tract/oauth_access_token_digestor_spec.rb +2 -2
  71. data/spec/digestion_tract/oauth_request_token_digestor_spec.rb +2 -2
  72. data/spec/digestion_tract/pager_digestor_spec.rb +3 -3
  73. data/spec/digestion_tract/price_digestor_spec.rb +4 -4
  74. data/spec/digestion_tract/release_digestor_spec.rb +19 -5
  75. data/spec/digestion_tract/tag_digestor_spec.rb +3 -3
  76. data/spec/digestion_tract/track_digestor_spec.rb +4 -4
  77. data/spec/digestion_tract/user_card_digestor_spec.rb +5 -5
  78. data/spec/digestion_tract/user_digestor_spec.rb +4 -6
  79. data/spec/integration/artist_spec.rb +86 -0
  80. data/spec/integration/country_spec.rb +18 -0
  81. data/spec/integration/list_spec.rb +22 -0
  82. data/spec/integration/purchasing_spec.rb +24 -0
  83. data/spec/integration/release_spec.rb +34 -0
  84. data/spec/integration/sevendigital_spec.yml +5 -0
  85. data/spec/integration/track_spec.rb +23 -0
  86. data/spec/integration/user_spec.rb +22 -0
  87. data/spec/management/artist_manager_spec.rb +32 -11
  88. data/spec/management/basket_manager_spec.rb +4 -4
  89. data/spec/management/country_manager_spec.rb +34 -0
  90. data/spec/management/list_manager_spec.rb +27 -0
  91. data/spec/management/oauth_manager_spec.rb +4 -4
  92. data/spec/management/release_manager_spec.rb +13 -13
  93. data/spec/management/tag_manager_spec.rb +1 -1
  94. data/spec/management/track_manager_spec.rb +4 -4
  95. data/spec/management/user_card_manager_spec.rb +2 -2
  96. data/spec/management/user_manager_spec.rb +20 -4
  97. data/spec/model/api_response_spec.rb +3 -3
  98. data/spec/model/artist_spec.rb +2 -2
  99. data/spec/model/sevendigital_object_spec.rb +4 -4
  100. data/spec/model/user_spec.rb +21 -0
  101. data/spec/spec_helper.rb +31 -11
  102. data/spec/test-xml/methods/country/resolve.xml +7 -0
  103. data/spec/test-xml/methods/editorial/list.xml +171 -0
  104. data/spec/test-xml/methods/user/details.xml +5 -0
  105. data/spec/test-xml/objects/artist.xml +1 -0
  106. data/spec/test-xml/objects/list.xml +89 -0
  107. data/spec/test-xml/objects/list_item_list.xml +86 -0
  108. data/spec/test-xml/objects/list_item_release.xml +14 -0
  109. data/spec/test-xml/objects/nested_release_list.xml +23 -0
  110. metadata +126 -273
  111. data/lib/sevendigital/peachy_patchy.rb +0 -9
  112. data/lib/sevendigital/proxy_police.rb +0 -28
  113. data/spec/coverage/assets/0.3.9/app.js +0 -66
  114. data/spec/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
  115. data/spec/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
  116. data/spec/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
  117. data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
  118. data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
  119. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
  120. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
  121. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
  122. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
  123. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
  124. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
  125. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
  126. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
  127. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
  128. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
  129. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
  130. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
  131. data/spec/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
  132. data/spec/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
  133. data/spec/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
  134. data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +0 -363
  135. data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +0 -44
  136. data/spec/coverage/assets/0.3.9/favicon.png +0 -0
  137. data/spec/coverage/assets/0.3.9/jquery-1.4.2.min.js +0 -155
  138. data/spec/coverage/assets/0.3.9/jquery.dataTables.min.js +0 -152
  139. data/spec/coverage/assets/0.3.9/jquery.timeago.js +0 -141
  140. data/spec/coverage/assets/0.3.9/jquery.url.js +0 -174
  141. data/spec/coverage/assets/0.3.9/loading.gif +0 -0
  142. data/spec/coverage/assets/0.3.9/magnify.png +0 -0
  143. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  144. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  145. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  146. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  147. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  148. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  149. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  150. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  151. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
  152. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  153. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
  154. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
  155. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  156. data/spec/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +0 -295
  157. data/spec/coverage/assets/0.3.9/stylesheet.css +0 -341
  158. data/spec/coverage/index.html +0 -47481
  159. data/spec/coverage/resultset.yml +0 -3556
  160. data/spec/model/coverage/assets/0.3.9/app.js +0 -66
  161. data/spec/model/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
  162. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
  163. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
  164. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
  165. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
  166. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
  167. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
  168. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
  169. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
  170. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
  171. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
  172. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
  173. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
  174. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
  175. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
  176. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
  177. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
  178. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
  179. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
  180. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
  181. data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +0 -363
  182. data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +0 -44
  183. data/spec/model/coverage/assets/0.3.9/favicon.png +0 -0
  184. data/spec/model/coverage/assets/0.3.9/jquery-1.4.2.min.js +0 -155
  185. data/spec/model/coverage/assets/0.3.9/jquery.dataTables.min.js +0 -152
  186. data/spec/model/coverage/assets/0.3.9/jquery.timeago.js +0 -141
  187. data/spec/model/coverage/assets/0.3.9/jquery.url.js +0 -174
  188. data/spec/model/coverage/assets/0.3.9/loading.gif +0 -0
  189. data/spec/model/coverage/assets/0.3.9/magnify.png +0 -0
  190. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  191. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  192. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  193. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  194. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  195. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  196. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  197. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  198. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
  199. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  200. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
  201. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
  202. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  203. data/spec/model/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +0 -295
  204. data/spec/model/coverage/assets/0.3.9/stylesheet.css +0 -341
  205. data/spec/model/coverage/index.html +0 -8637
  206. data/spec/model/coverage/resultset.yml +0 -642
  207. data/spec/pager_spec.rb +0 -7
  208. data/spec/peachy_spec_helper_patch.rb +0 -7
  209. data/spec/proxy_police_spec.rb +0 -70
  210. data/spec/sevendigital_spec.rb +0 -51
  211. data/spec/sevendigital_spec.yml +0 -5
@@ -37,8 +37,8 @@ module Sevendigital
37
37
  def price(options={})
38
38
  begin
39
39
  demand_price(options) if @api_client.configuration.lazy_load
40
- rescue
41
- puts "Error whilst lazyloading price - #{error.error_code} #{error.error_message}" if @api_client.verbose?
40
+ rescue Sevendigital::SevendigitalError => error
41
+ @api_client.log(:verbose) { "Release: Error while lazyloading price - #{error.error_code} #{error.error_message}" }
42
42
  raise error if !@api_client.configuration.ignorant_lazy_load
43
43
  end
44
44
  @price
@@ -25,7 +25,7 @@ class Class # :nodoc:
25
25
  begin
26
26
  send(demand_method, *options) if instance_variable_get("@#{accessor}").nil? && @api_client.configuration.lazy_load
27
27
  rescue Sevendigital::SevendigitalError => error
28
- puts "Error whilst lazyloading #{accessor} - #{error.error_code} #{error.error_message}" if @api_client.verbose?
28
+ @api_client.log(:verbose) { "Class: Error whilse lazyloading #{accessor} - #{error.error_code} #{error.error_message}" }
29
29
  raise error if !@api_client.configuration.ignorant_lazy_load
30
30
  end
31
31
  instance_variable_get("@#{accessor}")
@@ -2,7 +2,11 @@ module Sevendigital
2
2
 
3
3
  class User < SevendigitalObject
4
4
 
5
- attr_accessor :oauth_access_token, :id, :type, :email_address
5
+ attr_accessor :oauth_access_token, :id, :type
6
+
7
+ #Artist image URL (optional lazy-loaded property)
8
+ #@return [String]
9
+ sevendigital_basic_property :email_address
6
10
 
7
11
  sevendigital_extended_property :locker
8
12
 
@@ -12,6 +16,13 @@ module Sevendigital
12
16
  return !@oauth_access_token.nil?
13
17
  end
14
18
 
19
+ def get_details(options={})
20
+ raise Sevendigital::SevendigitalError if !authenticated?
21
+ user_with_details = @api_client.user.get_details(@oauth_access_token, options)
22
+ copy_basic_properties_from(user_with_details)
23
+ user_with_details
24
+ end
25
+
15
26
  def get_locker(options={})
16
27
  raise Sevendigital::SevendigitalError if !authenticated?
17
28
  @api_client.user.get_locker(@oauth_access_token, options)
@@ -4,11 +4,9 @@ rescue LoadError
4
4
  end
5
5
 
6
6
  module Sevendigital
7
-
8
7
  #@private
9
8
  #internal class used to page array results if will_paginate is available
10
9
  class Pager # :nodoc:
11
-
12
10
  attr_accessor :page, :page_size, :total_items
13
11
 
14
12
  def paginate_list(list)
@@ -16,9 +14,7 @@ module Sevendigital
16
14
  paged_list = WillPaginate::Collection.create(@page, @page_size, @total_items) do |pager|
17
15
  pager.replace(list)
18
16
  end
19
- return paged_list
17
+ paged_list
20
18
  end
21
-
22
19
  end
23
-
24
- end
20
+ end
@@ -1,5 +1,5 @@
1
1
  module Sevendigital
2
2
  # The version of the gem
3
3
  NAME = "7digital"
4
- VERSION = '0.0.7'
4
+ VERSION = '0.1.0'
5
5
  end
@@ -1,12 +1,12 @@
1
1
  require "spec_helper"
2
2
  require 'ostruct'
3
+ require 'time'
3
4
 
4
5
  describe "ApiOperatorCached" do
5
6
 
6
7
  before do
7
- @client = stub(Sevendigital::Client)
8
- @client.stub!(:verbose?).and_return(false)
9
- @client.stub!(:very_verbose?).and_return(false)
8
+ conf = test_configuration
9
+ @client = stub_api_client(conf)
10
10
  @cache = stub(Hash)
11
11
  @cached_operator = Sevendigital::ApiOperatorCached.new(@client, @cache)
12
12
  @stub_api_request = stub_api_request()
@@ -40,7 +40,7 @@ describe "ApiOperatorCached" do
40
40
  @cache.stub!(:get).with("key").and_return(http_response)
41
41
  @cached_operator.stub!(:response_out_of_date?).with(http_response).and_return(false)
42
42
  @cached_operator.should_not_receive(:make_http_request)
43
- @cached_operator.should_receive(:digest_http_response).with(http_response)
43
+ @cached_operator.should_not_receive(:digest_http_response).with(http_response)
44
44
  @cached_operator.call_api(@stub_api_request)
45
45
  end
46
46
 
@@ -74,13 +74,14 @@ describe "ApiOperatorCached" do
74
74
 
75
75
  it "should cache uncached api response if request was not signed" do
76
76
  http_response = stub_http_response()
77
+ api_response = stub_api_response()
77
78
 
78
79
  @cached_operator.stub(:create_request_uri).and_return("key")
79
80
  @cache.stub!(:get).with("key").and_return(nil)
80
81
  @cached_operator.stub!(:make_http_request).and_return(http_response)
81
- @cached_operator.stub!(:digest_http_response)
82
+ @cached_operator.stub!(:digest_http_response).with(http_response).and_return(api_response)
82
83
 
83
- @cache.should_receive(:set).with("key", http_response).and_return(nil)
84
+ @cache.should_receive(:set).with("key", api_response).and_return(nil)
84
85
  @cached_operator.call_api(@stub_api_request)
85
86
  end
86
87
 
@@ -90,7 +91,7 @@ describe "ApiOperatorCached" do
90
91
  max_age = 12*60*60
91
92
 
92
93
  http_response = stub_http_response
93
- http_response.stub!(:header).and_return({
94
+ http_response.stub!(:headers).and_return({
94
95
  "cache-control" => "private, max-age=#{max_age}",
95
96
  "Date" => yesterday.httpdate
96
97
  })
@@ -106,7 +107,7 @@ describe "ApiOperatorCached" do
106
107
  max_age = 48*60*60
107
108
 
108
109
  http_response = stub_http_response
109
- http_response.stub!(:header).and_return({
110
+ http_response.stub!(:headers).and_return({
110
111
  "cache-control" => "private, max-age=#{max_age}",
111
112
  "Date" => yesterday.httpdate
112
113
  })
@@ -118,10 +119,10 @@ describe "ApiOperatorCached" do
118
119
  it "response should be out of date if it is missing caching headers" do
119
120
 
120
121
  http_response = stub_http_response
121
- http_response.stub!(:header).and_return({})
122
+ http_response.stub!(:headers).and_return({})
122
123
  @cached_operator.response_out_of_date?(http_response, Time.now.utc).should == true
123
124
 
124
- http_response.stub!(:header).and_return({
125
+ http_response.stub!(:headers).and_return({
125
126
  "Date" => Time.now.utc.httpdate
126
127
  })
127
128
  @cached_operator.response_out_of_date?(http_response, Time.now.utc).should == true
@@ -131,7 +132,7 @@ describe "ApiOperatorCached" do
131
132
  it "response should be out of date if no max-age has been specified" do
132
133
 
133
134
  http_response = stub_http_response
134
- http_response.stub!(:header).and_return({"cache-control" => "no-cache", "Date" => Time.now.utc.httpdate})
135
+ http_response.stub!(:headers).and_return({"cache-control" => "no-cache", "Date" => Time.now.utc.httpdate})
135
136
  @cached_operator.response_out_of_date?(http_response, Time.now.utc).should == true
136
137
 
137
138
  end
@@ -139,7 +140,7 @@ describe "ApiOperatorCached" do
139
140
  it "response should be out of date if it is missing Date header" do
140
141
 
141
142
  http_response = stub_http_response
142
- http_response.stub!(:header).and_return({"cache-control" => "private, max-age=#{2**30}"})
143
+ http_response.stub!(:headers).and_return({"cache-control" => "private, max-age=#{2**30}"})
143
144
  @cached_operator.response_out_of_date?(http_response, Time.now.utc).should == true
144
145
 
145
146
  end
@@ -150,8 +151,7 @@ describe "ApiOperatorCached" do
150
151
  end
151
152
 
152
153
  def stub_http_response
153
- http_response = stub(Net::HTTP)
154
- http_response
154
+ stub(Net::HTTP)
155
155
  end
156
156
 
157
157
  def stub_time(time)
@@ -6,11 +6,11 @@ describe "ApiOperator" do
6
6
 
7
7
  before do
8
8
  response_digestor = stub(Sevendigital::ApiResponseDigestor)
9
- response_digestor.stub!(:from_http_response). and_return(fake_digested_response)
9
+ response_digestor.stub!(:from_http_response). and_return(fake_api_response)
10
10
 
11
11
  stub_api_client(test_configuration, response_digestor)
12
12
 
13
- Net::HTTP.stub!(:get_response).and_return(fake_api_response)
13
+ Net::HTTP.stub!(:get_response).and_return(fake_http_response)
14
14
 
15
15
  @api_operator = Sevendigital::ApiOperator.new(@client)
16
16
 
@@ -140,7 +140,7 @@ describe "ApiOperator" do
140
140
 
141
141
  it "should make HTTP request and get http response" do
142
142
 
143
- http_response = fake_api_response
143
+ http_response = fake_http_response
144
144
 
145
145
  @stub_http_request = stub(Net::HTTP::Get)
146
146
  @stub_http_client = stub(Net::HTTP)
@@ -157,8 +157,8 @@ describe "ApiOperator" do
157
157
 
158
158
  it "should digest the HTTP response and get it out" do
159
159
 
160
- http_response = fake_api_response
161
- digested_response = fake_digested_response
160
+ http_response = fake_http_response
161
+ digested_response = fake_api_response
162
162
 
163
163
  @client.api_response_digestor.should_receive(:from_http_response).with(http_response).and_return(digested_response)
164
164
 
@@ -170,8 +170,8 @@ describe "ApiOperator" do
170
170
 
171
171
  it "should call API by making an http request and digesting the response" do
172
172
 
173
- http_response = fake_api_response
174
- digested_response = fake_digested_response
173
+ http_response = fake_http_response
174
+ digested_response = fake_api_response
175
175
 
176
176
  @api_operator.should_receive(:make_http_request).and_return(http_response)
177
177
 
@@ -185,10 +185,10 @@ describe "ApiOperator" do
185
185
 
186
186
  it "should throw an exception if response is not ok" do
187
187
 
188
- failed_response = fake_digested_response(false)
188
+ failed_response = fake_api_response(false)
189
189
  failed_response.stub!(:error_code).and_return(4000)
190
190
  failed_response.stub!(:error_message).and_return("error")
191
- @api_operator.should_receive(:make_http_request).and_return(fake_api_response)
191
+ @api_operator.should_receive(:make_http_request).and_return(fake_http_response)
192
192
  @client.api_response_digestor.stub!(:from_http_response).and_return(failed_response)
193
193
 
194
194
  running { @api_operator.call_api(@stub_api_request) }.should raise_error(Sevendigital::SevendigitalError) { |error|
@@ -293,35 +293,19 @@ describe "ApiOperator" do
293
293
  signed_uri.should =~ /https:\/\/base.api.url\/version\/api\/method/
294
294
  end
295
295
 
296
- def test_configuration
297
- configuration = OpenStruct.new
298
- configuration.oauth_consumer_key = "oauth_consumer_key"
299
- return configuration
296
+ def fake_http_response(code = 200, body = "response_body")
297
+ http_stub = stub('Net::HTTPResponse')
298
+ http_stub.stub!(:code => code, :body => body, :header => {})
299
+ http_stub
300
+ #Net::HTTP.new("1.1", code, body).tap {|r| puts r.inspect}
300
301
  end
301
302
 
302
- def fake_api_response(code = 200, body = "response_body")
303
- return Net::HTTP.new("1.1", code, body)
303
+ def fake_api_response(is_ok = true)
304
+ r = stub(Sevendigital::ApiResponse)
305
+ r.stub(:ok?).and_return(is_ok)
306
+ r
304
307
  end
305
308
 
306
- def fake_digested_response(is_ok = true)
307
- proxy = stub(Peachy::Proxy)#.new('<response status="ok"><content>test</content></response>')
308
- proxy.stub!(:ok?).and_return(is_ok)
309
- proxy
310
- end
311
-
312
- def stub_api_client(configuration, response_digestor)
313
- @client = stub(Sevendigital::Client)
314
- @client.stub!(:configuration).and_return(configuration)
315
- @client.stub!(:oauth_consumer).and_return(OAuth::Consumer.new( configuration.oauth_consumer_key, configuration.oauth_consumer_secret))
316
- @client.stub!(:api_response_digestor).and_return(response_digestor)
317
- @client.stub!(:default_parameters).and_return({:country => 'sk'})
318
- @client.stub!(:user_agent_info).and_return("7digital")
319
- @client.stub!(:verbose?).and_return(false)
320
- @client.stub!(:very_verbose?).and_return(false)
321
- @client.stub!(:api_host_and_version).and_return(["base.api.url","version"])
322
-
323
- end
324
-
325
309
  def stub_api_request
326
310
  api_request = stub(Sevendigital::ApiRequest)
327
311
 
@@ -7,14 +7,13 @@ describe "ApiResponseDigestor" do
7
7
  end
8
8
 
9
9
  it "should create a response with body from http ok response" do
10
+ body = '<response status="ok"></response>'
10
11
 
11
- stub_http_response = stub(Net::HTTPSuccess)
12
- stub_http_response.stub!(:is_a?).with(Net::HTTPSuccess).and_return(true)
13
- stub_http_response.stub!(:body).and_return('<response status="ok"></response>')
14
- stub_http_response.stub!(:header).and_return(nil)
12
+ stub_http_response = stub_ok_http_response(body)
15
13
 
16
14
  response = @api_response_digestor.from_http_response(stub_http_response)
17
15
  response.error_code.should == 0
16
+ response.content.should == body
18
17
  end
19
18
 
20
19
  it "should create an error response from http non-ok response" do
@@ -36,9 +35,7 @@ describe "ApiResponseDigestor" do
36
35
 
37
36
  it "should store headers from http response" do
38
37
 
39
- stub_http_response = stub(Net::HTTPSuccess)
40
- stub_http_response.stub!(:is_a?).with(Net::HTTPSuccess).and_return(true)
41
- stub_http_response.stub!(:body).and_return('<response status="ok"></response>')
38
+ stub_http_response = stub_ok_http_response('<response status="ok"></response>')
42
39
  stub_http_response.stub!(:header).and_return({"cache-control" => "test", "date" => "now"})
43
40
 
44
41
  response = @api_response_digestor.from_http_response(stub_http_response)
@@ -48,45 +45,49 @@ describe "ApiResponseDigestor" do
48
45
 
49
46
 
50
47
  it "should create a response with body from xml ok response" do
51
-
52
- xml_response = <<XML
53
- <response status="ok"><test>aaa</test></response>
54
- XML
55
- response = @api_response_digestor.from_xml(xml_response)
48
+ xml_response = stub_ok_http_response("<response status=\"ok\">body</response>")
49
+ response = @api_response_digestor.from_http_response(xml_response)
56
50
  response.error_code.should == 0
57
- response.content.test.should_not == nil
58
- response.content.nothing.should == nil
59
51
  end
60
52
 
61
53
 
62
54
  it "should create a response with error details from xml error response" do
63
55
 
64
- xml_response = '<response status="error"><error code="1000"><errorMessage>expected error message</errorMessage></error></response>'
65
- response = @api_response_digestor.from_xml(xml_response)
56
+ xml_response = stub_ok_http_response(
57
+ '<response status="error"><error code="1000"><errorMessage>expected error message</errorMessage></error></response>')
58
+ response = @api_response_digestor.from_http_response(xml_response)
66
59
  response.error_code.should == 1000
67
60
  response.error_message.should == 'expected error message'
68
61
  end
69
62
 
70
63
  it "should create a response with error details from invalid xml response" do
71
64
 
72
- xml_response = '<wrongresponse status="ok"><test /></wrongresponse>'
73
- response = @api_response_digestor.from_xml(xml_response)
74
- response.error_code.should == 10000
65
+ xml_response = stub_ok_http_response('<wrongresponse status="ok"><test /></wrongresponse>')
66
+ response = @api_response_digestor.from_http_response(xml_response)
67
+ response.error_code.should == 10001
75
68
  response.error_message.should == 'Invalid 7digital API response'
76
69
 
77
- xml_response = '<response><test /></response>'
78
- response = @api_response_digestor.from_xml(xml_response)
79
- response.error_code.should == 10000
70
+ xml_response = stub_ok_http_response('<response><test /></response>')
71
+ response = @api_response_digestor.from_http_response(xml_response)
72
+ response.error_code.should == 10001
80
73
  response.error_message.should == 'Invalid 7digital API response'
81
74
  end
82
75
 
83
76
 
84
77
  it "should create a response with error details from valid xml response with invalid status" do
85
78
 
86
- xml_response = '<response status="unkown"><test></test></response>'
87
- response = @api_response_digestor.from_xml(xml_response)
88
- response.error_code.should == 10000
79
+ xml_response = stub_ok_http_response('<response status="unkown"><test></test></response>')
80
+ response = @api_response_digestor.from_http_response(xml_response)
81
+ response.error_code.should == 10001
89
82
  response.error_message.should == 'Invalid 7digital API response'
83
+ end
84
+
85
+ def stub_ok_http_response(body)
86
+ stub_http_response = stub(Net::HTTPSuccess)
87
+ stub_http_response.stub!(:is_a?).with(Net::HTTPSuccess).and_return(true)
88
+ stub_http_response.stub!(:body).and_return(body)
89
+ stub_http_response.stub!(:header).and_return(nil)
90
+ stub_http_response
90
91
  end
91
92
 
92
93
  end
@@ -14,7 +14,7 @@ describe "ArtistDigestor" do
14
14
  </release>
15
15
  XML
16
16
 
17
- running {@artist_digestor.from_xml(xml_response)}.should raise_error(Sevendigital::DigestiveProblem)
17
+ running {@artist_digestor.from_xml_string(xml_response)}.should raise_error(Sevendigital::DigestiveProblem)
18
18
 
19
19
  end
20
20
 
@@ -26,29 +26,29 @@ XML
26
26
  </artist>
27
27
  XML
28
28
 
29
- artist = @artist_digestor.from_xml(xml_response)
29
+ artist = @artist_digestor.from_xml_string(xml_response)
30
30
  artist.id.should == 123
31
31
  artist.name.should == "expected artist name"
32
32
  end
33
33
 
34
- it "should digest artist xml and populate all available properties" do
34
+ it "should digest artist xml and populate all available properties" do
35
35
 
36
36
  xml_response = load_sample_object_xml("artist")
37
-
38
- artist = @artist_digestor.from_xml(xml_response)
37
+ artist = @artist_digestor.from_xml_string(xml_response)
39
38
  artist.id.should == 123
40
39
  artist.name.should == "The Expected Artist"
41
40
  artist.sort_name.should == "Expected Artist, The"
42
41
  artist.appears_as.should == "The E.A."
43
42
  artist.image.should == "http://somewhere.com/tea.jpg"
44
43
  artist.url.should == "http://7digital.com/artists/tea?partner=1"
45
- end
44
+ artist.popularity.should == 0.55
45
+ end
46
46
 
47
47
  it "should digest xml containing list of artists and return a paginated array" do
48
48
 
49
49
  xml_response = load_sample_object_xml("artist_list")
50
50
 
51
- artists = @artist_digestor.list_from_xml(xml_response, :artists)
51
+ artists = @artist_digestor.list_from_xml_string(xml_response, :artists)
52
52
  artists[0].id.should == 14
53
53
  artists[1].id.should == 20
54
54
  artists[2].id.should == 106
@@ -61,7 +61,7 @@ XML
61
61
 
62
62
  xml_response = load_sample_object_xml("artist_list_empty")
63
63
 
64
- artists = @artist_digestor.list_from_xml(xml_response, :artists)
64
+ artists = @artist_digestor.list_from_xml_string(xml_response, :artists)
65
65
  artists.size.should == 0
66
66
  artists.total_entries.should == 0
67
67
 
@@ -75,7 +75,7 @@ XML
75
75
  </release>
76
76
  XML
77
77
 
78
- running {@artist_digestor.list_from_xml(xml_response)}.should raise_error(Sevendigital::DigestiveProblem)
78
+ running {@artist_digestor.list_from_xml_string(xml_response)}.should raise_error(Sevendigital::DigestiveProblem)
79
79
 
80
80
  end
81
81
 
@@ -16,14 +16,14 @@ describe "BasketDigestor" do
16
16
  </zzz>
17
17
  XML
18
18
 
19
- running {@basket_digestor.from_xml(xml_response)}.should raise_error(Sevendigital::DigestiveProblem)
19
+ running {@basket_digestor.from_xml_string(xml_response)}.should raise_error(Sevendigital::DigestiveProblem)
20
20
  end
21
21
 
22
22
  it "should parse from Basket xml and populate all properties" do
23
23
 
24
24
  xml_response = load_sample_object_xml("basket")
25
25
 
26
- basket = @basket_digestor.from_xml(xml_response)
26
+ basket = @basket_digestor.from_xml_string(xml_response)
27
27
  basket.id.should == "00000000-0000-0000-0000-000000000000"
28
28
  basket.basket_items.size == 1
29
29
  basket.basket_items[0].id == 15284882