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
@@ -0,0 +1,35 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "OAuthRequestTokenDigestor" do
4
+
5
+ before do
6
+ @stub_oauth_consumer = stub(OAuth::Consumer)
7
+ api_client = stub(Sevendigital::Client)
8
+ api_client.stub!(:oauth_consumer).and_return(@stub_oauth_consumer)
9
+ @token_digestor = Sevendigital::OAuthRequestTokenDigestor.new(api_client)
10
+ end
11
+
12
+
13
+ it "should not digest from invalid xml but throw up (exception)" do
14
+
15
+ xml_response = <<XML
16
+ <release id="123">
17
+ <name>expected artist name</name>
18
+ </release>
19
+ XML
20
+
21
+ running {@token_digestor.from_xml(xml_response)}.should raise_error(Sevendigital::DigestiveProblem)
22
+ end
23
+
24
+ it "should digest request token xml and populate all properties" do
25
+
26
+ xml_response = load_sample_object_xml("oauth_request_token")
27
+
28
+ token = @token_digestor.from_xml(xml_response, :oauth_request_token)
29
+ token.kind_of?(OAuth::RequestToken).should == true
30
+ token.token.should == "yu87230J29DT7tyuGslO98wrR43e39Of"
31
+ token.secret.should == "d2I8uj7yaoa39KKdu3upasybu98f89fln"
32
+ token.consumer.should == @stub_oauth_consumer
33
+ end
34
+
35
+ end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), %w[../spec_helper])
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
2
 
3
3
  describe "PagerDigestor" do
4
4
 
@@ -15,7 +15,7 @@ describe "PagerDigestor" do
15
15
  </release>
16
16
  XML
17
17
 
18
- running {@pager_digestor.from_xml(xml_response)}.should raise_error Sevendigital::DigestiveProblem
18
+ running {@pager_digestor.from_xml(xml_response)}.should raise_error(Sevendigital::DigestiveProblem)
19
19
  end
20
20
 
21
21
  it "should not digest if paging info is missing from xml but spit out nil" do
@@ -1,5 +1,5 @@
1
1
  # coding: utf-8
2
- require File.join(File.dirname(__FILE__), %w[../spec_helper])
2
+ require File.expand_path('../../spec_helper', __FILE__)
3
3
 
4
4
  describe "PriceDigestor" do
5
5
 
@@ -15,7 +15,7 @@ describe "PriceDigestor" do
15
15
  </xxx>
16
16
  XML
17
17
 
18
- running {@price_digestor.from_xml(xml_response)}.should raise_error Sevendigital::DigestiveProblem
18
+ running {@price_digestor.from_xml(xml_response)}.should raise_error(Sevendigital::DigestiveProblem)
19
19
  end
20
20
 
21
21
  it "should parse from xml and populate minimum available properties" do
@@ -34,9 +34,25 @@ XML
34
34
  price.currency_symbol.should == "£"
35
35
  price.value.should == 1.79
36
36
  price.formatted_price.should == "£1.79"
37
- price.rrp.should == nil
38
- price.formatted_rrp.should == nil
39
- price.on_sale.should == true
37
+
38
+ end
39
+
40
+ it "should parse from xml and populate N/A price" do
41
+
42
+ xml_response = <<XML
43
+ <price>
44
+ <currency code="GBP">£</currency>
45
+ <value />
46
+ <formattedPrice>N/A</formattedPrice>
47
+ <onSale>false</onSale>
48
+ </price>
49
+ XML
50
+
51
+ price = @price_digestor.from_xml(xml_response)
52
+ price.currency_code.should == :GBP
53
+ price.currency_symbol.should == "£"
54
+ price.value.should == nil
55
+ price.formatted_price.should == "N/A"
40
56
 
41
57
  end
42
58
 
@@ -1,6 +1,6 @@
1
1
  # coding: 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 "ReleaseDigestor" do
6
6
 
