7digital 0.0.2 → 0.0.5

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 (220) hide show
  1. data/README.rdoc +132 -5
  2. data/lib/sevendigital.rb +1 -2
  3. data/lib/sevendigital/api_operator.rb +103 -12
  4. data/lib/sevendigital/api_operator_cached.rb +14 -8
  5. data/lib/sevendigital/api_request.rb +50 -9
  6. data/lib/sevendigital/client.rb +51 -89
  7. data/lib/sevendigital/client_configuration.rb +86 -0
  8. data/lib/sevendigital/client_digestors.rb +79 -0
  9. data/lib/sevendigital/client_managers.rb +34 -0
  10. data/lib/sevendigital/digestion_tract/api_response_digestor.rb +8 -3
  11. data/lib/sevendigital/digestion_tract/artist_digestor.rb +1 -1
  12. data/lib/sevendigital/digestion_tract/basket_digestor.rb +18 -0
  13. data/lib/sevendigital/digestion_tract/basket_item_digestor.rb +25 -0
  14. data/lib/sevendigital/digestion_tract/chart_item_digestor.rb +1 -1
  15. data/lib/sevendigital/digestion_tract/digestor.rb +7 -3
  16. data/lib/sevendigital/digestion_tract/download_url_digestor.rb +19 -0
  17. data/lib/sevendigital/digestion_tract/format_digestor.rb +1 -1
  18. data/lib/sevendigital/digestion_tract/label_digestor.rb +1 -1
  19. data/lib/sevendigital/digestion_tract/locker_digestor.rb +17 -0
  20. data/lib/sevendigital/digestion_tract/locker_release_digestor.rb +19 -0
  21. data/lib/sevendigital/digestion_tract/locker_track_digestor.rb +21 -0
  22. data/lib/sevendigital/digestion_tract/oauth_access_token_digestor.rb +14 -0
  23. data/lib/sevendigital/digestion_tract/oauth_request_token_digestor.rb +14 -0
  24. data/lib/sevendigital/digestion_tract/pager_digestor.rb +1 -1
  25. data/lib/sevendigital/digestion_tract/price_digestor.rb +3 -3
  26. data/lib/sevendigital/digestion_tract/release_digestor.rb +1 -1
  27. data/lib/sevendigital/digestion_tract/tag_digestor.rb +22 -0
  28. data/lib/sevendigital/digestion_tract/track_digestor.rb +1 -1
  29. data/lib/sevendigital/management/artist_manager.rb +71 -34
  30. data/lib/sevendigital/management/basket_manager.rb +29 -0
  31. data/lib/sevendigital/management/manager.rb +1 -1
  32. data/lib/sevendigital/management/oauth_manager.rb +23 -0
  33. data/lib/sevendigital/management/release_manager.rb +7 -14
  34. data/lib/sevendigital/management/tag_manager.rb +11 -0
  35. data/lib/sevendigital/management/track_manager.rb +9 -9
  36. data/lib/sevendigital/management/user_manager.rb +51 -0
  37. data/lib/sevendigital/model/api_response.rb +19 -3
  38. data/lib/sevendigital/model/artist.rb +27 -9
  39. data/lib/sevendigital/model/basket.rb +16 -0
  40. data/lib/sevendigital/model/basket_item.rb +15 -0
  41. data/lib/sevendigital/model/download_url.rb +7 -0
  42. data/lib/sevendigital/model/format.rb +0 -2
  43. data/lib/sevendigital/model/label.rb +1 -3
  44. data/lib/sevendigital/model/locker.rb +5 -0
  45. data/lib/sevendigital/model/locker_release.rb +9 -0
  46. data/lib/sevendigital/model/locker_track.rb +9 -0
  47. data/lib/sevendigital/model/price.rb +0 -2
  48. data/lib/sevendigital/model/release.rb +22 -8
  49. data/lib/sevendigital/model/sevendigital_error.rb +9 -1
  50. data/lib/sevendigital/model/sevendigital_object.rb +16 -11
  51. data/lib/sevendigital/model/tag.rb +7 -0
  52. data/lib/sevendigital/model/track.rb +4 -4
  53. data/lib/sevendigital/model/user.rb +34 -0
  54. data/lib/sevendigital/pager.rb +8 -2
  55. data/lib/sevendigital/proxy_police.rb +5 -1
  56. data/lib/sevendigital/version.rb +5 -0
  57. data/spec/api_operator_cached_spec.rb +62 -7
  58. data/spec/api_operator_spec.rb +245 -21
  59. data/spec/api_request_spec.rb +20 -15
  60. data/spec/client_configuration_spec.rb +75 -0
  61. data/spec/client_spec.rb +126 -48
  62. data/spec/coverage/assets/0.3.9/app.js +66 -0
  63. data/spec/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
  64. data/spec/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
  65. data/spec/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
  66. data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
  67. data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
  68. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
  69. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
  70. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
  71. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
  72. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
  73. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
  74. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
  75. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
  76. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
  77. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
  78. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
  79. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
  80. data/spec/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
  81. data/spec/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
  82. data/spec/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
  83. data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +363 -0
  84. data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
  85. data/spec/coverage/assets/0.3.9/favicon.png +0 -0
  86. data/spec/coverage/assets/0.3.9/jquery-1.4.2.min.js +155 -0
  87. data/spec/coverage/assets/0.3.9/jquery.dataTables.min.js +152 -0
  88. data/spec/coverage/assets/0.3.9/jquery.timeago.js +141 -0
  89. data/spec/coverage/assets/0.3.9/jquery.url.js +174 -0
  90. data/spec/coverage/assets/0.3.9/loading.gif +0 -0
  91. data/spec/coverage/assets/0.3.9/magnify.png +0 -0
  92. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  93. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  94. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  95. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  96. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  97. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  98. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  99. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  100. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
  101. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  102. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
  103. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
  104. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  105. data/spec/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +295 -0
  106. data/spec/coverage/assets/0.3.9/stylesheet.css +341 -0
  107. data/spec/coverage/index.html +43412 -0
  108. data/spec/coverage/resultset.yml +3251 -0
  109. data/spec/data/configuration_override.yml +2 -1
  110. data/spec/digestion_tract/api_response_digestor_spec.rb +15 -1
  111. data/spec/digestion_tract/artist_digestor_spec.rb +3 -3
  112. data/spec/digestion_tract/basket_digestor_spec.rb +32 -0
  113. data/spec/digestion_tract/basket_item_digestor_spec.rb +58 -0
  114. data/spec/digestion_tract/chart_digestor_spec.rb +2 -2
  115. data/spec/digestion_tract/download_url_digestor_spec.rb +41 -0
  116. data/spec/digestion_tract/format_digestor_spec.rb +2 -2
  117. data/spec/digestion_tract/label_digestor_spec.rb +2 -2
  118. data/spec/digestion_tract/locker_digestor_spec.rb +31 -0
  119. data/spec/digestion_tract/locker_release_digestor_spec.rb +71 -0
  120. data/spec/digestion_tract/locker_track_digestor_spec.rb +56 -0
  121. data/spec/digestion_tract/oauth_access_token_digestor_spec.rb +35 -0
  122. data/spec/digestion_tract/oauth_request_token_digestor_spec.rb +35 -0
  123. data/spec/digestion_tract/pager_digestor_spec.rb +2 -2
  124. data/spec/digestion_tract/price_digestor_spec.rb +21 -5
  125. data/spec/digestion_tract/release_digestor_spec.rb +2 -2
  126. data/spec/digestion_tract/tag_digestor_spec.rb +46 -0
  127. data/spec/digestion_tract/track_digestor_spec.rb +1 -1
  128. data/spec/management/artist_manager_spec.rb +46 -41
  129. data/spec/management/basket_manager_spec.rb +78 -0
  130. data/spec/management/oauth_manager_spec.rb +73 -0
  131. data/spec/management/release_manager_spec.rb +33 -74
  132. data/spec/management/tag_manager_spec.rb +34 -0
  133. data/spec/management/track_manager_spec.rb +42 -25
  134. data/spec/management/user_manager_spec.rb +163 -0
  135. data/spec/model/api_response_spec.rb +69 -2
  136. data/spec/model/artist_spec.rb +1 -26
  137. data/spec/model/basket_spec.rb +63 -0
  138. data/spec/model/coverage/assets/0.3.9/app.js +66 -0
  139. data/spec/model/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
  140. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
  141. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
  142. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
  143. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
  144. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
  145. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
  146. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
  147. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
  148. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
  149. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
  150. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
  151. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
  152. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
  153. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
  154. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
  155. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
  156. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
  157. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
  158. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
  159. data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +363 -0
  160. data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
  161. data/spec/model/coverage/assets/0.3.9/favicon.png +0 -0
  162. data/spec/model/coverage/assets/0.3.9/jquery-1.4.2.min.js +155 -0
  163. data/spec/model/coverage/assets/0.3.9/jquery.dataTables.min.js +152 -0
  164. data/spec/model/coverage/assets/0.3.9/jquery.timeago.js +141 -0
  165. data/spec/model/coverage/assets/0.3.9/jquery.url.js +174 -0
  166. data/spec/model/coverage/assets/0.3.9/loading.gif +0 -0
  167. data/spec/model/coverage/assets/0.3.9/magnify.png +0 -0
  168. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  169. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  170. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  171. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  172. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  173. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  174. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  175. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  176. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
  177. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  178. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
  179. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
  180. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  181. data/spec/model/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +295 -0
  182. data/spec/model/coverage/assets/0.3.9/stylesheet.css +341 -0
  183. data/spec/model/coverage/index.html +8637 -0
  184. data/spec/model/coverage/resultset.yml +642 -0
  185. data/spec/model/release_spec.rb +15 -14
  186. data/spec/model/sevendigital_object_spec.rb +74 -0
  187. data/spec/model/track_spec.rb +8 -4
  188. data/spec/model/user_spec.rb +98 -0
  189. data/spec/pager_spec.rb +2 -2
  190. data/spec/proxy_police_spec.rb +1 -1
  191. data/spec/spec_helper.rb +11 -3
  192. data/spec/test-xml/methods/artist/browse.xml +22 -0
  193. data/spec/test-xml/methods/artist/chart.xml +31 -0
  194. data/spec/test-xml/methods/basket/additem.xml +24 -0
  195. data/spec/test-xml/methods/basket/create.xml +11 -0
  196. data/spec/test-xml/methods/basket/index.xml +24 -0
  197. data/spec/test-xml/methods/basket/removeitem.xml +11 -0
  198. data/spec/test-xml/methods/oauth/accesstoken.xml +6 -0
  199. data/spec/test-xml/methods/oauth/requesttoken.xml +6 -0
  200. data/spec/test-xml/methods/tag/index.xml +17 -0
  201. data/spec/test-xml/methods/user/locker.xml +50 -0
  202. data/spec/test-xml/methods/user/purchase/item.xml +49 -0
  203. data/spec/test-xml/objects/basket.xml +22 -0
  204. data/spec/test-xml/objects/basket_item.xml +12 -0
  205. data/spec/test-xml/objects/basket_item_list.xml +26 -0
  206. data/spec/test-xml/objects/basket_item_list_empty.xml +2 -0
  207. data/spec/test-xml/objects/download_url.xml +8 -0
  208. data/spec/test-xml/objects/locker.xml +48 -0
  209. data/spec/test-xml/objects/locker_release.xml +41 -0
  210. data/spec/test-xml/objects/locker_release_list.xml +87 -0
  211. data/spec/test-xml/objects/locker_release_list_empty.xml +5 -0
  212. data/spec/test-xml/objects/locker_release_one_item_list.xml +43 -0
  213. data/spec/test-xml/objects/locker_track.xml +25 -0
  214. data/spec/test-xml/objects/locker_track_list.xml +26 -0
  215. data/spec/test-xml/objects/locker_track_list_empty.xml +2 -0
  216. data/spec/test-xml/objects/oauth_access_token.xml +4 -0
  217. data/spec/test-xml/objects/oauth_request_token.xml +4 -0
  218. data/spec/test-xml/objects/tag.xml +5 -0
  219. metadata +395 -13
  220. data/lib/sevendigital/peachy_patch.rb +0 -19
@@ -1,6 +1,6 @@
1
1
  # encoding: UTF-8
2
2
  require 'date'
3
- require File.join(File.dirname(__FILE__), %w[../spec_helper])
3
+ require File.expand_path('../../spec_helper', __FILE__)
4
4
 
5
5
  describe "ReleaseManager" do
6
6
 
@@ -20,11 +20,9 @@ describe "ReleaseManager" do
20
20
  mock_client_digestor(@client, :release_digestor) \
21
21
  .should_receive(:from_xml).with(api_response.content.release).and_return(a_release)
22
22
 
23
- @client.operator.should_receive(:call_api) { |api_request|
24
- api_request.api_method.should == "release/details"
25
- api_request.parameters[:releaseId].should == expected_release_id
26
- api_response
27
- }
23
+ @client.should_receive(:make_api_request) \
24
+ .with("release/details", {:releaseId => expected_release_id}, {}) \
25
+ .and_return(api_response)
28
26
 
29
27
  @release_manager.get_details(expected_release_id).should == a_release
30
28
 
@@ -39,12 +37,9 @@ describe "ReleaseManager" do
39
37
  mock_client_digestor(@client, :track_digestor) \
40
38
  .should_receive(:list_from_xml).with(api_response.content.tracks).and_return(a_track_list)