@@ -16,7 +16,7 @@ describe "ReleaseDigestor" do
16
16
  </artist>
17
17
  XML
18
18
 
19
- running {@release_digestor.from_xml(xml_response)}.should raise_error Sevendigital::DigestiveProblem
19
+ running {@release_digestor.from_xml(xml_response)}.should raise_error(Sevendigital::DigestiveProblem)
20
20
  end
21
21
 
22
22
  it "should digest release xml and populate minimum available properties" do
@@ -0,0 +1,46 @@
1
+ # coding: utf-8
2
+ require File.expand_path('../../spec_helper', __FILE__)
3
+
4
+ describe "TagDigestor" do
5
+
6
+ before do
7
+ @tag_digestor = Sevendigital::TagDigestor.new(nil)
8
+ end
9
+
10
+ it "should not digest from invalid xml but throw up (exception)" do
11
+
12
+ xml_response = <<XML
13
+ <xxx>
14
+ <text>pop</text>
15
+ </xxx>
16
+ XML
17
+
18
+ running {@tag_digestor.from_xml(xml_response)}.should raise_error(Sevendigital::DigestiveProblem)
19
+ end
20
+
21
+ it "should parse from xml and populate minimum available properties" do
22
+
23
+ xml_response = <<XML
24
+ <tag id="rock">
25
+ <text>ROCK</text>
26
+ </tag>
27
+ XML
28
+
29
+ tag = @tag_digestor.from_xml(xml_response)
30
+ tag.id.should == 'rock'
31
+ tag.text.should == "ROCK"
32
+
33
+ end
34
+
35
+ it "should parse from xml and populate all properties" do
36
+
37
+ xml_response = load_sample_object_xml("tag")
38
+
39
+ tag = @tag_digestor.from_xml(xml_response)
40
+ tag.id.should == "pop"
41
+ tag.text.should == "pop"
42
+ tag.url.should == "http://www.7digital.com/tags/pop?partner=123"
43
+ tag.count.should == 90847
44
+ end
45
+
46
+ end
@@ -1,6 +1,6 @@
1
1
  # coding: 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 "TrackDigestor" do
6
6
 
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), %w[../spec_helper])
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
2
 
3
3
  describe "ArtistManager" do
4
4
 
@@ -16,11 +16,9 @@ describe "ArtistManager" do
16
16
  mock_client_digestor(@client, :artist_digestor) \
17
17
  .should_receive(:from_xml).with(an_api_response.content.artist).and_return(an_artist)
18
18
 
19
- @client.operator.should_receive(:call_api) { |api_request|
20
- api_request.api_method.should == "artist/details"
21
- api_request.parameters[:artistId].should == an_artist_id
22
- an_api_response
23
- }
19
+ @client.should_receive(:make_api_request) \
20
+ .with("artist/details", {:artistId => an_artist_id}, {}) \
21
+ .and_return(an_api_response)
24
22
 
25
23
  artist = @artist_manager.get_details(an_artist_id)
26
24
  artist.should == an_artist
@@ -34,17 +32,15 @@ describe "ArtistManager" do
34
32
  mock_client_digestor(@client, :release_digestor) \
35
33
  .should_receive(:list_from_xml).with(an_api_response.content.releases).and_return(a_list_of_releases)
36
34
 
37
- @client.operator.should_receive(:call_api) { |api_request|
38
- api_request.api_method.should == "artist/releases"
39
- api_request.parameters[:artistId].should == an_artist_id
40
- an_api_response
41
- }
42
-
35
+ @client.should_receive(:make_api_request) \
36
+ .with("artist/releases", {:artistId => an_artist_id}, {}) \
37
+ .and_return(an_api_response)
38
+
43
39
  releases = @artist_manager.get_releases(an_artist_id)
44
40
  releases.should == a_list_of_releases
45
41
  end
46
42
 
47
- it "get_top_tracks should call artist/toptracks method and digest the returned list of tracks" do
43
+ it "get_top_tracks should call artist/topTracks method and digest the returned list of tracks" do
48
44
  an_artist_id = 123