41
39
 
42
- @client.operator.should_receive(:call_api) { |api_request|
43
- api_request.api_method.should == "release/tracks"
44
- api_request.parameters[:releaseId].should == a_release_id
45
- api_request.parameters[:pageSize].should == 20
46
- api_response
47
- }
40
+ @client.should_receive(:make_api_request) \
41
+ .with("release/tracks", {:releaseId=>a_release_id}, expected_options) \
42
+ .and_return(api_response)
48
43
 
49
44
  tracks = @release_manager.get_tracks(a_release_id, expected_options)
50
45
  tracks.should == a_track_list
@@ -60,12 +55,9 @@ describe "ReleaseManager" do
60
55
  mock_client_digestor(@client, :track_digestor) \
61
56
  .should_receive(:list_from_xml).with(api_response.content.tracks).and_return(a_track_list)
62
57
 
63
- @client.operator.should_receive(:call_api) { |api_request|
64
- api_request.api_method.should == "release/tracks"
65
- api_request.parameters[:releaseId].should == a_release_id
66
- api_request.parameters[:pageSize].should == 100
67
- api_response
68
- }
58
+ @client.should_receive(:make_api_request) \
59
+ .with("release/tracks", {:releaseId => a_release_id}, {:page_size => 100}) \
60
+ .and_return(api_response)
69
61
 
70
62
  tracks = @release_manager.get_tracks(a_release_id)
71
63
  tracks.should == a_track_list
@@ -81,36 +73,15 @@ describe "ReleaseManager" do
81
73
  mock_client_digestor(@client, :chart_item_digestor) \
82
74
  .should_receive(:list_from_xml).with(api_response.content.chart).and_return(a_chart)
83
75
 
84
- @client.operator.should_receive(:call_api) { |api_request|
85
- api_request.api_method.should == "release/chart"
86
- api_response
87
- }
76
+ @client.should_receive(:make_api_request) \
77
+ .with("release/chart", {}, {}) \
78
+ .and_return(api_response)
88
79
 
89
80
  chart = @release_manager.get_chart
90
81
  chart.should == a_chart
91
82
  end
92
83
 
93
- it "get_latest should call release/tracks api method and digest the track list from response" do
94
-
95
- a_release_id = 123
96
- api_response = fake_api_response("release/tracks")
97
- a_track_list = []
98
-
99
- mock_client_digestor(@client, :track_digestor) \
100
- .should_receive(:list_from_xml).with(api_response.content.tracks).and_return(a_track_list)
101
-
102
- @client.operator.should_receive(:call_api) { |api_request|
103
- api_request.api_method.should == "release/tracks"
104
- api_request.parameters[:releaseId].should == a_release_id
105
- api_response
106
- }
107
-
108
- tracks = @release_manager.get_tracks(a_release_id)
109
- tracks.should == a_track_list
110
-
111
- end
112
-
113
- it "get_by_date should call release/tracks with supplied parameters and digest the release list from response" do
84
+ it "get_by_date should call release/byDate with supplied parameters and digest the release list from response" do
114
85
 
115
86
  from_date = DateTime.new(2010, 01, 01)
116
87
  to_date = DateTime.new(2010, 05, 01)
@@ -120,12 +91,9 @@ describe "ReleaseManager" do
120
91
  mock_client_digestor(@client, :release_digestor) \
121
92
  .should_receive(:list_from_xml).with(api_response.content.releases).and_return(a_release_list)