49
45
  a_top_tracks_list = [Sevendigital::Track.new(@client)]
50
46
  an_api_response = fake_api_response("artist/toptracks")
@@ -52,11 +48,9 @@ describe "ArtistManager" do
52
48
  mock_client_digestor(@client, :track_digestor) \
53
49
  .should_receive(:list_from_xml).with(an_api_response.content.tracks).and_return(a_top_tracks_list)
54
50
 
55
- @client.operator.should_receive(:call_api) { |api_request|
56
- api_request.api_method.should == "artist/toptracks"
57
- api_request.parameters[:artistId].should == an_artist_id
58
- an_api_response
59
- }
51
+ @client.should_receive(:make_api_request) \
52
+ .with("artist/topTracks", {:artistId => an_artist_id}, {}) \
53
+ .and_return(an_api_response)
60
54
 
61
55
  tracks = @artist_manager.get_top_tracks(an_artist_id)
62
56
  tracks.should == a_top_tracks_list
@@ -71,11 +65,9 @@ describe "ArtistManager" do
71
65
  mock_client_digestor(@client, :artist_digestor) \
72
66
  .should_receive(:list_from_xml).with(an_api_response.content.artists).and_return(a_similar_artists_list)
73
67
 
74
- @client.operator.should_receive(:call_api) { |api_request|
75
- api_request.api_method.should == "artist/similar"
76
- api_request.parameters[:artistId].should == an_artist_id
77
- an_api_response
78
- }
68
+ @client.should_receive(:make_api_request) \
69
+ .with("artist/similar", {:artistId => an_artist_id}, {}) \
70
+ .and_return(an_api_response)
79
71
 
80
72
  artists = @artist_manager.get_similar(an_artist_id)
81
73
  artists.should == a_similar_artists_list
@@ -85,45 +77,58 @@ describe "ArtistManager" do
85
77
  it "get_top_by_tag should call artist/byTag/top api method and digest the nested artist list from response" do
86
78
 
87
79
  tags = "alternative-indie"
88
- api_response = fake_api_response("artist/byTag/top")
80
+ an_api_response = fake_api_response("artist/byTag/top")
89
81
  a_release_list = []
90
82
 
91
83
  mock_client_digestor(@client, :artist_digestor) \
92
84
  .should_receive(:nested_list_from_xml) \
93
- .with(api_response.content.tagged_results, :tagged_item, :tagged_results) \
85
+ .with(an_api_response.content.tagged_results, :tagged_item, :tagged_results) \
94
86
  .and_return(a_release_list)
95
87
 
96
- @client.operator.should_receive(:call_api) { |api_request|
97
- api_request.api_method.should == "artist/byTag/top"
98
- api_request.parameters[:tags].should == tags
99
- api_response
100
- }
88
+ @client.should_receive(:make_api_request) \
89
+ .with("artist/byTag/top", {:tags => tags}, {}) \
90
+ .and_return(an_api_response)
101
91
 
102
92
  releases = @artist_manager.get_top_by_tag(tags)
103
93
  releases.should == a_release_list
104
94
 
105
95
  end
106
96
 
107
- it "search should call artist/search api method and digest the nested artist list from response" do
97
+ it "browse should call artist/browse api method and digest the artist list from response" do
108
98
 
109
- query = "radiohead"
110
- api_response = fake_api_response("artist/search")
99
+ letter = "ra"
100
+ an_api_response = fake_api_response("artist/browse")
111
101
  an_artist_list = []
112
102
 
113
103
  mock_client_digestor(@client, :artist_digestor) \
114
- .should_receive(:nested_list_from_xml) \
115
- .with(api_response.content.search_results, :search_result, :search_results) \
104
+ .should_receive(:list_from_xml) \
105
+ .with(an_api_response.content.artists) \
116
106
  .and_return(an_artist_list)
117
107
 