122
93
 
123
- @client.operator.should_receive(:call_api) { |api_request|
124
- api_request.api_method.should == "release/byDate"
125
- api_request.parameters[:fromDate].should == from_date.strftime("%Y%m%d")
126
- api_request.parameters[:toDate].should == to_date.strftime("%Y%m%d")
127
- api_response
128
- }
94
+ @client.should_receive(:make_api_request) \
95
+ .with("release/byDate", {:fromDate => from_date.strftime("%Y%m%d"), :toDate => to_date.strftime("%Y%m%d")}, {}) \
96
+ .and_return(api_response)
129
97
 
130
98
  tracks = @release_manager.get_by_date(from_date, to_date)
131
99
  tracks.should == a_release_list
@@ -140,15 +108,12 @@ describe "ReleaseManager" do
140
108
  mock_client_digestor(@client, :release_digestor) \
141
109
  .should_receive(:list_from_xml).with(api_response.content.releases).and_return(a_release_list)
142
110
 
143
- @client.operator.should_receive(:call_api) { |api_request|
144
- api_request.api_method.should == "release/byDate"
145
- api_request.parameters.has_key?(:fromDate).should == false
146
- api_request.parameters.has_key?(:toDate).should == false
147
- api_response
148
- }
111
+ @client.should_receive(:make_api_request) \
112
+ .with("release/byDate", {}, {}) \
113
+ .and_return(api_response)
149
114
 
150
- tracks = @release_manager.get_by_date
151
- tracks.should == a_release_list
115
+ releases = @release_manager.get_by_date
116
+ releases.should == a_release_list
152
117
 
153
118
  end
154
119
 
@@ -163,12 +128,10 @@ describe "ReleaseManager" do
163
128
  .with(api_response.content.recommendations, :recommended_item, :recommendations) \
164
129
  .and_return(a_release_list)
165
130
 
166
- @client.operator.should_receive(:call_api) { |api_request|
167
- api_request.api_method.should == "release/recommend"
168
- api_request.parameters[:releaseId].should == a_release_id
169
- api_response
170
- }
171
-
131
+ @client.should_receive(:make_api_request) \
132
+ .with("release/recommend", {:releaseId => a_release_id}, {}) \
133
+ .and_return(api_response)
134
+
172
135
  releases = @release_manager.get_recommendations(a_release_id)
173
136
  releases.should == a_release_list
174
137
 
@@ -185,12 +148,10 @@ describe "ReleaseManager" do
185
148
  .with(api_response.content.tagged_results, :tagged_item, :tagged_results) \
186
149
  .and_return(a_release_list)
187
150
 
188
- @client.operator.should_receive(:call_api) { |api_request|
189
- api_request.api_method.should == "release/byTag/top"
190
- api_request.parameters[:tags].should == tags
191
- api_response
192
- }
193
-
151
+ @client.should_receive(:make_api_request) \
152
+ .with("release/byTag/top", {:tags => tags}, {}) \
153
+ .and_return(api_response)
154
+
194
155
  releases = @release_manager.get_top_by_tag(tags)
195
156
  releases.should == a_release_list
196
157
 
@@ -207,11 +168,9 @@ describe "ReleaseManager" do
207
168
  .with(api_response.content.search_results, :search_result, :search_results) \
208
169
  .and_return(a_release_list)
209
170
 
210
- @client.operator.should_receive(:call_api) { |api_request|
211
- api_request.api_method.should == "release/search"
212
- api_request.parameters[:q].should == query
213
- api_response
214
- }
171
+ @client.should_receive(:make_api_request) \
172
+ .with("release/search", {:q => query}, {}) \
173
+ .and_return(api_response)
215
174
 
216
175
  releases = @release_manager.search(query)
217
176
  releases.should == a_release_list
@@ -0,0 +1,34 @@
1
+ # encoding: UTF-8
2
+ require 'date'
3
+ require File.expand_path('../../spec_helper', __FILE__)
4
+
5
+ describe "TagManager" do
6
+
7
+ before do
8
+
9
+ @client = stub(Sevendigital::Client)
10
+ @client.stub!(:operator).and_return(mock(Sevendigital::ApiOperator))
11
+ @tag_manager = Sevendigital::TagManager.new(@client)
12
+
13
+ end
14
+
15
+
16
+ it "get_tag_list should call tag api method and digest the tag list from response" do
17
+
18
+ an_api_response = fake_api_response("tag/index")
19
+ a_tag_list = [Sevendigital::Tag.new]
20
+
21
+ mock_client_digestor(@client, :tag_digestor) \
22
+ .should_receive(:list_from_xml).with(an_api_response.content.tags).and_return(a_tag_list)
23
+
24
+ @client.should_receive(:make_api_request) \
25
+ .with("tag", {}, {}) \
26
+ .and_return(an_api_response)
27
+
28
+
29
+ tags = @tag_manager.get_tag_list
30
+ tags.should == a_tag_list
31
+ end
32
+
33
+
34
+ end
@@ -1,6 +1,6 @@
1
1
  # encoding: UTF-8
2
2
  require 'date'
3
- require File.join(File.dirname(__FILE__), %w[../spec_helper])
3
+ require File.expand_path('../../spec_helper', __FILE__)
4
4
 
5
5
  describe "TrackManager" do
6
6
 
@@ -20,28 +20,44 @@ describe "TrackManager" do
20
20
  mock_client_digestor(@client, :track_digestor) \
21
21
  .should_receive(:from_xml).with(an_api_response.content.track).and_return(a_track)
22
22
 
23
- @client.operator.should_receive(:call_api) { |api_request|
24
- api_request.api_method.should == "track/details"
25
- api_request.parameters[:trackId].should == a_track_id
26
- an_api_response
27
- }
23
+ @client.should_receive(:make_api_request) \
24
+ .with("track/details", {:trackId => a_track_id}, {}) \
25
+ .and_return(an_api_response)
28
26
 
29
27
  @track_manager.get_details(a_track_id).should == a_track
30
28
 
31
29
  end
32
30
 
31
+ it "get_details_from_release should get all tracks from the release and pick the relevant one" do
32
+
33
+ @client.stub!(:release).and_return(mock(Sevendigital::ReleaseManager))
34
+
35
+ options = []
36
+ track_1 = Sevendigital::Track.new(@client)
37
+ track_1.id = 1
38
+ track_2 = Sevendigital::Track.new(@client)
39
+ track_2.id = 2
40
+ a_track_list = [track_1, track_2]
41
+ a_release_id = 123456
42
+
43
+ @client.release.should_receive(:get_tracks).with(a_release_id, options).and_return(a_track_list)
44
+
45
+ track = @track_manager.get_details_from_release(track_1.id, a_release_id, options)
46
+ track.should == track_1
47
+ end
48
+
33
49
  it "get_chart should call track/chart api method and digest the release list from response" do
34
50
 
35
- api_response = fake_api_response("track/chart")
51
+ an_api_response = fake_api_response("track/chart")
36
52
  a_chart = []
37
53
 
38
54
  mock_client_digestor(@client, :chart_item_digestor) \
39
- .should_receive(:list_from_xml).with(api_response.content.chart).and_return(a_chart)
55
+ .should_receive(:list_from_xml).with(an_api_response.content.chart).and_return(a_chart)
56
+
57
+ @client.should_receive(:make_api_request) \
58
+ .with("track/chart", {}, {}) \
59
+ .and_return(an_api_response)
40
60
 
41
- @client.operator.should_receive(:call_api) { |api_request|
42
- api_request.api_method.should == "track/chart"
43
- api_response
44
- }
45
61
 
46
62
  chart = @track_manager.get_chart
47
63
  chart.should == a_chart
@@ -50,12 +66,15 @@ describe "TrackManager" do
50
66
  it "build_preview_url should return URL for track/preview api request" do
51
67
  track_id = 123456
52
68
  fake_preview_url = "http://7digital.com/track/preview"
69
+ fake_api_request = stub(Sevendigital::ApiRequest)
53
70
 
54
- @client.operator.should_receive(:create_request_uri) { |api_request|
55
- api_request.api_method.should == "track/preview"
56
- api_request.parameters[:trackId].should == track_id
57
- fake_preview_url
58
- }
71
+ @client.should_receive(:create_api_request) \
72
+ .with("track/preview", {:trackId => track_id}, {}) \
73
+ .and_return(fake_api_request)
74
+
75
+ @client.operator.should_receive(:create_request_uri) \
76
+ .with(fake_api_request) \
77
+ .and_return(fake_preview_url)
59
78
 