118
- @client.operator.should_receive(:call_api) { |api_request|
119
- api_request.api_method.should == "artist/search"
120
- api_request.parameters[:q].should == query
121
- api_response
122
- }
108
+ @client.should_receive(:make_api_request) \
109
+ .with("artist/browse", {:letter => letter}, {}) \
110
+ .and_return(an_api_response)
123
111
 
124
- artists = @artist_manager.search(query)
112
+ artists = @artist_manager.browse(letter)
125
113
  artists.should == an_artist_list
126
114
 
127
115
  end
128
116
 
117
+
118
+ it "get_chart should call artist/chart api method and digest the artist list from response" do
119
+
120
+ api_response = fake_api_response("artist/chart")
121
+ a_chart = [Sevendigital::ChartItem.new(@client)]
122
+
123
+ mock_client_digestor(@client, :chart_item_digestor) \
124
+ .should_receive(:list_from_xml).with(api_response.content.chart).and_return(a_chart)
125
+
126
+ @client.should_receive(:make_api_request) \
127
+ .with("artist/chart", {}, {}) \
128
+ .and_return(api_response)
129
+
130
+ chart = @artist_manager.get_chart
131
+ chart.should == a_chart
132
+ end
133
+
129
134
  end
@@ -0,0 +1,78 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "BasketManager" do
4
+
5
+ before do
6
+ @client = stub(Sevendigital::Client)
7
+ @client.stub!(:operator).and_return(mock(Sevendigital::ApiOperator))
8
+ @basket_manager = Sevendigital::BasketManager.new(@client)
9
+ end
10
+
11
+ it "get should call basket api method and return digested basket" do
12
+ a_basket_id = "00000000-0000-0000-0000-000000000001"
13
+ a_basket = Sevendigital::Basket.new(@client)
14
+ an_api_response = fake_api_response("basket/index")
15
+
16
+ mock_client_digestor(@client, :basket_digestor) \
17
+ .should_receive(:from_xml).with(an_api_response.content.basket).and_return(a_basket)
18
+
19
+ @client.should_receive(:make_api_request) \
20
+ .with("basket", {:basketId => a_basket_id}, {}) \
21
+ .and_return(an_api_response)
22
+
23
+ basket = @basket_manager.get(a_basket_id)
24
+ basket.should == a_basket
25
+ end
26
+
27
+ it "create should call basket/create api method and return digested created basket" do
28
+ a_basket = Sevendigital::Basket.new(@client)
29
+ an_api_response = fake_api_response("basket/create")
30
+
31
+ mock_client_digestor(@client, :basket_digestor) \
32
+ .should_receive(:from_xml).with(an_api_response.content.basket).and_return(a_basket)
33
+
34
+ @client.should_receive(:make_api_request) \
35
+ .with("basket/create", {}, {}) \
36
+ .and_return(an_api_response)
37
+
38
+ basket = @basket_manager.create
39
+ basket.should == a_basket
40
+ end
41
+
42
+ it "add_item should call basket/addItem api method and return digested basket" do
43
+ a_basket_id = "00000000-0000-0000-0000-000000000001"
44
+ a_release_id = 123
45
+ a_track_id = 456
46
+ a_basket = Sevendigital::Basket.new(@client)
47
+ an_api_response = fake_api_response("basket/additem")
48
+
49
+ mock_client_digestor(@client, :basket_digestor) \
50
+ .should_receive(:from_xml).with(an_api_response.content.basket).and_return(a_basket)
51
+
52
+ @client.should_receive(:make_api_request) \
53
+ .with("basket/addItem", {:basketId => a_basket_id, :releaseId => a_release_id, :trackId => a_track_id}, {}) \
54
+ .and_return(an_api_response)
55
+
56
+ basket = @basket_manager.add_item(a_basket_id, a_release_id, a_track_id)
57
+ basket.should == a_basket
58
+ end
59
+
60
+ it "remove_item should call basket/removeItem api method and return digested basket" do
61
+ a_basket_id = "00000000-0000-0000-0000-000000000001"
62
+ an_item_id = 123456
63
+ a_basket = Sevendigital::Basket.new(@client)
64
+ an_api_response = fake_api_response("basket/removeitem")
65
+
66
+ mock_client_digestor(@client, :basket_digestor) \
67
+ .should_receive(:from_xml).with(an_api_response.content.basket).and_return(a_basket)
68
+
69
+ @client.should_receive(:make_api_request) \
70
+ .with("basket/removeItem", {:basketId => a_basket_id, :itemId => an_item_id}, {}) \
71
+ .and_return(an_api_response)
72
+
73
+ basket = @basket_manager.remove_item(a_basket_id, an_item_id)
74
+ basket.should == a_basket
75
+ end
76
+
77
+
78
+ end
@@ -0,0 +1,73 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "OAuthManager" do
4
+
5
+ before do
6
+ @client = stub(Sevendigital::Client)
7
+
8
+ @client.stub!(:operator).and_return(mock(Sevendigital::ApiOperator))
9
+ @oauth_manager = Sevendigital::OAuthManager.new(@client)
10
+ end
11
+
12
+ it "get_oauth_request_token should call oauth/requestToken api method and digest the request_token from response" do
13
+
14
+ fake_token = OAuth::RequestToken.new("aaa", "bbb", "ccc")
15
+ an_api_response = fake_api_response("oauth/requesttoken")
16
+
17
+ digestor = mock(Sevendigital::OAuthRequestTokenDigestor)
18
+ @client.stub!(:oauth_request_token_digestor).and_return(digestor)
19
+
20
+ digestor.should_receive(:from_xml) \
21
+ .with(an_api_response.content.oauth_request_token, :oauth_request_token) \
22
+ .and_return(fake_token)
23
+
24
+ @client.should_receive(:make_signed_api_request) \
25
+ .with("oauth/requestToken", {}) \
26
+ .and_return(an_api_response)
27
+
28
+ token = @oauth_manager.get_request_token
29
+ token.should == fake_token
30
+
31
+ end
32
+
33
+ it "get_oauth_access_token should call oauth/accessToken api method and digest the access_token from response" do
34
+
35
+ a_request_token = OAuth::RequestToken.new("aaa", "bbb", "ccc")
36
+ fake_token = OAuth::AccessToken.new("aaa", "bbb", "ccc")
37
+ an_api_response = fake_api_response("oauth/accessToken")
38
+
39
+ digestor = mock(Sevendigital::OAuthAccessTokenDigestor)
40
+ @client.stub!(:oauth_access_token_digestor).and_return(digestor)
41
+
42
+ digestor.should_receive(:from_xml) \
43
+ .with(an_api_response.content.oauth_access_token, :oauth_access_token) \
44
+ .and_return(fake_token)
45
+
46
+ @client.should_receive(:make_signed_api_request) \
47
+ .with("oauth/accessToken", {}, {}, a_request_token) \
48
+ .and_return(an_api_response)
49
+
50
+ token = @oauth_manager.get_access_token(a_request_token)
51
+ token.should == fake_token
52
+
53
+ end
54
+
55
+ it "authorise_request_token should call oauth/requestToken/authorise api method" do
56
+
57
+ a_request_token = OAuth::RequestToken.new("aaa", "bbb", "ccc")
58
+ an_email_address = "email"
59
+ a_password = "password"
60
+ an_api_response = fake_api_response("oauth/requesttoken")
61
+
62
+ @client.should_receive(:make_signed_api_request) \
63
+ .with("oauth/requestToken/authorise", \
64
+ {:username => an_email_address, :password => a_password, :token => a_request_token.token}) \
65
+ .and_return(an_api_response)
66
+
67
+ authorised = @oauth_manager.authorise_request_token(an_email_address, a_password, a_request_token)
68
+ authorised.should == true
69
+
70
+ end
71
+
72
+
73
+ end