60
79
  preview_url = @track_manager.build_preview_url(track_id)
61
80
 
@@ -65,20 +84,18 @@ describe "TrackManager" do
65
84
  it "search should call track/search api method and digest the nested track list from response" do
66
85
 
67
86
  query = "radiohead"
68
- api_response = fake_api_response("track/search")
87
+ an_api_response = fake_api_response("track/search")
69
88
  a_track_list = [Sevendigital::Track.new(@client)]
70
89
 
71
90
  mock_client_digestor(@client, :track_digestor) \
72
91
  .should_receive(:nested_list_from_xml) \
73
- .with(api_response.content.search_results, :search_result, :search_results) \
92
+ .with(an_api_response.content.search_results, :search_result, :search_results) \
74
93
  .and_return(a_track_list)
75
94
 
76
- @client.operator.should_receive(:call_api) { |api_request|
77
- api_request.api_method.should == "track/search"
78
- api_request.parameters[:q].should == query
79
- api_response
80
- }
81
-
95
+ @client.should_receive(:make_api_request) \
96
+ .with("track/search", {:q => query}, {}) \
97
+ .and_return(an_api_response)
98
+
82
99
  tracks = @track_manager.search(query)
83
100
  tracks.should == a_track_list
84
101
 
@@ -0,0 +1,163 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "UserManager" do
4
+
5
+ before do
6
+
7
+ @an_email = "email"
8
+ @a_password = "password"
9
+ @a_request_token = fake_request_token
10
+ @an_access_token = fake_access_token
11
+
12
+ @client = stub(Sevendigital::Client)
13
+
14
+ @oauth_manager = mock(Sevendigital::OAuthManager)
15
+ @oauth_manager.stub!(:get_request_token).and_return(@a_request_token)
16
+ @oauth_manager.stub!(:authorise_request_token).and_return(true)
17
+ @oauth_manager.stub!(:get_access_token).and_return(@an_access_token)
18
+
19
+ @client.stub!(:operator).and_return(mock(Sevendigital::ApiOperator))
20
+ @client.stub!(:oauth).and_return(@oauth_manager )
21
+ @user_manager = Sevendigital::UserManager.new(@client)
22
+ end
23
+
24
+ it "should log in user using an existing access token" do
25
+ an_access_token = OAuth::AccessToken.new("aaa", "bbb", nil)
26
+ @user = @user_manager.login(an_access_token)
27
+ @user.authenticated?.should == true
28
+ end
29
+
30
+ it "should not log in user using an request token but raise an exception" do
31
+ a_request_token = OAuth::RequestToken.new("aaa", "bbb", nil)
32
+ running {@user = @user_manager.login(a_request_token)}.should raise_exception Sevendigital::SevendigitalError
33
+ @user.nil?.should == true
34
+ end
35
+
36
+ it "authenticate should return an authenticated user if supplied with valid login details" do
37
+ user = @user_manager.authenticate("email", "password")
38
+ user.kind_of?(Sevendigital::User).should == true
39
+ user.authenticated?.should == true
40
+ end
41
+
42
+ it "authenticate should return nil if user does not authenticate" do
43
+ @oauth_manager.stub!(:authorise_request_token).and_return(false)
44
+ user = @user_manager.authenticate("email", "password")
45
+ user.nil?.should == true
46
+ end
47
+
48
+ it "authenticate should get a request token" do
49
+ @client.oauth.should_receive(:get_request_token).and_return(nil)
50
+ @user_manager.authenticate("email", "password")
51
+ end
52
+
53
+ it "authenticate should attempt to authorise request token" do
54
+ @client.oauth.should_receive(:authorise_request_token).with(@an_email, @a_password, @a_request_token) \
55
+ .and_return(true)
56
+ @user_manager.authenticate(@an_email, @a_password)
57
+ end
58
+
59
+ it "authenticate should retrieve access_token for authenticated user" do
60
+ @client.oauth.should_receive(:get_access_token).with(@a_request_token) \
61
+ .and_return(@an_access_token)
62
+ user = @user_manager.authenticate(@an_email, @a_password)
63
+ user.oauth_access_token.should == @an_access_token
64
+ end
65
+
66
+ def fake_request_token
67
+ token = stub(OAuth::RequestToken)
68
+ token.stub(:token).and_return("key")
69
+ token
70
+ end
71
+
72
+ def fake_access_token
73
+ token = stub(OAuth::RequestToken)
74
+ token.stub(:token).and_return("key")
75
+ token
76
+ end
77
+
78
+ it "get_locker should call user/locker api method and return digested locker" do
79
+ an_api_response = fake_api_response("user/locker")
80
+ a_token = OAuth::AccessToken.new(nil, "token", "token_secret")
81
+ fake_locker = [Sevendigital::LockerRelease.new(@client)]
82
+
83
+ mock_client_digestor(@client, :locker_digestor) \
84
+ .should_receive(:from_xml).with(an_api_response.content.locker).and_return(fake_locker)
85
+
86
+ @client.should_receive(:make_signed_api_request) \
87
+ .with("user/locker", {}, {}, a_token) \
88
+ .and_return(an_api_response)
89
+
90
+ @user_manager.get_locker(a_token).should == fake_locker
91
+
92
+ end
93
+
94
+ it "purchase should call user/purchase/item api method and return digested locker items" do
95
+ an_api_response = fake_api_response("user/purchase/item")
96
+ a_track_id = 123456
97
+ a_release_id = 56879
98
+ a_price = 0.99
99
+ a_token = OAuth::AccessToken.new(nil, "token", "token_secret")
100
+ fake_locker = [Sevendigital::LockerRelease.new(@client)]
101
+
102
+ mock_client_digestor(@client, :locker_digestor) \
103
+ .should_receive(:from_xml).with(an_api_response.content.purchase).and_return(fake_locker)
104
+
105
+ @client.should_receive(:make_signed_api_request) \
106
+ .with("user/purchase/item", \
107
+ {:trackId => a_track_id, :releaseId => a_release_id, :price => a_price}, \
108
+ {}, a_token) \
109
+ .and_return(an_api_response)
110
+
111
+ @user_manager.purchase(a_release_id, a_track_id, a_price, a_token).should == fake_locker
112
+
113
+ end
114
+
115
+ it "should get stream track URI" do
116
+ a_stream_track_uri = "http://media.com/streamtrack"
117
+ a_track_id = 123456
118
+ a_release_id = 78910
119
+ a_token = OAuth::AccessToken.new(nil, "token", "token_secret")
120
+ an_api_request = stub(Sevendigital::ApiRequest)
121
+
122
+ @client.should_receive(:create_api_request) \
123
+ .with("user/streamtrack", {:trackId => a_track_id, :releaseId => a_release_id}, {}) \
124
+ .and_return(an_api_request)
125
+
126
+ an_api_request.should_receive(:api_service=).with(:media)
127
+ an_api_request.should_receive(:require_signature)
128
+ an_api_request.should_not_receive(:require_secure_connection)
129
+ an_api_request.should_receive(:token=).with(a_token)
130
+
131
+ @client.operator.should_receive(:get_request_uri) \
132
+ .with(an_api_request) \
133
+ .and_return(a_stream_track_uri)
134
+
135
+ @user_manager.get_stream_track_url(a_release_id, a_track_id, a_token).should == a_stream_track_uri
136
+
137
+ end
138
+
139
+ it "should get add card URI" do
140
+ an_add_card_uri = "http://account.com/addcard"
141
+ a_token = OAuth::AccessToken.new(nil, "token", "token_secret")
142
+ a_return_url = "http://example.com/"
143
+ an_api_request = stub(Sevendigital::ApiRequest)
144
+
145
+ @client.should_receive(:create_api_request) \
146
+ .with("payment/addcard", {:returnUrl => a_return_url}, {}) \
147
+ .and_return(an_api_request)
148
+
149
+ an_api_request.should_receive(:api_service=).with(:account)
150
+ an_api_request.should_receive(:require_signature)
151
+ an_api_request.should_receive(:require_secure_connection)
152
+ an_api_request.should_receive(:token=).with(a_token)
153
+
154
+ @client.operator.should_receive(:get_request_uri) \
155
+ .with(an_api_request) \
156
+ .and_return(an_add_card_uri)
157
+
158
+ @user_manager.get_add_card_url(a_return_url, a_token).should == an_add_card_uri
159
+
160
+ end
161
+
162
+
163
+ end